FooGallery – Image Gallery WordPress Plugin - Version 1.4.12

Version Description

  • New : NextGen importer now includes shortcode replacement
  • New : Masonry gallery supports captions below thumbnails
  • New : Performance improvements for very large galleries (1000+ images)
  • Fix : Bugs fixes for paging, FooBox and more
  • Update to latest client side JS 1.0.18
Download this release

Release Info

Developer bradvin
Plugin Icon 128x128 FooGallery – Image Gallery WordPress Plugin
Version 1.4.12
Comparing to
See all releases

Code changes from version 1.4.8 to 1.4.12

Files changed (45) hide show
  1. Gruntfile.js +212 -212
  2. LICENSE.txt +338 -338
  3. README.md +362 -362
  4. README.txt +385 -373
  5. changelog.txt +3 -3
  6. css/admin-foogallery.css +461 -461
  7. css/admin-page-foogallery-extensions.css +296 -296
  8. css/admin-page-foogallery-help.css +2 -2
  9. css/admin-page-foogallery-settings.css +2 -2
  10. css/admin-tinymce.css +113 -113
  11. css/foogallery-foovideo-overrides.css +95 -95
  12. extensions/albums/admin/class-columns.php +73 -73
  13. extensions/albums/admin/class-metaboxes.php +576 -576
  14. extensions/albums/album-default.php +81 -81
  15. extensions/albums/album-stack.php +67 -67
  16. extensions/albums/class-albums-extension.php +111 -111
  17. extensions/albums/class-foogallery-album.php +256 -256
  18. extensions/albums/class-posttypes.php +108 -108
  19. extensions/albums/css/admin-foogallery-album.css +379 -379
  20. extensions/albums/css/album-default.css +102 -101
  21. extensions/albums/css/album-stack.css +289 -289
  22. extensions/albums/functions.php +360 -360
  23. extensions/albums/js/admin-foogallery-album.js +147 -147
  24. extensions/albums/js/album-stack.js +862 -862
  25. extensions/albums/public/class-foogallery-album-template-loader.php +184 -184
  26. extensions/albums/public/class-rewrite-rules.php +16 -16
  27. extensions/albums/public/class-shortcodes.php +48 -48
  28. extensions/default-templates/class-default-templates-extension.php +13 -13
  29. extensions/default-templates/class-default-templates.php +52 -52
  30. extensions/default-templates/default/class-default-gallery-template.php +219 -202
  31. extensions/default-templates/default/gallery-default.php +18 -22
  32. extensions/default-templates/default/js/admin-gallery-default.js +88 -88
  33. extensions/default-templates/functions.php +22 -22
  34. extensions/default-templates/image-viewer/class-image-viewer-gallery-template.php +297 -279
  35. extensions/default-templates/image-viewer/gallery-image-viewer.php +33 -42
  36. extensions/default-templates/image-viewer/js/admin-gallery-image-viewer.js +122 -122
  37. extensions/default-templates/justified/class-justified-gallery-template.php +269 -250
  38. extensions/default-templates/justified/gallery-justified.php +15 -21
  39. extensions/default-templates/masonry/class-masonry-gallery-template.php +330 -265
  40. extensions/default-templates/masonry/gallery-masonry.php +21 -25
  41. extensions/default-templates/masonry/js/admin-gallery-masonry.js +29 -29
  42. extensions/default-templates/shared/css/admin-foogallery.css +77 -77
  43. extensions/default-templates/shared/css/foogallery.css +2409 -2313
  44. extensions/default-templates/shared/css/foogallery.min.css +1 -1
  45. extensions/default-templates/shared/js/foogallery.js +0 -4318
Gruntfile.js CHANGED
@@ -1,212 +1,212 @@
1
- module.exports = function (grunt) {
2
-
3
- require('load-grunt-tasks')(grunt);
4
-
5
- // Project configuration.
6
- grunt.initConfig({
7
- pkg: grunt.file.readJSON('package.json'),
8
- uglify: {
9
- options: {
10
- compress: {
11
- global_defs: {
12
- "EO_SCRIPT_DEBUG": false
13
- },
14
- dead_code: true
15
- },
16
- banner: '/*! <%= pkg.name %> <%= pkg.version %> <%= grunt.template.today("yyyy-mm-dd HH:MM") %> */\n'
17
- },
18
- build: {
19
- files: [
20
- {
21
- expand: true, // Enable dynamic expansion.
22
- src: ['extensions/default-templates/js/*.js', '!extensions/default-templates/js/*.min.js' ], // Actual pattern(s) to match.
23
- ext: '.min.js' // Dest filepaths will have this extension.
24
- }
25
- ]
26
- }
27
- },
28
- jshint: {
29
- options: {
30
- reporter: require('jshint-stylish'),
31
- globals: {
32
- "EO_SCRIPT_DEBUG": false
33
- },
34
- '-W099': true, //Mixed spaces and tabs
35
- '-W083': true, //TODO Fix functions within loop
36
- '-W082': true, //Todo Function declarations should not be placed in blocks
37
- '-W020': true //Read only - error when assigning EO_SCRIPT_DEBUG a value.
38
- },
39
- all: [ 'js/*.js', '!js/*.min.js' ]
40
- },
41
-
42
- compress: {
43
- //Compress build/foogallery
44
- main: {
45
- options: {
46
- mode: 'zip',
47
- archive: './dist/foogallery.zip'
48
- },
49
- expand: true,
50
- cwd: 'dist/foogallery/',
51
- src: ['**/*'],
52
- dest: 'foogallery/'
53
- },
54
- version: {
55
- options: {
56
- mode: 'zip',
57
- archive: './dist/foogallery-<%= pkg.version %>.zip'
58
- },
59
- expand: true,
60
- cwd: 'dist/foogallery/',
61
- src: ['**/*'],
62
- dest: 'foogallery/'
63
- }
64
- },
65
-
66
- clean: {
67
- //Clean up build folder
68
- main: ['dist/foogallery']
69
- },
70
-
71
- copy: {
72
- // Copy the plugin to a versioned release directory
73
- main: {
74
- src: [
75
- '**',
76
- '!node_modules/**',
77
- '!dist/**',
78
- '!.git/**',
79
- '!vendor/**',
80
- '!Gruntfile.js',
81
- '!package.json',
82
- '!.gitignore',
83
- '!.gitmodules',
84
- '!*~',
85
- '!CONTRIBUTING.md'
86
- ],
87
- dest: 'dist/foogallery/'
88
- }
89
- },
90
-
91
- wp_readme_to_markdown: {
92
- convert: {
93
- files: {
94
- 'readme.md': 'readme.txt'
95
- }
96
- },
97
- options : {
98
- banner: 'https://s3.amazonaws.com/foogallery/banner-772x250.jpg',
99
- afterBannerMarkdown: '[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/fooplugins/foogallery/badges/quality-score.png?b=develop)](https://scrutinizer-ci.com/g/fooplugins/foogallery/?branch=develop)',
100
- screenshots: {
101
- enabled: true,
102
- prefix: 'https://s3.amazonaws.com/foogallery/screenshot-',
103
- suffix: '.jpg'
104
- }
105
- }
106
- },
107
-
108
- checkrepo: {
109
- deploy: {
110
- tag: {
111
- eq: '<%= pkg.version %>' // Check if highest repo tag is equal to pkg.version
112
- },
113
- tagged: true, // Check if last repo commit (HEAD) is not tagged
114
- clean: true // Check if the repo working directory is clean
115
- }
116
- },
117
-
118
- watch: {
119
- readme: {
120
- files: ['readme.txt'],
121
- tasks: ['wp_readme_to_markdown'],
122
- options: {
123
- spawn: false
124
- }
125
- },
126
- scripts: {
127
- files: ['js/*.js'],
128
- tasks: ['newer:jshint', 'newer:uglify'],
129
- options: {
130
- spawn: false
131
- }
132
- }
133
- },
134
-
135
- wp_deploy: {
136
- deploy: {
137
- options: {
138
- svn_user: 'bradvin',
139
- plugin_slug: 'foogallery',
140
- build_dir: 'dist/foogallery/'
141
- }
142
- }
143
- },
144
-
145
- po2mo: {
146
- files: {
147
- src: 'languages/*.po',
148
- expand: true
149
- }
150
- },
151
-
152
- pot: {
153
- options: {
154
- text_domain: 'foogallery',
155
- dest: 'languages/',
156
- keywords: ['__', '_e', 'esc_html__', 'esc_html_e', 'esc_attr__', 'esc_attr_e', 'esc_attr_x', 'esc_html_x', 'ngettext', '_n', '_ex', '_nx' ]
157
- },
158
- files: {
159
- src: [
160
- '**/*.php',
161
- '!node_modules/**',
162
- '!dist/**',
163
- '!vendor/**',
164
- '!*~'
165
- ],
166
- expand: true
167
- }
168
- },
169
-
170
- checktextdomain: {
171
- options: {
172
- text_domain: 'foogallery',
173
- keywords: ['__:1,2d',
174
- '_e:1,2d',
175
- '_x:1,2c,3d',
176
- 'esc_html__:1,2d',
177
- 'esc_html_e:1,2d',
178
- 'esc_html_x:1,2c,3d',
179
- 'esc_attr__:1,2d',
180
- 'esc_attr_e:1,2d',
181
- 'esc_attr_x:1,2c,3d',
182
- '_ex:1,2c,3d',
183
- '_n:1,2,4d',
184
- '_nx:1,2,4c,5d',
185
- '_n_noop:1,2,3d',
186
- '_nx_noop:1,2,3c,4d'
187
- ]
188
- },
189
- files: {
190
- src: [
191
- '**/*.php',
192
- '!node_modules/**',
193
- '!dist/**',
194
- '!vendor/**',
195
- '!*~',
196
- '!includes/foopluginbase/**'
197
- ],
198
- expand: true
199
- }
200
- }
201
-
202
- });
203
-
204
- grunt.registerTask('readme', [ 'wp_readme_to_markdown' ]);
205
-
206
- grunt.registerTask('test', [ 'jshint' ]);
207
-
208
- grunt.registerTask('build', [ 'test', 'pot', 'newer:po2mo', 'wp_readme_to_markdown', 'clean', 'copy' ]);
209
-
210
- grunt.registerTask('deploy', [ 'checkbranch:master', 'checkrepo:deploy', 'build', 'wp_deploy', 'compress' ]);
211
-
212
- };
1
+ module.exports = function (grunt) {
2
+
3
+ require('load-grunt-tasks')(grunt);
4
+
5
+ // Project configuration.
6
+ grunt.initConfig({
7
+ pkg: grunt.file.readJSON('package.json'),
8
+ uglify: {
9
+ options: {
10
+ compress: {
11
+ global_defs: {
12
+ "EO_SCRIPT_DEBUG": false
13
+ },
14
+ dead_code: true
15
+ },
16
+ banner: '/*! <%= pkg.name %> <%= pkg.version %> <%= grunt.template.today("yyyy-mm-dd HH:MM") %> */\n'
17
+ },
18
+ build: {
19
+ files: [
20
+ {
21
+ expand: true, // Enable dynamic expansion.
22
+ src: ['extensions/default-templates/js/*.js', '!extensions/default-templates/js/*.min.js' ], // Actual pattern(s) to match.
23
+ ext: '.min.js' // Dest filepaths will have this extension.
24
+ }
25
+ ]
26
+ }
27
+ },
28
+ jshint: {
29
+ options: {
30
+ reporter: require('jshint-stylish'),
31
+ globals: {
32
+ "EO_SCRIPT_DEBUG": false
33
+ },
34
+ '-W099': true, //Mixed spaces and tabs
35
+ '-W083': true, //TODO Fix functions within loop
36
+ '-W082': true, //Todo Function declarations should not be placed in blocks
37
+ '-W020': true //Read only - error when assigning EO_SCRIPT_DEBUG a value.
38
+ },
39
+ all: [ 'js/*.js', '!js/*.min.js' ]
40
+ },
41
+
42
+ compress: {
43
+ //Compress build/foogallery
44
+ main: {
45
+ options: {
46
+ mode: 'zip',
47
+ archive: './dist/foogallery.zip'
48
+ },
49
+ expand: true,
50
+ cwd: 'dist/foogallery/',
51
+ src: ['**/*'],
52
+ dest: 'foogallery/'
53
+ },
54
+ version: {
55
+ options: {
56
+ mode: 'zip',
57
+ archive: './dist/foogallery-<%= pkg.version %>.zip'
58
+ },
59
+ expand: true,
60
+ cwd: 'dist/foogallery/',
61
+ src: ['**/*'],
62
+ dest: 'foogallery/'
63
+ }
64
+ },
65
+
66
+ clean: {
67
+ //Clean up build folder
68
+ main: ['dist/foogallery']
69
+ },
70
+
71
+ copy: {
72
+ // Copy the plugin to a versioned release directory
73
+ main: {
74
+ src: [
75
+ '**',
76
+ '!node_modules/**',
77
+ '!dist/**',
78
+ '!.git/**',
79
+ '!vendor/**',
80
+ '!Gruntfile.js',
81
+ '!package.json',
82
+ '!.gitignore',
83
+ '!.gitmodules',
84
+ '!*~',
85
+ '!CONTRIBUTING.md'
86
+ ],
87
+ dest: 'dist/foogallery/'
88
+ }
89
+ },
90
+
91
+ wp_readme_to_markdown: {
92
+ convert: {
93
+ files: {
94
+ 'readme.md': 'readme.txt'
95
+ }
96
+ },
97
+ options : {
98
+ banner: 'https://s3.amazonaws.com/foogallery/banner-772x250.jpg',
99
+ afterBannerMarkdown: '[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/fooplugins/foogallery/badges/quality-score.png?b=develop)](https://scrutinizer-ci.com/g/fooplugins/foogallery/?branch=develop)',
100
+ screenshots: {
101
+ enabled: true,
102
+ prefix: 'https://s3.amazonaws.com/foogallery/screenshot-',
103
+ suffix: '.jpg'
104
+ }
105
+ }
106
+ },
107
+
108
+ checkrepo: {
109
+ deploy: {
110
+ tag: {
111
+ eq: '<%= pkg.version %>' // Check if highest repo tag is equal to pkg.version
112
+ },
113
+ tagged: true, // Check if last repo commit (HEAD) is not tagged
114
+ clean: true // Check if the repo working directory is clean
115
+ }
116
+ },
117
+
118
+ watch: {
119
+ readme: {
120
+ files: ['readme.txt'],
121
+ tasks: ['wp_readme_to_markdown'],
122
+ options: {
123
+ spawn: false
124
+ }
125
+ },
126
+ scripts: {
127
+ files: ['js/*.js'],
128
+ tasks: ['newer:jshint', 'newer:uglify'],
129
+ options: {
130
+ spawn: false
131
+ }
132
+ }
133
+ },
134
+
135
+ wp_deploy: {
136
+ deploy: {
137
+ options: {
138
+ svn_user: 'bradvin',
139
+ plugin_slug: 'foogallery',
140
+ build_dir: 'dist/foogallery/'
141
+ }
142
+ }
143
+ },
144
+
145
+ po2mo: {
146
+ files: {
147
+ src: 'languages/*.po',
148
+ expand: true
149
+ }
150
+ },
151
+
152
+ pot: {
153
+ options: {
154
+ text_domain: 'foogallery',
155
+ dest: 'languages/',
156
+ keywords: ['__', '_e', 'esc_html__', 'esc_html_e', 'esc_attr__', 'esc_attr_e', 'esc_attr_x', 'esc_html_x', 'ngettext', '_n', '_ex', '_nx' ]
157
+ },
158
+ files: {
159
+ src: [
160
+ '**/*.php',
161
+ '!node_modules/**',
162
+ '!dist/**',
163
+ '!vendor/**',
164
+ '!*~'
165
+ ],
166
+ expand: true
167
+ }
168
+ },
169
+
170
+ checktextdomain: {
171
+ options: {
172
+ text_domain: 'foogallery',
173
+ keywords: ['__:1,2d',
174
+ '_e:1,2d',
175
+ '_x:1,2c,3d',
176
+ 'esc_html__:1,2d',
177
+ 'esc_html_e:1,2d',
178
+ 'esc_html_x:1,2c,3d',
179
+ 'esc_attr__:1,2d',
180
+ 'esc_attr_e:1,2d',
181
+ 'esc_attr_x:1,2c,3d',
182
+ '_ex:1,2c,3d',
183
+ '_n:1,2,4d',
184
+ '_nx:1,2,4c,5d',
185
+ '_n_noop:1,2,3d',
186
+ '_nx_noop:1,2,3c,4d'
187
+ ]
188
+ },
189
+ files: {
190
+ src: [
191
+ '**/*.php',
192
+ '!node_modules/**',
193
+ '!dist/**',
194
+ '!vendor/**',
195
+ '!*~',
196
+ '!includes/foopluginbase/**'
197
+ ],
198
+ expand: true
199
+ }
200
+ }
201
+
202
+ });
203
+
204
+ grunt.registerTask('readme', [ 'wp_readme_to_markdown' ]);
205
+
206
+ grunt.registerTask('test', [ 'jshint' ]);
207
+
208
+ grunt.registerTask('build', [ 'test', 'pot', 'newer:po2mo', 'wp_readme_to_markdown', 'clean', 'copy' ]);
209
+
210
+ grunt.registerTask('deploy', [ 'checkbranch:master', 'checkrepo:deploy', 'build', 'wp_deploy', 'compress' ]);
211
+
212
+ };
LICENSE.txt CHANGED
@@ -1,339 +1,339 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 2, June 1991
3
-
4
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
- Everyone is permitted to copy and distribute verbatim copies
7
- of this license document, but changing it is not allowed.
8
-
9
- Preamble
10
-
11
- The licenses for most software are designed to take away your
12
- freedom to share and change it. By contrast, the GNU General Public
13
- License is intended to guarantee your freedom to share and change free
14
- software--to make sure the software is free for all its users. This
15
- General Public License applies to most of the Free Software
16
- Foundation's software and to any other program whose authors commit to
17
- using it. (Some other Free Software Foundation software is covered by
18
- the GNU Lesser General Public License instead.) You can apply it to
19
- your programs, too.
20
-
21
- When we speak of free software, we are referring to freedom, not
22
- price. Our General Public Licenses are designed to make sure that you
23
- have the freedom to distribute copies of free software (and charge for
24
- this service if you wish), that you receive source code or can get it
25
- if you want it, that you can change the software or use pieces of it
26
- in new free programs; and that you know you can do these things.
27
-
28
- To protect your rights, we need to make restrictions that forbid
29
- anyone to deny you these rights or to ask you to surrender the rights.
30
- These restrictions translate to certain responsibilities for you if you
31
- distribute copies of the software, or if you modify it.
32
-
33
- For example, if you distribute copies of such a program, whether
34
- gratis or for a fee, you must give the recipients all the rights that
35
- you have. You must make sure that they, too, receive or can get the
36
- source code. And you must show them these terms so they know their
37
- rights.
38
-
39
- We protect your rights with two steps: (1) copyright the software, and
40
- (2) offer you this license which gives you legal permission to copy,
41
- distribute and/or modify the software.
42
-
43
- Also, for each author's protection and ours, we want to make certain
44
- that everyone understands that there is no warranty for this free
45
- software. If the software is modified by someone else and passed on, we
46
- want its recipients to know that what they have is not the original, so
47
- that any problems introduced by others will not reflect on the original
48
- authors' reputations.
49
-
50
- Finally, any free program is threatened constantly by software
51
- patents. We wish to avoid the danger that redistributors of a free
52
- program will individually obtain patent licenses, in effect making the
53
- program proprietary. To prevent this, we have made it clear that any
54
- patent must be licensed for everyone's free use or not licensed at all.
55
-
56
- The precise terms and conditions for copying, distribution and
57
- modification follow.
58
-
59
- GNU GENERAL PUBLIC LICENSE
60
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
-
62
- 0. This License applies to any program or other work which contains
63
- a notice placed by the copyright holder saying it may be distributed
64
- under the terms of this General Public License. The "Program", below,
65
- refers to any such program or work, and a "work based on the Program"
66
- means either the Program or any derivative work under copyright law:
67
- that is to say, a work containing the Program or a portion of it,
68
- either verbatim or with modifications and/or translated into another
69
- language. (Hereinafter, translation is included without limitation in
70
- the term "modification".) Each licensee is addressed as "you".
71
-
72
- Activities other than copying, distribution and modification are not
73
- covered by this License; they are outside its scope. The act of
74
- running the Program is not restricted, and the output from the Program
75
- is covered only if its contents constitute a work based on the
76
- Program (independent of having been made by running the Program).
77
- Whether that is true depends on what the Program does.
78
-
79
- 1. You may copy and distribute verbatim copies of the Program's
80
- source code as you receive it, in any medium, provided that you
81
- conspicuously and appropriately publish on each copy an appropriate
82
- copyright notice and disclaimer of warranty; keep intact all the
83
- notices that refer to this License and to the absence of any warranty;
84
- and give any other recipients of the Program a copy of this License
85
- along with the Program.
86
-
87
- You may charge a fee for the physical act of transferring a copy, and
88
- you may at your option offer warranty protection in exchange for a fee.
89
-
90
- 2. You may modify your copy or copies of the Program or any portion
91
- of it, thus forming a work based on the Program, and copy and
92
- distribute such modifications or work under the terms of Section 1
93
- above, provided that you also meet all of these conditions:
94
-
95
- a) You must cause the modified files to carry prominent notices
96
- stating that you changed the files and the date of any change.
97
-
98
- b) You must cause any work that you distribute or publish, that in
99
- whole or in part contains or is derived from the Program or any
100
- part thereof, to be licensed as a whole at no charge to all third
101
- parties under the terms of this License.
102
-
103
- c) If the modified program normally reads commands interactively
104
- when run, you must cause it, when started running for such
105
- interactive use in the most ordinary way, to print or display an
106
- announcement including an appropriate copyright notice and a
107
- notice that there is no warranty (or else, saying that you provide
108
- a warranty) and that users may redistribute the program under
109
- these conditions, and telling the user how to view a copy of this
110
- License. (Exception: if the Program itself is interactive but
111
- does not normally print such an announcement, your work based on
112
- the Program is not required to print an announcement.)
113
-
114
- These requirements apply to the modified work as a whole. If
115
- identifiable sections of that work are not derived from the Program,
116
- and can be reasonably considered independent and separate works in
117
- themselves, then this License, and its terms, do not apply to those
118
- sections when you distribute them as separate works. But when you
119
- distribute the same sections as part of a whole which is a work based
120
- on the Program, the distribution of the whole must be on the terms of
121
- this License, whose permissions for other licensees extend to the
122
- entire whole, and thus to each and every part regardless of who wrote it.
123
-
124
- Thus, it is not the intent of this section to claim rights or contest
125
- your rights to work written entirely by you; rather, the intent is to
126
- exercise the right to control the distribution of derivative or
127
- collective works based on the Program.
128
-
129
- In addition, mere aggregation of another work not based on the Program
130
- with the Program (or with a work based on the Program) on a volume of
131
- a storage or distribution medium does not bring the other work under
132
- the scope of this License.
133
-
134
- 3. You may copy and distribute the Program (or a work based on it,
135
- under Section 2) in object code or executable form under the terms of
136
- Sections 1 and 2 above provided that you also do one of the following:
137
-
138
- a) Accompany it with the complete corresponding machine-readable
139
- source code, which must be distributed under the terms of Sections
140
- 1 and 2 above on a medium customarily used for software interchange; or,
141
-
142
- b) Accompany it with a written offer, valid for at least three
143
- years, to give any third party, for a charge no more than your
144
- cost of physically performing source distribution, a complete
145
- machine-readable copy of the corresponding source code, to be
146
- distributed under the terms of Sections 1 and 2 above on a medium
147
- customarily used for software interchange; or,
148
-
149
- c) Accompany it with the information you received as to the offer
150
- to distribute corresponding source code. (This alternative is
151
- allowed only for noncommercial distribution and only if you
152
- received the program in object code or executable form with such
153
- an offer, in accord with Subsection b above.)
154
-
155
- The source code for a work means the preferred form of the work for
156
- making modifications to it. For an executable work, complete source
157
- code means all the source code for all modules it contains, plus any
158
- associated interface definition files, plus the scripts used to
159
- control compilation and installation of the executable. However, as a
160
- special exception, the source code distributed need not include
161
- anything that is normally distributed (in either source or binary
162
- form) with the major components (compiler, kernel, and so on) of the
163
- operating system on which the executable runs, unless that component
164
- itself accompanies the executable.
165
-
166
- If distribution of executable or object code is made by offering
167
- access to copy from a designated place, then offering equivalent
168
- access to copy the source code from the same place counts as
169
- distribution of the source code, even though third parties are not
170
- compelled to copy the source along with the object code.
171
-
172
- 4. You may not copy, modify, sublicense, or distribute the Program
173
- except as expressly provided under this License. Any attempt
174
- otherwise to copy, modify, sublicense or distribute the Program is
175
- void, and will automatically terminate your rights under this License.
176
- However, parties who have received copies, or rights, from you under
177
- this License will not have their licenses terminated so long as such
178
- parties remain in full compliance.
179
-
180
- 5. You are not required to accept this License, since you have not
181
- signed it. However, nothing else grants you permission to modify or
182
- distribute the Program or its derivative works. These actions are
183
- prohibited by law if you do not accept this License. Therefore, by
184
- modifying or distributing the Program (or any work based on the
185
- Program), you indicate your acceptance of this License to do so, and
186
- all its terms and conditions for copying, distributing or modifying
187
- the Program or works based on it.
188
-
189
- 6. Each time you redistribute the Program (or any work based on the
190
- Program), the recipient automatically receives a license from the
191
- original licensor to copy, distribute or modify the Program subject to
192
- these terms and conditions. You may not impose any further
193
- restrictions on the recipients' exercise of the rights granted herein.
194
- You are not responsible for enforcing compliance by third parties to
195
- this License.
196
-
197
- 7. If, as a consequence of a court judgment or allegation of patent
198
- infringement or for any other reason (not limited to patent issues),
199
- conditions are imposed on you (whether by court order, agreement or
200
- otherwise) that contradict the conditions of this License, they do not
201
- excuse you from the conditions of this License. If you cannot
202
- distribute so as to satisfy simultaneously your obligations under this
203
- License and any other pertinent obligations, then as a consequence you
204
- may not distribute the Program at all. For example, if a patent
205
- license would not permit royalty-free redistribution of the Program by
206
- all those who receive copies directly or indirectly through you, then
207
- the only way you could satisfy both it and this License would be to
208
- refrain entirely from distribution of the Program.
209
-
210
- If any portion of this section is held invalid or unenforceable under
211
- any particular circumstance, the balance of the section is intended to
212
- apply and the section as a whole is intended to apply in other
213
- circumstances.
214
-
215
- It is not the purpose of this section to induce you to infringe any
216
- patents or other property right claims or to contest validity of any
217
- such claims; this section has the sole purpose of protecting the
218
- integrity of the free software distribution system, which is
219
- implemented by public license practices. Many people have made
220
- generous contributions to the wide range of software distributed
221
- through that system in reliance on consistent application of that
222
- system; it is up to the author/donor to decide if he or she is willing
223
- to distribute software through any other system and a licensee cannot
224
- impose that choice.
225
-
226
- This section is intended to make thoroughly clear what is believed to
227
- be a consequence of the rest of this License.
228
-
229
- 8. If the distribution and/or use of the Program is restricted in
230
- certain countries either by patents or by copyrighted interfaces, the
231
- original copyright holder who places the Program under this License
232
- may add an explicit geographical distribution limitation excluding
233
- those countries, so that distribution is permitted only in or among
234
- countries not thus excluded. In such case, this License incorporates
235
- the limitation as if written in the body of this License.
236
-
237
- 9. The Free Software Foundation may publish revised and/or new versions
238
- of the General Public License from time to time. Such new versions will
239
- be similar in spirit to the present version, but may differ in detail to
240
- address new problems or concerns.
241
-
242
- Each version is given a distinguishing version number. If the Program
243
- specifies a version number of this License which applies to it and "any
244
- later version", you have the option of following the terms and conditions
245
- either of that version or of any later version published by the Free
246
- Software Foundation. If the Program does not specify a version number of
247
- this License, you may choose any version ever published by the Free Software
248
- Foundation.
249
-
250
- 10. If you wish to incorporate parts of the Program into other free
251
- programs whose distribution conditions are different, write to the author
252
- to ask for permission. For software which is copyrighted by the Free
253
- Software Foundation, write to the Free Software Foundation; we sometimes
254
- make exceptions for this. Our decision will be guided by the two goals
255
- of preserving the free status of all derivatives of our free software and
256
- of promoting the sharing and reuse of software generally.
257
-
258
- NO WARRANTY
259
-
260
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
- PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
- OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
- TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
- REPAIR OR CORRECTION.
269
-
270
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
- OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
- TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
- YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
- PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
- POSSIBILITY OF SUCH DAMAGES.
279
-
280
- END OF TERMS AND CONDITIONS
281
-
282
- How to Apply These Terms to Your New Programs
283
-
284
- If you develop a new program, and you want it to be of the greatest
285
- possible use to the public, the best way to achieve this is to make it
286
- free software which everyone can redistribute and change under these terms.
287
-
288
- To do so, attach the following notices to the program. It is safest
289
- to attach them to the start of each source file to most effectively
290
- convey the exclusion of warranty; and each file should have at least
291
- the "copyright" line and a pointer to where the full notice is found.
292
-
293
- <one line to give the program's name and a brief idea of what it does.>
294
- Copyright (C) <year> <name of author>
295
-
296
- This program is free software; you can redistribute it and/or modify
297
- it under the terms of the GNU General Public License as published by
298
- the Free Software Foundation; either version 2 of the License, or
299
- (at your option) any later version.
300
-
301
- This program is distributed in the hope that it will be useful,
302
- but WITHOUT ANY WARRANTY; without even the implied warranty of
303
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
- GNU General Public License for more details.
305
-
306
- You should have received a copy of the GNU General Public License along
307
- with this program; if not, write to the Free Software Foundation, Inc.,
308
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
-
310
- Also add information on how to contact you by electronic and paper mail.
311
-
312
- If the program is interactive, make it output a short notice like this
313
- when it starts in an interactive mode:
314
-
315
- Gnomovision version 69, Copyright (C) year name of author
316
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
- This is free software, and you are welcome to redistribute it
318
- under certain conditions; type `show c' for details.
319
-
320
- The hypothetical commands `show w' and `show c' should show the appropriate
321
- parts of the General Public License. Of course, the commands you use may
322
- be called something other than `show w' and `show c'; they could even be
323
- mouse-clicks or menu items--whatever suits your program.
324
-
325
- You should also get your employer (if you work as a programmer) or your
326
- school, if any, to sign a "copyright disclaimer" for the program, if
327
- necessary. Here is a sample; alter the names:
328
-
329
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
-
332
- <signature of Ty Coon>, 1 April 1989
333
- Ty Coon, President of Vice
334
-
335
- This General Public License does not permit incorporating your program into
336
- proprietary programs. If your program is a subroutine library, you may
337
- consider it more useful to permit linking proprietary applications with the
338
- library. If this is what you want to do, use the GNU Lesser General
339
  Public License instead of this License.
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
  Public License instead of this License.
README.md CHANGED
@@ -1,363 +1,363 @@
1
- ![Plugin Banner](https://s3.amazonaws.com/foogallery/banner-772x250.jpg)
2
-
3
- [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/fooplugins/foogallery/badges/quality-score.png?b=develop)](https://scrutinizer-ci.com/g/fooplugins/foogallery/?branch=develop)
4
- # FooGallery - Image Gallery WordPress Plugin #
5
- **Contributors:** bradvin, steveush, fooplugins
6
-
7
- **Donate link:** http://fooplugins.com
8
-
9
- **Tags:** gallery, image gallery, photo gallery, responsive, album, media gallery, masonry gallery, portfolio, justified image gallery, video gallery, photography, photographer, retina
10
-
11
- **Requires at least:** 3.9
12
-
13
- **Tested up to:** 4.8.3
14
-
15
- **Stable tag:** trunk
16
-
17
- **License:** GPLv2 or later
18
-
19
- **License URI:** http://www.gnu.org/licenses/gpl-2.0.html
20
-
21
- FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use.
22
-
23
- ## Description ##
24
-
25
- FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use. Built to be highly configurable and extensible for developers or freelancers.
26
-
27
- [View the Foo Gallery Homepage & DEMO](http://foo.gallery/)
28
-
29
- **Major changes in 1.4.1!**
30
-
31
- There have been major updates to the gallery templates in v1.4.1. If you have updated, please test your galleries.
32
-
33
- **Retina Support**
34
-
35
- Foo Gallery now comes with built-in support for higher quality thumbnails on retina-enabled displays. No more blurry thumbnails, just crisp thumbnails that look amazing on all devices.
36
-
37
- **Video Support**
38
-
39
- Foo Gallery now supports the creation of video galleries with the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)! Create galleries with both images and videos mixed!
40
-
41
- **Albums Built In**
42
-
43
- Albums are now built in as an extension. Simply head over to the extensions page and activate the albums extension. A new menu item will appear that allows you to add albums just as easily as galleries.
44
-
45
- **Built For Developers**
46
-
47
- Foo Gallery was designed to be the most developer-friendly gallery plugin available for WordPress. It was also built on top of a solid extension framework, which means different functionality is separated out into different areas in the codebase. It also means the core plugin is lightweight, but still allowing for the most flexibility.
48
-
49
- **Features**
50
-
51
- * Retina thumbnail support
52
- * Add videos to galleries (via the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo))
53
- * Albums built-in! (Activate the albums extension)
54
- * Gallery custom post type
55
- * Use built-in media library to manage images
56
- * Drag n Drop reordering of images and galleries
57
- * Built-in gallery templates
58
- * Built-in support for FooBox
59
- * Built-in Extensions Store
60
- * Built on an extension framework
61
- * Custom CSS for both galleries and albums
62
- * Copy to clipboard shortcodes
63
- * Visual shortcodes in rich text editor
64
- * Gallery picker to insert shortcode
65
- * Page usage metabox with one-click gallery page creation
66
- * NextGen importer tool (albums and galleries)
67
- * Multisite Support
68
- * plus many, many more
69
-
70
- **Gallery Demos**
71
-
72
- * Responsive Image Gallery - [demo](http://foo.gallery/demos/responsive-image-gallery/)
73
- * FooGrid Image Gallery - [light demo](http://foo.gallery/demos/foogrid-light/) - [dark demo](http://foo.gallery/demos/foogrid-dark/)
74
- * Image Viewer Gallery - [light demo](http://foo.gallery/demos/image-viewer-gallery/) - [dark demo](http://foo.gallery/demos/image-viewer-gallery-dark/)
75
- * Masonry Gallery - [demo](http://foo.gallery/demos/masonry-image-gallery/)
76
- * Simple Portfolio - [demo](http://foo.gallery/demos/simple-portfolio/)
77
- * Justified Gallery ([http://miromannino.github.io/Justified-Gallery](http://miromannino.github.io/Justified-Gallery/)) - [demo](http://foo.gallery/demos/justified-gallery/)
78
- * Single Thumbnail Gallery - [demo](http://foo.gallery/demos/single-thumbnail-gallery/)
79
- * Polaroid Gallery - [demo](http://foo.gallery/demos/polaroid-image-gallery/)
80
- * Cube Gallery - [demo](http://foo.gallery/demos/cube-gallery/) - [Buy Now!](http://fooplugins.com/plugins/cube-gallery-template/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
81
- * Mixed (Images + Videos) - [demo](http://foo.gallery/demos/mixed/)
82
-
83
- **Caption Demos**
84
-
85
- * Simple Hover Captions - [demo](http://foo.gallery/demos/captions-simple-hover/)
86
- * Always Visible Captions - [demo](http://foo.gallery/demos/responsive-image-gallery-captions/)
87
- * Drop Captions - [demo](http://foo.gallery/demos/captions-drop/)
88
- * Fade Captions - [demo](http://foo.gallery/demos/captions-fade/)
89
- * Push Captions - [demo](http://foo.gallery/demos/captions-push/)
90
-
91
- **Album Demos**
92
-
93
- * Responsive Album Layout - [demo](http://foo.gallery/demos/responsive-album-layout/)
94
- * All-in-one Stack Album - [demo](http://foo.gallery/demos/all-in-one-stack-album/)
95
-
96
- **Videos Demos**
97
-
98
- * Vertical Video Slider - [demo](http://foo.gallery/demos/video-slider-vertical/) - [full-width demo](http://foo.gallery/demos/video-slider-vertical-full-width/)
99
- * Horizontal Video Slider - [demo](http://foo.gallery/demos/video-slider-horizontal/) - [custom colors](http://foo.gallery/demos/video-slider-custom-theme/)
100
-
101
- **Extensions**
102
-
103
- * [FooVideo](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
104
- * Albums (bundled)
105
- * Default Gallery Templates (bundled)
106
- * NextGen Gallery and Album Importer (bundled)
107
- * [FooGrid Gallery](http://fooplugins.com/plugins/foogrid/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
108
- * [Cube Gallery](http://fooplugins.com/plugins/cube-gallery-template/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
109
- * [Custom Branding](http://fooplugins.com/plugins/foogallery-branding/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
110
- * [FooBox PRO Lightbox](http://fooplugins.com/plugins/foobox/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
111
- * [FooBox FREE Lightbox](http://wordpress.org/plugins/foobox-image-lightbox)
112
- * [Owl Carousel Template](http://wordpress.org/plugins/foogallery-owl-carousel-template/)
113
- * [ZOOM Template](http://wordpress.org/plugins/foogallery-zoom-template/)
114
- * [Thirsty Affiliates](http://wordpress.org/plugins/thirstyaffiliates-for-foogallery-extension/)
115
- * [Polaroid Template](https://github.com/fooplugins/foogallery-polaroid-template)
116
- * [Use Media Menu](https://github.com/fooplugins/foogallery-media-menu)
117
- * Build your own!!!
118
-
119
- **Documentation**
120
-
121
- * [FooGallery 101](http://docs.fooplugins.com/foogallery/foogallery-101/)
122
- * [Developer 101](http://docs.fooplugins.com/foogallery/foogallery-developers-101/)
123
- * [Actions and Filters](http://docs.fooplugins.com/foogallery/actions-filters/)
124
-
125
- **Contribute**
126
-
127
- FooGallery is hosted on [GitHub](https://github.com/fooplugins/foogallery). If you find a bug, please [create an issue](https://github.com/fooplugins/foogallery/issues).
128
-
129
- ## Installation ##
130
-
131
- 1. Upload `foogallery` folder to the `/wp-content/plugins/` directory
132
- 2. Activate the plugin through the 'Plugins' menu in WordPress
133
- 3. You will be redirected to the FooGallery Help page to get your started
134
-
135
- ## Frequently Asked Questions ##
136
-
137
- ### Why are my thumbnails so blurry? ###
138
-
139
- Have you enabled retina support for your galleries? Displays with retina support can show better quality thumbnails when retina support is enabled. To enable retina support, edit the gallery and locate the Retina Support metabox.
140
-
141
- ### Can I add videos to my galleries? ###
142
-
143
- Yes, you need to use the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
144
-
145
- ### How do I get albums working? ###
146
-
147
- Simply go to the FooGallery extensions page and activate the Albums extension. If you do not see a button to activate the albums extension, reload the extensions list by clicking the reload button.
148
-
149
- ### Can I build an extension? ###
150
-
151
- Hell, yes! Check out our [developer page](http://foo.gallery/developers/)
152
-
153
- ## Screenshots ##
154
-
155
- [View screenshots](https://wordpress.org/plugins/foogallery/screenshots/)
156
-
157
- ## Upgrade Notice ##
158
-
159
- Update now to support FooVideo and many other improvements!
160
-
161
- ## Changelog ##
162
-
163
- ### 1.4.5 ###
164
-
165
- * Fix : Lazy loading - scrolling galleries in certain scenarios were not loading thumbs
166
- * Fix : Galleries that were hidden on page load were not displaying correctly when shown
167
- * Fix : Default gallery settings were not being applied to new galleries
168
- * New : shortcode arguments applied to gallery for common fields
169
- * New : HTML caching is disabled by default now!
170
- * Updated to latest client side JS and CSS
171
-
172
- ### 1.4.4 ###
173
-
174
- * Fix : upgrade was calling underfined function
175
-
176
- ### 1.4.3 ###
177
-
178
- * Fix : Justify gallery template issues
179
- * Fix : Masonry gallery template issues
180
- * Fix : Caption description not hidden when supposed to
181
- * Fix : Complete rework of thumbnail dimension logic!
182
- * Fix : Redirection bug on activation
183
- * Fix : Added checks for galleries causing PHP warnings
184
- * New : Last Row setting in Justify gallery template
185
- * New : Alignment setting in Simple Portfolio gallery template
186
- * New : Added more checks after load to ensure gallery layout is correct
187
- * Updated to Freemius SDK 1.2.2.10
188
- * Updated to latest client side JS and CSS
189
-
190
- ### 1.3.28 ###
191
-
192
- * Complete rewrite of the built-in gallery templates
193
- * New : lazy loading
194
- * New : simple pagination
195
- * New : Live Previews when editing a gallery
196
- * 260+ updates, changes and bug fixes
197
-
198
- ### 1.3.8 ###
199
-
200
- * New : Built in support for FooBox, fixing a lot of issues where FooBox option is not available
201
- * Fix : More reliable extension active status on extensions listing
202
- * Fix : More obvious wording for 3rd party plugins when they are not installed
203
-
204
- ### 1.3.7 ###
205
-
206
- * Fix : Activation redirect bug showing "Sorry, you are not allowed to access this page."
207
-
208
- ### 1.3.6 ###
209
-
210
- * New : Freemius integration!
211
- * New : Added support for the Responsive Lightbox by dFactory
212
- * New : New custom class field for an attachment
213
- * New : Added more system info for better debugging when there are server issues
214
- * Fix : Visual editor FooGallery edit button
215
- * Fix : Image Viewer hover effect none now works as expected
216
- * Fix : Disable HTML caching for randomly ordered galleries
217
-
218
- ### 1.2.20 ###
219
-
220
- * New : Force Use Original thumb setting on gallery edit page
221
- * Fix : PHP warning from thumbnail class since 1.2.19
222
-
223
- ### 1.2.19 ###
224
-
225
- * New : Gallery output caching! Saves database requests improving load time
226
- * New : Gallery usage column in admin gallery listing
227
- * New : Better support for animated gifs
228
- * New : Hover icons retina support
229
- * New : Uninstall button on settings
230
- * New : Save thumb dimensions per attachment. (needed in future versions)
231
- * Fix : Extensions refactor and many issues resolved
232
- * Fix : Better retina support for all templates
233
- * Fix : Colorize / Greyscale CSS filters
234
- * Fix : Even better wpthumb compatibility
235
-
236
- ### 1.2.18 ###
237
-
238
- * Fix : Handle no settings in retina metabox
239
-
240
- ### 1.2.17 ###
241
-
242
- * New : Retina support - metabox per gallery and default settings
243
- * New : Attachment datasources - backend changes for how images are used in a gallery. (This will allow for new external sources in the future)
244
- * New : Caption color settings in Simple portfolio gallery template
245
- * New : Updated to latest Justified Gallery
246
- * Fix : Better wpthumb compatibility
247
-
248
- ### 1.2.16 ###
249
-
250
- * Fix : Yoast SEO Sitemaps fatal error with deleted galleries
251
- * Fix : Updating pages with deleted galleries throws php warnings
252
-
253
- ### 1.2.15 ###
254
-
255
- * Fix : Album admin CSS issues in WP 4.6
256
- * Fix : Masonry layout issues in WP 4.6
257
- * Fix : Media attachment fields not updating
258
- * Fix : Better support for IE10
259
- * New : Thumbnail generation test admin notice and settings
260
-
261
- ### 1.2.13 ###
262
-
263
- * Fix : Shortcode replacing content in visual editor
264
- * Fix : Gallery hover effect of None being ignored
265
- * New : ImageViewer language settings for 'Prev', 'Next' & 'of'
266
- * New : Setting to use original thumbnails if available
267
-
268
- ### 1.2.12 ###
269
-
270
- * Fix : Simple Portfolio missing captions fix
271
-
272
- ### 1.2.11 ###
273
-
274
- * Fix : Simple Portfolio undefined function fix
275
-
276
- ### 1.2.10 ###
277
-
278
- * New : support for multiple admin JS and CSS assets for gallery templates
279
- * New : Added setting to choose Caption Description source
280
- * New : Crop position can be chosen for attachments
281
- * New : Albums gallery details modal for setting a gallery URL
282
- * New : Better shortcode preview in editor
283
- * New : Editor button now supported if multiple editors exist
284
- * Fix : Better No-Link support for gallery templates
285
- * Fix : Compatible with Unyson plugin
286
- * Fix : Compatible with Advanced Custom Fields
287
- * Fix : Simple Portfolio fixes and tweaks
288
- * Fix : ImageViewer fixes and better browser compatibility
289
- * Fix : Changed assets enqueue version to rather use extension version
290
- * Fix : Album URL fix for permalinks with no trailing slashes
291
-
292
- ### 1.2.9 ###
293
- * New : Added Image Viewer gallery template
294
- * New : Caption support for default template
295
- * New : Yoast SEO gallery image support!
296
- * New : Responsive options for Masonry gallery
297
- * New : change gallery URL slug for albums
298
- * New : setting to turn off loading animation in default gallery
299
- * New : French translation
300
- * Fix : Support for WP 4.4
301
- * Fix : All templates - moved all jQuery ready events to vanilla JS
302
- * Fix : Many gallery template tweaks
303
- * Fix : allow no default to be chosen in settings
304
-
305
- ### 1.2.8 ###
306
- * Works now with Polylang translation plugin
307
- * CSS Updates & enhancements to all gallery templates
308
- * Password protected galleries now work as expected
309
- * Ability to hide WYSIWYG editor button
310
- * Updated WPThumb
311
- * Multiple bug fixes and improvements
312
-
313
- ### 1.2.7 ###
314
- * Bug fixes for 1.2.6 release
315
- * Added 2 new settings to Justified Gallery template (maxRowHeight + Caption Source)
316
-
317
- ### 1.2.6 ###
318
- * CSS load optimizations
319
- * Updates and tweaks on all built-in gallery templates
320
- * More robust extension loading
321
- * More robust upgrades to FooBox PRO
322
- * Improved copy-to-clipboard
323
- * Added more hover effects
324
- * Support for FooVideo
325
-
326
- ### 1.2.5 ###
327
- * Fix for extensions being empty
328
- * Added support for Multi-site
329
- * Added esc_url to all places where url is rendered
330
- * Updated to latest Justified Gallery v3.5.4
331
-
332
- ### 1.2.4 ###
333
- * Many album template updates, enhancements and fixes
334
- * Many gallery template tweaks and fixes
335
- * Sort order settings for galleries and albums
336
- * Added new Single Thumbnail Gallery template
337
-
338
- ### 1.2.1 ###
339
- * Added setting to choose default gallery to copy settings from
340
- * Fixed bug #45 - gallery fields not showing onload
341
- * replaced minicolors with spectrum colorpicker
342
- * Allow gallery fields to have a suffix
343
- * Added function to render galleries "foogallery_render_gallery( $gallery_id )"
344
-
345
- ### 1.2.0 ###
346
- * Added albums extension
347
- * Added custom CSS metaboxes
348
- * Updated Nextgen importer
349
- * Fixed many bugs
350
-
351
- ### 1.1.8.2 ###
352
- * Fixed "edit gallery" CSS with WP 4.0
353
-
354
- ### 1.1.8.1 ###
355
- * Fixed "insert gallery" CSS with WP 4.0
356
-
357
- ### 1.1.8 ###
358
- * Added 2 new gallery templates
359
- * Added 10+ actions and filters for more customization
360
- * Countless bug fixes and enhancements
361
-
362
- ### 1.1.7 ###
363
  * first version!
1
+ ![Plugin Banner](https://s3.amazonaws.com/foogallery/banner-772x250.jpg)
2
+
3
+ [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/fooplugins/foogallery/badges/quality-score.png?b=develop)](https://scrutinizer-ci.com/g/fooplugins/foogallery/?branch=develop)
4
+ # FooGallery - Image Gallery WordPress Plugin #
5
+ **Contributors:** bradvin, steveush, fooplugins
6
+
7
+ **Donate link:** http://fooplugins.com
8
+
9
+ **Tags:** gallery, image gallery, photo gallery, responsive, album, media gallery, masonry gallery, portfolio, justified image gallery, video gallery, photography, photographer, retina
10
+
11
+ **Requires at least:** 3.9
12
+
13
+ **Tested up to:** 4.8.3
14
+
15
+ **Stable tag:** trunk
16
+
17
+ **License:** GPLv2 or later
18
+
19
+ **License URI:** http://www.gnu.org/licenses/gpl-2.0.html
20
+
21
+ FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use.
22
+
23
+ ## Description ##
24
+
25
+ FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use. Built to be highly configurable and extensible for developers or freelancers.
26
+
27
+ [View the Foo Gallery Homepage & DEMO](http://foo.gallery/)
28
+
29
+ **Major changes in 1.4.1!**
30
+
31
+ There have been major updates to the gallery templates in v1.4.1. If you have updated, please test your galleries.
32
+
33
+ **Retina Support**
34
+
35
+ Foo Gallery now comes with built-in support for higher quality thumbnails on retina-enabled displays. No more blurry thumbnails, just crisp thumbnails that look amazing on all devices.
36
+
37
+ **Video Support**
38
+
39
+ Foo Gallery now supports the creation of video galleries with the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)! Create galleries with both images and videos mixed!
40
+
41
+ **Albums Built In**
42
+
43
+ Albums are now built in as an extension. Simply head over to the extensions page and activate the albums extension. A new menu item will appear that allows you to add albums just as easily as galleries.
44
+
45
+ **Built For Developers**
46
+
47
+ Foo Gallery was designed to be the most developer-friendly gallery plugin available for WordPress. It was also built on top of a solid extension framework, which means different functionality is separated out into different areas in the codebase. It also means the core plugin is lightweight, but still allowing for the most flexibility.
48
+
49
+ **Features**
50
+
51
+ * Retina thumbnail support
52
+ * Add videos to galleries (via the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo))
53
+ * Albums built-in! (Activate the albums extension)
54
+ * Gallery custom post type
55
+ * Use built-in media library to manage images
56
+ * Drag n Drop reordering of images and galleries
57
+ * Built-in gallery templates
58
+ * Built-in support for FooBox
59
+ * Built-in Extensions Store
60
+ * Built on an extension framework
61
+ * Custom CSS for both galleries and albums
62
+ * Copy to clipboard shortcodes
63
+ * Visual shortcodes in rich text editor
64
+ * Gallery picker to insert shortcode
65
+ * Page usage metabox with one-click gallery page creation
66
+ * NextGen importer tool (albums and galleries)
67
+ * Multisite Support
68
+ * plus many, many more
69
+
70
+ **Gallery Demos**
71
+
72
+ * Responsive Image Gallery - [demo](http://foo.gallery/demos/responsive-image-gallery/)
73
+ * FooGrid Image Gallery - [light demo](http://foo.gallery/demos/foogrid-light/) - [dark demo](http://foo.gallery/demos/foogrid-dark/)
74
+ * Image Viewer Gallery - [light demo](http://foo.gallery/demos/image-viewer-gallery/) - [dark demo](http://foo.gallery/demos/image-viewer-gallery-dark/)
75
+ * Masonry Gallery - [demo](http://foo.gallery/demos/masonry-image-gallery/)
76
+ * Simple Portfolio - [demo](http://foo.gallery/demos/simple-portfolio/)
77
+ * Justified Gallery ([http://miromannino.github.io/Justified-Gallery](http://miromannino.github.io/Justified-Gallery/)) - [demo](http://foo.gallery/demos/justified-gallery/)
78
+ * Single Thumbnail Gallery - [demo](http://foo.gallery/demos/single-thumbnail-gallery/)
79
+ * Polaroid Gallery - [demo](http://foo.gallery/demos/polaroid-image-gallery/)
80
+ * Cube Gallery - [demo](http://foo.gallery/demos/cube-gallery/) - [Buy Now!](http://fooplugins.com/plugins/cube-gallery-template/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
81
+ * Mixed (Images + Videos) - [demo](http://foo.gallery/demos/mixed/)
82
+
83
+ **Caption Demos**
84
+
85
+ * Simple Hover Captions - [demo](http://foo.gallery/demos/captions-simple-hover/)
86
+ * Always Visible Captions - [demo](http://foo.gallery/demos/responsive-image-gallery-captions/)
87
+ * Drop Captions - [demo](http://foo.gallery/demos/captions-drop/)
88
+ * Fade Captions - [demo](http://foo.gallery/demos/captions-fade/)
89
+ * Push Captions - [demo](http://foo.gallery/demos/captions-push/)
90
+
91
+ **Album Demos**
92
+
93
+ * Responsive Album Layout - [demo](http://foo.gallery/demos/responsive-album-layout/)
94
+ * All-in-one Stack Album - [demo](http://foo.gallery/demos/all-in-one-stack-album/)
95
+
96
+ **Videos Demos**
97
+
98
+ * Vertical Video Slider - [demo](http://foo.gallery/demos/video-slider-vertical/) - [full-width demo](http://foo.gallery/demos/video-slider-vertical-full-width/)
99
+ * Horizontal Video Slider - [demo](http://foo.gallery/demos/video-slider-horizontal/) - [custom colors](http://foo.gallery/demos/video-slider-custom-theme/)
100
+
101
+ **Extensions**
102
+
103
+ * [FooVideo](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
104
+ * Albums (bundled)
105
+ * Default Gallery Templates (bundled)
106
+ * NextGen Gallery and Album Importer (bundled)
107
+ * [FooGrid Gallery](http://fooplugins.com/plugins/foogrid/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
108
+ * [Cube Gallery](http://fooplugins.com/plugins/cube-gallery-template/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
109
+ * [Custom Branding](http://fooplugins.com/plugins/foogallery-branding/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
110
+ * [FooBox PRO Lightbox](http://fooplugins.com/plugins/foobox/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
111
+ * [FooBox FREE Lightbox](http://wordpress.org/plugins/foobox-image-lightbox)
112
+ * [Owl Carousel Template](http://wordpress.org/plugins/foogallery-owl-carousel-template/)
113
+ * [ZOOM Template](http://wordpress.org/plugins/foogallery-zoom-template/)
114
+ * [Thirsty Affiliates](http://wordpress.org/plugins/thirstyaffiliates-for-foogallery-extension/)
115
+ * [Polaroid Template](https://github.com/fooplugins/foogallery-polaroid-template)
116
+ * [Use Media Menu](https://github.com/fooplugins/foogallery-media-menu)
117
+ * Build your own!!!
118
+
119
+ **Documentation**
120
+
121
+ * [FooGallery 101](http://docs.fooplugins.com/foogallery/foogallery-101/)
122
+ * [Developer 101](http://docs.fooplugins.com/foogallery/foogallery-developers-101/)
123
+ * [Actions and Filters](http://docs.fooplugins.com/foogallery/actions-filters/)
124
+
125
+ **Contribute**
126
+
127
+ FooGallery is hosted on [GitHub](https://github.com/fooplugins/foogallery). If you find a bug, please [create an issue](https://github.com/fooplugins/foogallery/issues).
128
+
129
+ ## Installation ##
130
+
131
+ 1. Upload `foogallery` folder to the `/wp-content/plugins/` directory
132
+ 2. Activate the plugin through the 'Plugins' menu in WordPress
133
+ 3. You will be redirected to the FooGallery Help page to get your started
134
+
135
+ ## Frequently Asked Questions ##
136
+
137
+ ### Why are my thumbnails so blurry? ###
138
+
139
+ Have you enabled retina support for your galleries? Displays with retina support can show better quality thumbnails when retina support is enabled. To enable retina support, edit the gallery and locate the Retina Support metabox.
140
+
141
+ ### Can I add videos to my galleries? ###
142
+
143
+ Yes, you need to use the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
144
+
145
+ ### How do I get albums working? ###
146
+
147
+ Simply go to the FooGallery extensions page and activate the Albums extension. If you do not see a button to activate the albums extension, reload the extensions list by clicking the reload button.
148
+
149
+ ### Can I build an extension? ###
150
+
151
+ Hell, yes! Check out our [developer page](http://foo.gallery/developers/)
152
+
153
+ ## Screenshots ##
154
+
155
+ [View screenshots](https://wordpress.org/plugins/foogallery/screenshots/)
156
+
157
+ ## Upgrade Notice ##
158
+
159
+ Update now to support FooVideo and many other improvements!
160
+
161
+ ## Changelog ##
162
+
163
+ ### 1.4.5 ###
164
+
165
+ * Fix : Lazy loading - scrolling galleries in certain scenarios were not loading thumbs
166
+ * Fix : Galleries that were hidden on page load were not displaying correctly when shown
167
+ * Fix : Default gallery settings were not being applied to new galleries
168
+ * New : shortcode arguments applied to gallery for common fields
169
+ * New : HTML caching is disabled by default now!
170
+ * Updated to latest client side JS and CSS
171
+
172
+ ### 1.4.4 ###
173
+
174
+ * Fix : upgrade was calling underfined function
175
+
176
+ ### 1.4.3 ###
177
+
178
+ * Fix : Justify gallery template issues
179
+ * Fix : Masonry gallery template issues
180
+ * Fix : Caption description not hidden when supposed to
181
+ * Fix : Complete rework of thumbnail dimension logic!
182
+ * Fix : Redirection bug on activation
183
+ * Fix : Added checks for galleries causing PHP warnings
184
+ * New : Last Row setting in Justify gallery template
185
+ * New : Alignment setting in Simple Portfolio gallery template
186
+ * New : Added more checks after load to ensure gallery layout is correct
187
+ * Updated to Freemius SDK 1.2.2.10
188
+ * Updated to latest client side JS and CSS
189
+
190
+ ### 1.3.28 ###
191
+
192
+ * Complete rewrite of the built-in gallery templates
193
+ * New : lazy loading
194
+ * New : simple pagination
195
+ * New : Live Previews when editing a gallery
196
+ * 260+ updates, changes and bug fixes
197
+
198
+ ### 1.3.8 ###
199
+
200
+ * New : Built in support for FooBox, fixing a lot of issues where FooBox option is not available
201
+ * Fix : More reliable extension active status on extensions listing
202
+ * Fix : More obvious wording for 3rd party plugins when they are not installed
203
+
204
+ ### 1.3.7 ###
205
+
206
+ * Fix : Activation redirect bug showing "Sorry, you are not allowed to access this page."
207
+
208
+ ### 1.3.6 ###
209
+
210
+ * New : Freemius integration!
211
+ * New : Added support for the Responsive Lightbox by dFactory
212
+ * New : New custom class field for an attachment
213
+ * New : Added more system info for better debugging when there are server issues
214
+ * Fix : Visual editor FooGallery edit button
215
+ * Fix : Image Viewer hover effect none now works as expected
216
+ * Fix : Disable HTML caching for randomly ordered galleries
217
+
218
+ ### 1.2.20 ###
219
+
220
+ * New : Force Use Original thumb setting on gallery edit page
221
+ * Fix : PHP warning from thumbnail class since 1.2.19
222
+
223
+ ### 1.2.19 ###
224
+
225
+ * New : Gallery output caching! Saves database requests improving load time
226
+ * New : Gallery usage column in admin gallery listing
227
+ * New : Better support for animated gifs
228
+ * New : Hover icons retina support
229
+ * New : Uninstall button on settings
230
+ * New : Save thumb dimensions per attachment. (needed in future versions)
231
+ * Fix : Extensions refactor and many issues resolved
232
+ * Fix : Better retina support for all templates
233
+ * Fix : Colorize / Greyscale CSS filters
234
+ * Fix : Even better wpthumb compatibility
235
+
236
+ ### 1.2.18 ###
237
+
238
+ * Fix : Handle no settings in retina metabox
239
+
240
+ ### 1.2.17 ###
241
+
242
+ * New : Retina support - metabox per gallery and default settings
243
+ * New : Attachment datasources - backend changes for how images are used in a gallery. (This will allow for new external sources in the future)
244
+ * New : Caption color settings in Simple portfolio gallery template
245
+ * New : Updated to latest Justified Gallery
246
+ * Fix : Better wpthumb compatibility
247
+
248
+ ### 1.2.16 ###
249
+
250
+ * Fix : Yoast SEO Sitemaps fatal error with deleted galleries
251
+ * Fix : Updating pages with deleted galleries throws php warnings
252
+
253
+ ### 1.2.15 ###
254
+
255
+ * Fix : Album admin CSS issues in WP 4.6
256
+ * Fix : Masonry layout issues in WP 4.6
257
+ * Fix : Media attachment fields not updating
258
+ * Fix : Better support for IE10
259
+ * New : Thumbnail generation test admin notice and settings
260
+
261
+ ### 1.2.13 ###
262
+
263
+ * Fix : Shortcode replacing content in visual editor
264
+ * Fix : Gallery hover effect of None being ignored
265
+ * New : ImageViewer language settings for 'Prev', 'Next' & 'of'
266
+ * New : Setting to use original thumbnails if available
267
+
268
+ ### 1.2.12 ###
269
+
270
+ * Fix : Simple Portfolio missing captions fix
271
+
272
+ ### 1.2.11 ###
273
+
274
+ * Fix : Simple Portfolio undefined function fix
275
+
276
+ ### 1.2.10 ###
277
+
278
+ * New : support for multiple admin JS and CSS assets for gallery templates
279
+ * New : Added setting to choose Caption Description source
280
+ * New : Crop position can be chosen for attachments
281
+ * New : Albums gallery details modal for setting a gallery URL
282
+ * New : Better shortcode preview in editor
283
+ * New : Editor button now supported if multiple editors exist
284
+ * Fix : Better No-Link support for gallery templates
285
+ * Fix : Compatible with Unyson plugin
286
+ * Fix : Compatible with Advanced Custom Fields
287
+ * Fix : Simple Portfolio fixes and tweaks
288
+ * Fix : ImageViewer fixes and better browser compatibility
289
+ * Fix : Changed assets enqueue version to rather use extension version
290
+ * Fix : Album URL fix for permalinks with no trailing slashes
291
+
292
+ ### 1.2.9 ###
293
+ * New : Added Image Viewer gallery template
294
+ * New : Caption support for default template
295
+ * New : Yoast SEO gallery image support!
296
+ * New : Responsive options for Masonry gallery
297
+ * New : change gallery URL slug for albums
298
+ * New : setting to turn off loading animation in default gallery
299
+ * New : French translation
300
+ * Fix : Support for WP 4.4
301
+ * Fix : All templates - moved all jQuery ready events to vanilla JS
302
+ * Fix : Many gallery template tweaks
303
+ * Fix : allow no default to be chosen in settings
304
+
305
+ ### 1.2.8 ###
306
+ * Works now with Polylang translation plugin
307
+ * CSS Updates & enhancements to all gallery templates
308
+ * Password protected galleries now work as expected
309
+ * Ability to hide WYSIWYG editor button
310
+ * Updated WPThumb
311
+ * Multiple bug fixes and improvements
312
+
313
+ ### 1.2.7 ###
314
+ * Bug fixes for 1.2.6 release
315
+ * Added 2 new settings to Justified Gallery template (maxRowHeight + Caption Source)
316
+
317
+ ### 1.2.6 ###
318
+ * CSS load optimizations
319
+ * Updates and tweaks on all built-in gallery templates
320
+ * More robust extension loading
321
+ * More robust upgrades to FooBox PRO
322
+ * Improved copy-to-clipboard
323
+ * Added more hover effects
324
+ * Support for FooVideo
325
+
326
+ ### 1.2.5 ###
327
+ * Fix for extensions being empty
328
+ * Added support for Multi-site
329
+ * Added esc_url to all places where url is rendered
330
+ * Updated to latest Justified Gallery v3.5.4
331
+
332
+ ### 1.2.4 ###
333
+ * Many album template updates, enhancements and fixes
334
+ * Many gallery template tweaks and fixes
335
+ * Sort order settings for galleries and albums
336
+ * Added new Single Thumbnail Gallery template
337
+
338
+ ### 1.2.1 ###
339
+ * Added setting to choose default gallery to copy settings from
340
+ * Fixed bug #45 - gallery fields not showing onload
341
+ * replaced minicolors with spectrum colorpicker
342
+ * Allow gallery fields to have a suffix
343
+ * Added function to render galleries "foogallery_render_gallery( $gallery_id )"
344
+
345
+ ### 1.2.0 ###
346
+ * Added albums extension
347
+ * Added custom CSS metaboxes
348
+ * Updated Nextgen importer
349
+ * Fixed many bugs
350
+
351
+ ### 1.1.8.2 ###
352
+ * Fixed "edit gallery" CSS with WP 4.0
353
+
354
+ ### 1.1.8.1 ###
355
+ * Fixed "insert gallery" CSS with WP 4.0
356
+
357
+ ### 1.1.8 ###
358
+ * Added 2 new gallery templates
359
+ * Added 10+ actions and filters for more customization
360
+ * Countless bug fixes and enhancements
361
+
362
+ ### 1.1.7 ###
363
  * first version!
README.txt CHANGED
@@ -1,374 +1,386 @@
1
- === FooGallery - Image Gallery WordPress Plugin ===
2
- Contributors: bradvin, steveush, fooplugins, freemius
3
- Donate link: http://fooplugins.com
4
- Tags: gallery, image gallery, photo gallery, responsive, album, media gallery, masonry gallery, portfolio, justified image gallery, video gallery, photography, photographer, retina
5
- Requires at least: 3.9
6
- Tested up to: 4.9
7
- Stable tag: trunk
8
- License: GPLv2 or later
9
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
-
11
- FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use.
12
-
13
- == Description ==
14
-
15
- FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use. Built to be highly configurable and extensible for developers or freelancers.
16
-
17
- [View the Foo Gallery Homepage & DEMO](http://foo.gallery/)
18
-
19
- **Major changes in 1.4.1!**
20
-
21
- There have been major updates to the gallery templates in v1.4.1. If you have updated, please test your galleries.
22
-
23
- **Retina Support**
24
-
25
- Foo Gallery now comes with built-in support for higher quality thumbnails on retina-enabled displays. No more blurry thumbnails, just crisp thumbnails that look amazing on all devices.
26
-
27
- **Video Support**
28
-
29
- Foo Gallery now supports the creation of video galleries with the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)! Create galleries with both images and videos mixed!
30
-
31
- **Albums Built In**
32
-
33
- Albums are now built in as an extension. Simply head over to the extensions page and activate the albums extension. A new menu item will appear that allows you to add albums just as easily as galleries.
34
-
35
- **Built For Developers**
36
-
37
- Foo Gallery was designed to be the most developer-friendly gallery plugin available for WordPress. It was also built on top of a solid extension framework, which means different functionality is separated out into different areas in the codebase. It also means the core plugin is lightweight, but still allowing for the most flexibility.
38
-
39
- **Features**
40
-
41
- * Lazy loading
42
- * Simple Pagination (dots)
43
- * Live previews in admin
44
- * Retina thumbnail support
45
- * Add videos to galleries (via the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo))
46
- * Albums built-in! (Activate the albums extension)
47
- * Use built-in media library to manage images
48
- * Drag n Drop reordering of images and galleries
49
- * Beautiful gallery templates
50
- * Custom CSS for both galleries and albums
51
- * Copy to clipboard shortcodes
52
- * Visual shortcodes in rich text editor
53
- * Gallery picker to insert shortcodes
54
- * Page usage metabox with one-click gallery page creation
55
- * NextGen importer tool (albums and galleries)
56
- * Multisite Support
57
- * plus many, many more
58
-
59
- **PRO Features**
60
-
61
- * Polaroid PRO Gallery Template
62
- * Grid PRO Gallery Template
63
- * Advanced Pagination
64
- * Infinite Scroll
65
- * Multiple Loaded Effects
66
- * Multiple hover effects presets
67
- * More on the way!
68
-
69
- **Gallery Demos**
70
-
71
- * Responsive Image Gallery - [demo](http://foo.gallery/demos/responsive-image-gallery/)
72
- * Image Viewer Gallery - [light demo](http://foo.gallery/demos/image-viewer-gallery/) - [dark demo](http://foo.gallery/demos/image-viewer-gallery-dark/)
73
- * Masonry Gallery - [demo](http://foo.gallery/demos/masonry-image-gallery/)
74
- * Simple Portfolio - [demo](http://foo.gallery/demos/simple-portfolio/)
75
- * Justified Gallery - [demo](http://foo.gallery/demos/justified-gallery/)
76
- * Single Thumbnail Gallery - [demo](http://foo.gallery/demos/single-thumbnail-gallery/)
77
- * Mixed (Images + Videos) - [demo](http://foo.gallery/demos/mixed/)
78
-
79
- **Album Demos**
80
-
81
- * Responsive Album Layout - [demo](http://foo.gallery/demos/responsive-album-layout/)
82
- * All-in-one Stack Album - [demo](http://foo.gallery/demos/all-in-one-stack-album/)
83
-
84
- **Videos Demos**
85
-
86
- * Vertical Video Slider - [demo](http://foo.gallery/demos/video-slider-vertical/) - [full-width demo](http://foo.gallery/demos/video-slider-vertical-full-width/)
87
- * Horizontal Video Slider - [demo](http://foo.gallery/demos/video-slider-horizontal/) - [custom colors](http://foo.gallery/demos/video-slider-custom-theme/)
88
-
89
- **Extensions**
90
-
91
- * [FooVideo](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
92
- * Albums (bundled)
93
- * Default Gallery Templates (bundled)
94
- * NextGen Gallery and Album Importer (bundled)
95
- * [Custom Branding](http://fooplugins.com/plugins/foogallery-branding/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
96
- * [FooBox PRO Lightbox](http://fooplugins.com/plugins/foobox/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
97
- * [FooBox FREE Lightbox](http://wordpress.org/plugins/foobox-image-lightbox)
98
- * [ZOOM Template](http://wordpress.org/plugins/foogallery-zoom-template/)
99
- * [Use Media Menu](https://github.com/fooplugins/foogallery-media-menu)
100
- * Build your own!!!
101
-
102
- **Documentation**
103
-
104
- * [FooGallery 101](http://docs.fooplugins.com/foogallery/foogallery-101/)
105
- * [Developer 101](http://docs.fooplugins.com/foogallery/foogallery-developers-101/)
106
- * [Actions and Filters](http://docs.fooplugins.com/foogallery/actions-filters/)
107
-
108
- **Contribute**
109
-
110
- FooGallery is hosted on [GitHub](https://github.com/fooplugins/foogallery). If you find a bug, please [create an issue](https://github.com/fooplugins/foogallery/issues).
111
-
112
- == Installation ==
113
-
114
- 1. Upload `foogallery` folder to the `/wp-content/plugins/` directory
115
- 2. Activate the plugin through the 'Plugins' menu in WordPress
116
- 3. You will be redirected to the FooGallery Help page to get your started
117
-
118
- == Frequently Asked Questions ==
119
-
120
- = Why are my thumbnails so blurry? =
121
-
122
- Have you enabled retina support for your galleries? Displays with retina support can show better quality thumbnails when retina support is enabled. To enable retina support, edit the gallery and locate the Retina Support metabox.
123
-
124
- = Can I add videos to my galleries? =
125
-
126
- Yes, you need to use the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
127
-
128
- = How do I get albums working? =
129
-
130
- Simply go to the FooGallery extensions page and activate the Albums extension. If you do not see a button to activate the albums extension, reload the extensions list by clicking the reload button.
131
-
132
- = Can I build an extension? =
133
-
134
- Hell, yes! Check out our [developer page](http://foo.gallery/developers/)
135
-
136
- == Screenshots ==
137
-
138
- 1. Gallery Edit Page
139
- 2. Visual Shortcodes
140
- 3. Gallery Picker
141
- 4. Frontend example with default template
142
- 5. Album Edit Page
143
-
144
- == Upgrade Notice ==
145
-
146
- Update now to support FooVideo and many other improvements!
147
-
148
- == Changelog ==
149
-
150
- = 1.4.8 =
151
-
152
- * New : added custom ready event setting for overcoming 3rd party jQuery exceptions
153
- * New : added crop thumbnail option to ‘Single Thumbnail’ and ‘Image Viewer’ templates
154
- * Update to latest client side JS
155
-
156
- = 1.4.7 =
157
-
158
- * Fix : conflicts with WP Rocket CDN features
159
- * Fix : conflicts with themes or plugins deferring script loading
160
- * New : Auto-loading of default templates
161
- * Update to latest client side JS
162
-
163
- = 1.4.6 =
164
-
165
- * Fix : conflicts with other scripts or plugins using data-src attributes
166
- * Fix : script moved back to use jQuery ready event, to avoid some conflicts
167
- * New : Global setting to disable lazy loading for all galleries
168
- * New : FooGallery Widget!
169
- * New : Admin notice for Autoptomize users to delete cache on updates
170
- * Update to latest client side JS
171
-
172
- = 1.4.5 =
173
-
174
- * Fix : Lazy loading - scrolling galleries in certain scenarios were not loading thumbs
175
- * Fix : Galleries that were hidden on page load were not displaying correctly when shown
176
- * Fix : Default gallery settings were not being applied to new galleries
177
- * New : shortcode arguments applied to gallery for common fields
178
- * New : HTML caching is disabled by default now!
179
- * Updated to latest client side JS and CSS
180
-
181
- = 1.4.4 =
182
-
183
- * Fix : upgrade was calling underfined function
184
-
185
- = 1.4.3 =
186
-
187
- * Fix : Justify gallery template issues
188
- * Fix : Masonry gallery template issues
189
- * Fix : Caption description not hidden when supposed to
190
- * Fix : Complete rework of thumbnail dimension logic!
191
- * Fix : Redirection bug on activation
192
- * Fix : Added checks for galleries causing PHP warnings
193
- * Fix : Multisite warnings on activation
194
- * New : Last Row setting in Justify gallery template
195
- * New : Alignment setting in Simple Portfolio gallery template
196
- * New : Added more checks after load to ensure gallery layout is correct
197
- * New : Added lazy loading advanced setting
198
- * Updated to Freemius SDK 1.2.2.10
199
- * Updated to latest client side JS and CSS
200
-
201
- = 1.3.28 =
202
-
203
- * Complete rewrite of the built-in gallery templates
204
- * New : lazy loading
205
- * New : simple pagination
206
- * New : Live Previews when editing a gallery
207
- * 260+ updates, changes and bug fixes
208
-
209
- = 1.3.8 =
210
-
211
- * New : Built in support for FooBox, fixing a lot of issues where FooBox option is not available
212
- * Fix : More reliable extension active status on extensions listing
213
- * Fix : More obvious wording for 3rd party plugins when they are not installed
214
-
215
- = 1.3.7 =
216
-
217
- * Fix : Activation redirect bug showing "Sorry, you are not allowed to access this page."
218
-
219
- = 1.3.6 =
220
-
221
- * New : Freemius integration!
222
- * New : Added support for the Responsive Lightbox by dFactory
223
- * New : New custom class field for an attachment
224
- * New : Added more system info for better debugging when there are server issues
225
- * Fix : Visual editor FooGallery edit button
226
- * Fix : Image Viewer hover effect none now works as expected
227
- * Fix : Disable HTML caching for randomly ordered galleries
228
-
229
- = 1.2.20 =
230
-
231
- * New : Force Use Original thumb setting on gallery edit page
232
- * Fix : PHP warning from thumbnail class since 1.2.19
233
-
234
- = 1.2.19 =
235
-
236
- * New : Gallery output caching! Saves database requests improving load time
237
- * New : Gallery usage column in admin gallery listing
238
- * New : Better support for animated gifs
239
- * New : Hover icons retina support
240
- * New : Uninstall button on settings
241
- * New : Save thumb dimensions per attachment. (needed in future versions)
242
- * Fix : Extensions refactor and many issues resolved
243
- * Fix : Better retina support for all templates
244
- * Fix : Colorize / Greyscale CSS filters
245
- * Fix : Even better wpthumb compatibility
246
-
247
- = 1.2.18 =
248
-
249
- * Fix : Handle no settings in retina metabox
250
-
251
- = 1.2.17 =
252
-
253
- * New : Retina support - metabox per gallery and default settings
254
- * New : Attachment datasources - backend changes for how images are used in a gallery. (This will allow for new external sources in the future)
255
- * New : Caption color settings in Simple portfolio gallery template
256
- * New : Updated to latest Justified Gallery
257
- * Fix : Better wpthumb compatibility
258
-
259
- = 1.2.16 =
260
-
261
- * Fix : Yoast SEO Sitemaps fatal error with deleted galleries
262
- * Fix : Updating pages with deleted galleries throws php warnings
263
-
264
- = 1.2.15 =
265
-
266
- * Fix : Album admin CSS issues in WP 4.6
267
- * Fix : Masonry layout issues in WP 4.6
268
- * Fix : Media attachment fields not updating
269
- * Fix : Better support for IE10
270
- * New : Thumbnail generation test admin notice and settings
271
-
272
- = 1.2.13 =
273
-
274
- * Fix : Shortcode replacing content in visual editor
275
- * Fix : Gallery hover effect of None being ignored
276
- * New : ImageViewer language settings for 'Prev', 'Next' & 'of'
277
- * New : Setting to use original thumbnails if available
278
-
279
- = 1.2.12 =
280
-
281
- * Fix : Simple Portfolio missing captions fix
282
-
283
- = 1.2.11 =
284
-
285
- * Fix : Simple Portfolio undefined function fix
286
-
287
- = 1.2.10 =
288
-
289
- * New : support for multiple admin JS and CSS assets for gallery templates
290
- * New : Added setting to choose Caption Description source
291
- * New : Crop position can be chosen for attachments
292
- * New : Albums gallery details modal for setting a gallery URL
293
- * New : Better shortcode preview in editor
294
- * New : Editor button now supported if multiple editors exist
295
- * Fix : Better No-Link support for gallery templates
296
- * Fix : Compatible with Unyson plugin
297
- * Fix : Compatible with Advanced Custom Fields
298
- * Fix : Simple Portfolio fixes and tweaks
299
- * Fix : ImageViewer fixes and better browser compatibility
300
- * Fix : Changed assets enqueue version to rather use extension version
301
- * Fix : Album URL fix for permalinks with no trailing slashes
302
-
303
- = 1.2.9 =
304
- * New : Added Image Viewer gallery template
305
- * New : Caption support for default template
306
- * New : Yoast SEO gallery image support!
307
- * New : Responsive options for Masonry gallery
308
- * New : change gallery URL slug for albums
309
- * New : setting to turn off loading animation in default gallery
310
- * New : French translation
311
- * Fix : Support for WP 4.4
312
- * Fix : All templates - moved all jQuery ready events to vanilla JS
313
- * Fix : Many gallery template tweaks
314
- * Fix : allow no default to be chosen in settings
315
-
316
- = 1.2.8 =
317
- * Works now with Polylang translation plugin
318
- * CSS Updates & enhancements to all gallery templates
319
- * Password protected galleries now work as expected
320
- * Ability to hide WYSIWYG editor button
321
- * Updated WPThumb
322
- * Multiple bug fixes and improvements
323
-
324
- = 1.2.7 =
325
- * Bug fixes for 1.2.6 release
326
- * Added 2 new settings to Justified Gallery template (maxRowHeight + Caption Source)
327
-
328
- = 1.2.6 =
329
- * CSS load optimizations
330
- * Updates and tweaks on all built-in gallery templates
331
- * More robust extension loading
332
- * More robust upgrades to FooBox PRO
333
- * Improved copy-to-clipboard
334
- * Added more hover effects
335
- * Support for FooVideo
336
-
337
- = 1.2.5 =
338
- * Fix for extensions being empty
339
- * Added support for Multi-site
340
- * Added esc_url to all places where url is rendered
341
- * Updated to latest Justified Gallery v3.5.4
342
-
343
- = 1.2.4 =
344
- * Many album template updates, enhancements and fixes
345
- * Many gallery template tweaks and fixes
346
- * Sort order settings for galleries and albums
347
- * Added new Single Thumbnail Gallery template
348
-
349
- = 1.2.1 =
350
- * Added setting to choose default gallery to copy settings from
351
- * Fixed bug #45 - gallery fields not showing onload
352
- * replaced minicolors with spectrum colorpicker
353
- * Allow gallery fields to have a suffix
354
- * Added function to render galleries "foogallery_render_gallery( $gallery_id )"
355
-
356
- = 1.2.0 =
357
- * Added albums extension
358
- * Added custom CSS metaboxes
359
- * Updated Nextgen importer
360
- * Fixed many bugs
361
-
362
- = 1.1.8.2 =
363
- * Fixed "edit gallery" CSS with WP 4.0
364
-
365
- = 1.1.8.1 =
366
- * Fixed "insert gallery" CSS with WP 4.0
367
-
368
- = 1.1.8 =
369
- * Added 2 new gallery templates
370
- * Added 10+ actions and filters for more customization
371
- * Countless bug fixes and enhancements
372
-
373
- = 1.1.7 =
 
 
 
 
 
 
 
 
 
 
 
 
374
  * first version!
1
+ === FooGallery - Image Gallery WordPress Plugin ===
2
+ Contributors: bradvin, steveush, fooplugins, freemius
3
+ Donate link: http://fooplugins.com
4
+ Tags: gallery, image gallery, photo gallery, responsive, album, media gallery, masonry gallery, portfolio, justified image gallery, video gallery, photography, photographer, retina
5
+ Requires at least: 3.9
6
+ Tested up to: 4.9.1
7
+ Stable tag: trunk
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use.
12
+
13
+ == Description ==
14
+
15
+ FooGallery is the best image gallery plugin for WordPress. Why? Stunning gallery layouts, responsive, retina-ready, lightning fast, easy to use. Built to be highly configurable and extensible for developers or freelancers.
16
+
17
+ [View the Foo Gallery Homepage & DEMO](http://foo.gallery/)
18
+
19
+ **Major changes in 1.4.1!**
20
+
21
+ There have been major updates to the gallery templates in v1.4.1. If you have updated, please test your galleries.
22
+
23
+ **PHP 7 Compatible**
24
+
25
+ FooGallery has been tried and tested on servers running PHP 7.
26
+
27
+ **Retina Support**
28
+
29
+ Foo Gallery now comes with built-in support for higher quality thumbnails on retina-enabled displays. No more blurry thumbnails, just crisp thumbnails that look amazing on all devices.
30
+
31
+ **Video Support**
32
+
33
+ Foo Gallery now supports the creation of video galleries with the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)! Create galleries with both images and videos mixed!
34
+
35
+ **Albums Built In**
36
+
37
+ Albums are now built in as an extension. Simply head over to the extensions page and activate the albums extension. A new menu item will appear that allows you to add albums just as easily as galleries.
38
+
39
+ **Built For Developers**
40
+
41
+ Foo Gallery was designed to be the most developer-friendly gallery plugin available for WordPress. It was also built on top of a solid extension framework, which means different functionality is separated out into different areas in the codebase. It also means the core plugin is lightweight, but still allowing for the most flexibility.
42
+
43
+ **Features**
44
+
45
+ * Lazy loading
46
+ * Simple Pagination (dots)
47
+ * Live previews in admin
48
+ * Retina thumbnail support
49
+ * Gallery Widget
50
+ * Add videos to galleries (via the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo))
51
+ * Albums built-in! (Activate the albums extension)
52
+ * Use built-in media library to manage images
53
+ * Drag n Drop reordering of images and galleries
54
+ * Beautiful gallery templates
55
+ * Custom CSS for both galleries and albums
56
+ * Copy to clipboard shortcodes
57
+ * Visual shortcodes in rich text editor
58
+ * Gallery picker to insert shortcodes
59
+ * Page usage metabox with one-click gallery page creation
60
+ * NextGen importer tool (albums and galleries and shortcodes)
61
+ * Multisite Support
62
+ * PHP 7 compatible
63
+ * plus many, many more
64
+
65
+ **PRO Features**
66
+
67
+ * Polaroid PRO Gallery Template
68
+ * Grid PRO Gallery Template
69
+ * Advanced Pagination
70
+ * Infinite Scroll
71
+ * Multiple Loaded Effects
72
+ * Multiple hover effects presets
73
+ * More on the way!
74
+
75
+ **Gallery Demos**
76
+
77
+ * Responsive Image Gallery - [demo](http://foo.gallery/demos/responsive-image-gallery/)
78
+ * Image Viewer Gallery - [light demo](http://foo.gallery/demos/image-viewer-gallery/) - [dark demo](http://foo.gallery/demos/image-viewer-gallery-dark/)
79
+ * Masonry Gallery - [demo](http://foo.gallery/demos/masonry-image-gallery/)
80
+ * Simple Portfolio - [demo](http://foo.gallery/demos/simple-portfolio/)
81
+ * Justified Gallery - [demo](http://foo.gallery/demos/justified-gallery/)
82
+ * Single Thumbnail Gallery - [demo](http://foo.gallery/demos/single-thumbnail-gallery/)
83
+ * Mixed (Images + Videos) - [demo](http://foo.gallery/demos/mixed/)
84
+
85
+ **Album Demos**
86
+
87
+ * Responsive Album Layout - [demo](http://foo.gallery/demos/responsive-album-layout/)
88
+ * All-in-one Stack Album - [demo](http://foo.gallery/demos/all-in-one-stack-album/)
89
+
90
+ **Videos Demos**
91
+
92
+ * Vertical Video Slider - [demo](http://foo.gallery/demos/video-slider-vertical/) - [full-width demo](http://foo.gallery/demos/video-slider-vertical-full-width/)
93
+ * Horizontal Video Slider - [demo](http://foo.gallery/demos/video-slider-horizontal/) - [custom colors](http://foo.gallery/demos/video-slider-custom-theme/)
94
+
95
+ **Extensions**
96
+
97
+ * [FooVideo](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
98
+ * Albums (bundled)
99
+ * Default Gallery Templates (bundled)
100
+ * NextGen Gallery and Album Importer (bundled)
101
+ * [Custom Branding](http://fooplugins.com/plugins/foogallery-branding/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
102
+ * [FooBox PRO Lightbox](http://fooplugins.com/plugins/foobox/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
103
+ * [FooBox FREE Lightbox](http://wordpress.org/plugins/foobox-image-lightbox)
104
+ * [ZOOM Template](http://wordpress.org/plugins/foogallery-zoom-template/)
105
+ * [Use Media Menu](https://github.com/fooplugins/foogallery-media-menu)
106
+ * Build your own!!!
107
+
108
+ **Documentation**
109
+
110
+ * [FooGallery 101](http://docs.fooplugins.com/foogallery/foogallery-101/)
111
+ * [Developer 101](http://docs.fooplugins.com/foogallery/foogallery-developers-101/)
112
+ * [Actions and Filters](http://docs.fooplugins.com/foogallery/actions-filters/)
113
+
114
+ **Contribute**
115
+
116
+ FooGallery is hosted on [GitHub](https://github.com/fooplugins/foogallery). If you find a bug, please [create an issue](https://github.com/fooplugins/foogallery/issues).
117
+
118
+ == Installation ==
119
+
120
+ 1. Upload `foogallery` folder to the `/wp-content/plugins/` directory
121
+ 2. Activate the plugin through the 'Plugins' menu in WordPress
122
+ 3. You will be redirected to the FooGallery Help page to get your started
123
+
124
+ == Frequently Asked Questions ==
125
+
126
+ = Why are my thumbnails so blurry? =
127
+
128
+ Have you enabled retina support for your galleries? Displays with retina support can show better quality thumbnails when retina support is enabled. To enable retina support, edit the gallery and locate the Retina Support metabox.
129
+
130
+ = Can I add videos to my galleries? =
131
+
132
+ Yes, you need to use the [FooVideo premium extension](http://fooplugins.com/plugins/foovideo/?utm_source=foogalleryplugin&utm_medium=foogallerylink&utm_campaign=foogallery_wprepo)
133
+
134
+ = How do I get albums working? =
135
+
136
+ Simply go to the FooGallery extensions page and activate the Albums extension. If you do not see a button to activate the albums extension, reload the extensions list by clicking the reload button.
137
+
138
+ = Can I build an extension? =
139
+
140
+ Hell, yes! Check out our [developer page](http://foo.gallery/developers/)
141
+
142
+ == Screenshots ==
143
+
144
+ 1. Gallery Edit Page
145
+ 2. Visual Shortcodes
146
+ 3. Gallery Picker
147
+ 4. Frontend example with default template
148
+ 5. Album Edit Page
149
+
150
+ == Upgrade Notice ==
151
+
152
+ Update now to support FooVideo and many other improvements!
153
+
154
+ == Changelog ==
155
+
156
+ = 1.4.12 =
157
+ * New : NextGen importer now includes shortcode replacement
158
+ * New : Masonry gallery supports captions below thumbnails
159
+ * New : Performance improvements for very large galleries (1000+ images)
160
+ * Fix : Bugs fixes for paging, FooBox and more
161
+ * Update to latest client side JS 1.0.18
162
+
163
+ = 1.4.8 =
164
+ * New : added custom ready event setting for overcoming 3rd party jQuery exceptions
165
+ * New : added crop thumbnail option to 'Single Thumbnail' and 'Image Viewer' templates
166
+ * Update to latest client side JS
167
+
168
+ = 1.4.7 =
169
+
170
+ * Fix : conflicts with WP Rocket CDN features
171
+ * Fix : conflicts with themes or plugins deferring script loading
172
+ * New : Auto-loading of default templates
173
+ * Update to latest client side JS
174
+
175
+ = 1.4.6 =
176
+
177
+ * Fix : conflicts with other scripts or plugins using data-src attributes
178
+ * Fix : script moved back to use jQuery ready event, to avoid some conflicts
179
+ * New : Global setting to disable lazy loading for all galleries
180
+ * New : FooGallery Widget!
181
+ * New : Admin notice for Autoptomize users to delete cache on updates
182
+ * Update to latest client side JS
183
+
184
+ = 1.4.5 =
185
+
186
+ * Fix : Lazy loading - scrolling galleries in certain scenarios were not loading thumbs
187
+ * Fix : Galleries that were hidden on page load were not displaying correctly when shown
188
+ * Fix : Default gallery settings were not being applied to new galleries
189
+ * New : shortcode arguments applied to gallery for common fields
190
+ * New : HTML caching is disabled by default now!
191
+ * Updated to latest client side JS and CSS
192
+
193
+ = 1.4.4 =
194
+
195
+ * Fix : upgrade was calling underfined function
196
+
197
+ = 1.4.3 =
198
+
199
+ * Fix : Justify gallery template issues
200
+ * Fix : Masonry gallery template issues
201
+ * Fix : Caption description not hidden when supposed to
202
+ * Fix : Complete rework of thumbnail dimension logic!
203
+ * Fix : Redirection bug on activation
204
+ * Fix : Added checks for galleries causing PHP warnings
205
+ * Fix : Multisite warnings on activation
206
+ * New : Last Row setting in Justify gallery template
207
+ * New : Alignment setting in Simple Portfolio gallery template
208
+ * New : Added more checks after load to ensure gallery layout is correct
209
+ * New : Added lazy loading advanced setting
210
+ * Updated to Freemius SDK 1.2.2.10
211
+ * Updated to latest client side JS and CSS
212
+
213
+ = 1.3.28 =
214
+
215
+ * Complete rewrite of the built-in gallery templates
216
+ * New : lazy loading
217
+ * New : simple pagination
218
+ * New : Live Previews when editing a gallery
219
+ * 260+ updates, changes and bug fixes
220
+
221
+ = 1.3.8 =
222
+
223
+ * New : Built in support for FooBox, fixing a lot of issues where FooBox option is not available
224
+ * Fix : More reliable extension active status on extensions listing
225
+ * Fix : More obvious wording for 3rd party plugins when they are not installed
226
+
227
+ = 1.3.7 =
228
+
229
+ * Fix : Activation redirect bug showing "Sorry, you are not allowed to access this page."
230
+
231
+ = 1.3.6 =
232
+
233
+ * New : Freemius integration!
234
+ * New : Added support for the Responsive Lightbox by dFactory
235
+ * New : New custom class field for an attachment
236
+ * New : Added more system info for better debugging when there are server issues
237
+ * Fix : Visual editor FooGallery edit button
238
+ * Fix : Image Viewer hover effect none now works as expected
239
+ * Fix : Disable HTML caching for randomly ordered galleries
240
+
241
+ = 1.2.20 =
242
+
243
+ * New : Force Use Original thumb setting on gallery edit page
244
+ * Fix : PHP warning from thumbnail class since 1.2.19
245
+
246
+ = 1.2.19 =
247
+
248
+ * New : Gallery output caching! Saves database requests improving load time
249
+ * New : Gallery usage column in admin gallery listing
250
+ * New : Better support for animated gifs
251
+ * New : Hover icons retina support
252
+ * New : Uninstall button on settings
253
+ * New : Save thumb dimensions per attachment. (needed in future versions)
254
+ * Fix : Extensions refactor and many issues resolved
255
+ * Fix : Better retina support for all templates
256
+ * Fix : Colorize / Greyscale CSS filters
257
+ * Fix : Even better wpthumb compatibility
258
+
259
+ = 1.2.18 =
260
+
261
+ * Fix : Handle no settings in retina metabox
262
+
263
+ = 1.2.17 =
264
+
265
+ * New : Retina support - metabox per gallery and default settings
266
+ * New : Attachment datasources - backend changes for how images are used in a gallery. (This will allow for new external sources in the future)
267
+ * New : Caption color settings in Simple portfolio gallery template
268
+ * New : Updated to latest Justified Gallery
269
+ * Fix : Better wpthumb compatibility
270
+
271
+ = 1.2.16 =
272
+
273
+ * Fix : Yoast SEO Sitemaps fatal error with deleted galleries
274
+ * Fix : Updating pages with deleted galleries throws php warnings
275
+
276
+ = 1.2.15 =
277
+
278
+ * Fix : Album admin CSS issues in WP 4.6
279
+ * Fix : Masonry layout issues in WP 4.6
280
+ * Fix : Media attachment fields not updating
281
+ * Fix : Better support for IE10
282
+ * New : Thumbnail generation test admin notice and settings
283
+
284
+ = 1.2.13 =
285
+
286
+ * Fix : Shortcode replacing content in visual editor
287
+ * Fix : Gallery hover effect of None being ignored
288
+ * New : ImageViewer language settings for 'Prev', 'Next' & 'of'
289
+ * New : Setting to use original thumbnails if available
290
+
291
+ = 1.2.12 =
292
+
293
+ * Fix : Simple Portfolio missing captions fix
294
+
295
+ = 1.2.11 =
296
+
297
+ * Fix : Simple Portfolio undefined function fix
298
+
299
+ = 1.2.10 =
300
+
301
+ * New : support for multiple admin JS and CSS assets for gallery templates
302
+ * New : Added setting to choose Caption Description source
303
+ * New : Crop position can be chosen for attachments
304
+ * New : Albums gallery details modal for setting a gallery URL
305
+ * New : Better shortcode preview in editor
306
+ * New : Editor button now supported if multiple editors exist
307
+ * Fix : Better No-Link support for gallery templates
308
+ * Fix : Compatible with Unyson plugin
309
+ * Fix : Compatible with Advanced Custom Fields
310
+ * Fix : Simple Portfolio fixes and tweaks
311
+ * Fix : ImageViewer fixes and better browser compatibility
312
+ * Fix : Changed assets enqueue version to rather use extension version
313
+ * Fix : Album URL fix for permalinks with no trailing slashes
314
+
315
+ = 1.2.9 =
316
+ * New : Added Image Viewer gallery template
317
+ * New : Caption support for default template
318
+ * New : Yoast SEO gallery image support!
319
+ * New : Responsive options for Masonry gallery
320
+ * New : change gallery URL slug for albums
321
+ * New : setting to turn off loading animation in default gallery
322
+ * New : French translation
323
+ * Fix : Support for WP 4.4
324
+ * Fix : All templates - moved all jQuery ready events to vanilla JS
325
+ * Fix : Many gallery template tweaks
326
+ * Fix : allow no default to be chosen in settings
327
+
328
+ = 1.2.8 =
329
+ * Works now with Polylang translation plugin
330
+ * CSS Updates & enhancements to all gallery templates
331
+ * Password protected galleries now work as expected
332
+ * Ability to hide WYSIWYG editor button
333
+ * Updated WPThumb
334
+ * Multiple bug fixes and improvements
335
+
336
+ = 1.2.7 =
337
+ * Bug fixes for 1.2.6 release
338
+ * Added 2 new settings to Justified Gallery template (maxRowHeight + Caption Source)
339
+
340
+ = 1.2.6 =
341
+ * CSS load optimizations
342
+ * Updates and tweaks on all built-in gallery templates
343
+ * More robust extension loading
344
+ * More robust upgrades to FooBox PRO
345
+ * Improved copy-to-clipboard
346
+ * Added more hover effects
347
+ * Support for FooVideo
348
+
349
+ = 1.2.5 =
350
+ * Fix for extensions being empty
351
+ * Added support for Multi-site
352
+ * Added esc_url to all places where url is rendered
353
+ * Updated to latest Justified Gallery v3.5.4
354
+
355
+ = 1.2.4 =
356
+ * Many album template updates, enhancements and fixes
357
+ * Many gallery template tweaks and fixes
358
+ * Sort order settings for galleries and albums
359
+ * Added new Single Thumbnail Gallery template
360
+
361
+ = 1.2.1 =
362
+ * Added setting to choose default gallery to copy settings from
363
+ * Fixed bug #45 - gallery fields not showing onload
364
+ * replaced minicolors with spectrum colorpicker
365
+ * Allow gallery fields to have a suffix
366
+ * Added function to render galleries "foogallery_render_gallery( $gallery_id )"
367
+
368
+ = 1.2.0 =
369
+ * Added albums extension
370
+ * Added custom CSS metaboxes
371
+ * Updated Nextgen importer
372
+ * Fixed many bugs
373
+
374
+ = 1.1.8.2 =
375
+ * Fixed "edit gallery" CSS with WP 4.0
376
+
377
+ = 1.1.8.1 =
378
+ * Fixed "insert gallery" CSS with WP 4.0
379
+
380
+ = 1.1.8 =
381
+ * Added 2 new gallery templates
382
+ * Added 10+ actions and filters for more customization
383
+ * Countless bug fixes and enhancements
384
+
385
+ = 1.1.7 =
386
  * first version!
changelog.txt CHANGED
@@ -1,4 +1,4 @@
1
- FooGallery Changelog
2
- ====================
3
-
4
  See changelog in readme.txt
1
+ FooGallery Changelog
2
+ ====================
3
+
4
  See changelog in readme.txt
css/admin-foogallery.css CHANGED
@@ -1,462 +1,462 @@
1
- .foogallery-attachments-list .add-attachment {
2
- background: #ddd;
3
- box-shadow: 0 0 0 1px #ccc;
4
- width: 150px;
5
- position: relative;
6
- float: left;
7
- padding: 0;
8
- color: #464646;
9
- list-style: none;
10
- text-align: center;
11
- -webkit-user-select: none;
12
- -moz-user-select: none;
13
- -ms-user-select: none;
14
- -o-user-select: none;
15
- user-select: none;
16
- }
17
-
18
- .foogallery-attachments-list .add-attachment a {
19
- display: table-cell;
20
- vertical-align: middle;
21
- height: 150px;
22
- text-align: center;
23
- width: 150px;
24
- height: 150px;
25
- color:#666;
26
- font-weight: bold;
27
- text-decoration: none;
28
- }
29
-
30
- .foogallery-attachments-list .add-attachment a:hover {
31
- color:#444;
32
- }
33
-
34
- .foogallery-attachments-list .add-attachment a div.dashicons {
35
- font-size:50px;
36
- width: 50px;
37
- height: 50px;
38
- }
39
-
40
- .foogallery-attachments-list .add-attachment a span {
41
- display: block;
42
- }
43
-
44
-
45
- .foogallery-attachments-list .attachment-preview,
46
- .foogallery-attachments-list .attachment-preview .thumbnail {
47
- width: 150px;
48
- height: 150px;
49
- cursor:move;
50
- }
51
-
52
- .foogallery-attachments-list .attachment {
53
- border: transparent 1px solid;
54
- box-shadow: none !important;
55
- width: auto !important;
56
- padding: 0 !important;
57
- }
58
-
59
- .foogallery-attachments-list .attachment.placeholder {
60
- width: 150px !important;
61
- height: 150px;
62
- border: #1e8cbe 1px dashed;
63
- background: #eee;
64
- }
65
-
66
- .foogallery-attachments-list li {
67
- margin: 0px 10px 10px 0px !important;
68
- }
69
-
70
- .foogallery-attachments-list .attachment.ui-sortable-helper {
71
- opacity: 0.5;
72
- }
73
-
74
- .foogallery-attachments-list .attachment.ui-sortable-helper:hover .close {
75
- display: none;
76
- }
77
-
78
- .foogallery-attachments-list input.describe {
79
- margin:0;
80
- width: 150px;
81
- font-size: 12px;
82
- }
83
-
84
- .foogallery-attachments-list .attachment .attachment-preview a {
85
- display: none;
86
- position: absolute;
87
- padding: 0;
88
- font-size: 20px;
89
- line-height: 20px;
90
- text-align: center;
91
- text-decoration: none;
92
- background-color: #444;
93
- border-top-right-radius: 50%;
94
- border-top-left-radius: 50%;
95
- border-bottom-right-radius: 50%;
96
- border-bottom-left-radius: 50%;
97
- }
98
-
99
- .foogallery-attachments-list .attachment .attachment-preview:hover a {
100
- display: block;
101
- }
102
-
103
- .foogallery-attachments-list .attachment .attachment-preview a span {
104
- color:#fff;
105
- }
106
-
107
- .foogallery-attachments-list .attachment .attachment-preview a:hover span {
108
- color:#ddd;
109
- }
110
-
111
- .foogallery-attachments-list .attachment .attachment-preview a.remove {
112
- top: 5px;
113
- right: 5px;
114
- }
115
-
116
- .foogallery-attachments-list .attachment .attachment-preview a.info {
117
- top: 5px;
118
- left: 5px;
119
- }
120
-
121
- .spacer {
122
- display: inline-block;
123
- width:30px;
124
- }
125
-
126
- .foogallery_template_field td {
127
- padding-bottom: 20px;
128
- }
129
-
130
- .foogallery_template_field th {
131
- vertical-align: top;
132
- text-align: left;
133
- padding-top: 0.3em;
134
- padding-right: 10px;
135
- }
136
-
137
- .foogallery_template_field textarea {
138
- min-width: 500px;
139
- min-height: 100px;
140
- }
141
-
142
- .foogallery_template_field.foogallery_template_field_type-help {
143
- border-bottom: none;
144
- }
145
-
146
- .foogallery_template_field.foogallery_template_field_type-help td {
147
- padding-bottom: 0;
148
- }
149
-
150
- .foogallery_template_field.foogallery_template_field_type-icon td {
151
- padding-bottom: 0;
152
- }
153
-
154
- .foogallery_metabox_field-icon label {
155
- display:inline-block;
156
- margin-right:10px;
157
- border:solid 3px transparent;
158
- background:#aaa;
159
- border-radius: 3px;
160
- -moz-border-radius: 3px;
161
- -webkit-border-radius: 3px;
162
- padding:5px;
163
- line-height: 0;
164
- margin-bottom: 10px;
165
- }
166
-
167
- .foogallery_metabox_field-icon input:checked + label {
168
- border:solid 3px #444;
169
- background: #888;
170
- }
171
-
172
- .foogallery_metabox_field-icon label:hover {
173
- border:solid 3px #444;
174
- }
175
-
176
- .foogallery_template_field.foogallery_template_field_type-htmlicon td {
177
- padding-bottom: 0;
178
- }
179
-
180
- .foogallery_metabox_field-htmlicon label {
181
- display:inline-block;
182
- margin-right:10px;
183
- border:solid 3px transparent;
184
- background:#aaa;
185
- border-radius: 3px;
186
- -moz-border-radius: 3px;
187
- -webkit-border-radius: 3px;
188
- padding:5px;
189
- line-height: 0;
190
- margin-bottom: 10px;
191
- }
192
-
193
- .foogallery_metabox_field-htmlicon input:checked + label {
194
- border:solid 3px #444;
195
- background: #888;
196
- }
197
-
198
- .foogallery_metabox_field-htmlicon label:hover {
199
- border:solid 3px #444;
200
- }
201
-
202
- .foogallery_metabox_field-thumb_size label {
203
- vertical-align: baseline;
204
- }
205
-
206
- .foogallery_metabox_field-thumb_size input[type="number"] {
207
- margin-right: 10px;
208
- margin-left: 10px;
209
- }
210
-
211
- .foogallery_template_field_type-text input.small-text {
212
- width: 65px;
213
- height: 28px;
214
- line-height: 1;
215
- }
216
-
217
- #foogallery_pages ul li:hover .row-actions { visibility: visible; }
218
-
219
- .foogallery-shortcode {
220
- text-align: center;
221
- }
222
-
223
- .foogallery-shortcode input {
224
- cursor: pointer;
225
- text-align: center;
226
- padding: 10px;
227
- font-family: "courier new", courier;
228
- border: none;
229
- box-shadow: none;
230
- background: #efefef;
231
- }
232
-
233
- .wp-list-table .foogallery-shortcode {
234
- cursor: pointer;
235
- font-size: 1em;
236
- border: none;
237
- box-shadow: none;
238
- background: #efefef;
239
- font-family: "courier new", courier;
240
- }
241
-
242
- .foogallery-shortcode-message {
243
- font-style: italic;
244
- color: #2EA2CC !important;
245
- }
246
-
247
- .foogallery-help {
248
- position: relative;
249
- display: block;
250
- line-height: 19px;
251
- padding: 11px 10px 11px 40px;
252
- font-size: 14px;
253
- text-align: left;
254
- margin: 5px 0 0 2px;
255
- background-color: #F4F4FF;
256
- border-left: 4px solid #1e8cbe;
257
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
258
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
259
- }
260
-
261
- .foogallery-help:before {
262
- content: "\f223";
263
- font: 400 30px/1 dashicons !important;
264
- speak: none;
265
- color: #1e8cbe;
266
- display: inline-block;
267
- -webkit-font-smoothing: antialiased;
268
- -moz-osx-font-smoothing: grayscale;
269
- vertical-align: bottom;
270
- position: absolute;
271
- left: 5px;
272
- margin-top: -15px;
273
- top: 50%;
274
- height: 1em;
275
- }
276
-
277
- #post-body.columns-2 #postbox-container-1 .foogallery-help {
278
- padding-left: 11px;
279
- margin-left: 5px;
280
- }
281
-
282
- #post-body.columns-2 #postbox-container-1 .foogallery-help:before {
283
- content: '';
284
- }
285
-
286
- /** <gallery settings styling overrides> **/
287
-
288
- .foogallery-metabox-settings {
289
- width: 100%;
290
- border-collapse: collapse;
291
- }
292
-
293
- .foogallery-metabox-settings th {
294
- font-weight: normal;
295
- padding: 10px;
296
- width: 180px;
297
- }
298
-
299
- .foogallery-metabox-settings tr {
300
- border-bottom: solid 1px #EEE;
301
- }
302
-
303
- .foogallery-metabox-settings td {
304
- padding: 10px;
305
- }
306
-
307
- .foogallery_metabox_field-radio > input,
308
- .foogallery_metabox_field-radio > label {
309
- margin-bottom: 10px;
310
- display: inline-block;
311
- }
312
-
313
- .foogallery_metabox_field-radio input[type="checkbox"],
314
- .foogallery_metabox_field-radio input[type="radio"] {
315
- margin: 0 0 10px 0;
316
- }
317
-
318
- .foogallery_metabox_field-select select {
319
- min-width: 250px;
320
- }
321
-
322
- .foogallery-thumbsize-crop {
323
- margin-top: 10px;
324
- }
325
-
326
- .foogallery_metabox_field-checkboxlist > input,
327
- .foogallery_metabox_field-checkboxlist > label {
328
- margin-bottom: 10px;
329
- display: inline-block;
330
- }
331
-
332
- .foogallery_metabox_field-checkboxlist input[type="checkbox"] {
333
- margin: 0 0 10px 0;
334
- }
335
-
336
- /** </gallery settings styling overrides> **/
337
-
338
- .foogallery_metabox_custom_css {
339
- width: 100%;
340
- height: 10em;
341
- }
342
-
343
- .foo-nav-tabs a:focus {
344
- box-shadow: none;
345
- outline: 0;
346
- }
347
-
348
- .foogallery-thumbnail-preview {
349
- display: inline-block;
350
- }
351
-
352
- #foogallery_apply_retina_support_container {
353
- margin-top: 5px;
354
- }
355
-
356
- .widefat th.column-icon {
357
- width: 60px;
358
- }
359
-
360
- #foogallery_settings .inside {
361
- margin: 0;
362
- padding: 0;
363
- }
364
- /** Balloon.css **/
365
- button[data-balloon]{overflow:visible}[data-balloon]{position:relative}[data-balloon]:after,[data-balloon]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-khtml-opacity:0;-moz-opacity:0;opacity:0;pointer-events:none;-webkit-transition:all .18s ease-out .18s;transition:all .18s ease-out .18s;bottom:100%;left:50%;position:absolute;z-index:10;-webkit-transform:translate(-50%,10px);-ms-transform:translate(-50%,10px);transform:translate(-50%,10px);-webkit-transform-origin:top;-ms-transform-origin:top;transform-origin:top}[data-balloon]:after{background:rgba(17,17,17,.9);border-radius:4px;color:#fff;content:attr(data-balloon);font-size:12px;padding:.5em 1em;white-space:nowrap;margin-bottom:11px}[data-balloon]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%280%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;content:"";margin-bottom:5px}[data-balloon]:hover:after,[data-balloon]:hover:before,[data-balloon][data-balloon-visible]:after,[data-balloon][data-balloon-visible]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;pointer-events:auto;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon].font-awesome:after{font-family:FontAwesome}[data-balloon][data-balloon-break]:after{white-space:pre}[data-balloon-pos=down]:after,[data-balloon-pos=down]:before{bottom:auto;left:50%;top:100%;-webkit-transform:translate(-50%,-10px);-ms-transform:translate(-50%,-10px);transform:translate(-50%,-10px)}[data-balloon-pos=down]:after{margin-top:11px}[data-balloon-pos=down]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28180%2018%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;margin-top:5px;margin-bottom:0}[data-balloon-pos=down]:hover:after,[data-balloon-pos=down]:hover:before,[data-balloon-pos=down][data-balloon-visible]:after,[data-balloon-pos=down][data-balloon-visible]:before{-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon-pos=left]:after,[data-balloon-pos=left]:before{bottom:auto;left:auto;right:100%;top:50%;-webkit-transform:translate(10px,-50%);-ms-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon-pos=left]:after{margin-right:11px}[data-balloon-pos=left]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28-90%2018%2018%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-right:5px;margin-bottom:0}[data-balloon-pos=left]:hover:after,[data-balloon-pos=left]:hover:before,[data-balloon-pos=left][data-balloon-visible]:after,[data-balloon-pos=left][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-pos=right]:after,[data-balloon-pos=right]:before{bottom:auto;left:100%;top:50%;-webkit-transform:translate(-10px,-50%);-ms-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon-pos=right]:after{margin-left:11px}[data-balloon-pos=right]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%2890%206%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-bottom:0;margin-left:5px}[data-balloon-pos=right]:hover:after,[data-balloon-pos=right]:hover:before,[data-balloon-pos=right][data-balloon-visible]:after,[data-balloon-pos=right][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-length]:after{white-space:normal}[data-balloon-length=small]:after{width:80px}[data-balloon-length=medium]:after{width:150px}[data-balloon-length=large]:after{width:260px}[data-balloon-length=xlarge]:after{width:90vw}@media screen and (min-width:768px){[data-balloon-length=xlarge]:after{width:380px}}[data-balloon-length=fit]:after{width:100%}
366
-
367
- /** Balloon.css overrides **/
368
- [data-balloon]:after,
369
- [data-balloon]:before {
370
- text-align: center;
371
- line-height: 1.2em;
372
- }
373
-
374
- .foogallery-items-view-switch-container.hidden {
375
- display: none;
376
- }
377
-
378
- .foogallery-items-view-switch-container {
379
- display: inline-block;
380
- margin-left: 10px;
381
- }
382
-
383
- .foogallery-items-view-switch {
384
- vertical-align: middle;
385
- display: inline-block;
386
- }
387
-
388
- .foogallery-items-view-switch a {
389
- padding: 4px 10px;
390
- line-height: 12px;
391
- border: 1px solid #ccc;
392
- float: left;
393
- display: inline-block;
394
- text-decoration: none;
395
- margin-right: 10px;
396
- border-radius: 4px;
397
- text-align: center;
398
- white-space: nowrap;
399
- vertical-align: middle;
400
- -ms-touch-action: manipulation;
401
- touch-action: manipulation;
402
- cursor: pointer;
403
- -webkit-user-select: none;
404
- -moz-user-select: none;
405
- -ms-user-select: none;
406
- user-select: none;
407
- background: #f7f7f7;
408
- color: #555;
409
- }
410
-
411
- .foogallery-items-view-switch a:first-child:not(:last-child) {
412
- border-top-right-radius: 0;
413
- border-bottom-right-radius: 0;
414
- }
415
-
416
- .foogallery-items-view-switch a:last-child:not(:first-child) {
417
- border-top-left-radius: 0;
418
- border-bottom-left-radius: 0;
419
- }
420
-
421
- .foogallery-items-view-switch a:first-child {
422
- margin-right: 0;
423
- }
424
-
425
- .foogallery-items-view-switch a.current {
426
- background: #0085ba;
427
- color: #fff;
428
- }
429
-
430
- .foogallery-items-view-switch a+a {
431
- margin-left: -1px;
432
- }
433
-
434
- .foogallery_preview_container {
435
- position: relative;
436
- padding: 10px;
437
- }
438
-
439
- .foogallery_preview_container.loading:after {
440
- content: '';
441
- position: absolute;
442
- top: 0;
443
- left: 0;
444
- right: 0;
445
- bottom: 0;
446
- background: #fff;
447
- opacity: 0.8;
448
- z-index: 159900;
449
- }
450
-
451
- .fs-submenu-item.foogallery {
452
- font-size: 13px;
453
- line-height: 1.2;
454
- }
455
-
456
- .foogallery_template_field_type-thumb_size_no_crop input.small-text+label {
457
- margin-left: 10px;
458
- }
459
-
460
- .foogallery_template_field_type-thumb_size_no_crop label+input {
461
- margin-left: 5px;
462
  }
1
+ .foogallery-attachments-list .add-attachment {
2
+ background: #ddd;
3
+ box-shadow: 0 0 0 1px #ccc;
4
+ width: 150px;
5
+ position: relative;
6
+ float: left;
7
+ padding: 0;
8
+ color: #464646;
9
+ list-style: none;
10
+ text-align: center;
11
+ -webkit-user-select: none;
12
+ -moz-user-select: none;
13
+ -ms-user-select: none;
14
+ -o-user-select: none;
15
+ user-select: none;
16
+ }
17
+
18
+ .foogallery-attachments-list .add-attachment a {
19
+ display: table-cell;
20
+ vertical-align: middle;
21
+ height: 150px;
22
+ text-align: center;
23
+ width: 150px;
24
+ height: 150px;
25
+ color:#666;
26
+ font-weight: bold;
27
+ text-decoration: none;
28
+ }
29
+
30
+ .foogallery-attachments-list .add-attachment a:hover {
31
+ color:#444;
32
+ }
33
+
34
+ .foogallery-attachments-list .add-attachment a div.dashicons {
35
+ font-size:50px;
36
+ width: 50px;
37
+ height: 50px;
38
+ }
39
+
40
+ .foogallery-attachments-list .add-attachment a span {
41
+ display: block;
42
+ }
43
+
44
+
45
+ .foogallery-attachments-list .attachment-preview,
46
+ .foogallery-attachments-list .attachment-preview .thumbnail {
47
+ width: 150px;
48
+ height: 150px;
49
+ cursor:move;
50
+ }
51
+
52
+ .foogallery-attachments-list .attachment {
53
+ border: transparent 1px solid;
54
+ box-shadow: none !important;
55
+ width: auto !important;
56
+ padding: 0 !important;
57
+ }
58
+
59
+ .foogallery-attachments-list .attachment.placeholder {
60
+ width: 150px !important;
61
+ height: 150px;
62
+ border: #1e8cbe 1px dashed;
63
+ background: #eee;
64
+ }
65
+
66
+ .foogallery-attachments-list li {
67
+ margin: 0px 10px 10px 0px !important;
68
+ }
69
+
70
+ .foogallery-attachments-list .attachment.ui-sortable-helper {
71
+ opacity: 0.5;
72
+ }
73
+
74
+ .foogallery-attachments-list .attachment.ui-sortable-helper:hover .close {
75
+ display: none;
76
+ }
77
+
78
+ .foogallery-attachments-list input.describe {
79
+ margin:0;
80
+ width: 150px;
81
+ font-size: 12px;
82
+ }
83
+
84
+ .foogallery-attachments-list .attachment .attachment-preview a {
85
+ display: none;
86
+ position: absolute;
87
+ padding: 0;
88
+ font-size: 20px;
89
+ line-height: 20px;
90
+ text-align: center;
91
+ text-decoration: none;
92
+ background-color: #444;
93
+ border-top-right-radius: 50%;
94
+ border-top-left-radius: 50%;
95
+ border-bottom-right-radius: 50%;
96
+ border-bottom-left-radius: 50%;
97
+ }
98
+
99
+ .foogallery-attachments-list .attachment .attachment-preview:hover a {
100
+ display: block;
101
+ }
102
+
103
+ .foogallery-attachments-list .attachment .attachment-preview a span {
104
+ color:#fff;
105
+ }
106
+
107
+ .foogallery-attachments-list .attachment .attachment-preview a:hover span {
108
+ color:#ddd;
109
+ }
110
+
111
+ .foogallery-attachments-list .attachment .attachment-preview a.remove {
112
+ top: 5px;
113
+ right: 5px;
114
+ }
115
+
116
+ .foogallery-attachments-list .attachment .attachment-preview a.info {
117
+ top: 5px;
118
+ left: 5px;
119
+ }
120
+
121
+ .spacer {
122
+ display: inline-block;
123
+ width:30px;
124
+ }
125
+
126
+ .foogallery_template_field td {
127
+ padding-bottom: 20px;
128
+ }
129
+
130
+ .foogallery_template_field th {
131
+ vertical-align: top;
132
+ text-align: left;
133
+ padding-top: 0.3em;
134
+ padding-right: 10px;
135
+ }
136
+
137
+ .foogallery_template_field textarea {
138
+ min-width: 500px;
139
+ min-height: 100px;
140
+ }
141
+
142
+ .foogallery_template_field.foogallery_template_field_type-help {
143
+ border-bottom: none;
144
+ }
145
+
146
+ .foogallery_template_field.foogallery_template_field_type-help td {
147
+ padding-bottom: 0;
148
+ }
149
+
150
+ .foogallery_template_field.foogallery_template_field_type-icon td {
151
+ padding-bottom: 0;
152
+ }
153
+
154
+ .foogallery_metabox_field-icon label {
155
+ display:inline-block;
156
+ margin-right:10px;
157
+ border:solid 3px transparent;
158
+ background:#aaa;
159
+ border-radius: 3px;
160
+ -moz-border-radius: 3px;
161
+ -webkit-border-radius: 3px;
162
+ padding:5px;
163
+ line-height: 0;
164
+ margin-bottom: 10px;
165
+ }
166
+
167
+ .foogallery_metabox_field-icon input:checked + label {
168
+ border:solid 3px #444;
169
+ background: #888;
170
+ }
171
+
172
+ .foogallery_metabox_field-icon label:hover {
173
+ border:solid 3px #444;
174
+ }
175
+
176
+ .foogallery_template_field.foogallery_template_field_type-htmlicon td {
177
+ padding-bottom: 0;
178
+ }
179
+
180
+ .foogallery_metabox_field-htmlicon label {
181
+ display:inline-block;
182
+ margin-right:10px;
183
+ border:solid 3px transparent;
184
+ background:#aaa;
185
+ border-radius: 3px;
186
+ -moz-border-radius: 3px;
187
+ -webkit-border-radius: 3px;
188
+ padding:5px;
189
+ line-height: 0;
190
+ margin-bottom: 10px;
191
+ }
192
+
193
+ .foogallery_metabox_field-htmlicon input:checked + label {
194
+ border:solid 3px #444;
195
+ background: #888;
196
+ }
197
+
198
+ .foogallery_metabox_field-htmlicon label:hover {
199
+ border:solid 3px #444;
200
+ }
201
+
202
+ .foogallery_metabox_field-thumb_size label {
203
+ vertical-align: baseline;
204
+ }
205
+
206
+ .foogallery_metabox_field-thumb_size input[type="number"] {
207
+ margin-right: 10px;
208
+ margin-left: 10px;
209
+ }
210
+
211
+ .foogallery_template_field_type-text input.small-text {
212
+ width: 65px;
213
+ height: 28px;
214
+ line-height: 1;
215
+ }
216
+
217
+ #foogallery_pages ul li:hover .row-actions { visibility: visible; }
218
+
219
+ .foogallery-shortcode {
220
+ text-align: center;
221
+ }
222
+
223
+ .foogallery-shortcode input {
224
+ cursor: pointer;
225
+ text-align: center;
226
+ padding: 10px;
227
+ font-family: "courier new", courier;
228
+ border: none;
229
+ box-shadow: none;
230
+ background: #efefef;
231
+ }
232
+
233
+ .wp-list-table .foogallery-shortcode {
234
+ cursor: pointer;
235
+ font-size: 1em;
236
+ border: none;
237
+ box-shadow: none;
238
+ background: #efefef;
239
+ font-family: "courier new", courier;
240
+ }
241
+
242
+ .foogallery-shortcode-message {
243
+ font-style: italic;
244
+ color: #2EA2CC !important;
245
+ }
246
+
247
+ .foogallery-help {
248
+ position: relative;
249
+ display: block;
250
+ line-height: 19px;
251
+ padding: 11px 10px 11px 40px;
252
+ font-size: 14px;
253
+ text-align: left;
254
+ margin: 5px 0 0 2px;
255
+ background-color: #F4F4FF;
256
+ border-left: 4px solid #1e8cbe;
257
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
258
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
259
+ }
260
+
261
+ .foogallery-help:before {
262
+ content: "\f223";
263
+ font: 400 30px/1 dashicons !important;
264
+ speak: none;
265
+ color: #1e8cbe;
266
+ display: inline-block;
267
+ -webkit-font-smoothing: antialiased;
268
+ -moz-osx-font-smoothing: grayscale;
269
+ vertical-align: bottom;
270
+ position: absolute;
271
+ left: 5px;
272
+ margin-top: -15px;
273
+ top: 50%;
274
+ height: 1em;
275
+ }
276
+
277
+ #post-body.columns-2 #postbox-container-1 .foogallery-help {
278
+ padding-left: 11px;
279
+ margin-left: 5px;
280
+ }
281
+
282
+ #post-body.columns-2 #postbox-container-1 .foogallery-help:before {
283
+ content: '';
284
+ }
285
+
286
+ /** <gallery settings styling overrides> **/
287
+
288
+ .foogallery-metabox-settings {
289
+ width: 100%;
290
+ border-collapse: collapse;
291
+ }
292
+
293
+ .foogallery-metabox-settings th {
294
+ font-weight: normal;
295
+ padding: 10px;
296
+ width: 180px;
297
+ }
298
+
299
+ .foogallery-metabox-settings tr {
300
+ border-bottom: solid 1px #EEE;
301
+ }
302
+
303
+ .foogallery-metabox-settings td {
304
+ padding: 10px;
305
+ }
306
+
307
+ .foogallery_metabox_field-radio > input,
308
+ .foogallery_metabox_field-radio > label {
309
+ margin-bottom: 10px;
310
+ display: inline-block;
311
+ }
312
+
313
+ .foogallery_metabox_field-radio input[type="checkbox"],
314
+ .foogallery_metabox_field-radio input[type="radio"] {
315
+ margin: 0 0 10px 0;
316
+ }
317
+
318
+ .foogallery_metabox_field-select select {
319
+ min-width: 250px;
320
+ }
321
+
322
+ .foogallery-thumbsize-crop {
323
+ margin-top: 10px;
324
+ }
325
+
326
+ .foogallery_metabox_field-checkboxlist > input,
327
+ .foogallery_metabox_field-checkboxlist > label {
328
+ margin-bottom: 10px;
329
+ display: inline-block;
330
+ }
331
+
332
+ .foogallery_metabox_field-checkboxlist input[type="checkbox"] {
333
+ margin: 0 0 10px 0;
334
+ }
335
+
336
+ /** </gallery settings styling overrides> **/
337
+
338
+ .foogallery_metabox_custom_css {
339
+ width: 100%;
340
+ height: 10em;
341
+ }
342
+
343
+ .foo-nav-tabs a:focus {
344
+ box-shadow: none;
345
+ outline: 0;
346
+ }
347
+
348
+ .foogallery-thumbnail-preview {
349
+ display: inline-block;
350
+ }
351
+
352
+ #foogallery_apply_retina_support_container {
353
+ margin-top: 5px;
354
+ }
355
+
356
+ .widefat th.column-icon {
357
+ width: 60px;
358
+ }
359
+
360
+ #foogallery_settings .inside {
361
+ margin: 0;
362
+ padding: 0;
363
+ }
364
+ /** Balloon.css **/
365
+ button[data-balloon]{overflow:visible}[data-balloon]{position:relative}[data-balloon]:after,[data-balloon]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-khtml-opacity:0;-moz-opacity:0;opacity:0;pointer-events:none;-webkit-transition:all .18s ease-out .18s;transition:all .18s ease-out .18s;bottom:100%;left:50%;position:absolute;z-index:10;-webkit-transform:translate(-50%,10px);-ms-transform:translate(-50%,10px);transform:translate(-50%,10px);-webkit-transform-origin:top;-ms-transform-origin:top;transform-origin:top}[data-balloon]:after{background:rgba(17,17,17,.9);border-radius:4px;color:#fff;content:attr(data-balloon);font-size:12px;padding:.5em 1em;white-space:nowrap;margin-bottom:11px}[data-balloon]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%280%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;content:"";margin-bottom:5px}[data-balloon]:hover:after,[data-balloon]:hover:before,[data-balloon][data-balloon-visible]:after,[data-balloon][data-balloon-visible]:before{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;pointer-events:auto;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon].font-awesome:after{font-family:FontAwesome}[data-balloon][data-balloon-break]:after{white-space:pre}[data-balloon-pos=down]:after,[data-balloon-pos=down]:before{bottom:auto;left:50%;top:100%;-webkit-transform:translate(-50%,-10px);-ms-transform:translate(-50%,-10px);transform:translate(-50%,-10px)}[data-balloon-pos=down]:after{margin-top:11px}[data-balloon-pos=down]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2236px%22%20height%3D%2212px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28180%2018%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:6px;width:18px;margin-top:5px;margin-bottom:0}[data-balloon-pos=down]:hover:after,[data-balloon-pos=down]:hover:before,[data-balloon-pos=down][data-balloon-visible]:after,[data-balloon-pos=down][data-balloon-visible]:before{-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}[data-balloon-pos=left]:after,[data-balloon-pos=left]:before{bottom:auto;left:auto;right:100%;top:50%;-webkit-transform:translate(10px,-50%);-ms-transform:translate(10px,-50%);transform:translate(10px,-50%)}[data-balloon-pos=left]:after{margin-right:11px}[data-balloon-pos=left]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%28-90%2018%2018%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-right:5px;margin-bottom:0}[data-balloon-pos=left]:hover:after,[data-balloon-pos=left]:hover:before,[data-balloon-pos=left][data-balloon-visible]:after,[data-balloon-pos=left][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-pos=right]:after,[data-balloon-pos=right]:before{bottom:auto;left:100%;top:50%;-webkit-transform:translate(-10px,-50%);-ms-transform:translate(-10px,-50%);transform:translate(-10px,-50%)}[data-balloon-pos=right]:after{margin-left:11px}[data-balloon-pos=right]:before{background:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2212px%22%20height%3D%2236px%22%3E%3Cpath%20fill%3D%22rgba%2817,%2017,%2017,%200.9%29%22%20transform%3D%22rotate%2890%206%206%29%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E') no-repeat;background-size:100% auto;height:18px;width:6px;margin-bottom:0;margin-left:5px}[data-balloon-pos=right]:hover:after,[data-balloon-pos=right]:hover:before,[data-balloon-pos=right][data-balloon-visible]:after,[data-balloon-pos=right][data-balloon-visible]:before{-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}[data-balloon-length]:after{white-space:normal}[data-balloon-length=small]:after{width:80px}[data-balloon-length=medium]:after{width:150px}[data-balloon-length=large]:after{width:260px}[data-balloon-length=xlarge]:after{width:90vw}@media screen and (min-width:768px){[data-balloon-length=xlarge]:after{width:380px}}[data-balloon-length=fit]:after{width:100%}
366
+
367
+ /** Balloon.css overrides **/
368
+ [data-balloon]:after,
369
+ [data-balloon]:before {
370
+ text-align: center;
371
+ line-height: 1.2em;
372
+ }
373
+
374
+ .foogallery-items-view-switch-container.hidden {
375
+ display: none;
376
+ }
377
+
378
+ .foogallery-items-view-switch-container {
379
+ display: inline-block;
380
+ margin-left: 10px;
381
+ }
382
+
383
+ .foogallery-items-view-switch {
384
+ vertical-align: middle;
385
+ display: inline-block;
386
+ }
387
+
388
+ .foogallery-items-view-switch a {
389
+ padding: 4px 10px;
390
+ line-height: 12px;
391
+ border: 1px solid #ccc;
392
+ float: left;
393
+ display: inline-block;
394
+ text-decoration: none;
395
+ margin-right: 10px;
396
+ border-radius: 4px;
397
+ text-align: center;
398
+ white-space: nowrap;
399
+ vertical-align: middle;
400
+ -ms-touch-action: manipulation;
401
+ touch-action: manipulation;
402
+ cursor: pointer;
403
+ -webkit-user-select: none;
404
+ -moz-user-select: none;
405
+ -ms-user-select: none;
406
+ user-select: none;
407
+ background: #f7f7f7;
408
+ color: #555;
409
+ }
410
+
411
+ .foogallery-items-view-switch a:first-child:not(:last-child) {
412
+ border-top-right-radius: 0;
413
+ border-bottom-right-radius: 0;
414
+ }
415
+
416
+ .foogallery-items-view-switch a:last-child:not(:first-child) {
417
+ border-top-left-radius: 0;
418
+ border-bottom-left-radius: 0;
419
+ }
420
+
421
+ .foogallery-items-view-switch a:first-child {
422
+ margin-right: 0;
423
+ }
424
+
425
+ .foogallery-items-view-switch a.current {
426
+ background: #0085ba;
427
+ color: #fff;
428
+ }
429
+
430
+ .foogallery-items-view-switch a+a {
431
+ margin-left: -1px;
432
+ }
433
+
434
+ .foogallery_preview_container {
435
+ position: relative;
436
+ padding: 10px;
437
+ }
438
+
439
+ .foogallery_preview_container.loading:after {
440
+ content: '';
441
+ position: absolute;
442
+ top: 0;
443
+ left: 0;
444
+ right: 0;
445
+ bottom: 0;
446
+ background: #fff;
447
+ opacity: 0.8;
448
+ z-index: 159900;
449
+ }
450
+
451
+ .fs-submenu-item.foogallery {
452
+ font-size: 13px;
453
+ line-height: 1.2;
454
+ }
455
+
456
+ .foogallery_template_field_type-thumb_size_no_crop input.small-text+label {
457
+ margin-left: 10px;
458
+ }
459
+
460
+ .foogallery_template_field_type-thumb_size_no_crop label+input {
461
+ margin-left: 5px;
462
  }
css/admin-page-foogallery-extensions.css CHANGED
@@ -1,297 +1,297 @@
1
- .extensions-wrap {
2
- margin-left: 0;
3
- width: 98%;
4
- max-width: 98%;
5
- }
6
-
7
- .foogallery-extension-browser .extension-controls {
8
- margin-bottom: 10px;
9
- }
10
-
11
- .foogallery-extension-browser .extension-controls .subsubsub {
12
- margin:0;
13
- }
14
-
15
- .extension-search-box {
16
- display: inline-block;
17
- margin-left: 20px;
18
- float: left;
19
- }
20
-
21
- .extension-search-box #extensions-search-input {
22
- position: relative;
23
- top: -4px;
24
- margin: 0;
25
- width: 280px;
26
- font-size: 16px;
27
- font-weight: 300;
28
- line-height: 1.4em;
29
- }
30
-
31
- .extension-reload {
32
- float: left;
33
- display: inline-block;
34
- margin-left: 20px;
35
- vertical-align: middle;
36
- }
37
-
38
- .extension-reload .button {
39
- vertical-align: middle;
40
- }
41
-
42
- .extension-reload span.dashicons {
43
- vertical-align: middle;
44
- font-size: 18px;
45
- }
46
-
47
- .extension-reload .button.disabled span.dashicons {
48
- -webkit-animation: rotation 2s infinite linear;
49
- animation: rotation 2s infinite linear;
50
- }
51
-
52
- div.foogallery-message-success {
53
- border-left: 4px solid #7ad03a;
54
- padding: 1px 12px;
55
- background-color: #fff;
56
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
57
- box-shadow: 0 1px 1px 0 rgba(0,0,0,.1)
58
- }
59
-
60
- div.foogallery-message-error {
61
- border-left: 4px solid #dd3d36;
62
- background: #fff;
63
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
64
- box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
65
- padding: 1px 12px
66
- }
67
-
68
- .spinner {
69
- position: absolute;
70
- margin-top: 15px;
71
- }
72
-
73
- .foogallery-extension-browser {
74
- margin-top: 10px;
75
- width: 100%;
76
- position: relative;
77
- }
78
-
79
- .foogallery-extension-browser * {
80
- box-sizing: border-box;
81
- }
82
-
83
- .foogallery-extension-browser .extensions .extension {
84
- float: left;
85
- margin: 0 20px 20px 0;
86
- position: relative;
87
- width: 400px;
88
- height: 300px;
89
- border: 1px solid #DEDEDE;
90
- -webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
91
- box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
92
- -webkit-box-sizing: border-box;
93
- -moz-box-sizing: border-box;
94
- box-sizing: border-box;
95
- background: #fff;
96
- }
97
-
98
- .foogallery-extension-browser .extensions .extension h3 {
99
- position: absolute;
100
- bottom: 0;
101
- width: 100%;
102
- font-size: 15px;
103
- font-weight: bold;
104
- height: 50px;
105
- line-height: 50px;
106
- margin: 0;
107
- padding-left: 15px;
108
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
109
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
110
- overflow: hidden;
111
- white-space: nowrap;
112
- text-overflow: ellipsis;
113
- background: #000;
114
- opacity: 0.9;
115
- color:#fff;
116
- }
117
-
118
- .foogallery-extension-browser .extensions .extension h3 .new {
119
- background: #D54E21;
120
- background: rgba(213, 78, 33, 0.95);
121
- -webkit-border-radius: 3px;
122
- border-radius: 3px;
123
- padding:2px 5px;
124
- color:#fff;
125
- font-size: 10px;
126
- margin-left: 5px;
127
- margin-bottom: 3px;
128
- }
129
-
130
- .foogallery-extension-browser .extensions .extension h3 .tag {
131
- background: #888;
132
- -webkit-border-radius: 3px;
133
- border-radius: 3px;
134
- padding:2px 5px;
135
- color:#000;
136
- font-size: 9px;
137
- margin-left: 5px;
138
- vertical-align:top;
139
- }
140
-
141
- .foogallery-extension-browser .extensions .extension h3 .tag.functionality {
142
- background: #8a5cc9;
143
- }
144
-
145
- .foogallery-extension-browser .extensions .extension h3 .tag.premium {
146
- background: #080;
147
- }
148
-
149
- .foogallery-extension-browser .extensions .extension h3 .tag.lightbox {
150
- background: #ff7f00;
151
- }
152
-
153
- .foogallery-extension-browser .extensions .extension h3 .tag.template {
154
- background: #369;
155
- }
156
-
157
- .foogallery-extension-browser .extensions .extension h3 .tag.new {
158
- background: #F00;
159
- }
160
-
161
- .foogallery-extension-browser .extensions .extension .screenshot {
162
- height: 100%;
163
- position: absolute;
164
- left: 0;
165
- top: 0;
166
- width: 100%;
167
- -webkit-transform: translateZ(0);
168
- -webkit-transition: opacity .2s ease-in-out;
169
- transition: opacity .2s ease-in-out;
170
- }
171
-
172
- .foogallery-extension-browser .extensions .extension:hover .screenshot {
173
- opacity: .4;
174
- }
175
-
176
- .foogallery-extension-browser .extensions .extension .extension-actions {
177
- -webkit-transition: opacity .1s ease-in-out;
178
- transition: opacity .1s ease-in-out;
179
- position: absolute;
180
- bottom: 0;
181
- right: 0;
182
- height: 50px;
183
- padding: 9px 10px 0;
184
- }
185
-
186
- .foogallery-extension-browser .extensions .extension .extension-details {
187
- -ms-filter: "alpha(Opacity=0)";
188
- opacity: 0;
189
- position: absolute;
190
- top: 25%;
191
- right: 20%;
192
- left: 20%;
193
- background: #222;
194
- background: rgba(0, 0, 0, 0.7);
195
- color: #FFF;
196
- font-size: 15px;
197
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6);
198
- -webkit-font-smoothing: antialiased;
199
- font-weight: 600;
200
- padding: 15px 12px;
201
- text-align: center;
202
- -webkit-border-radius: 3px;
203
- border-radius: 3px;
204
- -webkit-transition: opacity .1s ease-in-out;
205
- transition: opacity .1s ease-in-out;
206
- }
207
-
208
- .foogallery-extension-browser .extensions .extension:hover .extension-details {
209
- -ms-filter: "alpha(Opacity=1)";
210
- opacity: 1;
211
- }
212
-
213
- .foogallery-extension-browser .extensions .extension .banner {
214
- background: #888;
215
- color: #FFF;
216
- display: block;
217
- font-size: 13px;
218
- font-weight: 400;
219
- height: 48px;
220
- line-height: 48px;
221
- padding: 0 10px 0 40px;
222
- position: absolute;
223
- top: 0;
224
- right: 0;
225
- left: 0;
226
- border-bottom: 1px solid rgba(0, 0, 0, 0.25);
227
- overflow: hidden;
228
- }
229
-
230
- .foogallery-extension-browser .extensions .extension .banner:empty {
231
- display: none;
232
- }
233
-
234
- .foogallery-extension-browser .extensions .extension .banner:before {
235
- display: inline-block;
236
- font: 400 30px/1 dashicons;
237
- top: 10px;
238
- left: 10px;
239
- position: absolute;
240
- speak: none;
241
- -webkit-font-smoothing: antialiased;
242
- }
243
-
244
- .foogallery-extension-browser .extensions .extension.activated .banner {
245
- background: #080;
246
- }
247
-
248
- .foogallery-extension-browser .extensions .extension.activated .banner:before {
249
- content: "\f147";
250
- }
251
-
252
- .foogallery-extension-browser .extensions .extension.has_error .banner {
253
- background: #800;
254
- }
255
-
256
- .foogallery-extension-browser .extensions .extension.has_error .banner:before {
257
- content: "\f158";
258
- }
259
-
260
- .foogallery-extension-browser .extensions .extension.updating .banner {
261
- background: #888;
262
- }
263
-
264
- .foogallery-extension-browser .extensions .extension.updating .banner:before {
265
- content: "\f463";
266
- -webkit-animation: rotation 2s infinite linear;
267
- animation: rotation 2s infinite linear;
268
- }
269
-
270
- .foogallery-extension-browser .extensions .extension .activate,
271
- .foogallery-extension-browser .extensions .extension .deactivate {
272
- display: none;
273
- }
274
-
275
- .foogallery-extension-browser .extensions .extension.downloaded .activate {
276
- display: block;
277
- }
278
-
279
- .foogallery-extension-browser .extensions .extension.downloaded .download {
280
- display: none;
281
- }
282
-
283
- .foogallery-extension-browser .extensions .extension.activated .activate {
284
- display: none;
285
- }
286
-
287
- .foogallery-extension-browser .extensions .extension.activated .deactivate {
288
- display: block;
289
- }
290
-
291
- .foogallery-extension-browser .extensions .extension.activated .updating {
292
- display: block;
293
- }
294
-
295
- .foogallery-extension-browser .extension-page {
296
- display: none;
297
  }
1
+ .extensions-wrap {
2
+ margin-left: 0;
3
+ width: 98%;
4
+ max-width: 98%;
5
+ }
6
+
7
+ .foogallery-extension-browser .extension-controls {
8
+ margin-bottom: 10px;
9
+ }
10
+
11
+ .foogallery-extension-browser .extension-controls .subsubsub {
12
+ margin:0;
13
+ }
14
+
15
+ .extension-search-box {
16
+ display: inline-block;
17
+ margin-left: 20px;
18
+ float: left;
19
+ }
20
+
21
+ .extension-search-box #extensions-search-input {
22
+ position: relative;
23
+ top: -4px;
24
+ margin: 0;
25
+ width: 280px;
26
+ font-size: 16px;
27
+ font-weight: 300;
28
+ line-height: 1.4em;
29
+ }
30
+
31
+ .extension-reload {
32
+ float: left;
33
+ display: inline-block;
34
+ margin-left: 20px;
35
+ vertical-align: middle;
36
+ }
37
+
38
+ .extension-reload .button {
39
+ vertical-align: middle;
40
+ }
41
+
42
+ .extension-reload span.dashicons {
43
+ vertical-align: middle;
44
+ font-size: 18px;
45
+ }
46
+
47
+ .extension-reload .button.disabled span.dashicons {
48
+ -webkit-animation: rotation 2s infinite linear;
49
+ animation: rotation 2s infinite linear;
50
+ }
51
+
52
+ div.foogallery-message-success {
53
+ border-left: 4px solid #7ad03a;
54
+ padding: 1px 12px;
55
+ background-color: #fff;
56
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
57
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,.1)
58
+ }
59
+
60
+ div.foogallery-message-error {
61
+ border-left: 4px solid #dd3d36;
62
+ background: #fff;
63
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
64
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
65
+ padding: 1px 12px
66
+ }
67
+
68
+ .spinner {
69
+ position: absolute;
70
+ margin-top: 15px;
71
+ }
72
+
73
+ .foogallery-extension-browser {
74
+ margin-top: 10px;
75
+ width: 100%;
76
+ position: relative;
77
+ }
78
+
79
+ .foogallery-extension-browser * {
80
+ box-sizing: border-box;
81
+ }
82
+
83
+ .foogallery-extension-browser .extensions .extension {
84
+ float: left;
85
+ margin: 0 20px 20px 0;
86
+ position: relative;
87
+ width: 400px;
88
+ height: 300px;
89
+ border: 1px solid #DEDEDE;
90
+ -webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
91
+ box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1);
92
+ -webkit-box-sizing: border-box;
93
+ -moz-box-sizing: border-box;
94
+ box-sizing: border-box;
95
+ background: #fff;
96
+ }
97
+
98
+ .foogallery-extension-browser .extensions .extension h3 {
99
+ position: absolute;
100
+ bottom: 0;
101
+ width: 100%;
102
+ font-size: 15px;
103
+ font-weight: bold;
104
+ height: 50px;
105
+ line-height: 50px;
106
+ margin: 0;
107
+ padding-left: 15px;
108
+ -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
109
+ box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1);
110
+ overflow: hidden;
111
+ white-space: nowrap;
112
+ text-overflow: ellipsis;
113
+ background: #000;
114
+ opacity: 0.9;
115
+ color:#fff;
116
+ }
117
+
118
+ .foogallery-extension-browser .extensions .extension h3 .new {
119
+ background: #D54E21;
120
+ background: rgba(213, 78, 33, 0.95);
121
+ -webkit-border-radius: 3px;
122
+ border-radius: 3px;
123
+ padding:2px 5px;
124
+ color:#fff;
125
+ font-size: 10px;
126
+ margin-left: 5px;
127
+ margin-bottom: 3px;
128
+ }
129
+
130
+ .foogallery-extension-browser .extensions .extension h3 .tag {
131
+ background: #888;
132
+ -webkit-border-radius: 3px;
133
+ border-radius: 3px;
134
+ padding:2px 5px;
135
+ color:#000;
136
+ font-size: 9px;
137
+ margin-left: 5px;
138
+ vertical-align:top;
139
+ }
140
+
141
+ .foogallery-extension-browser .extensions .extension h3 .tag.functionality {
142
+ background: #8a5cc9;
143
+ }
144
+
145
+ .foogallery-extension-browser .extensions .extension h3 .tag.premium {
146
+ background: #080;
147
+ }
148
+
149
+ .foogallery-extension-browser .extensions .extension h3 .tag.lightbox {
150
+ background: #ff7f00;
151
+ }
152
+
153
+ .foogallery-extension-browser .extensions .extension h3 .tag.template {
154
+ background: #369;
155
+ }
156
+
157
+ .foogallery-extension-browser .extensions .extension h3 .tag.new {
158
+ background: #F00;
159
+ }
160
+
161
+ .foogallery-extension-browser .extensions .extension .screenshot {
162
+ height: 100%;
163
+ position: absolute;
164
+ left: 0;
165
+ top: 0;
166
+ width: 100%;
167
+ -webkit-transform: translateZ(0);
168
+ -webkit-transition: opacity .2s ease-in-out;
169
+ transition: opacity .2s ease-in-out;
170
+ }
171
+
172
+ .foogallery-extension-browser .extensions .extension:hover .screenshot {
173
+ opacity: .4;
174
+ }
175
+
176
+ .foogallery-extension-browser .extensions .extension .extension-actions {
177
+ -webkit-transition: opacity .1s ease-in-out;
178
+ transition: opacity .1s ease-in-out;
179
+ position: absolute;
180
+ bottom: 0;
181
+ right: 0;
182
+ height: 50px;
183
+ padding: 9px 10px 0;
184
+ }
185
+
186
+ .foogallery-extension-browser .extensions .extension .extension-details {
187
+ -ms-filter: "alpha(Opacity=0)";
188
+ opacity: 0;
189
+ position: absolute;
190
+ top: 25%;
191
+ right: 20%;
192
+ left: 20%;
193
+ background: #222;
194
+ background: rgba(0, 0, 0, 0.7);
195
+ color: #FFF;
196
+ font-size: 15px;
197
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6);
198
+ -webkit-font-smoothing: antialiased;
199
+ font-weight: 600;
200
+ padding: 15px 12px;
201
+ text-align: center;
202
+ -webkit-border-radius: 3px;
203
+ border-radius: 3px;
204
+ -webkit-transition: opacity .1s ease-in-out;
205
+ transition: opacity .1s ease-in-out;
206
+ }
207
+
208
+ .foogallery-extension-browser .extensions .extension:hover .extension-details {
209
+ -ms-filter: "alpha(Opacity=1)";
210
+ opacity: 1;
211
+ }
212
+
213
+ .foogallery-extension-browser .extensions .extension .banner {
214
+ background: #888;
215
+ color: #FFF;
216
+ display: block;
217
+ font-size: 13px;
218
+ font-weight: 400;
219
+ height: 48px;
220
+ line-height: 48px;
221
+ padding: 0 10px 0 40px;
222
+ position: absolute;
223
+ top: 0;
224
+ right: 0;
225
+ left: 0;
226
+ border-bottom: 1px solid rgba(0, 0, 0, 0.25);
227
+ overflow: hidden;
228
+ }
229
+
230
+ .foogallery-extension-browser .extensions .extension .banner:empty {
231
+ display: none;
232
+ }
233
+
234
+ .foogallery-extension-browser .extensions .extension .banner:before {
235
+ display: inline-block;
236
+ font: 400 30px/1 dashicons;
237
+ top: 10px;
238
+ left: 10px;
239
+ position: absolute;
240
+ speak: none;
241
+ -webkit-font-smoothing: antialiased;
242
+ }
243
+
244
+ .foogallery-extension-browser .extensions .extension.activated .banner {
245
+ background: #080;
246
+ }
247
+
248
+ .foogallery-extension-browser .extensions .extension.activated .banner:before {
249
+ content: "\f147";
250
+ }
251
+
252
+ .foogallery-extension-browser .extensions .extension.has_error .banner {
253
+ background: #800;
254
+ }
255
+
256
+ .foogallery-extension-browser .extensions .extension.has_error .banner:before {
257
+ content: "\f158";
258
+ }
259
+
260
+ .foogallery-extension-browser .extensions .extension.updating .banner {
261
+ background: #888;
262
+ }
263
+
264
+ .foogallery-extension-browser .extensions .extension.updating .banner:before {
265
+ content: "\f463";
266
+ -webkit-animation: rotation 2s infinite linear;
267
+ animation: rotation 2s infinite linear;
268
+ }
269
+
270
+ .foogallery-extension-browser .extensions .extension .activate,
271
+ .foogallery-extension-browser .extensions .extension .deactivate {
272
+ display: none;
273
+ }
274
+
275
+ .foogallery-extension-browser .extensions .extension.downloaded .activate {
276
+ display: block;
277
+ }
278
+
279
+ .foogallery-extension-browser .extensions .extension.downloaded .download {
280
+ display: none;
281
+ }
282
+
283
+ .foogallery-extension-browser .extensions .extension.activated .activate {
284
+ display: none;
285
+ }
286
+
287
+ .foogallery-extension-browser .extensions .extension.activated .deactivate {
288
+ display: block;
289
+ }
290
+
291
+ .foogallery-extension-browser .extensions .extension.activated .updating {
292
+ display: block;
293
+ }
294
+
295
+ .foogallery-extension-browser .extension-page {
296
+ display: none;
297
  }
css/admin-page-foogallery-help.css CHANGED
@@ -1,3 +1,3 @@
1
- .foogallery_page_foogallery-help .fs-notice {
2
- margin-right: 200px !important;
3
  }
1
+ .foogallery_page_foogallery-help .fs-notice {
2
+ margin-right: 200px !important;
3
  }
css/admin-page-foogallery-settings.css CHANGED
@@ -1,3 +1,3 @@
1
- #foogallery-settings-main div+br {
2
- display: none;
3
  }
1
+ #foogallery-settings-main div+br {
2
+ display: none;
3
  }
css/admin-tinymce.css CHANGED
@@ -1,114 +1,114 @@
1
- .mce-content-body div.foogallery-tinymce-view {
2
- background-color: rgba(0, 0, 0, 0.1);
3
- position: relative;
4
- margin-bottom: 16px;
5
- border: 1px solid rgba(0, 0, 0, 0);
6
- width: 99.99%;
7
- clear: both;
8
- height: 250px;
9
- text-align: center;
10
- }
11
-
12
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar {
13
- display: none;
14
- position: absolute;
15
- top: 0;
16
- left: 0;
17
- z-index: 100;
18
- }
19
-
20
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons {
21
- margin-top: 7px;
22
- margin-left: 7px;
23
- padding: 2px;
24
- width: 30px;
25
- height: 30px;
26
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
27
- background-color: #000;
28
- background-color: rgba(0, 0, 0, 0.9);
29
- cursor: pointer;
30
- color: #FFF;
31
- font-size: 30px;
32
- }
33
-
34
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons:hover {
35
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
36
- background-color: #000;
37
- color: #2EA2CC;
38
- }
39
-
40
- .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected {
41
- border-color: rgba(0, 0, 0, 0.3);
42
- }
43
-
44
- .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected .foogallery-tinymce-toolbar {
45
- display: block;
46
- }
47
-
48
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile {
49
- position: absolute;
50
- z-index: 10;
51
- left: 50%;
52
- top: 50%;
53
- margin-left: -83px;
54
- margin-top: -95px;
55
- }
56
-
57
- /* Image styles */
58
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile .foogallery-pile-inner { max-width: 100%; height: auto; vertical-align: bottom; border: 8px solid #fff;
59
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
60
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
61
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
62
- overflow: hidden;
63
- background: #CCC;
64
- }
65
-
66
- /* Stacks creted by the use of generated content */
67
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before, .foogallery-pile:after { content: ""; width: 100%; height: 100%; position: absolute; border: 8px solid #fff; left: 0;
68
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
69
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
70
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
71
- -webkit-box-sizing: border-box;
72
- -moz-box-sizing: border-box;
73
- box-sizing: border-box;
74
- }
75
- /* 1st element in stack (behind image) */
76
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before {
77
- top: 0;
78
- z-index: -10;
79
- -webkit-transform: rotate(-3deg);
80
- -moz-transform: rotate(-3deg);
81
- transform: rotate(-3deg);
82
- }
83
- /* 2nd element in stack (behind image) */
84
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile:after {
85
- top: 1px;
86
- z-index: -20;
87
- -webkit-transform: rotate(4deg);
88
- -moz-transform: rotate(4deg);
89
- transform: rotate(4deg);
90
- }
91
-
92
- .mce-content-body div.foogallery-tinymce-view .foogallery-pile-inner img {
93
- max-width: 150px;
94
- }
95
-
96
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-title {
97
- font-family: "Open Sans", sans-serif;
98
- font-size: 1.2em;
99
- color: #666;
100
- position: absolute;
101
- bottom: 1em;
102
- width: 100%;
103
- left: 0;
104
- }
105
-
106
- .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-count {
107
- font-family: "Open Sans", sans-serif;
108
- font-size: 0.7em;
109
- color: #888;
110
- position: absolute;
111
- bottom: 0.5em;
112
- width: 100%;
113
- left: 0;
114
  }
1
+ .mce-content-body div.foogallery-tinymce-view {
2
+ background-color: rgba(0, 0, 0, 0.1);
3
+ position: relative;
4
+ margin-bottom: 16px;
5
+ border: 1px solid rgba(0, 0, 0, 0);
6
+ width: 99.99%;
7
+ clear: both;
8
+ height: 250px;
9
+ text-align: center;
10
+ }
11
+
12
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar {
13
+ display: none;
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ z-index: 100;
18
+ }
19
+
20
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons {
21
+ margin-top: 7px;
22
+ margin-left: 7px;
23
+ padding: 2px;
24
+ width: 30px;
25
+ height: 30px;
26
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
27
+ background-color: #000;
28
+ background-color: rgba(0, 0, 0, 0.9);
29
+ cursor: pointer;
30
+ color: #FFF;
31
+ font-size: 30px;
32
+ }
33
+
34
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-toolbar .dashicons:hover {
35
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
36
+ background-color: #000;
37
+ color: #2EA2CC;
38
+ }
39
+
40
+ .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected {
41
+ border-color: rgba(0, 0, 0, 0.3);
42
+ }
43
+
44
+ .mce-content-body div.foogallery-tinymce-view.foogallery-tinymce-selected .foogallery-tinymce-toolbar {
45
+ display: block;
46
+ }
47
+
48
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile {
49
+ position: absolute;
50
+ z-index: 10;
51
+ left: 50%;
52
+ top: 50%;
53
+ margin-left: -83px;
54
+ margin-top: -95px;
55
+ }
56
+
57
+ /* Image styles */
58
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile .foogallery-pile-inner { max-width: 100%; height: auto; vertical-align: bottom; border: 8px solid #fff;
59
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
60
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
61
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
62
+ overflow: hidden;
63
+ background: #CCC;
64
+ }
65
+
66
+ /* Stacks creted by the use of generated content */
67
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before, .foogallery-pile:after { content: ""; width: 100%; height: 100%; position: absolute; border: 8px solid #fff; left: 0;
68
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
69
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
70
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
71
+ -webkit-box-sizing: border-box;
72
+ -moz-box-sizing: border-box;
73
+ box-sizing: border-box;
74
+ }
75
+ /* 1st element in stack (behind image) */
76
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile:before {
77
+ top: 0;
78
+ z-index: -10;
79
+ -webkit-transform: rotate(-3deg);
80
+ -moz-transform: rotate(-3deg);
81
+ transform: rotate(-3deg);
82
+ }
83
+ /* 2nd element in stack (behind image) */
84
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile:after {
85
+ top: 1px;
86
+ z-index: -20;
87
+ -webkit-transform: rotate(4deg);
88
+ -moz-transform: rotate(4deg);
89
+ transform: rotate(4deg);
90
+ }
91
+
92
+ .mce-content-body div.foogallery-tinymce-view .foogallery-pile-inner img {
93
+ max-width: 150px;
94
+ }
95
+
96
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-title {
97
+ font-family: "Open Sans", sans-serif;
98
+ font-size: 1.2em;
99
+ color: #666;
100
+ position: absolute;
101
+ bottom: 1em;
102
+ width: 100%;
103
+ left: 0;
104
+ }
105
+
106
+ .mce-content-body div.foogallery-tinymce-view .foogallery-tinymce-count {
107
+ font-family: "Open Sans", sans-serif;
108
+ font-size: 0.7em;
109
+ color: #888;
110
+ position: absolute;
111
+ bottom: 0.5em;
112
+ width: 100%;
113
+ left: 0;
114
  }
css/foogallery-foovideo-overrides.css CHANGED
@@ -1,96 +1,96 @@
1
- /* sticky video icon states */
2
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb,
3
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb,
4
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb,
5
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb,
6
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb {
7
- transform: translateY(0) translateX(0) translateZ(0);
8
- }
9
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb,
10
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb,
11
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb,
12
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb,
13
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb {
14
- transform: translateY(0) translateX(0) translateZ(0);
15
- }
16
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb:before,
17
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
18
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
19
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
20
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb:before {
21
- content: '';
22
- display: block;
23
- top: 0;
24
- left: 0;
25
- bottom: 0;
26
- right: 0;
27
- visibility: visible;
28
- opacity: 1;
29
- background-color: rgba(0,0,0,0);
30
- transition-timing-function: ease;
31
- transition-duration: 300ms;
32
- transition-property: opacity,visibility,background-color;
33
- transform: translateY(0) translateX(0) translateZ(0);
34
- z-index: 8;
35
- }
36
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb:before,
37
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb:before,
38
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb:before,
39
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb:before,
40
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb:before {
41
- background-color: rgba(0,0,0,0.5);
42
- }
43
- .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
44
- .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
45
- .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
46
- .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
47
- .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
48
- display: none;
49
- }
50
-
51
- /* The icons */
52
- .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
53
- .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
54
- .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
55
- .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
56
- .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
57
- .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
58
- .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
59
- .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
60
- .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
61
- .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
62
- background-size: 60px 60px;
63
- }
64
- .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
65
- .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
66
- .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
67
- .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
68
- .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
69
- width: 60px;
70
- height: 60px;
71
- }
72
-
73
- .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
74
- .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before {
75
- background-image: url('data:image/png;base64,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')!important;
76
- }
77
-
78
- .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
79
- .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before {
80
- background-image: url('data:image/png;base64,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')!important;
81
- }
82
-
83
- .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
84
- .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before {
85
- background-image: url('data:image/png;base64,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')!important;
86
- }
87
-
88
- .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
89
- .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before {
90
- background-image: url('data:image/png;base64,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')!important;
91
- }
92
-
93
- .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
94
- .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
95
- background-image: url(data:image/png;base64,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)!important;
96
  }
1
+ /* sticky video icon states */
2
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb,
3
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb,
4
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb,
5
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb,
6
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb {
7
+ transform: translateY(0) translateX(0) translateZ(0);
8
+ }
9
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb,
10
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb,
11
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb,
12
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb,
13
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb {
14
+ transform: translateY(0) translateX(0) translateZ(0);
15
+ }
16
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-thumb:before,
17
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
18
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
19
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
20
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-thumb:before {
21
+ content: '';
22
+ display: block;
23
+ top: 0;
24
+ left: 0;
25
+ bottom: 0;
26
+ right: 0;
27
+ visibility: visible;
28
+ opacity: 1;
29
+ background-color: rgba(0,0,0,0);
30
+ transition-timing-function: ease;
31
+ transition-duration: 300ms;
32
+ transition-property: opacity,visibility,background-color;
33
+ transform: translateY(0) translateX(0) translateZ(0);
34
+ z-index: 8;
35
+ }
36
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-item-inner:hover .fg-thumb:before,
37
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-item-inner:hover .fg-thumb:before,
38
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-item-inner:hover .fg-thumb:before,
39
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-item-inner:hover .fg-thumb:before,
40
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-item-inner:hover .fg-thumb:before {
41
+ background-color: rgba(0,0,0,0.5);
42
+ }
43
+ .video-icon-sticky.foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
44
+ .video-icon-sticky.foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
45
+ .video-icon-sticky.foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
46
+ .video-icon-sticky.foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
47
+ .video-icon-sticky.foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
48
+ display: none;
49
+ }
50
+
51
+ /* The icons */
52
+ .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
53
+ .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
54
+ .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
55
+ .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
56
+ .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
57
+ .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
58
+ .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
59
+ .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
60
+ .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
61
+ .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
62
+ background-size: 60px 60px;
63
+ }
64
+ .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before,
65
+ .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before,
66
+ .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before,
67
+ .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before,
68
+ .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
69
+ width: 60px;
70
+ height: 60px;
71
+ }
72
+
73
+ .foogallery-container.video-icon-default .fg-video .fg-thumb:before,
74
+ .foogallery-container.video-icon-default .fg-video .fg-caption-inner:before {
75
+ background-image: url('data:image/png;base64,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')!important;
76
+ }
77
+
78
+ .foogallery-container.video-icon-1 .fg-video .fg-thumb:before,
79
+ .foogallery-container.video-icon-1 .fg-video .fg-caption-inner:before {
80
+ background-image: url('data:image/png;base64,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')!important;
81
+ }
82
+
83
+ .foogallery-container.video-icon-2 .fg-video .fg-thumb:before,
84
+ .foogallery-container.video-icon-2 .fg-video .fg-caption-inner:before {
85
+ background-image: url('data:image/png;base64,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')!important;
86
+ }
87
+
88
+ .foogallery-container.video-icon-3 .fg-video .fg-thumb:before,
89
+ .foogallery-container.video-icon-3 .fg-video .fg-caption-inner:before {
90
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsSAAALEgHS3X78AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAADPZJREFUeNrMWmtwU+W6ftYlWbmtNE1zoTdaoC23alvqVIxTwqWM28HZW2XgaAsesd5FqOgPZ/QHjuAMMA7qFEW3W4nM6GYjx/G4mbYeOBjbTpFiC9m0pUWhUFJ6Xyv3ZGUla//YTU8a2tIW2HPemTWTWVnry/d83/O+7/O9bwhJkpBofr8fr7zyCubNmweKonD69GmkpKQgLy8PXV1dUKlU6OvrQ1ZWFq5fvw6DwUB2dnaaOY5L93q9ep/Pp1Gr1Uqn0ykHQJhMJoEgiKBWq/WIosgnJSXdSE9PdwqCENFqtRgYGIDRaIRKpUJOTg4GBwfR398PmUyGrKwsdHR04IMPPoDZbL5prjRmaARBQC6XAwAGBgYyWltbi1wu19yRkRFjNBpVjD4mjV4AIF29epUAELtAEITAsuxQUlKSc+HCha0EQVyVy+URkiRnOp2ZAZDL5ZAkiezs7Cxobm4u4TguLRqNMgBEABEAwemMI0kS4Xa7TW63O7Wnp6dQo9H033PPPS0LFy48yzCMQBDEnQVAkiQoisJvv/02//jx42uHhoayR1c4PN1JJ2IYBS0CILxeb2pTU9MfOzo67qNp+n91Ot0FiqLuDACapgGAaWhoeKirq+v+URqEpnqHZVnodLoxqoXDYbjdbvA8PxmYMIAwz/Pmzz//vCI7O9thsVj+zrKsZ9YAJEkCwzDgOM70888/P87z/LzR1b7J6w0GA5YtW4b8/Hzk5eVhwYIFYFkWMSpIkgS/34/u7m50dXWhra0NLS0tcDqdiUOFAaC7u7tgeHg4dc2aNd/Nnz//yqwAqFQqtLS0ZNrt9nKe53UAAonP5ObmYsOGDSgrK0NqaipIkoQoigiHw4hGo+OeVSgUMJvNsFgsAIDh4WHY7XYcPXoUra2tiUMHPR6Poa6u7j8lSfqbXq9vnzSoTBRGAWDjxo2Z33///WZBENSxlYlZUlISXnzxRTz++ONITk6G3++HKIozcgKKoqBSqeD3+1FbW4vq6uqJdoQmCCKycuXKIz/88EO7Wq2+eZydO3fedPPYsWOG999//+lAIKBJnLzVasVHH32EVatWIRqNIhgM3rTa04xEEAQBBEGgoKAADz/8MDweD9rbxy12FAB9/fr1xTqd7qrFYrnJiYjh4eFxq9Lb28usXbu20ul0ZiY6a2VlJaqqqgAAoVAId9JkMhkYhoHNZsPevXsRiUTGfa1QKFwnT578c35+Phe/29Rjjz2G4eFhcBwHjuPw/PPP/+nixYtLE8Pj9u3bUVVVhVAohHA4jDtt0WgU4XAYy5cvx5w5c/DTTz8hjt5RURTZU6dOmR544IFzgUAAIyMj4DgO1AsvvACSJKFSqVBbW5v31Vdf/SGRNs899xy2bdsGv98/KV1IksRk/jQTEwQBhYWFSE5ORn19ffyYIs/zJpVK5cnMzHQODQ3B7XaD2rFjBxiGgSiK1NatW//D6/UmjWZVAEBZWRl27do15eQlSUIoFALLspAk6baBCIKAkpISjIyMwOFwjKP82bNn0wwGQ6vL5Qr39fWBKi4uRm9vL2w2W8Hp06ctAITY03PmzMH+/fuhUCimjDJKpRL79u3D+fPnUVRUBJVKdds0C4fDKCkpQX19PYaGhuKdmjUajUJZWdmVlJQUkDKZDBRFkU1NTZbRB8ZRJzMzE4Ig3DJb8zyPTz/9FJs2bYLdbodarR7LxLOxSCQCjUaDqqoqJMiKcH19fTHP8+pIJALq/vvvh91uz2tsbCyN5/7ixYvx9ttvQxCEW1JCJpPhxIkTuHTpEoaGhnD8+HH09/djyZIlMBqNEEVxVrQKh8PIzc1FW1sbrlwZS8hSMBjUBgIBzmQyXSe7urrQ2tq6FMA4mE8//TSUSuWsYjwAfPvtt9i4cSO+/vrrsaQ1m1wRiURQWVmZuAuR9vb2hR0dHSDvu+8+iuO4zFFlOMb90tJSBAKB2+Lx8PAw3nnnHbz88ss4f/48WJaNicNpWzAYxNKlS7Fo0aL42+LIyEh6bm6ujnQ4HOlDQ0OG+MhTVFQEvV6fmExmbY2NjXjqqaewZ88eBAIBqNVqTFfzS5IEpVKJ0tLScWkjGAxqzp07N490uVzpAGTxKnPFihV3JKYn8vmLL75ARUUFTpw4AZVKBYZhpv3uihUrkHBiI3ieN5M9PT3J8XcZhkF+fv5dybYAcPnyZbz66quoqqpCT08PWJbFrQ4voigiIyMDer1+3OY4nU492d/fr40Pn0lJSdDpdHeMPpNZXV0dnnjiCdhsNkSj0SmdPBqNQq1Ww2g0jrs9ODioIT0ejyaePizLxs6+uNvmdrvx3nvvYcuWLThz5gxYloVMJpsQAMMwSE4eRxbJ7/crSADyeAAMw4Cm6X8LgJg5HA4888wz2LVrF65duzYhpUiShFarTTyKUiT+n1g0GsXhw4dx9OjRSUPtRJGLliRJjNVrYkIqEon823chIyMDO3bswOrVqyeULpIkweMZd8YnAERovV7v7e/vHwPg8XggCMKEXLwbJpfLsWXLFmzatAlGoxE+n++mhSNJEqFQCBzHjQOgVqtDtEKh8AAYo5LL5YLb7YZWq73rkWjZsmV44403UFxcjEAgAK/XOyl1vF5vvCqNAfCRhYWFI4mpu6ur667ugNFoxM6dO3Ho0CEUFBTA4/FMKddpmsbAwEAiAHLx4sUcKYpiX6xCFvvGbrdjJuW9mdRVH330URw+fBhPPvkkRFGclt6Sy+VobGyciBEDpMViuZaSkjISr0Z//fVXuN1uzKbYOpktWrQIBw8exJ49e5CWlgaPxzMtpUsQBEKhEE6dOjXutlwu9z344INXyO7u7rBer3fGA7h27RrOnj0LpVJ52xNnGAYvvfQSbDYbrFbrWJCYiZNfvnw5sdwiS0lJuTEyMjJEpqWloaioqCPxxS+//BKRSOS2qGS1WvHNN99g+/btkMvlkzrprRbAZrMllnGoJUuWXJo7dy5Is9mMRx55pCMjI6N/VJUCAJqbm1FXVweNRjPjH01NTcW7776LAwcOIC8vD16vd1YRTalUoqWlBTU1NeMmz7Kse/369Q6z2fwvANnZ2eFVq1adSTyVffzxx+A47paHEIIgxpyxvLwcR44cwYYNGxAKhRAMBme1e7Eyzf79+xPHkBcVFTlycnI4rVYL6t5778WNGzeQkpLS39DQsEQURTamTjmOA8/zeOihh24pr/v7+1FeXo7KykrQND3ricdMq9Xi4MGDOHbs2LjVl8lkvurq6m8NBkNQqVSCevbZZ6HVapGenh4xGAyBpqam/Hh53d7eDq1Wi+XLl0/qfKIoori4GAsWLIDP55v1OTp+8j/++CN2796dSD2mvLz8p7Vr114MBAL/8tFYaZskSYTDYVRUVGzu7OwcV1qkKAq7d+/G+vXr4Xa776pG0mq1aGhowLZt2xKdXm4wGJxHjhz5VKfTiTFGEL29veMy3qVLl7Tr1q17jud5fXyZhaZpvPnmm9i8eTMCgcCMy+nTKbdrNBrU1NTgrbfeShRuFEmSwnffffcXi8XSG0/nCfsDn3zyydzXXnvtmVAoRMdXKwCgoqICW7duRXJy8oTCazamVqsRDAZx6NAhHDhwIHFxSIIgqNdff/2v+/bt+8e0GhySJGHdunWLa2trn5AkiUoEMX/+fFRVVWH16tWgKArBYHDGYZIkSSgUChAEgV9++QUffvjhRJ0aEgBdUlLy3ydPnjw9UUifsMHh9/tx5syZIaPRODg4OJgXCoWYeMfmOA41NTVoa2sDwzAwmUxITk6e8iAS63QqFAoolUoEAgE0Nzejuroae/fuRV9f300aTiaTwWq1/j0vL++01WrFRB2aSQO8z+eD1Wpty83N9X322WcbgsFgSmLPwG63w263IysrCytXrkR+fj7y8/NhNBpB0/QYoEgkgnA4DI7jcOHCBbS3t8Nut+PixYtTKAh5YM2aNf9ltVrbzp07NylVp8xQoVAI6enp3Var9c8XLlz4o9PpXIL/6++O2dWrV2Gz2QAAGo0GJpMJWq12rO4jCAK8Xi8GBgbgcrmm9GUAMoPB0F1aWvq92Wy+catO0C3rfOFwGCqVirdYLIddLteyxsbGVT6fzzAREADwer2z0TzUaBvJXVJS8j9arbbJZDKFp1ObmlahMhKJgKIoqaio6FeTydTx+++/WxwOx72jQIjRcDvT7EWO/j4hl8v5vLy89sLCwvrMzEze4XBMO0xPu9Ia68IoFAp/SUnJCZPJVA9gYXNzcwHP82l+vz9pdFJSwoW4wxI5+lmSyWQenU7Xl5OTc4FhmLbs7GxfLJzOJDTP+N8q0WgUgiCApulQVlaWg6Zph0aj0XR0dGS7XC6z1+vV+/1+DUVRDM/zNEEQhEajEWmaDrEs6wPAsSw7kJmZ2U0QBJ+UlITBwUEIggCFQjHjHPLPAQCVOvMDg/9I3gAAAABJRU5ErkJggg==')!important;
91
+ }
92
+
93
+ .foogallery-container.video-icon-4 .fg-video .fg-thumb:before,
94
+ .foogallery-container.video-icon-4 .fg-video .fg-caption-inner:before {
95
+ background-image: url(data:image/png;base64,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)!important;
96
  }
extensions/albums/admin/class-columns.php CHANGED
@@ -1,73 +1,73 @@
1
- <?php
2
- /*
3
- * FooGallery Admin Columns class
4
- */
5
-
6
- if ( ! class_exists( 'FooGallery_Albums_Admin_Columns' ) ) {
7
-
8
- class FooGallery_Albums_Admin_Columns {
9
-
10
- private $include_clipboard_script = false;
11
-
12
- function __construct() {
13
- add_filter( 'manage_edit-' . FOOGALLERY_CPT_ALBUM . '_columns', array( $this, 'album_custom_columns' ) );
14
- add_action( 'manage_posts_custom_column', array( $this, 'album_custom_column_content' ) );
15
- add_action( 'admin_footer', array( $this, 'include_clipboard_script' ) );
16
- }
17
-
18
- function album_custom_columns( $columns ) {
19
- $columns[FOOGALLERY_CPT_ALBUM . '_template'] = __( 'Template', 'foogallery' );
20
- $columns[FOOGALLERY_CPT_ALBUM . '_galleries'] = __( 'Galleries', 'foogallery' );
21
- $columns[FOOGALLERY_CPT_ALBUM . '_shortcode'] = __( 'Shortcode', 'foogallery' );
22
-
23
- return $columns;
24
- }
25
-
26
- function album_custom_column_content( $column ) {
27
- global $post;
28
-
29
- switch ( $column ) {
30
- case FOOGALLERY_CPT_ALBUM . '_template':
31
- $album = FooGalleryAlbum::get( $post );
32
- $template = $album->album_template_details();
33
- if ( false !== $template ) {
34
- echo $template['name'];
35
- }
36
- break;
37
- case FOOGALLERY_CPT_ALBUM . '_galleries':
38
- $album = FooGalleryAlbum::get( $post );
39
- echo $album->gallery_count();
40
- break;
41
- case FOOGALLERY_CPT_ALBUM . '_shortcode':
42
- $album = FooGalleryAlbum::get( $post );
43
- $shortcode = $album->shortcode();
44
- echo '<input type="text" readonly="readonly" size="' . strlen( $shortcode ) . '" value="' . esc_attr( $shortcode ) . '" class="foogallery-shortcode" />';
45
- $this->include_clipboard_script = true;
46
- break;
47
- }
48
- }
49
-
50
- function include_clipboard_script() {
51
- if ( $this->include_clipboard_script ) { ?>
52
- <script>
53
- jQuery(function($) {
54
- $('.foogallery-shortcode').click( function () {
55
- try {
56
- //select the contents
57
- this.select();
58
- //copy the selection
59
- document.execCommand('copy');
60
- //show the copied message
61
- $('.foogallery-shortcode-message').remove();
62
- $(this).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
63
- } catch(err) {
64
- console.log('Oops, unable to copy!');
65
- }
66
- });
67
- });
68
- </script>
69
- <?php
70
- }
71
- }
72
- }
73
- }
1
+ <?php
2
+ /*
3
+ * FooGallery Admin Columns class
4
+ */
5
+
6
+ if ( ! class_exists( 'FooGallery_Albums_Admin_Columns' ) ) {
7
+
8
+ class FooGallery_Albums_Admin_Columns {
9
+
10
+ private $include_clipboard_script = false;
11
+
12
+ function __construct() {
13
+ add_filter( 'manage_edit-' . FOOGALLERY_CPT_ALBUM . '_columns', array( $this, 'album_custom_columns' ) );
14
+ add_action( 'manage_posts_custom_column', array( $this, 'album_custom_column_content' ) );
15
+ add_action( 'admin_footer', array( $this, 'include_clipboard_script' ) );
16
+ }
17
+
18
+ function album_custom_columns( $columns ) {
19
+ $columns[FOOGALLERY_CPT_ALBUM . '_template'] = __( 'Template', 'foogallery' );
20
+ $columns[FOOGALLERY_CPT_ALBUM . '_galleries'] = __( 'Galleries', 'foogallery' );
21
+ $columns[FOOGALLERY_CPT_ALBUM . '_shortcode'] = __( 'Shortcode', 'foogallery' );
22
+
23
+ return $columns;
24
+ }
25
+
26
+ function album_custom_column_content( $column ) {
27
+ global $post;
28
+
29
+ switch ( $column ) {
30
+ case FOOGALLERY_CPT_ALBUM . '_template':
31
+ $album = FooGalleryAlbum::get( $post );
32
+ $template = $album->album_template_details();
33
+ if ( false !== $template ) {
34
+ echo $template['name'];
35
+ }
36
+ break;
37
+ case FOOGALLERY_CPT_ALBUM . '_galleries':
38
+ $album = FooGalleryAlbum::get( $post );
39
+ echo $album->gallery_count();
40
+ break;
41
+ case FOOGALLERY_CPT_ALBUM . '_shortcode':
42
+ $album = FooGalleryAlbum::get( $post );
43
+ $shortcode = $album->shortcode();
44
+ echo '<input type="text" readonly="readonly" size="' . strlen( $shortcode ) . '" value="' . esc_attr( $shortcode ) . '" class="foogallery-shortcode" />';
45
+ $this->include_clipboard_script = true;
46
+ break;
47
+ }
48
+ }
49
+
50
+ function include_clipboard_script() {
51
+ if ( $this->include_clipboard_script ) { ?>
52
+ <script>
53
+ jQuery(function($) {
54
+ $('.foogallery-shortcode').click( function () {
55
+ try {
56
+ //select the contents
57
+ this.select();
58
+ //copy the selection
59
+ document.execCommand('copy');
60
+ //show the copied message
61
+ $('.foogallery-shortcode-message').remove();
62
+ $(this).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
63
+ } catch(err) {
64
+ console.log('Oops, unable to copy!');
65
+ }
66
+ });
67
+ });
68
+ </script>
69
+ <?php
70
+ }
71
+ }
72
+ }
73
+ }
extensions/albums/admin/class-metaboxes.php CHANGED
@@ -1,576 +1,576 @@
1
- <?php
2
-
3
- /*
4
- * FooGallery Admin Album MetaBoxes class
5
- */
6
-
7
- if ( ! class_exists( 'FooGallery_Admin_Album_MetaBoxes' ) ) {
8
-
9
- class FooGallery_Admin_Album_MetaBoxes {
10
-
11
- private $_album;
12
-
13
- public function __construct() {
14
- //add our foogallery metaboxes
15
- add_action( 'add_meta_boxes_' . FOOGALLERY_CPT_ALBUM, array( $this, 'add_meta_boxes' ) );
16
-
17
- //save extra post data for a gallery
18
- add_action( 'save_post', array( $this, 'save_album' ) );
19
-
20
- //whitelist metaboxes for our album posttype
21
- add_filter( 'foogallery-album_metabox_sanity', array( $this, 'whitelist_metaboxes' ) );
22
-
23
- //add scripts used by metaboxes
24
- add_action( 'admin_enqueue_scripts', array( $this, 'include_required_scripts' ) );
25
-
26
- // Ajax call for getting gallery details
27
- add_action( 'wp_ajax_foogallery_get_gallery_details', array( $this, 'ajax_get_gallery_details' ) );
28
-
29
- // Ajax call for saving gallery details
30
- add_action( 'wp_ajax_foogallery_save_gallery_details', array( $this, 'ajax_save_gallery_details' ) );
31
-
32
- // Save details for the gallery
33
- add_action( 'foogallery_album_gallery_details_save', array( $this, 'gallery_details_save' ), 10, 3 );
34
- }
35
-
36
- public function whitelist_metaboxes() {
37
- return array(
38
- FOOGALLERY_CPT_GALLERY => array(
39
- 'whitelist' => apply_filters( 'foogallery_metabox_sanity_foogallery-album',
40
- array(
41
- 'submitdiv',
42
- 'slugdiv',
43
- 'postimagediv',
44
- 'foogalleryalbum_galleries',
45
- 'foogalleryalbum_shortcode'
46
- )
47
- ),
48
- 'contexts' => array( 'normal', 'advanced', 'side', ),
49
- 'priorities' => array( 'high', 'core', 'default', 'low', ),
50
- )
51
- );
52
- }
53
-
54
- public function add_meta_boxes( $post ) {
55
- add_meta_box(
56
- 'foogalleryalbum_galleries',
57
- __( 'Galleries - click a gallery to add it to your album.', 'foogallery' ),
58
- array( $this, 'render_gallery_metabox' ),
59
- FOOGALLERY_CPT_ALBUM,
60
- 'normal',
61
- 'high'
62
- );
63
-
64
- add_meta_box(
65
- 'foogalleryalbum_settings',
66
- __( 'Settings', 'foogallery' ),
67
- array( $this, 'render_settings_metabox' ),
68
- FOOGALLERY_CPT_ALBUM,
69
- 'normal',
70
- 'high'
71
- );
72
-
73
- add_meta_box(
74
- 'foogalleryalbum_customcss',
75
- __( 'Custom CSS', 'foogallery' ),
76
- array( $this, 'render_customcss_metabox' ),
77
- FOOGALLERY_CPT_ALBUM,
78
- 'normal',
79
- 'low'
80
- );
81
-
82
- add_meta_box(
83
- 'foogalleryalbum_shortcode',
84
- __( 'Album Shortcode', 'foogallery' ),
85
- array( $this, 'render_shortcode_metabox' ),
86
- FOOGALLERY_CPT_ALBUM,
87
- 'side',
88
- 'default'
89
- );
90
-
91
- add_meta_box(
92
- 'foogalleryalbum_sorting',
93
- __( 'Album Sorting', 'foogallery' ),
94
- array( $this, 'render_sorting_metabox' ),
95
- FOOGALLERY_CPT_ALBUM,
96
- 'side',
97
- 'default'
98
- );
99
- }
100
-
101
- public function get_album( $post ) {
102
- if ( ! isset( $this->_album ) ) {
103
- $this->_album = FooGalleryAlbum::get( $post );
104
- }
105
-
106
- return $this->_album;
107
- }
108
-
109
- public function save_album( $post_id ) {
110
- // check autosave
111
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
112
- return $post_id;
113
- }
114
-
115
- // verify nonce
116
- if ( array_key_exists( FOOGALLERY_CPT_ALBUM . '_nonce', $_POST ) &&
117
- wp_verify_nonce( $_POST[ FOOGALLERY_CPT_ALBUM . '_nonce' ], plugin_basename( FOOGALLERY_FILE ) )
118
- ) {
119
- //if we get here, we are dealing with the Album custom post type
120
-
121
- $galleries = apply_filters( 'foogallery_save_album_galleries', explode( ',', $_POST[ FOOGALLERY_ALBUM_META_GALLERIES ] ) );
122
- update_post_meta( $post_id, FOOGALLERY_ALBUM_META_GALLERIES, $galleries );
123
-
124
- update_post_meta( $post_id, FOOGALLERY_ALBUM_META_TEMPLATE, $_POST[FOOGALLERY_ALBUM_META_TEMPLATE] );
125
-
126
- update_post_meta( $post_id, FOOGALLERY_ALBUM_META_SORT, $_POST[FOOGALLERY_ALBUM_META_SORT] );
127
-
128
- $settings = isset($_POST['_foogallery_settings']) ?
129
- $_POST['_foogallery_settings'] : array();
130
-
131
- $settings = apply_filters( 'foogallery_save_album_settings', $settings );
132
-
133
- update_post_meta( $post_id, FOOGALLERY_META_SETTINGS_OLD, $settings );
134
-
135
- $custom_css = isset($_POST[FOOGALLERY_META_CUSTOM_CSS]) ?
136
- $_POST[FOOGALLERY_META_CUSTOM_CSS] : '';
137
-
138
- if ( empty( $custom_css ) ) {
139
- delete_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS );
140
- } else {
141
- update_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS, $custom_css );
142
- }
143
-
144
- do_action( 'foogallery_after_save_album', $post_id, $_POST );
145
- }
146
- }
147
-
148
- public function get_ordered_galleries( $album ) {
149
-
150
- //get all other galleries
151
- $galleries = foogallery_get_all_galleries( $album->gallery_ids );
152
-
153
- $album_galleries = $album->galleries();
154
-
155
- return array_merge( $album_galleries, $galleries );
156
- }
157
-
158
- public function render_gallery_metabox( $post ) {
159
- $album = $this->get_album( $post );
160
-
161
- $galleries = $this->get_ordered_galleries( $album );
162
-
163
- wp_enqueue_style( 'media-views' );
164
-
165
- ?>
166
- <input type="hidden" name="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
167
- id="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
168
- value="<?php echo wp_create_nonce( plugin_basename( FOOGALLERY_FILE ) ); ?>"/>
169
- <input type="hidden" name='foogallery_album_galleries' id="foogallery_album_galleries"
170
- value="<?php echo $album->gallery_id_csv(); ?>"/>
171
- <div>
172
- <?php if ( !$album->has_galleries() ) { ?>
173
- <div class="foogallery-album-error">
174
- <?php _e( 'There are no galleries selected for your album yet! Click any gallery to add it to your album.', 'foogallery' ); ?>
175
- </div>
176
- <?php } ?>
177
-
178
- <div class="foogallery-album-info-modal media-modal">
179
- <div class="media-modal-content">
180
- <div class="media-frame mode-select">
181
- <div class="media-frame-title">
182
- <h1><?php _e('Edit Gallery Details', 'foogallery'); ?></h1>
183
- <span class="spinner is-active"></span>
184
- </div>
185
- <div class="modal-content">
186
- <?php wp_nonce_field( 'foogallery_album_gallery_details', 'foogallery_album_gallery_details_nonce', false ); ?>
187
- <div class="gallery-details" data-loading="<?php _e( 'Loading details for ', 'foogallery' ); ?>"></div>
188
- </div>
189
- </div>
190
- <div class="media-frame-toolbar">
191
- <div class="media-toolbar">
192
- <div class="media-toolbar-secondary"></div>
193
- <div class="media-toolbar-primary search-form">
194
- <button type="button" class="button media-button button-primary button-large media-button-select gallery-details-save"><?php _e('Save Gallery Details', 'foogallery'); ?></button>
195
- <span class="spinner"></span>
196
- </div>
197
- </div>
198
- </div>
199
- </div>
200
- <button type="button" class="button-link media-modal-close">
201
- <span class="media-modal-icon"><span class="screen-reader-text"><?php _e('Close media panel', 'foogallery'); ?></span></span>
202
- </button>
203
-
204
- </div>
205
- <div class="foogallery-album-info-modal-backdrop media-modal-backdrop"></div>
206
-
207
-
208
- <ul class="foogallery-album-gallery-list">
209
- <?php
210
- foreach ( $galleries as $gallery ) {
211
- $img_src = foogallery_find_featured_attachment_thumbnail_src( $gallery );
212
- $images = $gallery->image_count();
213
- $selected = $album->includes_gallery( $gallery->ID ) ? ' selected' : '';
214
- $title = $gallery->safe_name();
215
- ?>
216
- <li class="foogallery-pile">
217
- <div class="foogallery-gallery-select attachment-preview landscape<?php echo $selected; ?>" data-foogallery-id="<?php echo $gallery->ID; ?>">
218
- <div class="thumbnail" style="display: table;">
219
- <div style="display: table-cell; vertical-align: middle; text-align: center;">
220
- <img src="<?php echo $img_src; ?>"/>
221
- <h3><?php echo $title; ?>
222
- <span><?php echo $images; ?></span>
223
- </h3>
224
- </div>
225
- </div>
226
- <a class="info foogallery-album-info" href="#"
227
- title="<?php _e( 'Edit Album Info', 'foogallery' ); ?>"
228
- data-gallery-title="<?php echo $title; ?>"
229
- data-gallery-id="<?php echo $gallery->ID; ?>"><span class="dashicons dashicons-info"></span></a>
230
- </div>
231
- </li>
232
- <?php } ?>
233
- </ul>
234
- <div style="clear: both;"></div>
235
- </div>
236
- <?php
237
- }
238
-
239
- public function render_shortcode_metabox( $post ) {
240
- $album = $this->get_album( $post );
241
- $shortcode = $album->shortcode();
242
- ?>
243
- <p class="foogallery-shortcode">
244
- <input type="text" id="foogallery-copy-shortcode" size="<?php echo strlen( $shortcode ); ?>" value="<?php echo htmlspecialchars( $shortcode ); ?>" readonly="readonly" />
245
- </p>
246
- <p>
247
- <?php _e( 'Paste the above shortcode into a post or page to show the album.', 'foogallery' ); ?>
248
- </p>
249
- <script>
250
- jQuery(function($) {
251
- var shortcodeInput = document.querySelector('#foogallery-copy-shortcode');
252
- shortcodeInput.addEventListener('click', function () {
253
- try {
254
- // select the contents
255
- shortcodeInput.select();
256
- //copy the selection
257
- document.execCommand('copy');
258
- //show the copied message
259
- $('.foogallery-shortcode-message').remove();
260
- $(shortcodeInput).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
261
- } catch(err) {
262
- console.log('Oops, unable to copy!');
263
- }
264
- }, false);
265
- });
266
- </script>
267
- <?php
268
- }
269
-
270
- public function render_sorting_metabox( $post ) {
271
- $album = $this->get_album( $post );
272
- $sorting_options = foogallery_sorting_options(); ?>
273
- <p>
274
- <?php _e('Change the way galleries are sorted within your album. By default, they are sorted in the order you see them.', 'foogallery'); ?>
275
- </p>
276
- <?php
277
- foreach ( $sorting_options as $sorting_key => $sorting_label ) { ?>
278
- <p>
279
- <input type="radio" value="<?php echo $sorting_key; ?>" <?php checked( $sorting_key === $album->sorting ); ?> id="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>" name="<?php echo FOOGALLERY_ALBUM_META_SORT; ?>" />
280
- <label for="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>"><?php echo $sorting_label; ?></label>
281
- </p><?php
282
- }
283
- }
284
-
285
- public function render_settings_metabox( $post ) {
286
- $album = $this->get_album( $post );
287
- $available_templates = foogallery_album_templates();
288
- $album_template = foogallery_default_album_template();
289
- if ( ! empty($album->album_template) ) {
290
- $album_template = $album->album_template;
291
- }
292
- if ( false === $album_template ) {
293
- $album_template = $available_templates[0]['slug'];
294
- }
295
- $hide_help = 'on' == foogallery_get_setting( 'hide_gallery_template_help' );
296
- ?>
297
- <table class="foogallery-album-metabox-settings">
298
- <tbody>
299
- <tr class="foogallery_template_field foogallery_template_field_selector">
300
- <th>
301
- <label for="FooGallerySettings_AlbumTemplate"><?php _e( 'Album Template', 'foogallery' ); ?></label>
302
- </th>
303
- <td>
304
- <select id="FooGallerySettings_AlbumTemplate" name="<?php echo FOOGALLERY_ALBUM_META_TEMPLATE; ?>">
305
- <?php
306
- foreach ( $available_templates as $template ) {
307
- $selected = ($album_template === $template['slug']) ? 'selected' : '';
308
- echo "<option {$selected} value=\"{$template['slug']}\">{$template['name']}</option>";
309
- }
310
- ?>
311
- </select>
312
- <br />
313
- <small><?php _e( 'The album template that will be used when the album is output to the frontend.', 'foogallery' ); ?></small>
314
- </td>
315
- </tr>
316
- <?php
317
- foreach ( $available_templates as $template ) {
318
- $field_visibility = ($album_template !== $template['slug']) ? 'style="display:none"' : '';
319
- $section = '';
320
- $fields = isset( $template['fields'] ) ? $template['fields'] : array();
321
- foreach ( $fields as $field ) {
322
- //allow for the field to be altered by extensions.
323
- $field = apply_filters( 'foogallery_alter_gallery_template_field', $field, $album );
324
-
325
- $class ="foogallery_template_field foogallery_template_field-{$template['slug']} foogallery_template_field-{$template['slug']}-{$field['id']}";
326
-
327
- if ( isset($field['section']) && $field['section'] !== $section ) {
328
- $section = $field['section'];
329
- ?>
330
- <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
331
- <td colspan="2"><h4><?php echo $section; ?></h4></td>
332
- </tr>
333
- <?php }
334
- if (isset($field['type']) && 'help' == $field['type'] && $hide_help) {
335
- continue; //skip help if the 'hide help' setting is turned on
336
- }
337
- ?>
338
- <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
339
- <?php if ( isset($field['type']) && 'help' == $field['type'] ) { ?>
340
- <td colspan="2">
341
- <div class="foogallery-help">
342
- <?php echo $field['desc']; ?>
343
- </div>
344
- </td>
345
- <?php } else { ?>
346
- <th>
347
- <label for="FooGallerySettings_<?php echo $template['slug'] . '_' . $field['id']; ?>"><?php echo $field['title']; ?></label>
348
- </th>
349
- <td>
350
- <?php do_action( 'foogallery_render_gallery_template_field', $field, $album, $template ); ?>
351
- </td>
352
- <?php } ?>
353
- </tr>
354
- <?php
355
- }
356
- }
357
- ?>
358
- </tbody>
359
- </table>
360
- <?php
361
- }
362
-
363
- public function render_customcss_metabox( $post ) {
364
- $album = $this->get_album( $post );
365
- $custom_css = $album->custom_css;
366
- $example = '<code>#foogallery-album-' . $post->ID . ' { }</code>';
367
- ?>
368
- <p>
369
- <?php printf( __( 'Add any custom CSS to target this specific album. For example %s', 'foogallery' ), $example ); ?>
370
- </p>
371
- <table id="table_styling" class="form-table">
372
- <tbody>
373
- <tr>
374
- <td>
375
- <textarea class="foogallery_metabox_custom_css" name="<?php echo FOOGALLERY_META_CUSTOM_CSS; ?>" type="text"><?php echo $custom_css; ?></textarea>
376
- </td>
377
- </tr>
378
- </tbody>
379
- </table>
380
- <?php
381
- }
382
-
383
- public function include_required_scripts() {
384
- if ( FOOGALLERY_CPT_ALBUM === foo_current_screen_post_type() ) {
385
- //include album selection script
386
- $url = FOOGALLERY_ALBUM_URL . 'js/admin-foogallery-album.js';
387
- wp_enqueue_script( 'admin-foogallery-album', $url, array( 'jquery', 'jquery-ui-core','jquery-ui-sortable' ), FOOGALLERY_VERSION );
388
-
389
- //include album selection css
390
- $url = FOOGALLERY_ALBUM_URL . 'css/admin-foogallery-album.css';
391
- wp_enqueue_style( 'admin-foogallery-album', $url, array(), FOOGALLERY_VERSION );
392
-
393
- //spectrum needed for the colorpicker field
394
- $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.js';
395
- wp_enqueue_script( 'foogallery-spectrum', $url, array('jquery'), FOOGALLERY_VERSION );
396
- $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.css';
397
- wp_enqueue_style( 'foogallery-spectrum', $url, array(), FOOGALLERY_VERSION );
398
- }
399
- }
400
-
401
- public function ajax_get_gallery_details() {
402
- if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
403
- $foogallery_id = $_POST['foogallery_id'];
404
- $gallery = FooGallery::get_by_id( $foogallery_id );
405
-
406
- if ( false !== $gallery ) {
407
- $fields = $this->get_gallery_detail_fields( $gallery ); ?>
408
- <form name="foogallery_gallery_details">
409
- <input type="hidden" name="foogallery_id" id="foogallery_id" value="<?php echo $foogallery_id; ?>" />
410
- <table class="gallery-detail-fields">
411
- <tbody>
412
- <?php foreach ( $fields as $field => $values ) {
413
- $value = get_post_meta( $gallery->ID, $field, true );
414
- $input_id = 'foogallery-gallery-detail-fields-' . $field;
415
- switch ( $values['input'] ) {
416
- case 'text':
417
- $values['html'] = '<input type="text" id="' . $input_id . '" name="' . $field . '" value="' . $value . '" />';
418
- break;
419
-
420
- case 'textarea':
421
- $values['html'] = '<textarea id="' . $input_id . '" name="' . $field . '">' . $value . '</textarea>';
422
- break;
423
-
424
- case 'select':
425
- $html = '<select id="' . $input_id . '" name="' . $field . '">';
426
-
427
- // If options array is passed
428
- if ( isset( $values['options'] ) ) {
429
- // Browse and add the options
430
- foreach ( $values['options'] as $k => $v ) {
431
- // Set the option selected or not
432
- if ( $value == $k )
433
- $selected = ' selected="selected"';
434
- else
435
- $selected = '';
436
-
437
- $html .= '<option' . $selected . ' value="' . $k . '">' . $v . '</option>';
438
- }
439
- }
440
-
441
- $html .= '</select>';
442
-
443
- // Set the html content
444
- $values['html'] = $html;
445
-
446
- break;
447
-
448
- case 'checkbox':
449
- // Set the checkbox checked or not
450
- if ( $value == 'on' )
451
- $checked = ' checked="checked"';
452
- else
453
- $checked = '';
454
-
455
- $html = '<input' . $checked . ' type="checkbox" name="' . $field . ']" id="' . $input_id . '" />';
456
-
457
- $values['html'] = $html;
458
-
459
- break;
460
-
461
- case 'radio':
462
- $html = '';
463
-
464
- if ( ! empty( $values['options'] ) ) {
465
- $i = 0;
466
-
467
- foreach ( $values['options'] as $k => $v ) {
468
- if ( $value == $k )
469
- $checked = ' checked="checked"';
470
- else
471
- $checked = '';
472
-
473
- $html .= '<input' . $checked . ' value="' . $k . '" type="radio" name="' . $field . ']" id="' . sanitize_key( $field . '_' . $i ) . '" /> <label for="' . sanitize_key( $field . '_' . $i ) . '">' . $v . '</label><br />';
474
- $i++;
475
- }
476
- }
477
-
478
- $values['html'] = $html;
479
-
480
- break;
481
- } ?>
482
- <tr class="foogallery-gallery-detail-fields-<?php echo $field; ?>">
483
- <th scope="row" class="label">
484
- <label for="foogallery-gallery-detail-fields-<?php echo $field; ?>"><?php echo $values['label']; ?></label>
485
- </th>
486
- <td>
487
- <?php echo $values['html']; ?>
488
- <?php if ( !empty( $values['help'] ) ) { ?><p class="help"><?php echo $values['help']; ?></p><?php } ?>
489
- </td>
490
- </tr>
491
- <?php } ?>
492
- </tbody>
493
- </table>
494
- </form><?php
495
- } else {
496
- echo '<h2>' . __( 'Invalid Gallery!', 'foogallery' ) . '</h2>';
497
- }
498
- }
499
- die();
500
- }
501
-
502
- public function ajax_save_gallery_details() {
503
- if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
504
- $foogallery_id = $_POST['foogallery_id'];
505
- $gallery = FooGallery::get_by_id( $foogallery_id );
506
- if ( false !== $gallery ) {
507
- $fields = $this->get_gallery_detail_fields( $gallery );
508
-
509
- foreach ( $fields as $field => $values ) {
510
- //for every field, save some info
511
- do_action( 'foogallery_album_gallery_details_save', $field, $values, $gallery );
512
- }
513
- }
514
- }
515
- }
516
-
517
- public function gallery_details_save($field, $field_args, $gallery) {
518
- if ( 'custom_url' === $field || 'custom_target' === $field ) {
519
- $value = $_POST[$field];
520
- update_post_meta( $gallery->ID, $field, $value );
521
- }
522
- }
523
-
524
- /**
525
- * Get the fields that we want to edit for a gallery from the album management page
526
- * @param $gallery FooGallery
527
- *
528
- * @return mixed|void
529
- */
530
- public function get_gallery_detail_fields($gallery) {
531
-
532
- $target_options = apply_filters( 'foogallery_gallery_detail_fields_custom_target_options', array(
533
- 'default' => __( 'Default', 'foogallery' ),
534
- '_blank' => __( 'New tab (_blank)', 'foogallery' ),
535
- '_self' => __( 'Same tab (_self)', 'foogallery' )
536
- ) );
537
-
538
- $edit_url = get_edit_post_link( $gallery->ID );
539
-
540
- $fields = array(
541
- 'gallery_title' => array(
542
- 'label' => __( 'Gallery Title', 'foogallery' ),
543
- 'input' => 'html',
544
- 'html' => '<strong>' . $gallery->safe_name() . ' <a href="' . $edit_url . '" target="_blank">' . __( 'Edit Gallery', 'foogallery' ) . '</a></strong>',
545
- ),
546
-
547
- 'gallery_template' => array(
548
- 'label' => __( 'Gallery Template', 'foogallery' ),
549
- 'input' => 'html',
550
- 'html' => '<strong>' . $gallery->gallery_template_name() . '</strong>',
551
- ),
552
-
553
- 'gallery_media' => array(
554
- 'label' => __( 'Media', 'foogallery' ),
555
- 'input' => 'html',
556
- 'html' => '<strong>' . $gallery->image_count() . '</strong>'
557
- ),
558
-
559
- 'custom_url' => array(
560
- 'label' => __( 'Custom URL', 'foogallery' ),
561
- 'input' => 'text',
562
- 'help' => __( 'Point your gallery to a custom URL', 'foogallery' )
563
- ),
564
-
565
- 'custom_target' => array(
566
- 'label' => __( 'Custom Target', 'foogallery' ),
567
- 'input' => 'select',
568
- 'help' => __( 'Set a custom target for your gallery', 'foogallery' ),
569
- 'options' => $target_options
570
- )
571
- );
572
-
573
- return apply_filters( 'foogallery_gallery_detail_fields', $fields );
574
- }
575
- }
576
- }
1
+ <?php
2
+
3
+ /*
4
+ * FooGallery Admin Album MetaBoxes class
5
+ */
6
+
7
+ if ( ! class_exists( 'FooGallery_Admin_Album_MetaBoxes' ) ) {
8
+
9
+ class FooGallery_Admin_Album_MetaBoxes {
10
+
11
+ private $_album;
12
+
13
+ public function __construct() {
14
+ //add our foogallery metaboxes
15
+ add_action( 'add_meta_boxes_' . FOOGALLERY_CPT_ALBUM, array( $this, 'add_meta_boxes' ) );
16
+
17
+ //save extra post data for a gallery
18
+ add_action( 'save_post', array( $this, 'save_album' ) );
19
+
20
+ //whitelist metaboxes for our album posttype
21
+ add_filter( 'foogallery-album_metabox_sanity', array( $this, 'whitelist_metaboxes' ) );
22
+
23
+ //add scripts used by metaboxes
24
+ add_action( 'admin_enqueue_scripts', array( $this, 'include_required_scripts' ) );
25
+
26
+ // Ajax call for getting gallery details
27
+ add_action( 'wp_ajax_foogallery_get_gallery_details', array( $this, 'ajax_get_gallery_details' ) );
28
+
29
+ // Ajax call for saving gallery details
30
+ add_action( 'wp_ajax_foogallery_save_gallery_details', array( $this, 'ajax_save_gallery_details' ) );
31
+
32
+ // Save details for the gallery
33
+ add_action( 'foogallery_album_gallery_details_save', array( $this, 'gallery_details_save' ), 10, 3 );
34
+ }
35
+
36
+ public function whitelist_metaboxes() {
37
+ return array(
38
+ FOOGALLERY_CPT_GALLERY => array(
39
+ 'whitelist' => apply_filters( 'foogallery_metabox_sanity_foogallery-album',
40
+ array(
41
+ 'submitdiv',
42
+ 'slugdiv',
43
+ 'postimagediv',
44
+ 'foogalleryalbum_galleries',
45
+ 'foogalleryalbum_shortcode'
46
+ )
47
+ ),
48
+ 'contexts' => array( 'normal', 'advanced', 'side', ),
49
+ 'priorities' => array( 'high', 'core', 'default', 'low', ),
50
+ )
51
+ );
52
+ }
53
+
54
+ public function add_meta_boxes( $post ) {
55
+ add_meta_box(
56
+ 'foogalleryalbum_galleries',
57
+ __( 'Galleries - click a gallery to add it to your album.', 'foogallery' ),
58
+ array( $this, 'render_gallery_metabox' ),
59
+ FOOGALLERY_CPT_ALBUM,
60
+ 'normal',
61
+ 'high'
62
+ );
63
+
64
+ add_meta_box(
65
+ 'foogalleryalbum_settings',
66
+ __( 'Settings', 'foogallery' ),
67
+ array( $this, 'render_settings_metabox' ),
68
+ FOOGALLERY_CPT_ALBUM,
69
+ 'normal',
70
+ 'high'
71
+ );
72
+
73
+ add_meta_box(
74
+ 'foogalleryalbum_customcss',
75
+ __( 'Custom CSS', 'foogallery' ),
76
+ array( $this, 'render_customcss_metabox' ),
77
+ FOOGALLERY_CPT_ALBUM,
78
+ 'normal',
79
+ 'low'
80
+ );
81
+
82
+ add_meta_box(
83
+ 'foogalleryalbum_shortcode',
84
+ __( 'Album Shortcode', 'foogallery' ),
85
+ array( $this, 'render_shortcode_metabox' ),
86
+ FOOGALLERY_CPT_ALBUM,
87
+ 'side',
88
+ 'default'
89
+ );
90
+
91
+ add_meta_box(
92
+ 'foogalleryalbum_sorting',
93
+ __( 'Album Sorting', 'foogallery' ),
94
+ array( $this, 'render_sorting_metabox' ),
95
+ FOOGALLERY_CPT_ALBUM,
96
+ 'side',
97
+ 'default'
98
+ );
99
+ }
100
+
101
+ public function get_album( $post ) {
102
+ if ( ! isset( $this->_album ) ) {
103
+ $this->_album = FooGalleryAlbum::get( $post );
104
+ }
105
+
106
+ return $this->_album;
107
+ }
108
+
109
+ public function save_album( $post_id ) {
110
+ // check autosave
111
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
112
+ return $post_id;
113
+ }
114
+
115
+ // verify nonce
116
+ if ( array_key_exists( FOOGALLERY_CPT_ALBUM . '_nonce', $_POST ) &&
117
+ wp_verify_nonce( $_POST[ FOOGALLERY_CPT_ALBUM . '_nonce' ], plugin_basename( FOOGALLERY_FILE ) )
118
+ ) {
119
+ //if we get here, we are dealing with the Album custom post type
120
+
121
+ $galleries = apply_filters( 'foogallery_save_album_galleries', explode( ',', $_POST[ FOOGALLERY_ALBUM_META_GALLERIES ] ) );
122
+ update_post_meta( $post_id, FOOGALLERY_ALBUM_META_GALLERIES, $galleries );
123
+
124
+ update_post_meta( $post_id, FOOGALLERY_ALBUM_META_TEMPLATE, $_POST[FOOGALLERY_ALBUM_META_TEMPLATE] );
125
+
126
+ update_post_meta( $post_id, FOOGALLERY_ALBUM_META_SORT, $_POST[FOOGALLERY_ALBUM_META_SORT] );
127
+
128
+ $settings = isset($_POST['_foogallery_settings']) ?
129
+ $_POST['_foogallery_settings'] : array();
130
+
131
+ $settings = apply_filters( 'foogallery_save_album_settings', $settings );
132
+
133
+ update_post_meta( $post_id, FOOGALLERY_META_SETTINGS_OLD, $settings );
134
+
135
+ $custom_css = isset($_POST[FOOGALLERY_META_CUSTOM_CSS]) ?
136
+ $_POST[FOOGALLERY_META_CUSTOM_CSS] : '';
137
+
138
+ if ( empty( $custom_css ) ) {
139
+ delete_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS );
140
+ } else {
141
+ update_post_meta( $post_id, FOOGALLERY_META_CUSTOM_CSS, $custom_css );
142
+ }
143
+
144
+ do_action( 'foogallery_after_save_album', $post_id, $_POST );
145
+ }
146
+ }
147
+
148
+ public function get_ordered_galleries( $album ) {
149
+
150
+ //get all other galleries
151
+ $galleries = foogallery_get_all_galleries( $album->gallery_ids );
152
+
153
+ $album_galleries = $album->galleries();
154
+
155
+ return array_merge( $album_galleries, $galleries );
156
+ }
157
+
158
+ public function render_gallery_metabox( $post ) {
159
+ $album = $this->get_album( $post );
160
+
161
+ $galleries = $this->get_ordered_galleries( $album );
162
+
163
+ wp_enqueue_style( 'media-views' );
164
+
165
+ ?>
166
+ <input type="hidden" name="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
167
+ id="<?php echo FOOGALLERY_CPT_ALBUM; ?>_nonce"
168
+ value="<?php echo wp_create_nonce( plugin_basename( FOOGALLERY_FILE ) ); ?>"/>
169
+ <input type="hidden" name='foogallery_album_galleries' id="foogallery_album_galleries"
170
+ value="<?php echo $album->gallery_id_csv(); ?>"/>
171
+ <div>
172
+ <?php if ( !$album->has_galleries() ) { ?>
173
+ <div class="foogallery-album-error">
174
+ <?php _e( 'There are no galleries selected for your album yet! Click any gallery to add it to your album.', 'foogallery' ); ?>
175
+ </div>
176
+ <?php } ?>
177
+
178
+ <div class="foogallery-album-info-modal media-modal">
179
+ <div class="media-modal-content">
180
+ <div class="media-frame mode-select">
181
+ <div class="media-frame-title">
182
+ <h1><?php _e('Edit Gallery Details', 'foogallery'); ?></h1>
183
+ <span class="spinner is-active"></span>
184
+ </div>
185
+ <div class="modal-content">
186
+ <?php wp_nonce_field( 'foogallery_album_gallery_details', 'foogallery_album_gallery_details_nonce', false ); ?>
187
+ <div class="gallery-details" data-loading="<?php _e( 'Loading details for ', 'foogallery' ); ?>"></div>
188
+ </div>
189
+ </div>
190
+ <div class="media-frame-toolbar">
191
+ <div class="media-toolbar">
192
+ <div class="media-toolbar-secondary"></div>
193
+ <div class="media-toolbar-primary search-form">
194
+ <button type="button" class="button media-button button-primary button-large media-button-select gallery-details-save"><?php _e('Save Gallery Details', 'foogallery'); ?></button>
195
+ <span class="spinner"></span>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ </div>
200
+ <button type="button" class="button-link media-modal-close">
201
+ <span class="media-modal-icon"><span class="screen-reader-text"><?php _e('Close media panel', 'foogallery'); ?></span></span>
202
+ </button>
203
+
204
+ </div>
205
+ <div class="foogallery-album-info-modal-backdrop media-modal-backdrop"></div>
206
+
207
+
208
+ <ul class="foogallery-album-gallery-list">
209
+ <?php
210
+ foreach ( $galleries as $gallery ) {
211
+ $img_src = foogallery_find_featured_attachment_thumbnail_src( $gallery );
212
+ $images = $gallery->image_count();
213
+ $selected = $album->includes_gallery( $gallery->ID ) ? ' selected' : '';
214
+ $title = $gallery->safe_name();
215
+ ?>
216
+ <li class="foogallery-pile">
217
+ <div class="foogallery-gallery-select attachment-preview landscape<?php echo $selected; ?>" data-foogallery-id="<?php echo $gallery->ID; ?>">
218
+ <div class="thumbnail" style="display: table;">
219
+ <div style="display: table-cell; vertical-align: middle; text-align: center;">
220
+ <img src="<?php echo $img_src; ?>"/>
221
+ <h3><?php echo $title; ?>
222
+ <span><?php echo $images; ?></span>
223
+ </h3>
224
+ </div>
225
+ </div>
226
+ <a class="info foogallery-album-info" href="#"
227
+ title="<?php _e( 'Edit Album Info', 'foogallery' ); ?>"
228
+ data-gallery-title="<?php echo $title; ?>"
229
+ data-gallery-id="<?php echo $gallery->ID; ?>"><span class="dashicons dashicons-info"></span></a>
230
+ </div>
231
+ </li>
232
+ <?php } ?>
233
+ </ul>
234
+ <div style="clear: both;"></div>
235
+ </div>
236
+ <?php
237
+ }
238
+
239
+ public function render_shortcode_metabox( $post ) {
240
+ $album = $this->get_album( $post );
241
+ $shortcode = $album->shortcode();
242
+ ?>
243
+ <p class="foogallery-shortcode">
244
+ <input type="text" id="foogallery-copy-shortcode" size="<?php echo strlen( $shortcode ); ?>" value="<?php echo htmlspecialchars( $shortcode ); ?>" readonly="readonly" />
245
+ </p>
246
+ <p>
247
+ <?php _e( 'Paste the above shortcode into a post or page to show the album.', 'foogallery' ); ?>
248
+ </p>
249
+ <script>
250
+ jQuery(function($) {
251
+ var shortcodeInput = document.querySelector('#foogallery-copy-shortcode');
252
+ shortcodeInput.addEventListener('click', function () {
253
+ try {
254
+ // select the contents
255
+ shortcodeInput.select();
256
+ //copy the selection
257
+ document.execCommand('copy');
258
+ //show the copied message
259
+ $('.foogallery-shortcode-message').remove();
260
+ $(shortcodeInput).after('<p class="foogallery-shortcode-message"><?php _e( 'Shortcode copied to clipboard :)','foogallery' ); ?></p>');
261
+ } catch(err) {
262
+ console.log('Oops, unable to copy!');
263
+ }
264
+ }, false);
265
+ });
266
+ </script>
267
+ <?php
268
+ }
269
+
270
+ public function render_sorting_metabox( $post ) {
271
+ $album = $this->get_album( $post );
272
+ $sorting_options = foogallery_sorting_options(); ?>
273
+ <p>
274
+ <?php _e('Change the way galleries are sorted within your album. By default, they are sorted in the order you see them.', 'foogallery'); ?>
275
+ </p>
276
+ <?php
277
+ foreach ( $sorting_options as $sorting_key => $sorting_label ) { ?>
278
+ <p>
279
+ <input type="radio" value="<?php echo $sorting_key; ?>" <?php checked( $sorting_key === $album->sorting ); ?> id="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>" name="<?php echo FOOGALLERY_ALBUM_META_SORT; ?>" />
280
+ <label for="FooGallerySettings_AlbumSort_<?php echo $sorting_key; ?>"><?php echo $sorting_label; ?></label>
281
+ </p><?php
282
+ }
283
+ }
284
+
285
+ public function render_settings_metabox( $post ) {
286
+ $album = $this->get_album( $post );
287
+ $available_templates = foogallery_album_templates();
288
+ $album_template = foogallery_default_album_template();
289
+ if ( ! empty($album->album_template) ) {
290
+ $album_template = $album->album_template;
291
+ }
292
+ if ( false === $album_template ) {
293
+ $album_template = $available_templates[0]['slug'];
294
+ }
295
+ $hide_help = 'on' == foogallery_get_setting( 'hide_gallery_template_help' );
296
+ ?>
297
+ <table class="foogallery-album-metabox-settings">
298
+ <tbody>
299
+ <tr class="foogallery_template_field foogallery_template_field_selector">
300
+ <th>
301
+ <label for="FooGallerySettings_AlbumTemplate"><?php _e( 'Album Template', 'foogallery' ); ?></label>
302
+ </th>
303
+ <td>
304
+ <select id="FooGallerySettings_AlbumTemplate" name="<?php echo FOOGALLERY_ALBUM_META_TEMPLATE; ?>">
305
+ <?php
306
+ foreach ( $available_templates as $template ) {
307
+ $selected = ($album_template === $template['slug']) ? 'selected' : '';
308
+ echo "<option {$selected} value=\"{$template['slug']}\">{$template['name']}</option>";
309
+ }
310
+ ?>
311
+ </select>
312
+ <br />
313
+ <small><?php _e( 'The album template that will be used when the album is output to the frontend.', 'foogallery' ); ?></small>
314
+ </td>
315
+ </tr>
316
+ <?php
317
+ foreach ( $available_templates as $template ) {
318
+ $field_visibility = ($album_template !== $template['slug']) ? 'style="display:none"' : '';
319
+ $section = '';
320
+ $fields = isset( $template['fields'] ) ? $template['fields'] : array();
321
+ foreach ( $fields as $field ) {
322
+ //allow for the field to be altered by extensions.
323
+ $field = apply_filters( 'foogallery_alter_gallery_template_field', $field, $album );
324
+
325
+ $class ="foogallery_template_field foogallery_template_field-{$template['slug']} foogallery_template_field-{$template['slug']}-{$field['id']}";
326
+
327
+ if ( isset($field['section']) && $field['section'] !== $section ) {
328
+ $section = $field['section'];
329
+ ?>
330
+ <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
331
+ <td colspan="2"><h4><?php echo $section; ?></h4></td>
332
+ </tr>
333
+ <?php }
334
+ if (isset($field['type']) && 'help' == $field['type'] && $hide_help) {
335
+ continue; //skip help if the 'hide help' setting is turned on
336
+ }
337
+ ?>
338
+ <tr class="<?php echo $class; ?>" <?php echo $field_visibility; ?>>
339
+ <?php if ( isset($field['type']) && 'help' == $field['type'] ) { ?>
340
+ <td colspan="2">
341
+ <div class="foogallery-help">
342
+ <?php echo $field['desc']; ?>
343
+ </div>
344
+ </td>
345
+ <?php } else { ?>
346
+ <th>
347
+ <label for="FooGallerySettings_<?php echo $template['slug'] . '_' . $field['id']; ?>"><?php echo $field['title']; ?></label>
348
+ </th>
349
+ <td>
350
+ <?php do_action( 'foogallery_render_gallery_template_field', $field, $album, $template ); ?>
351
+ </td>
352
+ <?php } ?>
353
+ </tr>
354
+ <?php
355
+ }
356
+ }
357
+ ?>
358
+ </tbody>
359
+ </table>
360
+ <?php
361
+ }
362
+
363
+ public function render_customcss_metabox( $post ) {
364
+ $album = $this->get_album( $post );
365
+ $custom_css = $album->custom_css;
366
+ $example = '<code>#foogallery-album-' . $post->ID . ' { }</code>';
367
+ ?>
368
+ <p>
369
+ <?php printf( __( 'Add any custom CSS to target this specific album. For example %s', 'foogallery' ), $example ); ?>
370
+ </p>
371
+ <table id="table_styling" class="form-table">
372
+ <tbody>
373
+ <tr>
374
+ <td>
375
+ <textarea class="foogallery_metabox_custom_css" name="<?php echo FOOGALLERY_META_CUSTOM_CSS; ?>" type="text"><?php echo $custom_css; ?></textarea>
376
+ </td>
377
+ </tr>
378
+ </tbody>
379
+ </table>
380
+ <?php
381
+ }
382
+
383
+ public function include_required_scripts() {
384
+ if ( FOOGALLERY_CPT_ALBUM === foo_current_screen_post_type() ) {
385
+ //include album selection script
386
+ $url = FOOGALLERY_ALBUM_URL . 'js/admin-foogallery-album.js';
387
+ wp_enqueue_script( 'admin-foogallery-album', $url, array( 'jquery', 'jquery-ui-core','jquery-ui-sortable' ), FOOGALLERY_VERSION );
388
+
389
+ //include album selection css
390
+ $url = FOOGALLERY_ALBUM_URL . 'css/admin-foogallery-album.css';
391
+ wp_enqueue_style( 'admin-foogallery-album', $url, array(), FOOGALLERY_VERSION );
392
+
393
+ //spectrum needed for the colorpicker field
394
+ $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.js';
395
+ wp_enqueue_script( 'foogallery-spectrum', $url, array('jquery'), FOOGALLERY_VERSION );
396
+ $url = FOOGALLERY_URL . 'lib/spectrum/spectrum.css';
397
+ wp_enqueue_style( 'foogallery-spectrum', $url, array(), FOOGALLERY_VERSION );
398
+ }
399
+ }
400
+
401
+ public function ajax_get_gallery_details() {
402
+ if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
403
+ $foogallery_id = $_POST['foogallery_id'];
404
+ $gallery = FooGallery::get_by_id( $foogallery_id );
405
+
406
+ if ( false !== $gallery ) {
407
+ $fields = $this->get_gallery_detail_fields( $gallery ); ?>
408
+ <form name="foogallery_gallery_details">
409
+ <input type="hidden" name="foogallery_id" id="foogallery_id" value="<?php echo $foogallery_id; ?>" />
410
+ <table class="gallery-detail-fields">
411
+ <tbody>
412
+ <?php foreach ( $fields as $field => $values ) {
413
+ $value = get_post_meta( $gallery->ID, $field, true );
414
+ $input_id = 'foogallery-gallery-detail-fields-' . $field;
415
+ switch ( $values['input'] ) {
416
+ case 'text':
417
+ $values['html'] = '<input type="text" id="' . $input_id . '" name="' . $field . '" value="' . $value . '" />';
418
+ break;
419
+
420
+ case 'textarea':
421
+ $values['html'] = '<textarea id="' . $input_id . '" name="' . $field . '">' . $value . '</textarea>';
422
+ break;
423
+
424
+ case 'select':
425
+ $html = '<select id="' . $input_id . '" name="' . $field . '">';
426
+
427
+ // If options array is passed
428
+ if ( isset( $values['options'] ) ) {
429
+ // Browse and add the options
430
+ foreach ( $values['options'] as $k => $v ) {
431
+ // Set the option selected or not
432
+ if ( $value == $k )
433
+ $selected = ' selected="selected"';
434
+ else
435
+ $selected = '';
436
+
437
+ $html .= '<option' . $selected . ' value="' . $k . '">' . $v . '</option>';
438
+ }
439
+ }
440
+
441
+ $html .= '</select>';
442
+
443
+ // Set the html content
444
+ $values['html'] = $html;
445
+
446
+ break;
447
+
448
+ case 'checkbox':
449
+ // Set the checkbox checked or not
450
+ if ( $value == 'on' )
451
+ $checked = ' checked="checked"';
452
+ else
453
+ $checked = '';
454
+
455
+ $html = '<input' . $checked . ' type="checkbox" name="' . $field . ']" id="' . $input_id . '" />';
456
+
457
+ $values['html'] = $html;
458
+
459
+ break;
460
+
461
+ case 'radio':
462
+ $html = '';
463
+
464
+ if ( ! empty( $values['options'] ) ) {
465
+ $i = 0;
466
+
467
+ foreach ( $values['options'] as $k => $v ) {
468
+ if ( $value == $k )
469
+ $checked = ' checked="checked"';
470
+ else
471
+ $checked = '';
472
+
473
+ $html .= '<input' . $checked . ' value="' . $k . '" type="radio" name="' . $field . ']" id="' . sanitize_key( $field . '_' . $i ) . '" /> <label for="' . sanitize_key( $field . '_' . $i ) . '">' . $v . '</label><br />';
474
+ $i++;
475
+ }
476
+ }
477
+
478
+ $values['html'] = $html;
479
+
480
+ break;
481
+ } ?>
482
+ <tr class="foogallery-gallery-detail-fields-<?php echo $field; ?>">
483
+ <th scope="row" class="label">
484
+ <label for="foogallery-gallery-detail-fields-<?php echo $field; ?>"><?php echo $values['label']; ?></label>
485
+ </th>
486
+ <td>
487
+ <?php echo $values['html']; ?>
488
+ <?php if ( !empty( $values['help'] ) ) { ?><p class="help"><?php echo $values['help']; ?></p><?php } ?>
489
+ </td>
490
+ </tr>
491
+ <?php } ?>
492
+ </tbody>
493
+ </table>
494
+ </form><?php
495
+ } else {
496
+ echo '<h2>' . __( 'Invalid Gallery!', 'foogallery' ) . '</h2>';
497
+ }
498
+ }
499
+ die();
500
+ }
501
+
502
+ public function ajax_save_gallery_details() {
503
+ if ( check_admin_referer( 'foogallery_album_gallery_details' ) ) {
504
+ $foogallery_id = $_POST['foogallery_id'];
505
+ $gallery = FooGallery::get_by_id( $foogallery_id );
506
+ if ( false !== $gallery ) {
507
+ $fields = $this->get_gallery_detail_fields( $gallery );
508
+
509
+ foreach ( $fields as $field => $values ) {
510
+ //for every field, save some info
511
+ do_action( 'foogallery_album_gallery_details_save', $field, $values, $gallery );
512
+ }
513
+ }
514
+ }
515
+ }
516
+
517
+ public function gallery_details_save($field, $field_args, $gallery) {
518
+ if ( 'custom_url' === $field || 'custom_target' === $field ) {
519
+ $value = $_POST[$field];
520
+ update_post_meta( $gallery->ID, $field, $value );
521
+ }
522
+ }
523
+
524
+ /**
525
+ * Get the fields that we want to edit for a gallery from the album management page
526
+ * @param $gallery FooGallery
527
+ *
528
+ * @return mixed|void
529
+ */
530
+ public function get_gallery_detail_fields($gallery) {
531
+
532
+ $target_options = apply_filters( 'foogallery_gallery_detail_fields_custom_target_options', array(
533
+ 'default' => __( 'Default', 'foogallery' ),
534
+ '_blank' => __( 'New tab (_blank)', 'foogallery' ),
535
+ '_self' => __( 'Same tab (_self)', 'foogallery' )
536
+ ) );
537
+
538
+ $edit_url = get_edit_post_link( $gallery->ID );
539
+
540
+ $fields = array(
541
+ 'gallery_title' => array(
542
+ 'label' => __( 'Gallery Title', 'foogallery' ),
543
+ 'input' => 'html',
544
+ 'html' => '<strong>' . $gallery->safe_name() . ' <a href="' . $edit_url . '" target="_blank">' . __( 'Edit Gallery', 'foogallery' ) . '</a></strong>',
545
+ ),
546
+
547
+ 'gallery_template' => array(
548
+ 'label' => __( 'Gallery Template', 'foogallery' ),
549
+ 'input' => 'html',
550
+ 'html' => '<strong>' . $gallery->gallery_template_name() . '</strong>',
551
+ ),
552
+
553
+ 'gallery_media' => array(
554
+ 'label' => __( 'Media', 'foogallery' ),
555
+ 'input' => 'html',
556
+ 'html' => '<strong>' . $gallery->image_count() . '</strong>'
557
+ ),
558
+
559
+ 'custom_url' => array(
560
+ 'label' => __( 'Custom URL', 'foogallery' ),
561
+ 'input' => 'text',
562
+ 'help' => __( 'Point your gallery to a custom URL', 'foogallery' )
563
+ ),
564
+
565
+ 'custom_target' => array(
566
+ 'label' => __( 'Custom Target', 'foogallery' ),
567
+ 'input' => 'select',
568
+ 'help' => __( 'Set a custom target for your gallery', 'foogallery' ),
569
+ 'options' => $target_options
570
+ )
571
+ );
572
+
573
+ return apply_filters( 'foogallery_gallery_detail_fields', $fields );
574
+ }
575
+ }
576
+ }
extensions/albums/album-default.php CHANGED
@@ -1,81 +1,81 @@
1
- <?php
2
- /**
3
- * FooGallery default responsive album template
4
- */
5
- global $current_foogallery_album;
6
- global $current_foogallery_album_arguments;
7
- $gallery = foogallery_album_get_current_gallery();
8
- $alignment = foogallery_album_template_setting( 'alignment', 'alignment-left' );
9
- $foogallery = false;
10
-
11
- if ( !empty( $gallery ) ) {
12
- $foogallery = FooGallery::get_by_slug( $gallery );
13
-
14
- //check to see if the gallery belongs to the album
15
- if ( !$current_foogallery_album->includes_gallery( $foogallery->ID ) ) {
16
- $foogallery = false;
17
- }
18
- }
19
-
20
- if ( false !== $foogallery ) {
21
- $album_url = foogallery_album_remove_gallery_from_link();
22
- echo '<div id="' . $current_foogallery_album->slug . '" class="foogallery-album-header">';
23
- echo '<p><a href="' . esc_url( $album_url ) . '">' . foogallery_get_setting( 'language_back_to_album_text', __( '&laquo; back to album', 'foogallery' ) ) . '</a></p>';
24
- echo '<h2>' . $foogallery->name . '</h2>';
25
- echo apply_filters('foogallery_album_default_gallery_content', '', $foogallery);
26
- echo '</div>';
27
- echo do_shortcode('[foogallery id="' . $foogallery->ID . '"]');
28
- } else {
29
- $title_bg = foogallery_album_template_setting( 'title_bg', '#ffffff' );
30
- $title_font_color = foogallery_album_template_setting( 'title_font_color', '#000000' );
31
- $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
32
- if ( !empty( $title_bg ) || !empty( $title_font_color ) ) {
33
- echo '<style type="text/css">';
34
- if ( !empty( $title_bg ) ) {
35
- echo '.foogallery-album-gallery-list .foogallery-pile h3 { background: ' . $title_bg . ' !important; }';
36
- }
37
- if ( !empty( $title_font_color ) ) {
38
- echo '.foogallery-album-gallery-list .foogallery-pile h3 { color: ' . $title_font_color . ' !important; }';
39
- }
40
- echo '</style>';
41
- }
42
- ?>
43
- <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>">
44
- <ul class="foogallery-album-gallery-list <?php echo $alignment; ?>">
45
- <?php
46
- foreach ( $current_foogallery_album->galleries() as $gallery ) {
47
- if (!empty($gallery->attachment_ids)) {
48
- $attachment = $gallery->featured_attachment();
49
-
50
- if ( false === $attachment ) continue;
51
-
52
- $img_html = $attachment->html_img( $args );
53
- $images = $gallery->image_count();
54
- $gallery_link = foogallery_album_build_gallery_link( $current_foogallery_album, $gallery );
55
- $gallery_link_target = foogallery_album_build_gallery_link_target( $current_foogallery_album, $gallery );
56
- ?>
57
- <li>
58
- <div class="foogallery-pile">
59
- <div class="foogallery-pile-inner">
60
- <a href="<?php echo esc_url( $gallery_link ); ?>" target="<?php echo $gallery_link_target; ?>">
61
- <?php echo $img_html; ?>
62
- <?php
63
-
64
- $title = empty( $gallery->name ) ?
65
- sprintf( __( '%s #%s', 'foogallery' ), foogallery_plugin_name(), $gallery->ID ) :
66
- $gallery->name;
67
-
68
- ?>
69
- <h3><?php echo $title; ?>
70
- <span><?php echo $images; ?></span>
71
- </h3>
72
- </a>
73
- </div>
74
- </div>
75
- </li>
76
- <?php } ?>
77
- <?php } ?>
78
- </ul>
79
- <div style="clear: both;"></div>
80
- </div>
81
- <?php }
1
+ <?php
2
+ /**
3
+ * FooGallery default responsive album template
4
+ */
5
+ global $current_foogallery_album;
6
+ global $current_foogallery_album_arguments;
7
+ $gallery = foogallery_album_get_current_gallery();
8
+ $alignment = foogallery_album_template_setting( 'alignment', 'alignment-left' );
9
+ $foogallery = false;
10
+
11
+ if ( !empty( $gallery ) ) {
12
+ $foogallery = FooGallery::get_by_slug( $gallery );
13
+
14
+ //check to see if the gallery belongs to the album
15
+ if ( !$current_foogallery_album->includes_gallery( $foogallery->ID ) ) {
16
+ $foogallery = false;
17
+ }
18
+ }
19
+
20
+ if ( false !== $foogallery ) {
21
+ $album_url = foogallery_album_remove_gallery_from_link();
22
+ echo '<div id="' . $current_foogallery_album->slug . '" class="foogallery-album-header">';
23
+ echo '<p><a href="' . esc_url( $album_url ) . '">' . foogallery_get_setting( 'language_back_to_album_text', __( '&laquo; back to album', 'foogallery' ) ) . '</a></p>';
24
+ echo '<h2>' . $foogallery->name . '</h2>';
25
+ echo apply_filters('foogallery_album_default_gallery_content', '', $foogallery);
26
+ echo '</div>';
27
+ echo do_shortcode('[foogallery id="' . $foogallery->ID . '"]');
28
+ } else {
29
+ $title_bg = foogallery_album_template_setting( 'title_bg', '#ffffff' );
30
+ $title_font_color = foogallery_album_template_setting( 'title_font_color', '#000000' );
31
+ $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
32
+ if ( !empty( $title_bg ) || !empty( $title_font_color ) ) {
33
+ echo '<style type="text/css">';
34
+ if ( !empty( $title_bg ) ) {
35
+ echo '.foogallery-album-gallery-list .foogallery-pile h3 { background: ' . $title_bg . ' !important; }';
36
+ }
37
+ if ( !empty( $title_font_color ) ) {
38
+ echo '.foogallery-album-gallery-list .foogallery-pile h3 { color: ' . $title_font_color . ' !important; }';
39
+ }
40
+ echo '</style>';
41
+ }
42
+ ?>
43
+ <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>">
44
+ <ul class="foogallery-album-gallery-list <?php echo $alignment; ?>">
45
+ <?php
46
+ foreach ( $current_foogallery_album->galleries() as $gallery ) {
47
+ if (!empty($gallery->attachment_ids)) {
48
+ $attachment = $gallery->featured_attachment();
49
+
50
+ if ( false === $attachment ) continue;
51
+
52
+ $img_html = $attachment->html_img( $args );
53
+ $images = $gallery->image_count();
54
+ $gallery_link = foogallery_album_build_gallery_link( $current_foogallery_album, $gallery );
55
+ $gallery_link_target = foogallery_album_build_gallery_link_target( $current_foogallery_album, $gallery );
56
+ ?>
57
+ <li>
58
+ <div class="foogallery-pile">
59
+ <div class="foogallery-pile-inner">
60
+ <a href="<?php echo esc_url( $gallery_link ); ?>" target="<?php echo $gallery_link_target; ?>">
61
+ <?php echo $img_html; ?>
62
+ <?php
63
+
64
+ $title = empty( $gallery->name ) ?
65
+ sprintf( __( '%s #%s', 'foogallery' ), foogallery_plugin_name(), $gallery->ID ) :
66
+ $gallery->name;
67
+
68
+ ?>
69
+ <h3><?php echo $title; ?>
70
+ <span><?php echo $images; ?></span>
71
+ </h3>
72
+ </a>
73
+ </div>
74
+ </div>
75
+ </li>
76
+ <?php } ?>
77
+ <?php } ?>
78
+ </ul>
79
+ <div style="clear: both;"></div>
80
+ </div>
81
+ <?php }
extensions/albums/album-stack.php CHANGED
@@ -1,67 +1,67 @@
1
- <?php
2
- /**
3
- * FooGallery All-In-One Stack Album template
4
- */
5
- global $current_foogallery_album;
6
- global $current_foogallery_album_arguments;
7
- $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
8
- $lightbox = foogallery_album_template_setting( 'lightbox', 'unknown' );
9
- $random_angle = foogallery_album_template_setting( 'random_angle', 'false' );
10
- $gutter = foogallery_album_template_setting( 'gutter', '40' );
11
- $delay = foogallery_album_template_setting( 'delay', '0' );
12
- $pile_angles = foogallery_album_template_setting( 'pile_angles', '2' );
13
- ?>
14
- <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>" class="foogallery-container foogallery-stack-album">
15
- <div class="topbar">
16
- <span id="foogallery-stack-album-back-<?php echo $current_foogallery_album->ID; ?>" class="back">&larr;</span>
17
- <h2><?php echo $current_foogallery_album->name; ?></h2><h3 id="foogallery-stack-album-gallery-<?php echo $current_foogallery_album->ID; ?>"></h3>
18
- </div>
19
- <ul id="foogallery-stack-album-<?php echo $current_foogallery_album->ID; ?>" class="tp-grid">
20
- <?php
21
- foreach ( $current_foogallery_album->galleries() as $gallery ) {
22
- foreach ( $gallery->attachments() as $attachment ) {
23
- echo '<li data-pile="'. esc_attr($gallery->name) . '">';
24
- $args['link_attributes']['rel'] = 'gallery[' . $gallery->ID . ']';
25
- $args['link_attributes']['class'] = apply_filters( 'foogallery_album_stack_link_class_name', $lightbox );
26
- echo $attachment->html( $args, false, false );
27
- if ( $attachment->caption ) {
28
- echo '<span class="tp-info"><span>' . wp_filter_nohtml_kses( $attachment->caption ) . '</span></span>';
29
- }
30
- echo $attachment->html_img( $args );
31
- echo '</a>';
32
- echo '</li>';
33
- }
34
- }
35
- ?>
36
- </ul>
37
- </div>
38
- <script type="text/javascript">
39
- jQuery(function($) {
40
-
41
- var $grid = $( '#foogallery-stack-album-<?php echo $current_foogallery_album->ID; ?>' ),
42
- $name = $( '#foogallery-stack-album-gallery-<?php echo $current_foogallery_album->ID; ?>' ),
43
- $close = $( '#foogallery-stack-album-back-<?php echo $current_foogallery_album->ID; ?>' ),
44
- $loader = $( '<div class="loader"><i></i><i></i><i></i><i></i><i></i><i></i></div>' ).insertBefore( $grid ),
45
- stapel = $grid.stapel( {
46
- delay : <?php echo $delay; ?>,
47
- randomAngle : <?php echo $random_angle; ?>,
48
- gutter : <?php echo $gutter; ?>,
49
- pileAngles : <?php echo $pile_angles; ?>,
50
- onLoad : function() {
51
- $loader.remove();
52
- },
53
- onBeforeOpen : function( pileName ) {
54
- $name.html( pileName );
55
- },
56
- onAfterOpen : function( pileName ) {
57
- $close.show();
58
- }
59
- } );
60
-
61
- $close.on( 'click', function() {
62
- $close.hide();
63
- $name.empty();
64
- stapel.closePile();
65
- } );
66
- } );
67
- </script>
1
+ <?php
2
+ /**
3
+ * FooGallery All-In-One Stack Album template
4
+ */
5
+ global $current_foogallery_album;
6
+ global $current_foogallery_album_arguments;
7
+ $args = foogallery_album_template_setting( 'thumbnail_dimensions', array() );
8
+ $lightbox = foogallery_album_template_setting( 'lightbox', 'unknown' );
9
+ $random_angle = foogallery_album_template_setting( 'random_angle', 'false' );
10
+ $gutter = foogallery_album_template_setting( 'gutter', '40' );
11
+ $delay = foogallery_album_template_setting( 'delay', '0' );
12
+ $pile_angles = foogallery_album_template_setting( 'pile_angles', '2' );
13
+ ?>
14
+ <div id="foogallery-album-<?php echo $current_foogallery_album->ID; ?>" class="foogallery-container foogallery-stack-album">
15
+ <div class="topbar">
16
+ <span id="foogallery-stack-album-back-<?php echo $current_foogallery_album->ID; ?>" class="back">&larr;</span>
17
+ <h2><?php echo $current_foogallery_album->name; ?></h2><h3 id="foogallery-stack-album-gallery-<?php echo $current_foogallery_album->ID; ?>"></h3>
18
+ </div>
19
+ <ul id="foogallery-stack-album-<?php echo $current_foogallery_album->ID; ?>" class="tp-grid">
20
+ <?php
21
+ foreach ( $current_foogallery_album->galleries() as $gallery ) {
22
+ foreach ( $gallery->attachments() as $attachment ) {
23
+ echo '<li data-pile="'. esc_attr($gallery->name) . '">';
24
+ $args['link_attributes']['rel'] = 'gallery[' . $gallery->ID . ']';
25
+ $args['link_attributes']['class'] = apply_filters( 'foogallery_album_stack_link_class_name', $lightbox );
26
+ echo $attachment->html( $args, false, false );
27
+ if ( $attachment->caption ) {
28
+ echo '<span class="tp-info"><span>' . wp_filter_nohtml_kses( $attachment->caption ) . '</span></span>';
29
+ }
30
+ echo $attachment->html_img( $args );
31
+ echo '</a>';
32
+ echo '</li>';
33
+ }
34
+ }
35
+ ?>
36
+ </ul>
37
+ </div>
38
+ <script type="text/javascript">
39
+ jQuery(function($) {
40
+
41
+ var $grid = $( '#foogallery-stack-album-<?php echo $current_foogallery_album->ID; ?>' ),
42
+ $name = $( '#foogallery-stack-album-gallery-<?php echo $current_foogallery_album->ID; ?>' ),
43
+ $close = $( '#foogallery-stack-album-back-<?php echo $current_foogallery_album->ID; ?>' ),
44
+ $loader = $( '<div class="loader"><i></i><i></i><i></i><i></i><i></i><i></i></div>' ).insertBefore( $grid ),
45
+ stapel = $grid.stapel( {
46
+ delay : <?php echo $delay; ?>,
47
+ randomAngle : <?php echo $random_angle; ?>,
48
+ gutter : <?php echo $gutter; ?>,
49
+ pileAngles : <?php echo $pile_angles; ?>,
50
+ onLoad : function() {
51
+ $loader.remove();
52
+ },
53
+ onBeforeOpen : function( pileName ) {
54
+ $name.html( pileName );
55
+ },
56
+ onAfterOpen : function( pileName ) {
57
+ $close.show();
58
+ }
59
+ } );
60
+
61
+ $close.on( 'click', function() {
62
+ $close.hide();
63
+ $name.empty();
64
+ stapel.closePile();
65
+ } );
66
+ } );
67
+ </script>
extensions/albums/class-albums-extension.php CHANGED
@@ -1,111 +1,111 @@
1
- <?php
2
- if ( ! class_exists( 'FooGallery_Albums_Extension' ) ) {
3
-
4
- define( 'FOOGALLERY_ALBUM_PATH', plugin_dir_path( __FILE__ ) );
5
- define( 'FOOGALLERY_ALBUM_URL', plugin_dir_url( __FILE__ ) );
6
- define( 'FOOGALLERY_CPT_ALBUM', 'foogallery-album' );
7
- define( 'FOOGALLERY_ALBUM_META_GALLERIES', 'foogallery_album_galleries' );
8
- define( 'FOOGALLERY_ALBUM_META_TEMPLATE', 'foogallery_album_template' );
9
- define( 'FOOGALLERY_ALBUM_META_SORT', 'foogallery_album_sort' );
10
-
11
- class FooGallery_Albums_Extension {
12
-
13
- function __construct() {
14
- $this->includes();
15
-
16
- new FooGallery_Album_Rewrite_Rules();
17
- new FooGallery_Albums_PostTypes();
18
-
19
- if ( is_admin() ) {
20
- new FooGallery_Albums_Admin_Columns();
21
- new FooGallery_Admin_Album_MetaBoxes();
22
-
23
- //add language settings
24
- add_filter( 'foogallery_admin_settings_override', array( $this, 'include_album_language_settings' ) );
25
-
26
- //add some global settings for albums
27
- add_filter( 'foogallery_admin_settings_override', array($this, 'add_album_settings' ) );
28
-
29
- add_action( 'foogallery_uninstall', array($this, 'uninstall' ) );
30
-
31
- } else {
32
-
33
- new FooGallery_Album_Template_Loader();
34
- new FooGallery_Album_Shortcodes();
35
- }
36
- add_filter( 'foogallery_album_templates_files', array( $this, 'register_myself' ) );
37
- add_filter( 'foogallery_defaults', array( $this, 'apply_album_defaults' ) );
38
- add_action( 'foogallery_extension_activated-albums', array( $this, 'flush_rewrite_rules' ) );
39
- add_filter( 'foogallery_alter_album_template_field', array( $this, 'alter_gallery_template_field' ), 10, 2 );
40
- }
41
-
42
- function includes() {
43
- require_once( FOOGALLERY_ALBUM_PATH . 'functions.php' );
44
- require_once( FOOGALLERY_ALBUM_PATH . 'class-posttypes.php' );
45
- require_once( FOOGALLERY_ALBUM_PATH . 'class-foogallery-album.php' );
46
- require_once( FOOGALLERY_ALBUM_PATH . 'public/class-rewrite-rules.php' );
47
-
48
- if ( is_admin() ) {
49
- //only admin
50
- require_once( FOOGALLERY_ALBUM_PATH . 'admin/class-metaboxes.php' );
51
- require_once( FOOGALLERY_ALBUM_PATH . 'admin/class-columns.php' );
52
- } else {
53
- //only front-end
54
- require_once( FOOGALLERY_ALBUM_PATH . 'public/class-shortcodes.php' );
55
-
56
- //load Template \ Loader files
57
- require_once( FOOGALLERY_ALBUM_PATH . 'public/class-foogallery-album-template-loader.php' );
58
- }
59
- }
60
-
61
- function apply_album_defaults( $defaults ) {
62
- $defaults['album_template'] = 'default';
63
-
64
- return $defaults;
65
- }
66
-
67
- function register_myself( $extensions ) {
68
- $extensions[] = __FILE__;
69
- return $extensions;
70
- }
71
-
72
- function flush_rewrite_rules() {
73
- $rewrite = new FooGallery_Album_Rewrite_Rules();
74
- $rewrite->add_gallery_endpoint();
75
-
76
- flush_rewrite_rules();
77
- }
78
-
79
- function include_album_language_settings( $settings ) {
80
- $settings['settings'][] = array(
81
- 'id' => 'language_back_to_album_text',
82
- 'title' => __( 'Back To Album Text', 'foogallery' ),
83
- 'type' => 'text',
84
- 'default' => __( '&laquo; back to album', 'foogallery' ),
85
- 'tab' => 'language'
86
- );
87
-
88
- return $settings;
89
- }
90
-
91
- function add_album_settings( $settings ) {
92
-
93
- $settings['tabs']['albums'] = __( 'Albums', 'foogallery' );
94
-
95
- $settings['settings'][] = array(
96
- 'id' => 'album_gallery_slug',
97
- 'title' => __( 'Gallery Slug', 'foogallery' ),
98
- 'type' => 'text',
99
- 'default' => 'gallery',
100
- 'desc' => __( 'The slug that is used when generating gallery URL\'s for albums. PLEASE NOTE : if you change this value, you might need to save your Permalinks again.', 'foogallery' ),
101
- 'tab' => 'albums'
102
- );
103
-
104
- return $settings;
105
- }
106
-
107
- function uninstall() {
108
- foogallery_album_uninstall();
109
- }
110
- }
111
- }
1
+ <?php
2
+ if ( ! class_exists( 'FooGallery_Albums_Extension' ) ) {
3
+
4
+ define( 'FOOGALLERY_ALBUM_PATH', plugin_dir_path( __FILE__ ) );
5
+ define( 'FOOGALLERY_ALBUM_URL', plugin_dir_url( __FILE__ ) );
6
+ define( 'FOOGALLERY_CPT_ALBUM', 'foogallery-album' );
7
+ define( 'FOOGALLERY_ALBUM_META_GALLERIES', 'foogallery_album_galleries' );
8
+ define( 'FOOGALLERY_ALBUM_META_TEMPLATE', 'foogallery_album_template' );
9
+ define( 'FOOGALLERY_ALBUM_META_SORT', 'foogallery_album_sort' );
10
+
11
+ class FooGallery_Albums_Extension {
12
+
13
+ function __construct() {
14
+ $this->includes();
15
+
16
+ new FooGallery_Album_Rewrite_Rules();
17
+ new FooGallery_Albums_PostTypes();
18
+
19
+ if ( is_admin() ) {
20
+ new FooGallery_Albums_Admin_Columns();
21
+ new FooGallery_Admin_Album_MetaBoxes();
22
+
23
+ //add language settings
24
+ add_filter( 'foogallery_admin_settings_override', array( $this, 'include_album_language_settings' ) );
25
+
26
+ //add some global settings for albums
27
+ add_filter( 'foogallery_admin_settings_override', array($this, 'add_album_settings' ) );
28
+
29
+ add_action( 'foogallery_uninstall', array($this, 'uninstall' ) );
30
+
31
+ } else {
32
+
33
+ new FooGallery_Album_Template_Loader();
34
+ new FooGallery_Album_Shortcodes();
35
+ }
36
+ add_filter( 'foogallery_album_templates_files', array( $this, 'register_myself' ) );
37
+ add_filter( 'foogallery_defaults', array( $this, 'apply_album_defaults' ) );
38
+ add_action( 'foogallery_extension_activated-albums', array( $this, 'flush_rewrite_rules' ) );
39
+ add_filter( 'foogallery_alter_album_template_field', array( $this, 'alter_gallery_template_field' ), 10, 2 );
40
+ }
41
+
42
+ function includes() {
43
+ require_once( FOOGALLERY_ALBUM_PATH . 'functions.php' );
44
+ require_once( FOOGALLERY_ALBUM_PATH . 'class-posttypes.php' );
45
+ require_once( FOOGALLERY_ALBUM_PATH . 'class-foogallery-album.php' );
46
+ require_once( FOOGALLERY_ALBUM_PATH . 'public/class-rewrite-rules.php' );
47
+
48
+ if ( is_admin() ) {
49
+ //only admin
50
+ require_once( FOOGALLERY_ALBUM_PATH . 'admin/class-metaboxes.php' );
51
+ require_once( FOOGALLERY_ALBUM_PATH . 'admin/class-columns.php' );
52
+ } else {
53
+ //only front-end
54
+ require_once( FOOGALLERY_ALBUM_PATH . 'public/class-shortcodes.php' );
55
+
56
+ //load Template \ Loader files
57
+ require_once( FOOGALLERY_ALBUM_PATH . 'public/class-foogallery-album-template-loader.php' );
58
+ }
59
+ }
60
+
61
+ function apply_album_defaults( $defaults ) {
62
+ $defaults['album_template'] = 'default';
63
+
64
+ return $defaults;
65
+ }
66
+
67
+ function register_myself( $extensions ) {
68
+ $extensions[] = __FILE__;
69
+ return $extensions;
70
+ }
71
+
72
+ function flush_rewrite_rules() {
73
+ $rewrite = new FooGallery_Album_Rewrite_Rules();
74
+ $rewrite->add_gallery_endpoint();
75
+
76
+ flush_rewrite_rules();
77
+ }
78
+
79
+ function include_album_language_settings( $settings ) {
80
+ $settings['settings'][] = array(
81
+ 'id' => 'language_back_to_album_text',
82
+ 'title' => __( 'Back To Album Text', 'foogallery' ),
83
+ 'type' => 'text',
84
+ 'default' => __( '&laquo; back to album', 'foogallery' ),
85
+ 'tab' => 'language'
86
+ );
87
+
88
+ return $settings;
89
+ }
90
+
91
+ function add_album_settings( $settings ) {
92
+
93
+ $settings['tabs']['albums'] = __( 'Albums', 'foogallery' );
94
+
95
+ $settings['settings'][] = array(
96
+ 'id' => 'album_gallery_slug',
97
+ 'title' => __( 'Gallery Slug', 'foogallery' ),
98
+ 'type' => 'text',
99
+ 'default' => 'gallery',
100
+ 'desc' => __( 'The slug that is used when generating gallery URL\'s for albums. PLEASE NOTE : if you change this value, you might need to save your Permalinks again.', 'foogallery' ),
101
+ 'tab' => 'albums'
102
+ );
103
+
104
+ return $settings;
105
+ }
106
+
107
+ function uninstall() {
108
+ foogallery_album_uninstall();
109
+ }
110
+ }
111
+ }
extensions/albums/class-foogallery-album.php CHANGED
@@ -1,256 +1,256 @@
1
- <?php
2
-
3
- /**
4
- * Class FooGalleryAlbum
5
- *
6
- * An easy to use wrapper class for a FooGallery Album post
7
- */
8
- class FooGalleryAlbum extends stdClass {
9
-
10
- /**
11
- * private constructor
12
- *
13
- * @param null $post
14
- */
15
- private function __construct( $post = null ) {
16
- $this->set_defaults();
17
-
18
- if ( $post !== null ) {
19
- $this->load( $post );
20
- }
21
- }
22
-
23
- /**
24
- * Sets the default when a new album is instantiated
25
- */
26
- private function set_defaults() {
27
- $this->_post = null;
28
- $this->ID = 0;
29
- $this->gallery_ids = array();
30
- $this->_galleries = false;
31
- }
32
-
33
- /**
34
- * private gallery load function
35
- * @param $post
36
- */
37
- private function load( $post ) {
38
- $this->_post = $post;
39
- $this->ID = $post->ID;
40
- $this->slug = $post->post_name;
41
- $this->name = $post->post_title;
42
- $this->author = $post->post_author;
43
- $this->post_status = $post->post_status;
44
- $album_meta = get_post_meta( $this->ID, FOOGALLERY_ALBUM_META_GALLERIES, true );
45
- $this->gallery_ids = is_array( $album_meta ) ? array_filter( $album_meta ) : array();
46
- $this->album_template = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_TEMPLATE, true );
47
- $this->settings = get_post_meta( $post->ID, FOOGALLERY_META_SETTINGS_OLD, true );
48
- $this->custom_css = get_post_meta( $post->ID, FOOGALLERY_META_CUSTOM_CSS, true );
49
- $this->sorting = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_SORT, true );
50
- do_action( 'foogallery_foogallery-album_instance_after_load', $this, $post );
51
- }
52
-
53
- /**
54
- * private function to load a album by an id
55
- * @param $post_id
56
- */
57
- private function load_by_id( $post_id ) {
58
- $post = get_post( $post_id );
59
- if ( $post ) {
60
- $this->load( $post );
61
- }
62
- }
63
-
64
- /**
65
- * private function to load a album by the slug.
66
- * Will be used when loading album shortcodes
67
- * @param $slug
68
- */
69
- private function load_by_slug( $slug ) {
70
- if ( ! empty( $slug ) ) {
71
- $args = array(
72
- 'name' => $slug,
73
- 'numberposts' => 1,
74
- 'post_type' => FOOGALLERY_CPT_ALBUM,
75
- );
76
-
77
- $albums = get_posts( $args );
78
-
79
- if ( $albums ) {
80
- $this->load( $albums[0] );
81
- }
82
- }
83
- }
84
-
85
- /**
86
- * Static function to load a Album instance by passing in a post object
87
- * @static
88
- *
89
- * @param $post
90
- *
91
- * @return FooGalleryAlbum
92
- */
93
- public static function get( $post ) {
94
- return new self( $post );
95
- }
96
-
97
- /**
98
- * Static function to load an Album instance by post id
99
- *
100
- * @param $post_id
101
- *
102
- * @return FooGalleryAlbum
103
- */
104
- public static function get_by_id( $post_id ) {
105
- $album = new self();
106
- $album->load_by_id( $post_id );
107
- if ( ! $album->does_exist() ) {
108
- return false;
109
- }
110
- return $album;
111
- }
112
-
113
- /**
114
- * Static function to load a album instance by passing in a album slug
115
- *
116
- * @param string $slug
117
- *
118
- * @return FooGalleryAlbum
119
- */
120
- public static function get_by_slug( $slug ) {
121
- $album = new self();
122
- $album->load_by_slug( $slug );
123
- if ( ! $album->does_exist() ) {
124
- return false;
125
- }
126
- return $album;
127
- }
128
-
129
- /**
130
- * Checks if the album has galleries
131
- * @return bool
132
- */
133
- public function has_galleries() {
134
- return sizeof( $this->gallery_ids ) > 0;
135
- }
136
-
137
- /**
138
- * Checks if the album exists
139
- * @return bool
140
- */
141
- public function does_exist() {
142
- return $this->ID > 0;
143
- }
144
-
145
- /**
146
- * Returns true if the album is published
147
- * @return bool
148
- */
149
- public function is_published() {
150
- return $this->post_status === 'publish';
151
- }
152
-
153
- /**
154
- * Get a comma separated list of gallery ids
155
- * @return string
156
- */
157
- public function gallery_id_csv() {
158
- if ( is_array( $this->gallery_ids ) ) {
159
- return implode( ',', $this->gallery_ids );
160
- }
161
-
162
- return '';
163
- }
164
-
165
- /**
166
- * Lazy load the attachments for the gallery
167
- *
168
- * @return array
169
- */
170
- public function galleries() {
171
- //lazy load the attachments for performance
172
- if ( $this->_galleries === false ) {
173
- $this->_galleries = array();
174
-
175
- if ( ! empty( $this->gallery_ids ) ) {
176
-
177
- $gallery_query_args = apply_filters( 'foogallery_album_gallery_get_posts_args', array(
178
- 'post_type' => FOOGALLERY_CPT_GALLERY,
179
- 'posts_per_page' => -1,
180
- 'post__in' => $this->gallery_ids,
181
- 'orderby' => foogallery_sorting_get_posts_orderby_arg( $this->sorting ),
182
- 'order' => foogallery_sorting_get_posts_order_arg( $this->sorting )
183
- ) );
184
-
185
- $galleries = get_posts( $gallery_query_args );
186
-
187
- $this->_galleries = array_map( array( 'FooGallery', 'get' ), $galleries );
188
- }
189
- }
190
-
191
- return $this->_galleries;
192
- }
193
-
194
- function includes_gallery( $gallery_id ) {
195
- if ( $this->has_galleries() ) {
196
- return in_array( $gallery_id, $this->gallery_ids );
197
- }
198
- return false;
199
- }
200
-
201
- public function gallery_count() {
202
- $count = sizeof( $this->gallery_ids );
203
- switch ( $count ) {
204
- case 0:
205
- return __( 'No galleries', 'foogallery' );
206
- case 1:
207
- return __( '1 gallery', 'foogallery' );
208
- default:
209
- return sprintf( __( '%s galleries', 'foogallery' ), $count );
210
- }
211
- }
212
-
213
- /**
214
- * Output the shortcode for the gallery
215
- *
216
- * @return string
217
- */
218
- public function shortcode() {
219
- return foogallery_build_album_shortcode( $this->ID );
220
- }
221
-
222
- function get_meta( $key, $default ) {
223
- if ( ! is_array( $this->settings ) ) {
224
- return $default;
225
- }
226
-
227
- $value = array_key_exists( $key, $this->settings ) ? $this->settings[ $key ] : null;
228
-
229
- if ( $value === null ) {
230
- return $default;
231
- }
232
-
233
- return $value;
234
- }
235
-
236
- function is_checked( $key, $default = false ) {
237
- if ( ! is_array( $this->settings ) ) {
238
- return $default;
239
- }
240
-
241
- return array_key_exists( $key, $this->settings );
242
- }
243
-
244
- public function album_template_details() {
245
- if ( ! empty( $this->album_template ) ) {
246
-
247
- foreach ( foogallery_album_templates() as $template ) {
248
- if ( $this->album_template == $template['slug'] ) {
249
- return $template;
250
- }
251
- }
252
- }
253
-
254
- return false;
255
- }
256
- }
1
+ <?php
2
+
3
+ /**
4
+ * Class FooGalleryAlbum
5
+ *
6
+ * An easy to use wrapper class for a FooGallery Album post
7
+ */
8
+ class FooGalleryAlbum extends stdClass {
9
+
10
+ /**
11
+ * private constructor
12
+ *
13
+ * @param null $post
14
+ */
15
+ private function __construct( $post = null ) {
16
+ $this->set_defaults();
17
+
18
+ if ( $post !== null ) {
19
+ $this->load( $post );
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Sets the default when a new album is instantiated
25
+ */
26
+ private function set_defaults() {
27
+ $this->_post = null;
28
+ $this->ID = 0;
29
+ $this->gallery_ids = array();
30
+ $this->_galleries = false;
31
+ }
32
+
33
+ /**
34
+ * private gallery load function
35
+ * @param $post
36
+ */
37
+ private function load( $post ) {
38
+ $this->_post = $post;
39
+ $this->ID = $post->ID;
40
+ $this->slug = $post->post_name;
41
+ $this->name = $post->post_title;
42
+ $this->author = $post->post_author;
43
+ $this->post_status = $post->post_status;
44
+ $album_meta = get_post_meta( $this->ID, FOOGALLERY_ALBUM_META_GALLERIES, true );
45
+ $this->gallery_ids = is_array( $album_meta ) ? array_filter( $album_meta ) : array();
46
+ $this->album_template = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_TEMPLATE, true );
47
+ $this->settings = get_post_meta( $post->ID, FOOGALLERY_META_SETTINGS_OLD, true );
48
+ $this->custom_css = get_post_meta( $post->ID, FOOGALLERY_META_CUSTOM_CSS, true );
49
+ $this->sorting = get_post_meta( $post->ID, FOOGALLERY_ALBUM_META_SORT, true );
50
+ do_action( 'foogallery_foogallery-album_instance_after_load', $this, $post );
51
+ }
52
+
53
+ /**
54
+ * private function to load a album by an id
55
+ * @param $post_id
56
+ */
57
+ private function load_by_id( $post_id ) {
58
+ $post = get_post( $post_id );
59
+ if ( $post ) {
60
+ $this->load( $post );
61
+ }
62
+ }
63
+
64
+ /**
65
+ * private function to load a album by the slug.
66
+ * Will be used when loading album shortcodes
67
+ * @param $slug
68
+ */
69
+ private function load_by_slug( $slug ) {
70
+ if ( ! empty( $slug ) ) {
71
+ $args = array(
72
+ 'name' => $slug,
73
+ 'numberposts' => 1,
74
+ 'post_type' => FOOGALLERY_CPT_ALBUM,
75
+ );
76
+
77
+ $albums = get_posts( $args );
78
+
79
+ if ( $albums ) {
80
+ $this->load( $albums[0] );
81
+ }
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Static function to load a Album instance by passing in a post object
87
+ * @static
88
+ *
89
+ * @param $post
90
+ *
91
+ * @return FooGalleryAlbum
92
+ */
93
+ public static function get( $post ) {
94
+ return new self( $post );
95
+ }
96
+
97
+ /**
98
+ * Static function to load an Album instance by post id
99
+ *
100
+ * @param $post_id
101
+ *
102
+ * @return FooGalleryAlbum
103
+ */
104
+ public static function get_by_id( $post_id ) {
105
+ $album = new self();
106
+ $album->load_by_id( $post_id );
107
+ if ( ! $album->does_exist() ) {
108
+ return false;
109
+ }
110
+ return $album;
111
+ }
112
+
113
+ /**
114
+ * Static function to load a album instance by passing in a album slug
115
+ *
116
+ * @param string $slug
117
+ *
118
+ * @return FooGalleryAlbum
119
+ */
120
+ public static function get_by_slug( $slug ) {
121
+ $album = new self();
122
+ $album->load_by_slug( $slug );
123
+ if ( ! $album->does_exist() ) {
124
+ return false;
125
+ }
126
+ return $album;
127
+ }
128
+
129
+ /**
130
+ * Checks if the album has galleries
131
+ * @return bool
132
+ */
133
+ public function has_galleries() {
134
+ return sizeof( $this->gallery_ids ) > 0;
135
+ }
136
+
137
+ /**
138
+ * Checks if the album exists
139
+ * @return bool
140
+ */
141
+ public function does_exist() {
142
+ return $this->ID > 0;
143
+ }
144
+
145
+ /**
146
+ * Returns true if the album is published
147
+ * @return bool
148
+ */
149
+ public function is_published() {
150
+ return $this->post_status === 'publish';
151
+ }
152
+
153
+ /**
154
+ * Get a comma separated list of gallery ids
155
+ * @return string
156
+ */
157
+ public function gallery_id_csv() {
158
+ if ( is_array( $this->gallery_ids ) ) {
159
+ return implode( ',', $this->gallery_ids );
160
+ }
161
+
162
+ return '';
163
+ }
164
+
165
+ /**
166
+ * Lazy load the attachments for the gallery
167
+ *
168
+ * @return array
169
+ */
170
+ public function galleries() {
171
+ //lazy load the attachments for performance
172
+ if ( $this->_galleries === false ) {
173
+ $this->_galleries = array();
174
+
175
+ if ( ! empty( $this->gallery_ids ) ) {
176
+
177
+ $gallery_query_args = apply_filters( 'foogallery_album_gallery_get_posts_args', array(
178
+ 'post_type' => FOOGALLERY_CPT_GALLERY,
179
+ 'posts_per_page' => -1,
180
+ 'post__in' => $this->gallery_ids,
181
+ 'orderby' => foogallery_sorting_get_posts_orderby_arg( $this->sorting ),
182
+ 'order' => foogallery_sorting_get_posts_order_arg( $this->sorting )
183
+ ) );
184
+
185
+ $galleries = get_posts( $gallery_query_args );
186
+
187
+ $this->_galleries = array_map( array( 'FooGallery', 'get' ), $galleries );
188
+ }
189
+ }
190
+
191
+ return $this->_galleries;
192
+ }
193
+
194
+ function includes_gallery( $gallery_id ) {
195
+ if ( $this->has_galleries() ) {
196
+ return in_array( $gallery_id, $this->gallery_ids );
197
+ }
198
+ return false;
199
+ }
200
+
201
+ public function gallery_count() {
202
+ $count = sizeof( $this->gallery_ids );
203
+ switch ( $count ) {
204
+ case 0:
205
+ return __( 'No galleries', 'foogallery' );
206
+ case 1:
207
+ return __( '1 gallery', 'foogallery' );
208
+ default:
209
+ return sprintf( __( '%s galleries', 'foogallery' ), $count );
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Output the shortcode for the gallery
215
+ *
216
+ * @return string
217
+ */
218
+ public function shortcode() {
219
+ return foogallery_build_album_shortcode( $this->ID );
220
+ }
221
+
222
+ function get_meta( $key, $default ) {
223
+ if ( ! is_array( $this->settings ) ) {
224
+ return $default;
225
+ }
226
+
227
+ $value = array_key_exists( $key, $this->settings ) ? $this->settings[ $key ] : null;
228
+
229
+ if ( $value === null ) {
230
+ return $default;
231
+ }
232
+
233
+ return $value;
234
+ }
235
+
236
+ function is_checked( $key, $default = false ) {
237
+ if ( ! is_array( $this->settings ) ) {
238
+ return $default;
239
+ }
240
+
241
+ return array_key_exists( $key, $this->settings );
242
+ }
243
+
244
+ public function album_template_details() {
245
+ if ( ! empty( $this->album_template ) ) {
246
+
247
+ foreach ( foogallery_album_templates() as $template ) {
248
+ if ( $this->album_template == $template['slug'] ) {
249
+ return $template;
250
+ }
251
+ }
252
+ }
253
+
254
+ return false;
255
+ }
256
+ }
extensions/albums/class-posttypes.php CHANGED
@@ -1,108 +1,108 @@
1
- <?php
2
- /*
3
- * FooGallery Album Custom Post Types
4
- */
5
-
6
- if ( ! class_exists( 'FooGallery_Albums_PostTypes' ) ) {
7
-
8
- class FooGallery_Albums_PostTypes {
9
-
10
- function __construct() {
11
- //register the post types
12
- add_action( 'init', array( $this, 'register_posttype' ) );
13
-
14
- //update post type messages
15
- add_filter( 'post_updated_messages', array( $this, 'update_messages' ) );
16
-
17
- //update post bulk messages
18
- add_filter( 'bulk_post_updated_messages', array( $this, 'update_bulk_messages' ), 10, 2 );
19
- }
20
-
21
- function register_posttype() {
22
- //allow extensions to override the album post type
23
- $args = apply_filters( 'foogallery_album_posttype_register_args',
24
- array(
25
- 'labels' => array(
26
- 'name' => __( 'Albums', 'foogallery' ),
27
- 'singular_name' => __( 'Album', 'foogallery' ),
28
- 'add_new' => __( 'Add Album', 'foogallery' ),
29
- 'add_new_item' => __( 'Add New Album', 'foogallery' ),
30
- 'edit_item' => __( 'Edit Album', 'foogallery' ),
31
- 'new_item' => __( 'New Album', 'foogallery' ),
32
- 'view_item' => __( 'View Album', 'foogallery' ),
33
- 'search_items' => __( 'Search Albums', 'foogallery' ),
34
- 'not_found' => __( 'No Albums found', 'foogallery' ),
35
- 'not_found_in_trash' => __( 'No Albums found in Trash', 'foogallery' ),
36
- 'menu_name' => __( 'Albums', 'foogallery' ),
37
- 'all_items' => __( 'Albums', 'foogallery' )
38
- ),
39
- 'hierarchical' => false,
40
- 'public' => false,
41
- 'rewrite' => false,
42
- 'show_ui' => true,
43
- 'show_in_menu' => foogallery_admin_menu_parent_slug(),
44
- 'supports' => array( 'title' ),
45
- )
46
- );
47
-
48
- register_post_type( FOOGALLERY_CPT_ALBUM, $args );
49
- }
50
-
51
- /**
52
- * Customize the update messages for a album
53
- *
54
- * @global object $post The current post object.
55
- *
56
- * @param array $messages Array of default post updated messages.
57
- *
58
- * @return array $messages Amended array of post updated messages.
59
- */
60
- public function update_messages( $messages ) {
61
-
62
- global $post;
63
-
64
- // Add our album messages
65
- $messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_update_messages',
66
- array(
67
- 0 => '',
68
- 1 => __( 'Album updated.', 'foogallery' ),
69
- 2 => __( 'Album custom field updated.', 'foogallery' ),
70
- 3 => __( 'Album custom field deleted.', 'foogallery' ),
71
- 4 => __( 'Album updated.', 'foogallery' ),
72
- 5 => isset($_GET['revision']) ? sprintf( __( 'Album restored to revision from %s.', 'foogallery' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
73
- 6 => __( 'Album published.', 'foogallery' ),
74
- 7 => __( 'Album saved.', 'foogallery' ),
75
- 8 => __( 'Album submitted.', 'foogallery' ),
76
- 9 => sprintf( __( 'Album scheduled for: <strong>%1$s</strong>.', 'foogallery' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) ),
77
- 10 => __( 'Album draft updated.', 'foogallery' )
78
- )
79
- );
80
-
81
- return $messages;
82
-
83
- }
84
-
85
- /**
86
- * Customize the bulk update messages for a album
87
- *
88
- * @param array $bulk_messages Array of default bulk updated messages.
89
- * @param array $bulk_counts Array containing count of posts involved in the action.
90
- *
91
- * @return array mixed Amended array of bulk updated messages.
92
- */
93
- function update_bulk_messages( $bulk_messages, $bulk_counts ) {
94
-
95
- $bulk_messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_bulk_update_messages',
96
- array(
97
- 'updated' => _n( '%s Album updated.', '%s Albums updated.', $bulk_counts['updated'], 'foogallery' ),
98
- 'locked' => _n( '%s Album not updated, somebody is editing it.', '%s Albums not updated, somebody is editing them.', $bulk_counts['locked'], 'foogallery' ),
99
- 'deleted' => _n( '%s Album permanently deleted.', '%s Albums permanently deleted.', $bulk_counts['deleted'], 'foogallery' ),
100
- 'trashed' => _n( '%s Album moved to the Trash.', '%s Albums moved to the Trash.', $bulk_counts['trashed'], 'foogallery' ),
101
- 'untrashed' => _n( '%s Album restored from the Trash.', '%s Albums restored from the Trash.', $bulk_counts['untrashed'], 'foogallery' ),
102
- )
103
- );
104
-
105
- return $bulk_messages;
106
- }
107
- }
108
- }
1
+ <?php
2
+ /*
3
+ * FooGallery Album Custom Post Types
4
+ */
5
+
6
+ if ( ! class_exists( 'FooGallery_Albums_PostTypes' ) ) {
7
+
8
+ class FooGallery_Albums_PostTypes {
9
+
10
+ function __construct() {
11
+ //register the post types
12
+ add_action( 'init', array( $this, 'register_posttype' ) );
13
+
14
+ //update post type messages
15
+ add_filter( 'post_updated_messages', array( $this, 'update_messages' ) );
16
+
17
+ //update post bulk messages
18
+ add_filter( 'bulk_post_updated_messages', array( $this, 'update_bulk_messages' ), 10, 2 );
19
+ }
20
+
21
+ function register_posttype() {
22
+ //allow extensions to override the album post type
23
+ $args = apply_filters( 'foogallery_album_posttype_register_args',
24
+ array(
25
+ 'labels' => array(
26
+ 'name' => __( 'Albums', 'foogallery' ),
27
+ 'singular_name' => __( 'Album', 'foogallery' ),
28
+ 'add_new' => __( 'Add Album', 'foogallery' ),
29
+ 'add_new_item' => __( 'Add New Album', 'foogallery' ),
30
+ 'edit_item' => __( 'Edit Album', 'foogallery' ),
31
+ 'new_item' => __( 'New Album', 'foogallery' ),
32
+ 'view_item' => __( 'View Album', 'foogallery' ),
33
+ 'search_items' => __( 'Search Albums', 'foogallery' ),
34
+ 'not_found' => __( 'No Albums found', 'foogallery' ),
35
+ 'not_found_in_trash' => __( 'No Albums found in Trash', 'foogallery' ),
36
+ 'menu_name' => __( 'Albums', 'foogallery' ),
37
+ 'all_items' => __( 'Albums', 'foogallery' )
38
+ ),
39
+ 'hierarchical' => false,
40
+ 'public' => false,
41
+ 'rewrite' => false,
42
+ 'show_ui' => true,
43
+ 'show_in_menu' => foogallery_admin_menu_parent_slug(),
44
+ 'supports' => array( 'title' ),
45
+ )
46
+ );
47
+
48
+ register_post_type( FOOGALLERY_CPT_ALBUM, $args );
49
+ }
50
+
51
+ /**
52
+ * Customize the update messages for a album
53
+ *
54
+ * @global object $post The current post object.
55
+ *
56
+ * @param array $messages Array of default post updated messages.
57
+ *
58
+ * @return array $messages Amended array of post updated messages.
59
+ */
60
+ public function update_messages( $messages ) {
61
+
62
+ global $post;
63
+
64
+ // Add our album messages
65
+ $messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_update_messages',
66
+ array(
67
+ 0 => '',
68
+ 1 => __( 'Album updated.', 'foogallery' ),
69
+ 2 => __( 'Album custom field updated.', 'foogallery' ),
70
+ 3 => __( 'Album custom field deleted.', 'foogallery' ),
71
+ 4 => __( 'Album updated.', 'foogallery' ),
72
+ 5 => isset($_GET['revision']) ? sprintf( __( 'Album restored to revision from %s.', 'foogallery' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
73
+ 6 => __( 'Album published.', 'foogallery' ),
74
+ 7 => __( 'Album saved.', 'foogallery' ),
75
+ 8 => __( 'Album submitted.', 'foogallery' ),
76
+ 9 => sprintf( __( 'Album scheduled for: <strong>%1$s</strong>.', 'foogallery' ), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) ),
77
+ 10 => __( 'Album draft updated.', 'foogallery' )
78
+ )
79
+ );
80
+
81
+ return $messages;
82
+
83
+ }
84
+
85
+ /**
86
+ * Customize the bulk update messages for a album
87
+ *
88
+ * @param array $bulk_messages Array of default bulk updated messages.
89
+ * @param array $bulk_counts Array containing count of posts involved in the action.
90
+ *
91
+ * @return array mixed Amended array of bulk updated messages.
92
+ */
93
+ function update_bulk_messages( $bulk_messages, $bulk_counts ) {
94
+
95
+ $bulk_messages[FOOGALLERY_CPT_ALBUM] = apply_filters( 'foogallery_album_posttype_bulk_update_messages',
96
+ array(
97
+ 'updated' => _n( '%s Album updated.', '%s Albums updated.', $bulk_counts['updated'], 'foogallery' ),
98
+ 'locked' => _n( '%s Album not updated, somebody is editing it.', '%s Albums not updated, somebody is editing them.', $bulk_counts['locked'], 'foogallery' ),
99
+ 'deleted' => _n( '%s Album permanently deleted.', '%s Albums permanently deleted.', $bulk_counts['deleted'], 'foogallery' ),
100
+ 'trashed' => _n( '%s Album moved to the Trash.', '%s Albums moved to the Trash.', $bulk_counts['trashed'], 'foogallery' ),
101
+ 'untrashed' => _n( '%s Album restored from the Trash.', '%s Albums restored from the Trash.', $bulk_counts['untrashed'], 'foogallery' ),
102
+ )
103
+ );
104
+
105
+ return $bulk_messages;
106
+ }
107
+ }
108
+ }
extensions/albums/css/admin-foogallery-album.css CHANGED
@@ -1,380 +1,380 @@
1
- .foogallery-pile {
2
- position: relative;
3
- z-index: 10;
4
- float: left;
5
- margin: 10px 15px 15px 10px !important;
6
- }
7
- /* Image styles */
8
- .foogallery-pile .foogallery-gallery-select {
9
- max-width: 100%;
10
- vertical-align: bottom;
11
- border: 8px solid #fff;
12
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
13
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
14
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
15
- overflow: hidden;
16
- }
17
-
18
- /* Stacks creted by the use of generated content */
19
- .foogallery-pile:before, .foogallery-pile:after {
20
- content: "";
21
- width: 100%;
22
- height: 100%;
23
- position: absolute;
24
- border: 8px solid #fff;
25
- left: 0;
26
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
27
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
28
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
29
- -webkit-box-sizing: border-box;
30
- -moz-box-sizing: border-box;
31
- box-sizing: border-box;
32
- }
33
- /* 1st element in stack (behind image) */
34
- .foogallery-pile:before {
35
- top: -3px; z-index: -10;
36
- -webkit-transform: rotate(2deg);
37
- -moz-transform: rotate(2deg);
38
- transform: rotate(2deg);
39
- }
40
- /* 2nd element in stack (behind image) */
41
- .foogallery-pile:after {
42
- top: -2px; z-index: -20;
43
- -webkit-transform: rotate(-2deg);
44
- -moz-transform: rotate(-2deg);
45
- transform: rotate(-2deg);
46
- }
47
-
48
- .foogallery-pile img {
49
- height: 100%;
50
- }
51
-
52
- .foogallery-pile h3 {
53
- background: #fff;
54
- position: absolute;
55
- display: block;
56
- bottom: 0px;
57
- padding: 5px;
58
- width: 100%;
59
- box-sizing: border-box;
60
- margin: 0;
61
- opacity: 0.8;
62
- }
63
-
64
- .foogallery-pile h3 span {
65
- display: block;
66
- font-size: 0.6em;
67
- }
68
-
69
- .foogallery-gallery-select.selected {
70
- border-color: #1E8CBE;
71
- }
72
-
73
- .foogallery-gallery-select.selected::before {
74
- content: "\f147" !important;
75
- display: inline-block !important;
76
- font: normal 60px/70px 'dashicons';
77
- position: absolute;
78
- color: #FFF;
79
- top: 40%;
80
- left: 50%;
81
- margin-left: -30px;
82
- margin-top: -30px;
83
- -webkit-font-smoothing: antialiased;
84
- background: #1E8CBE;
85
- border-radius: 50%;
86
- width: 60px;
87
- height: 60px;
88
- z-index: 4;
89
- padding-top:0 !important;
90
- }
91
-
92
- .attachment-preview {
93
- position: relative;
94
- width: 150px;
95
- height: 150px;
96
- -webkit-box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.05);
97
- box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.05);
98
- background: #EEE;
99
- cursor: pointer;
100
- }
101
-
102
- .foogallery-shortcode {
103
- text-align: center;
104
- }
105
-
106
- .foogallery-shortcode input {
107
- cursor: pointer;
108
- text-align: center;
109
- padding: 10px;
110
- font-family: "courier new", courier;
111
- border: none;
112
- box-shadow: none;
113
- background: #efefef;
114
- }
115
-
116
- .wp-list-table .foogallery-shortcode {
117
- cursor: pointer;
118
- font-size: 1em;
119
- border: none;
120
- box-shadow: none;
121
- background: #efefef;
122
- font-family: "courier new", courier;
123
- }
124
-
125
- .foogallery-shortcode-message {
126
- font-style: italic;
127
- color: #2EA2CC !important;
128
- }
129
-
130
- .foogallery-album-gallery-list .attachment.placeholder {
131
- position: relative;
132
- z-index: 10;
133
- float: left;
134
- margin: 10px 15px 15px 10px !important;
135
- width: 164px;
136
- height: 164px;
137
- border: #1e8cbe 1px dashed;
138
- background: #eee;
139
- }
140
-
141
- .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper {
142
- opacity: 0.5;
143
- }
144
-
145
- .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper:hover .close {
146
- display: none;
147
- }
148
-
149
- .foogallery-album-gallery-list .attachment-preview:before {
150
- padding-top:0 !important;
151
- }
152
-
153
- .foogallery_template_field td {
154
- padding-bottom: 20px;
155
- }
156
-
157
- .foogallery_template_field th {
158
- vertical-align: top;
159
- text-align: left;
160
- padding-top: 0.3em;
161
- padding-right: 10px;
162
- }
163
-
164
- .foogallery_metabox_field-icon label {
165
- display:inline-block;
166
- margin-right:10px;
167
- border:solid 3px transparent;
168
- background:#aaa;
169
- border-radius: 3px;
170
- -moz-border-radius: 3px;
171
- -webkit-border-radius: 3px;
172
- padding:5px;
173
- line-height: 0;
174
- }
175
-
176
- .foogallery_metabox_field-icon input:checked + label {
177
- border:solid 3px #444;
178
- background: #888;
179
- }
180
-
181
- .foogallery_metabox_field-icon label:hover {
182
- border:solid 3px #444;
183
- }
184
-
185
- .foogallery_metabox_field-thumb_size label {
186
- vertical-align: baseline;
187
- }
188
-
189
- .foogallery_metabox_field-thumb_size input[type="number"] {
190
- margin-right: 10px;
191
- }
192
-
193
- .foogallery_template_field h4 {
194
- font-size: 1.2em;
195
- border-bottom: solid 1px #EEE;
196
- padding-bottom: 5px;
197
- margin: 0;
198
- }
199
-
200
- .foogallery_metabox_field-number input[type="number"] {
201
- width: 10em;
202
- }
203
-
204
- .foogallery_metabox_custom_css {
205
- width: 100%;
206
- height: 10em;
207
- }
208
-
209
- .foogallery_metabox_field-radio > input, .foogallery_metabox_field-radio > label {
210
- margin-bottom: 10px;
211
- display: inline-block;
212
- }
213
-
214
- .foogallery_template_field th {
215
- width: 180px;
216
- }
217
-
218
- .foogallery-help {
219
- position: relative;
220
- display: block;
221
- line-height: 19px;
222
- padding: 11px 15px 11px 40px;
223
- font-size: 14px;
224
- text-align: left;
225
- margin: 5px 0 20px 2px;
226
- background-color: #F4F4FF;
227
- border-left: 4px solid #1e8cbe;
228
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
229
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
230
- }
231
-
232
- .foogallery-help:before {
233
- content: "\f223";
234
- font: 400 30px/1 dashicons !important;
235
- speak: none;
236
- color: #1e8cbe;
237
- display: inline-block;
238
- -webkit-font-smoothing: antialiased;
239
- -moz-osx-font-smoothing: grayscale;
240
- vertical-align: bottom;
241
- position: absolute;
242
- left: 5px;
243
- height: 100%;
244
- margin-top: -15px;
245
- top: 50%;
246
- }
247
-
248
- .foogallery-album-error {
249
- padding: 11px 15px;
250
- font-size: 14px;
251
- text-align: left;
252
- border-left: 4px solid #dc3232;
253
- -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
254
- box-shadow: 1px 1px 1px 1px rgba(0,0,0,.1);
255
- }
256
-
257
- .foogallery-album-gallery-list .attachment-preview a.info {
258
- display: none;
259
- position: absolute;
260
- padding: 0;
261
- font-size: 20px;
262
- line-height: 20px;
263
- text-align: center;
264
- text-decoration: none;
265
- background-color: #444;
266
- border-top-right-radius: 50%;
267
- border-top-left-radius: 50%;
268
- border-bottom-right-radius: 50%;
269
- border-bottom-left-radius: 50%;
270
- color: #fff;
271
- top: 5px;
272
- left: 5px;
273
- }
274
-
275
- .foogallery-album-gallery-list .attachment-preview:hover a.info {
276
- display: block;
277
- }
278
-
279
- .foogallery-album-info-modal {
280
- display: none;
281
- top: 20%;
282
- bottom: 20%;
283
- left: 30%;
284
- right: 30%;
285
- }
286
-
287
- .foogallery-album-info-modal .media-frame-title {
288
- left:0;
289
- }
290
-
291
- .foogallery-album-info-modal .media-frame-title h1 {
292
- float: left;
293
- }
294
-
295
- .foogallery-album-info-modal .media-frame-title .spinner {
296
- float:left;
297
- margin: 15px 0;
298
- }
299
-
300
- .foogallery-album-info-modal .close {
301
- position: absolute;
302
- top: 20px;
303
- right: 20px;
304
- cursor: pointer;
305
- font-size: 20px;
306
- }
307
-
308
- .foogallery-album-info-modal .modal-content {
309
- position: absolute;
310
- top: 50px;
311
- left: 0;
312
- right: 0;
313
- bottom: 61px;
314
- height: auto;
315
- width: auto;
316
- margin: 0;
317
- overflow: auto;
318
- background: #fff;
319
- border-top: 1px solid #ddd;
320
- border-bottom: 1px solid #ddd;
321
- padding: 20px;
322
- min-width: 400px;
323
- }
324
-
325
- .foogallery-album-info-modal .gallery-details,
326
- .foogallery-album-info-modal .gallery-details table {
327
- width: 100%;
328
- }
329
-
330
- .foogallery-album-info-modal .gallery-details th {
331
- vertical-align: top;
332
- }
333
-
334
- .foogallery-album-info-modal .gallery-details th label {
335
- box-sizing: border-box;
336
- float: right;
337
- padding: 6px 0px;
338
- margin-right: 20px;
339
- font-weight: normal;
340
- }
341
-
342
- .foogallery-album-info-modal .gallery-details td input,
343
- .foogallery-album-info-modal .gallery-details td textarea,
344
- .foogallery-album-info-modal .gallery-details td select {
345
- width: 100%;
346
- }
347
-
348
- .foogallery-album-info-modal .gallery-details td select {
349
- line-height: inherit;
350
- padding: 6px 8px;
351
- height: inherit;
352
- }
353
-
354
- .foogallery-album-info-modal .gallery-details td .help {
355
- margin-top: 0;
356
- font-size: 0.8em;
357
- }
358
-
359
- .foogallery-album-info-modal .media-toolbar .spinner {
360
- margin-top: 20px;
361
- margin-right: 0;
362
- }
363
-
364
- .foogallery-album-info-modal .media-frame-toolbar {
365
- left: 0;
366
- }
367
-
368
- .foogallery-album-info-modal .media-frame-toolbar .media-toolbar-secondary {
369
- line-height: 60px;
370
- font-weight: bold;
371
- }
372
-
373
- .foogallery-album-info-modal-backdrop {
374
- display: none;
375
- }
376
-
377
- .spacer {
378
- display: inline-block;
379
- width:30px;
380
  }
1
+ .foogallery-pile {
2
+ position: relative;
3
+ z-index: 10;
4
+ float: left;
5
+ margin: 10px 15px 15px 10px !important;
6
+ }
7
+ /* Image styles */
8
+ .foogallery-pile .foogallery-gallery-select {
9
+ max-width: 100%;
10
+ vertical-align: bottom;
11
+ border: 8px solid #fff;
12
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
13
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
14
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
15
+ overflow: hidden;
16
+ }
17
+
18
+ /* Stacks creted by the use of generated content */
19
+ .foogallery-pile:before, .foogallery-pile:after {
20
+ content: "";
21
+ width: 100%;
22
+ height: 100%;
23
+ position: absolute;
24
+ border: 8px solid #fff;
25
+ left: 0;
26
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
27
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
28
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
29
+ -webkit-box-sizing: border-box;
30
+ -moz-box-sizing: border-box;
31
+ box-sizing: border-box;
32
+ }
33
+ /* 1st element in stack (behind image) */
34
+ .foogallery-pile:before {
35
+ top: -3px; z-index: -10;
36
+ -webkit-transform: rotate(2deg);
37
+ -moz-transform: rotate(2deg);
38
+ transform: rotate(2deg);
39
+ }
40
+ /* 2nd element in stack (behind image) */
41
+ .foogallery-pile:after {
42
+ top: -2px; z-index: -20;
43
+ -webkit-transform: rotate(-2deg);
44
+ -moz-transform: rotate(-2deg);
45
+ transform: rotate(-2deg);
46
+ }
47
+
48
+ .foogallery-pile img {
49
+ height: 100%;
50
+ }
51
+
52
+ .foogallery-pile h3 {
53
+ background: #fff;
54
+ position: absolute;
55
+ display: block;
56
+ bottom: 0px;
57
+ padding: 5px;
58
+ width: 100%;
59
+ box-sizing: border-box;
60
+ margin: 0;
61
+ opacity: 0.8;
62
+ }
63
+
64
+ .foogallery-pile h3 span {
65
+ display: block;
66
+ font-size: 0.6em;
67
+ }
68
+
69
+ .foogallery-gallery-select.selected {
70
+ border-color: #1E8CBE;
71
+ }
72
+
73
+ .foogallery-gallery-select.selected::before {
74
+ content: "\f147" !important;
75
+ display: inline-block !important;
76
+ font: normal 60px/70px 'dashicons';
77
+ position: absolute;
78
+ color: #FFF;
79
+ top: 40%;
80
+ left: 50%;
81
+ margin-left: -30px;
82
+ margin-top: -30px;
83
+ -webkit-font-smoothing: antialiased;
84
+ background: #1E8CBE;
85
+ border-radius: 50%;
86
+ width: 60px;
87
+ height: 60px;
88
+ z-index: 4;
89
+ padding-top:0 !important;
90
+ }
91
+
92
+ .attachment-preview {
93
+ position: relative;
94
+ width: 150px;
95
+ height: 150px;
96
+ -webkit-box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.05);
97
+ box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.05);
98
+ background: #EEE;
99
+ cursor: pointer;
100
+ }
101
+
102
+ .foogallery-shortcode {
103
+ text-align: center;
104
+ }
105
+
106
+ .foogallery-shortcode input {
107
+ cursor: pointer;
108
+ text-align: center;
109
+ padding: 10px;
110
+ font-family: "courier new", courier;
111
+ border: none;
112
+ box-shadow: none;
113
+ background: #efefef;
114
+ }
115
+
116
+ .wp-list-table .foogallery-shortcode {
117
+ cursor: pointer;
118
+ font-size: 1em;
119
+ border: none;
120
+ box-shadow: none;
121
+ background: #efefef;
122
+ font-family: "courier new", courier;
123
+ }
124
+
125
+ .foogallery-shortcode-message {
126
+ font-style: italic;
127
+ color: #2EA2CC !important;
128
+ }
129
+
130
+ .foogallery-album-gallery-list .attachment.placeholder {
131
+ position: relative;
132
+ z-index: 10;
133
+ float: left;
134
+ margin: 10px 15px 15px 10px !important;
135
+ width: 164px;
136
+ height: 164px;
137
+ border: #1e8cbe 1px dashed;
138
+ background: #eee;
139
+ }
140
+
141
+ .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper {
142
+ opacity: 0.5;
143
+ }
144
+
145
+ .foogallery-album-gallery-list .foogallery-pile.ui-sortable-helper:hover .close {
146
+ display: none;
147
+ }
148
+
149
+ .foogallery-album-gallery-list .attachment-preview:before {
150
+ padding-top:0 !important;
151
+ }
152
+
153
+ .foogallery_template_field td {
154
+ padding-bottom: 20px;
155
+ }
156
+
157
+ .foogallery_template_field th {
158
+ vertical-align: top;
159
+ text-align: left;
160
+ padding-top: 0.3em;
161
+ padding-right: 10px;
162
+ }
163
+
164
+ .foogallery_metabox_field-icon label {
165
+ display:inline-block;
166
+ margin-right:10px;
167
+ border:solid 3px transparent;
168
+ background:#aaa;
169
+ border-radius: 3px;
170
+ -moz-border-radius: 3px;
171
+ -webkit-border-radius: 3px;
172
+ padding:5px;
173
+ line-height: 0;
174
+ }
175
+
176
+ .foogallery_metabox_field-icon input:checked + label {
177
+ border:solid 3px #444;
178
+ background: #888;
179
+ }
180
+
181
+ .foogallery_metabox_field-icon label:hover {
182
+ border:solid 3px #444;
183
+ }
184
+
185
+ .foogallery_metabox_field-thumb_size label {
186
+ vertical-align: baseline;
187
+ }
188
+
189
+ .foogallery_metabox_field-thumb_size input[type="number"] {
190
+ margin-right: 10px;
191
+ }
192
+
193
+ .foogallery_template_field h4 {
194
+ font-size: 1.2em;
195
+ border-bottom: solid 1px #EEE;
196
+ padding-bottom: 5px;
197
+ margin: 0;
198
+ }
199
+
200
+ .foogallery_metabox_field-number input[type="number"] {
201
+ width: 10em;
202
+ }
203
+
204
+ .foogallery_metabox_custom_css {
205
+ width: 100%;
206
+ height: 10em;
207
+ }
208
+
209
+ .foogallery_metabox_field-radio > input, .foogallery_metabox_field-radio > label {
210
+ margin-bottom: 10px;
211
+ display: inline-block;
212
+ }
213
+
214
+ .foogallery_template_field th {
215
+ width: 180px;
216
+ }
217
+
218
+ .foogallery-help {
219
+ position: relative;
220
+ display: block;
221
+ line-height: 19px;
222
+ padding: 11px 15px 11px 40px;
223
+ font-size: 14px;
224
+ text-align: left;
225
+ margin: 5px 0 20px 2px;
226
+ background-color: #F4F4FF;
227
+ border-left: 4px solid #1e8cbe;
228
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
229
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
230
+ }
231
+
232
+ .foogallery-help:before {
233
+ content: "\f223";
234
+ font: 400 30px/1 dashicons !important;
235
+ speak: none;
236
+ color: #1e8cbe;
237
+ display: inline-block;
238
+ -webkit-font-smoothing: antialiased;
239
+ -moz-osx-font-smoothing: grayscale;
240
+ vertical-align: bottom;
241
+ position: absolute;
242
+ left: 5px;
243
+ height: 100%;
244
+ margin-top: -15px;
245
+ top: 50%;
246
+ }
247
+
248
+ .foogallery-album-error {
249
+ padding: 11px 15px;
250
+ font-size: 14px;
251
+ text-align: left;
252
+ border-left: 4px solid #dc3232;
253
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
254
+ box-shadow: 1px 1px 1px 1px rgba(0,0,0,.1);
255
+ }
256
+
257
+ .foogallery-album-gallery-list .attachment-preview a.info {
258
+ display: none;
259
+ position: absolute;
260
+ padding: 0;
261
+ font-size: 20px;
262
+ line-height: 20px;
263
+ text-align: center;
264
+ text-decoration: none;
265
+ background-color: #444;
266
+ border-top-right-radius: 50%;
267
+ border-top-left-radius: 50%;
268
+ border-bottom-right-radius: 50%;
269
+ border-bottom-left-radius: 50%;
270
+ color: #fff;
271
+ top: 5px;
272
+ left: 5px;
273
+ }
274
+
275
+ .foogallery-album-gallery-list .attachment-preview:hover a.info {
276
+ display: block;
277
+ }
278
+
279
+ .foogallery-album-info-modal {
280
+ display: none;
281
+ top: 20%;
282
+ bottom: 20%;
283
+ left: 30%;
284
+ right: 30%;
285
+ }
286
+
287
+ .foogallery-album-info-modal .media-frame-title {
288
+ left:0;
289
+ }
290
+
291
+ .foogallery-album-info-modal .media-frame-title h1 {
292
+ float: left;
293
+ }
294
+
295
+ .foogallery-album-info-modal .media-frame-title .spinner {
296
+ float:left;
297
+ margin: 15px 0;
298
+ }
299
+
300
+ .foogallery-album-info-modal .close {
301
+ position: absolute;
302
+ top: 20px;
303
+ right: 20px;
304
+ cursor: pointer;
305
+ font-size: 20px;
306
+ }
307
+
308
+ .foogallery-album-info-modal .modal-content {
309
+ position: absolute;
310
+ top: 50px;
311
+ left: 0;
312
+ right: 0;
313
+ bottom: 61px;
314
+ height: auto;
315
+ width: auto;
316
+ margin: 0;
317
+ overflow: auto;
318
+ background: #fff;
319
+ border-top: 1px solid #ddd;
320
+ border-bottom: 1px solid #ddd;
321
+ padding: 20px;
322
+ min-width: 400px;
323
+ }
324
+
325
+ .foogallery-album-info-modal .gallery-details,
326
+ .foogallery-album-info-modal .gallery-details table {
327
+ width: 100%;
328
+ }
329
+
330
+ .foogallery-album-info-modal .gallery-details th {
331
+ vertical-align: top;
332
+ }
333
+
334
+ .foogallery-album-info-modal .gallery-details th label {
335
+ box-sizing: border-box;
336
+ float: right;
337
+ padding: 6px 0px;
338
+ margin-right: 20px;
339
+ font-weight: normal;
340
+ }
341
+
342
+ .foogallery-album-info-modal .gallery-details td input,
343
+ .foogallery-album-info-modal .gallery-details td textarea,
344
+ .foogallery-album-info-modal .gallery-details td select {
345
+ width: 100%;
346
+ }
347
+
348
+ .foogallery-album-info-modal .gallery-details td select {
349
+ line-height: inherit;
350
+ padding: 6px 8px;
351
+ height: inherit;
352
+ }
353
+
354
+ .foogallery-album-info-modal .gallery-details td .help {
355
+ margin-top: 0;
356
+ font-size: 0.8em;
357
+ }
358
+
359
+ .foogallery-album-info-modal .media-toolbar .spinner {
360
+ margin-top: 20px;
361
+ margin-right: 0;
362
+ }
363
+
364
+ .foogallery-album-info-modal .media-frame-toolbar {
365
+ left: 0;
366
+ }
367
+
368
+ .foogallery-album-info-modal .media-frame-toolbar .media-toolbar-secondary {
369
+ line-height: 60px;
370
+ font-weight: bold;
371
+ }
372
+
373
+ .foogallery-album-info-modal-backdrop {
374
+ display: none;
375
+ }
376
+
377
+ .spacer {
378
+ display: inline-block;
379
+ width:30px;
380
  }
extensions/albums/css/album-default.css CHANGED
@@ -1,102 +1,103 @@
1
- .foogallery-album-gallery-list {
2
- list-style: none !important;
3
- padding: 0 !important;
4
- }
5
-
6
- .foogallery-album-gallery-list li {
7
- list-style-type: none !important;
8
- }
9
-
10
- .foogallery-album-gallery-list .foogallery-pile {
11
- position: relative;
12
- z-index: 10;
13
- float: left;
14
- margin: 10px 15px 15px 10px !important;
15
- }
16
-
17
- /* Stacks creted by the use of generated content */
18
- .foogallery-album-gallery-list .foogallery-pile:before,
19
- .foogallery-album-gallery-list .foogallery-pile:after {
20
- content: "";
21
- width: 100%;
22
- height: 100%;
23
- position: absolute;
24
- border: 8px solid #fff;
25
- left: 0;
26
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
27
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
28
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
29
- -webkit-box-sizing: border-box;
30
- -moz-box-sizing: border-box;
31
- box-sizing: border-box;
32
- }
33
- /* 1st element in stack (behind image) */
34
- .foogallery-album-gallery-list .foogallery-pile:before {
35
- top: -3px; z-index: -10;
36
- -webkit-transform: rotate(2deg);
37
- -moz-transform: rotate(2deg);
38
- transform: rotate(2deg);
39
- }
40
- /* 2nd element in stack (behind image) */
41
- .foogallery-album-gallery-list .foogallery-pile:after {
42
- top: -2px; z-index: -20;
43
- -webkit-transform: rotate(-2deg);
44
- -moz-transform: rotate(-2deg);
45
- transform: rotate(-2deg);
46
- }
47
-
48
- .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner {
49
- border: 8px solid #fff;
50
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
51
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
52
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
53
- overflow: hidden;
54
- line-height: 0;
55
- }
56
-
57
- .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner a {
58
- display: inline-block;
59
- }
60
-
61
- .foogallery-album-gallery-list .foogallery-pile img {
62
- }
63
-
64
- .foogallery-album-gallery-list .foogallery-pile h3 {
65
- background: #FFF;
66
- position: absolute;
67
- display: block;
68
- bottom: 0px;
69
- padding: 5px 5px 0 5px;
70
- width: 100%;
71
- box-sizing: border-box;
72
- margin: 0;
73
- opacity: 0.6;
74
- line-height: 1em;
75
- }
76
-
77
- .foogallery-album-gallery-list .foogallery-pile h3 span {
78
- display: block;
79
- font-size: 0.6em;
80
- }
81
-
82
- .foogallery-album-gallery-list .foogallery-pile a {
83
- position: relative;
84
- }
85
-
86
- .foogallery-album-gallery-list.alignment-left {
87
- text-align: left;
88
- }
89
-
90
- .foogallery-album-gallery-list.alignment-center {
91
- text-align: center;
92
- }
93
-
94
- .foogallery-album-gallery-list.alignment-right {
95
- text-align: right;
96
- }
97
-
98
- /* force no borders */
99
- .foogallery-album-gallery-list .foogallery-pile a,
100
- .foogallery-album-gallery-list .foogallery-pile a:hover {
101
- border: none !important;
 
102
  }
1
+ .foogallery-album-gallery-list {
2
+ list-style: none !important;
3
+ padding: 0 !important;
4
+ }
5
+
6
+ .foogallery-album-gallery-list li {
7
+ list-style-type: none !important;
8
+ display: inline-block;
9
+ }
10
+
11
+ .foogallery-album-gallery-list .foogallery-pile {
12
+ position: relative;
13
+ z-index: 10;
14
+ float: left;
15
+ margin: 10px 15px 15px 10px !important;
16
+ }
17
+
18
+ /* Stacks created by the use of generated content */
19
+ .foogallery-album-gallery-list .foogallery-pile:before,
20
+ .foogallery-album-gallery-list .foogallery-pile:after {
21
+ content: "";
22
+ width: 100%;
23
+ height: 100%;
24
+ position: absolute;
25
+ border: 8px solid #fff;
26
+ left: 0;
27
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
28
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
29
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
30
+ -webkit-box-sizing: border-box;
31
+ -moz-box-sizing: border-box;
32
+ box-sizing: border-box;
33
+ }
34
+ /* 1st element in stack (behind image) */
35
+ .foogallery-album-gallery-list .foogallery-pile:before {
36
+ top: -3px; z-index: -10;
37
+ -webkit-transform: rotate(2deg);
38
+ -moz-transform: rotate(2deg);
39
+ transform: rotate(2deg);
40
+ }
41
+ /* 2nd element in stack (behind image) */
42
+ .foogallery-album-gallery-list .foogallery-pile:after {
43
+ top: -2px; z-index: -20;
44
+ -webkit-transform: rotate(-2deg);
45
+ -moz-transform: rotate(-2deg);
46
+ transform: rotate(-2deg);
47
+ }
48
+
49
+ .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner {
50
+ border: 8px solid #fff;
51
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
52
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
53
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
54
+ overflow: hidden;
55
+ line-height: 0;
56
+ }
57
+
58
+ .foogallery-album-gallery-list .foogallery-pile .foogallery-pile-inner a {
59
+ display: inline-block;
60
+ }
61
+
62
+ .foogallery-album-gallery-list .foogallery-pile img {
63
+ }
64
+
65
+ .foogallery-album-gallery-list .foogallery-pile h3 {
66
+ background: #FFF;
67
+ position: absolute;
68
+ display: block;
69
+ bottom: 0px;
70
+ padding: 5px 5px 0 5px;
71
+ width: 100%;
72
+ box-sizing: border-box;
73
+ margin: 0;
74
+ opacity: 0.6;
75
+ line-height: 1em;
76
+ }
77
+
78
+ .foogallery-album-gallery-list .foogallery-pile h3 span {
79
+ display: block;
80
+ font-size: 0.6em;
81
+ }
82
+
83
+ .foogallery-album-gallery-list .foogallery-pile a {
84
+ position: relative;
85
+ }
86
+
87
+ .foogallery-album-gallery-list.alignment-left {
88
+ text-align: left;
89
+ }
90
+
91
+ .foogallery-album-gallery-list.alignment-center {
92
+ text-align: center;
93
+ }
94
+
95
+ .foogallery-album-gallery-list.alignment-right {
96
+ text-align: right;
97
+ }
98
+
99
+ /* force no borders */
100
+ .foogallery-album-gallery-list .foogallery-pile a,
101
+ .foogallery-album-gallery-list .foogallery-pile a:hover {
102
+ border: none !important;
103
  }
extensions/albums/css/album-stack.css CHANGED
@@ -1,290 +1,290 @@
1
- .tp-grid {
2
- list-style-type: none;
3
- position: relative;
4
- display: block;
5
- }
6
-
7
- .tp-grid li {
8
- position: absolute;
9
- cursor: pointer;
10
- border: 10px solid #fff;
11
- box-shadow: 0 2px 3px rgba(0,0,0,0.2);
12
- display: none;
13
- overflow: hidden;
14
- -webkit-backface-visibility: hidden;
15
- -moz-backface-visibility: hidden;
16
- -o-backface-visibility: hidden;
17
- -ms-backface-visibility: hidden;
18
- backface-visibility: hidden;
19
- }
20
-
21
- .no-js .tp-grid li {
22
- position: relative;
23
- display: inline-block;
24
- }
25
-
26
- .tp-grid li a {
27
- display: block;
28
- outline: none;
29
- }
30
-
31
- .tp-grid li img {
32
- display: block;
33
- border: none;
34
- }
35
-
36
- .tp-info,
37
- .tp-title {
38
- position: absolute;
39
- background: #fff;
40
- line-height: 20px;
41
- color: #333;
42
- top: 40%;
43
- width: 75%;
44
- padding: 10px;
45
- font-weight: 700;
46
- text-align: right;
47
- left: -100%;
48
- box-shadow:
49
- 1px 1px 1px rgba(0,0,0,0.1),
50
- 5px 0 5px -3px rgba(0,0,0,0.4),
51
- inset 0 0 5px rgba(0,0,0,0.04);
52
- }
53
-
54
- .tp-title-cover {
55
- position: absolute;
56
- top: 0;
57
- bottom: 0;
58
- left: 0;
59
- right: 0;
60
- }
61
-
62
- .tp-open .tp-title-cover {
63
- display: none;
64
- }
65
-
66
- .touch .tp-info {
67
- left: 0px;
68
- }
69
-
70
- .no-touch .tp-info {
71
- -webkit-transition: all 0.3s ease-in-out;
72
- -moz-transition: all 0.3s ease-in-out;
73
- -o-transition: all 0.3s ease-in-out;
74
- -ms-transition: all 0.3s ease-in-out;
75
- transition: all 0.3s ease-in-out;
76
- }
77
-
78
- .no-touch .tp-grid li:hover .tp-info {
79
- -webkit-transition-delay: 150ms;
80
- -moz-transition-delay: 150ms;
81
- -o-transition-delay: 150ms;
82
- -ms-transition-delay: 150ms;
83
- transition-delay: 150ms;
84
- }
85
-
86
- .no-touch .tp-open li:hover .tp-info {
87
- left: 0px;
88
- }
89
-
90
- .tp-title {
91
- padding: 10px 35px 10px 10px;
92
- left: 0px;
93
- }
94
-
95
- .tp-title span:nth-child(2){
96
- color: #aaa;
97
- padding: 0 5px;
98
- background: #F7F7F7;
99
- right: 0px;
100
- height: 100%;
101
- line-height: 40px;
102
- top: 0px;
103
- position: absolute;
104
- display: block;
105
- }
106
-
107
- .foogallery-stack-album * {
108
- box-sizing: border-box;
109
- }
110
-
111
- .foogallery-stack-album .topbar {
112
- position: relative;
113
- padding: 10px 0;
114
- margin: 0 0 20px;
115
- box-shadow: 0 1px 0 #aaa, 0 -1px 0 #aaa;
116
- }
117
-
118
- .foogallery-stack-album .back {
119
- width: 40px;
120
- height: 40px;
121
- position: absolute;
122
- left: 50%;
123
- top: 50%;
124
- margin: -20px 0 0 -20px;
125
- border-radius: 50%;
126
- text-align: center;
127
- line-height: 38px;
128
- color: #999;
129
- background: #ddd;
130
- background: rgba(200,200,200,0.5);
131
- cursor: pointer;
132
- display: none;
133
- -webkit-touch-callout: none;
134
- -webkit-user-select: none;
135
- -khtml-user-select: none;
136
- -moz-user-select: none;
137
- -ms-user-select: none;
138
- user-select: none;
139
- }
140
-
141
- .no-touch .foogallery-stack-album .back:hover {
142
- background: #666;
143
- background: rgba(100,100,100,0.5);
144
- color: #fff;
145
- }
146
-
147
- .foogallery-stack-album .topbar h2,
148
- .foogallery-stack-album .topbar h3 {
149
- display: inline-block;
150
- width: 49%;
151
- margin: 0;
152
- }
153
-
154
- .foogallery-stack-album .topbar h2 {
155
- padding-right: 20px;
156
- }
157
-
158
- .foogallery-stack-album .topbar h3 {
159
- text-align: right;
160
- padding-left: 20px;
161
- }
162
-
163
- /* Loader */
164
-
165
- .foogallery-stack-album .loader {
166
- left: 50%;
167
- position: absolute;
168
- margin-left: -120px;
169
- }
170
-
171
- .foogallery-stack-album .loader i {
172
- display: inline-block;
173
- width: 40px;
174
- height: 40px;
175
- -webkit-animation: loading 1s linear infinite forwards;
176
- -moz-animation: loading 1s linear infinite forwards;
177
- -o-animation: loading 1s linear infinite forwards;
178
- -ms-animation: loading 1s linear infinite forwards;
179
- animation: loading 1s linear infinite forwards;
180
- }
181
-
182
- .foogallery-stack-album .loader i:nth-child(2){
183
- -webkit-animation-delay: 0.1s;
184
- -moz-animation-delay: 0.1s;
185
- -o-animation-delay: 0.1s;
186
- -ms-animation-delay: 0.1s;
187
- animation-delay: 0.1s;
188
- }
189
-
190
- .foogallery-stack-album .loader i:nth-child(3){
191
- -webkit-animation-delay: 0.2s;
192
- -moz-animation-delay: 0.2s;
193
- -o-animation-delay: 0.2s;
194
- -ms-animation-delay: 0.2s;
195
- animation-delay: 0.2s;
196
- }
197
-
198
- .foogallery-stack-album .loader i:nth-child(4){
199
- -webkit-animation-delay: 0.3s;
200
- -moz-animation-delay: 0.3s;
201
- -o-animation-delay: 0.3s;
202
- -ms-animation-delay: 0.3s;
203
- animation-delay: 0.3s;
204
- }
205
-
206
- .foogallery-stack-album .loader i:nth-child(5){
207
- -webkit-animation-delay: 0.4s;
208
- -moz-animation-delay: 0.4s;
209
- -o-animation-delay: 0.4s;
210
- -ms-animation-delay: 0.4s;
211
- animation-delay: 0.4s;
212
- }
213
-
214
- .foogallery-stack-album .loader i:nth-child(6){
215
- -webkit-animation-delay: 0.5s;
216
- -moz-animation-delay: 0.5s;
217
- -o-animation-delay: 0.5s;
218
- -ms-animation-delay: 0.5s;
219
- animation-delay: 0.5s;
220
- }
221
-
222
- @-webkit-keyframes loading{
223
- 0%{
224
- opacity: 0;
225
- background-color: rgba(255,255,255,0.9);
226
- }
227
-
228
- 100%{
229
- opacity: 1;
230
- -webkit-transform: scale(0.25) rotate(75deg);
231
- background-color: rgba(155,155,155,0.9);
232
- }
233
- }
234
-
235
- @-moz-keyframes loading{
236
- 0%{
237
- opacity: 0;
238
- background-color: rgba(255,255,255,0.9);
239
- }
240
-
241
- 100%{
242
- opacity: 1;
243
- -moz-transform: scale(0.25) rotate(75deg);
244
- background-color: rgba(155,155,155,0.9);
245
- }
246
- }
247
-
248
- @-o-keyframes loading{
249
- 0%{
250
- opacity: 0;
251
- background-color: rgba(255,255,255,0.9);
252
- }
253
-
254
- 100%{
255
- opacity: 1;
256
- -o-transform: scale(0.25) rotate(75deg);
257
- background-color: rgba(155,155,155,0.9);
258
- }
259
- }
260
-
261
- @-ms-keyframes loading{
262
- 0%{
263
- opacity: 0;
264
- background-color: rgba(255,255,255,0.9);
265
- }
266
-
267
- 100%{
268
- opacity: 1;
269
- -ms-transform: scale(0.25) rotate(75deg);
270
- background-color: rgba(155,155,155,0.9);
271
- }
272
- }
273
-
274
- @keyframes loading{
275
- 0%{
276
- opacity: 0;
277
- background-color: rgba(255,255,255,0.9);
278
- }
279
-
280
- 100%{
281
- opacity: 1;
282
- transform: scale(0.25) rotate(75deg);
283
- background-color: rgba(155,155,155,0.9);
284
- }
285
- }
286
-
287
- @media screen and (max-width: 680px){
288
- .foogallery-stack-album .topbar h2, .foogallery-stack-album .topbar h3 { text-align: left; padding: 0; display: block;}
289
- .foogallery-stack-album .back { left: auto; right: 0px; margin-left: 0px;}
290
  }
1
+ .tp-grid {
2
+ list-style-type: none;
3
+ position: relative;
4
+ display: block;
5
+ }
6
+
7
+ .tp-grid li {
8
+ position: absolute;
9
+ cursor: pointer;
10
+ border: 10px solid #fff;
11
+ box-shadow: 0 2px 3px rgba(0,0,0,0.2);
12
+ display: none;
13
+ overflow: hidden;
14
+ -webkit-backface-visibility: hidden;
15
+ -moz-backface-visibility: hidden;
16
+ -o-backface-visibility: hidden;
17
+ -ms-backface-visibility: hidden;
18
+ backface-visibility: hidden;
19
+ }
20
+
21
+ .no-js .tp-grid li {
22
+ position: relative;
23
+ display: inline-block;
24
+ }
25
+
26
+ .tp-grid li a {
27
+ display: block;
28
+ outline: none;
29
+ }
30
+
31
+ .tp-grid li img {
32
+ display: block;
33
+ border: none;
34
+ }
35
+
36
+ .tp-info,
37
+ .tp-title {
38
+ position: absolute;
39
+ background: #fff;
40
+ line-height: 20px;
41
+ color: #333;
42
+ top: 40%;
43
+ width: 75%;
44
+ padding: 10px;
45
+ font-weight: 700;
46
+ text-align: right;
47
+ left: -100%;
48
+ box-shadow:
49
+ 1px 1px 1px rgba(0,0,0,0.1),
50
+ 5px 0 5px -3px rgba(0,0,0,0.4),
51
+ inset 0 0 5px rgba(0,0,0,0.04);
52
+ }
53
+
54
+ .tp-title-cover {
55
+ position: absolute;
56
+ top: 0;
57
+ bottom: 0;
58
+ left: 0;
59
+ right: 0;
60
+ }
61
+
62
+ .tp-open .tp-title-cover {
63
+ display: none;
64
+ }
65
+
66
+ .touch .tp-info {
67
+ left: 0px;
68
+ }
69
+
70
+ .no-touch .tp-info {
71
+ -webkit-transition: all 0.3s ease-in-out;
72
+ -moz-transition: all 0.3s ease-in-out;
73
+ -o-transition: all 0.3s ease-in-out;
74
+ -ms-transition: all 0.3s ease-in-out;
75
+ transition: all 0.3s ease-in-out;
76
+ }
77
+
78
+ .no-touch .tp-grid li:hover .tp-info {
79
+ -webkit-transition-delay: 150ms;
80
+ -moz-transition-delay: 150ms;
81
+ -o-transition-delay: 150ms;
82
+ -ms-transition-delay: 150ms;
83
+ transition-delay: 150ms;
84
+ }
85
+
86
+ .no-touch .tp-open li:hover .tp-info {
87
+ left: 0px;
88
+ }
89
+
90
+ .tp-title {
91
+ padding: 10px 35px 10px 10px;
92
+ left: 0px;
93
+ }
94
+
95
+ .tp-title span:nth-child(2){
96
+ color: #aaa;
97
+ padding: 0 5px;
98
+ background: #F7F7F7;
99
+ right: 0px;
100
+ height: 100%;
101
+ line-height: 40px;
102
+ top: 0px;
103
+ position: absolute;
104
+ display: block;
105
+ }
106
+
107
+ .foogallery-stack-album * {
108
+ box-sizing: border-box;
109
+ }
110
+
111
+ .foogallery-stack-album .topbar {
112
+ position: relative;
113
+ padding: 10px 0;
114
+ margin: 0 0 20px;
115
+ box-shadow: 0 1px 0 #aaa, 0 -1px 0 #aaa;
116
+ }
117
+
118
+ .foogallery-stack-album .back {
119
+ width: 40px;
120
+ height: 40px;
121
+ position: absolute;
122
+ left: 50%;
123
+ top: 50%;
124
+ margin: -20px 0 0 -20px;
125
+ border-radius: 50%;
126
+ text-align: center;
127
+ line-height: 38px;
128
+ color: #999;
129
+ background: #ddd;
130
+ background: rgba(200,200,200,0.5);
131
+ cursor: pointer;
132
+ display: none;
133
+ -webkit-touch-callout: none;
134
+ -webkit-user-select: none;
135
+ -khtml-user-select: none;
136
+ -moz-user-select: none;
137
+ -ms-user-select: none;
138
+ user-select: none;
139
+ }
140
+
141
+ .no-touch .foogallery-stack-album .back:hover {
142
+ background: #666;
143
+ background: rgba(100,100,100,0.5);
144
+ color: #fff;
145
+ }
146
+
147
+ .foogallery-stack-album .topbar h2,
148
+ .foogallery-stack-album .topbar h3 {
149
+ display: inline-block;
150
+ width: 49%;
151
+ margin: 0;
152
+ }
153
+
154
+ .foogallery-stack-album .topbar h2 {
155
+ padding-right: 20px;
156
+ }
157
+
158
+ .foogallery-stack-album .topbar h3 {
159
+ text-align: right;
160
+ padding-left: 20px;
161
+ }
162
+
163
+ /* Loader */
164
+
165
+ .foogallery-stack-album .loader {
166
+ left: 50%;
167
+ position: absolute;
168
+ margin-left: -120px;
169
+ }
170
+
171
+ .foogallery-stack-album .loader i {
172
+ display: inline-block;
173
+ width: 40px;
174
+ height: 40px;
175
+ -webkit-animation: loading 1s linear infinite forwards;
176
+ -moz-animation: loading 1s linear infinite forwards;
177
+ -o-animation: loading 1s linear infinite forwards;
178
+ -ms-animation: loading 1s linear infinite forwards;
179
+ animation: loading 1s linear infinite forwards;
180
+ }
181
+
182
+ .foogallery-stack-album .loader i:nth-child(2){
183
+ -webkit-animation-delay: 0.1s;
184
+ -moz-animation-delay: 0.1s;
185
+ -o-animation-delay: 0.1s;
186
+ -ms-animation-delay: 0.1s;
187
+ animation-delay: 0.1s;
188
+ }
189
+
190
+ .foogallery-stack-album .loader i:nth-child(3){
191
+ -webkit-animation-delay: 0.2s;
192
+ -moz-animation-delay: 0.2s;
193
+ -o-animation-delay: 0.2s;
194
+ -ms-animation-delay: 0.2s;
195
+ animation-delay: 0.2s;
196
+ }
197
+
198
+ .foogallery-stack-album .loader i:nth-child(4){
199
+ -webkit-animation-delay: 0.3s;
200
+ -moz-animation-delay: 0.3s;
201
+ -o-animation-delay: 0.3s;
202
+ -ms-animation-delay: 0.3s;
203
+ animation-delay: 0.3s;
204
+ }
205
+
206
+ .foogallery-stack-album .loader i:nth-child(5){
207
+ -webkit-animation-delay: 0.4s;
208
+ -moz-animation-delay: 0.4s;
209
+ -o-animation-delay: 0.4s;
210
+ -ms-animation-delay: 0.4s;
211
+ animation-delay: 0.4s;
212
+ }
213
+
214
+ .foogallery-stack-album .loader i:nth-child(6){
215
+ -webkit-animation-delay: 0.5s;
216
+ -moz-animation-delay: 0.5s;
217
+ -o-animation-delay: 0.5s;
218
+ -ms-animation-delay: 0.5s;
219
+ animation-delay: 0.5s;
220
+ }
221
+
222
+ @-webkit-keyframes loading{
223
+ 0%{
224
+ opacity: 0;
225
+ background-color: rgba(255,255,255,0.9);
226
+ }
227
+
228
+ 100%{
229
+ opacity: 1;
230
+ -webkit-transform: scale(0.25) rotate(75deg);
231
+ background-color: rgba(155,155,155,0.9);
232
+ }
233
+ }
234
+
235
+ @-moz-keyframes loading{
236
+ 0%{
237
+ opacity: 0;
238
+ background-color: rgba(255,255,255,0.9);
239
+ }
240
+
241
+ 100%{
242
+ opacity: 1;
243
+ -moz-transform: scale(0.25) rotate(75deg);
244
+ background-color: rgba(155,155,155,0.9);
245
+ }
246
+ }
247
+
248
+ @-o-keyframes loading{
249
+ 0%{
250
+ opacity: 0;
251
+ background-color: rgba(255,255,255,0.9);
252
+ }
253
+
254
+ 100%{
255
+ opacity: 1;
256
+ -o-transform: scale(0.25) rotate(75deg);
257
+ background-color: rgba(155,155,155,0.9);
258
+ }
259
+ }
260
+
261
+ @-ms-keyframes loading{
262
+ 0%{
263
+ opacity: 0;
264
+ background-color: rgba(255,255,255,0.9);
265
+ }
266
+
267
+ 100%{
268
+ opacity: 1;
269
+ -ms-transform: scale(0.25) rotate(75deg);
270
+ background-color: rgba(155,155,155,0.9);
271
+ }
272
+ }
273
+
274
+ @keyframes loading{
275
+ 0%{
276
+ opacity: 0;
277
+ background-color: rgba(255,255,255,0.9);
278
+ }
279
+
280
+ 100%{
281
+ opacity: 1;
282
+ transform: scale(0.25) rotate(75deg);
283
+ background-color: rgba(155,155,155,0.9);
284
+ }
285
+ }
286
+
287
+ @media screen and (max-width: 680px){
288
+ .foogallery-stack-album .topbar h2, .foogallery-stack-album .topbar h3 { text-align: left; padding: 0; display: block;}
289
+ .foogallery-stack-album .back { left: auto; right: 0px; margin-left: 0px;}
290
  }
extensions/albums/functions.php CHANGED
@@ -1,361 +1,361 @@
1
- <?php
2
-
3
- /**
4
- * Builds up a FooGallery album shortcode
5
- *
6
- * @param $album_id
7
- *
8
- * @return string
9
- */
10
- function foogallery_build_album_shortcode( $album_id ) {
11
- return '[' . foogallery_album_shortcode_tag() . ' id="' . $album_id . '"]';
12
- }
13
-
14
- /**
15
- * Returns the album shortcode tag
16
- *
17
- * @return string
18
- */
19
- function foogallery_album_shortcode_tag() {
20
- return apply_filters( 'foogallery_album_shortcode_tag', FOOGALLERY_CPT_ALBUM );
21
- }
22
-
23
- /**
24
- * Return all the album templates used within FooGallery
25
- *
26
- * @return array
27
- */
28
- function foogallery_album_templates() {
29
- $album_templates[] = array(
30
- 'slug' => 'default',
31
- 'name' => __( 'Responsive Album Layout', 'foogallery' ),
32
- 'fields' => array(
33
- array(
34
- 'id' => 'thumbnail_dimensions',
35
- 'title' => __( 'Thumbnail Size', 'foogallery' ),
36
- 'desc' => __( 'Choose the size of your gallery thumbnails.', 'foogallery' ),
37
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
38
- 'type' => 'thumb_size',
39
- 'default' => array(
40
- 'width' => get_option( 'thumbnail_size_w' ),
41
- 'height' => get_option( 'thumbnail_size_h' ),
42
- 'crop' => true,
43
- ),
44
- ),
45
- array(
46
- 'id' => 'title_bg',
47
- 'title' => __( 'Title Background Color', 'foogallery' ),
48
- 'desc' => __( 'The color of the title that overlays the album thumbnails', 'foogallery' ),
49
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
50
- 'type' => 'colorpicker',
51
- 'default' => '#fff'
52
- ),
53
- array(
54
- 'id' => 'title_font_color',
55
- 'title' => __( 'Title Text Color', 'foogallery' ),
56
- 'desc' => __( 'The color of the title text that overlays the album thumbnails', 'foogallery' ),
57
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
58
- 'type' => 'colorpicker',
59
- 'default' => '#000000'
60
- ),
61
- array(
62
- 'id' => 'alignment',
63
- 'title' => __( 'Alignment', 'foogallery' ),
64
- 'desc' => __( 'The horizontal alignment of the gallery thumbnails inside the album.', 'foogallery' ),
65
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
66
- 'default' => 'alignment-left',
67
- 'type' => 'select',
68
- 'choices' => array(
69
- 'alignment-left' => __( 'Left', 'foogallery' ),
70
- 'alignment-center' => __( 'Center', 'foogallery' ),
71
- 'alignment-right' => __( 'Right', 'foogallery' ),
72
- )
73
- ),
74
- array(
75
- 'id' => 'gallery_link',
76
- 'title' => __( 'Gallery Link', 'foogallery' ),
77
- 'section' => __( 'URL Settings', 'foogallery' ),
78
- 'default' => '',
79
- 'type' => 'radio',
80
- 'spacer' => '<span class="spacer"></span>',
81
- 'choices' => array(
82
- '' => __('Default', 'foogallery'),
83
- 'custom_url' => __('Custom URL', 'foogallery')
84
- ),
85
- 'desc' => __( 'You can choose to link each gallery to the default embedded gallery, or you can choose to link to the gallery custom URL (if set).', 'foogallery' ),
86
- ),
87
- array(
88
- 'id' => 'gallery_link_format',
89
- 'title' => __( 'Gallery Link Format', 'foogallery' ),
90
- 'desc' => __( 'The format of the URL for each individual gallery in the album.', 'foogallery' ),
91
- 'section' => __( 'URL Settings', 'foogallery' ),
92
- 'type' => 'radio',
93
- 'choices' => array(
94
- 'default' => __('Pretty, e.g. ', 'foogallery') . '<code>/page-with-album/' . foogallery_album_gallery_url_slug() . '/some-gallery</code>',
95
- 'querystring' => __('Querystring e.g. ', 'foogallery') . '<code>/page-with-album?' . foogallery_album_gallery_url_slug() . '=some-gallery</code>'
96
- ),
97
- 'default' => foogallery_determine_best_link_format_default()
98
- ),
99
- array(
100
- 'id' => 'url_help',
101
- 'title' => __( 'Please Note', 'foogallery' ),
102
- 'section' => __( 'URL Settings', 'foogallery' ),
103
- 'type' => 'help',
104
- 'help' => true,
105
- 'desc' => __( 'If you are getting 404\'s when clicking on the album galleries, then change to the querystring format. To force your rewrite rules to flush, simply deactivate and activate the albums extension again.', 'foogallery' ),
106
- ),
107
- array(
108
- 'id' => 'album_hash',
109
- 'title' => __( 'Remember Scroll Position', 'foogallery' ),
110
- 'desc' => __( 'When a gallery is loaded in your album, the page is refreshed which means the scroll position will be lost .', 'foogallery' ),
111
- 'section' => __( 'URL Settings', 'foogallery' ),
112
- 'type' => 'radio',
113
- 'choices' => array(
114
- 'none' => __('Don\'t Remember', 'foogallery'),
115
- 'remember' => __('Remember Scroll Position', 'foogallery')
116
- ),
117
- 'default' => 'none'
118
- )
119
- )
120
- );
121
-
122
- $album_templates[] = array(
123
- 'slug' => 'stack',
124
- 'name' => __( 'All-In-One Stack Album', 'foogallery' ),
125
- 'fields' => array(
126
- array(
127
- 'id' => 'lightbox',
128
- 'title' => __( 'Lightbox', 'foogallery' ),
129
- 'desc' => __( 'Choose which lightbox you want to use to display images.', 'foogallery' ),
130
- 'type' => 'lightbox',
131
- ),
132
-
133
- array(
134
- 'id' => 'thumbnail_dimensions',
135
- 'title' => __( 'Thumbnail Size', 'foogallery' ),
136
- 'desc' => __( 'Choose the size of your image stack thumbnails.', 'foogallery' ),
137
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
138
- 'type' => 'thumb_size',
139
- 'default' => array(
140
- 'width' => get_option( 'thumbnail_size_w' ),
141
- 'height' => get_option( 'thumbnail_size_h' ),
142
- 'crop' => true,
143
- ),
144
- ),
145
-
146
- array(
147
- 'id' => 'random_angle',
148
- 'title' => __( 'Thumbnail Rotation', 'foogallery' ),
149
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
150
- 'desc' => __( 'Choose how thumbnails in each gallery are shown when clicking an image stack.', 'foogallery' ),
151
- 'type' => 'radio',
152
- 'default' => 'false',
153
- 'choices' => array(
154
- 'false' => __( 'Normal', 'foogallery' ),
155
- 'true' => __( 'Random Angles', 'foogallery' )
156
- )
157
- ),
158
-
159
- array(
160
- 'id' => 'gutter',
161
- 'title' => __( 'Thumbnail Gutter', 'foogallery' ),
162
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
163
- 'desc' => __( 'The spacing between each image stack.', 'foogallery' ),
164
- 'type' => 'number',
165
- 'default' => 50
166
- ),
167
-
168
- array(
169
- 'id' => 'delay',
170
- 'title' => __( 'Expand Delay', 'foogallery' ),
171
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
172
- 'desc' => __( 'The delay between expanding each image on a image stack.', 'foogallery' ),
173
- 'type' => 'number',
174
- 'default' => 0
175
- ),
176
-
177
- array(
178
- 'id' => 'pile_angles',
179
- 'title' => __( 'Image Stack Angles', 'foogallery' ),
180
- 'section' => __( 'Thumbnail Settings', 'foogallery' ),
181
- 'desc' => __( 'The angle of the images behind the thumbnail in each image stack.', 'foogallery' ),
182
- 'type' => 'radio',
183
- 'default' => '1',
184
- 'choices' => array(
185
- '1' => __( 'Low', 'foogallery' ),
186
- '2' => __( 'Normal', 'foogallery' ),
187
- '3' => __( 'More Than Normal', 'foogallery' ),
188
- '5' => __( 'High', 'foogallery' ),
189
- )
190
- )
191
- )
192
- );
193
-
194
- return apply_filters( 'foogallery_album_templates', $album_templates );
195
- }
196
-
197
- function foogallery_determine_best_link_format_default() {
198
- global $wp_rewrite;
199
- if ( '' === $wp_rewrite->permalink_structure ) {
200
- //we are using ?page_id
201
- return 'querystring';
202
- }
203
-
204
- //we are using permalinks
205
- return 'default';
206
- }
207
-
208
- /**
209
- * Returns the default album template
210
- *
211
- * @return string
212
- */
213
- function foogallery_default_album_template() {
214
- return foogallery_get_setting( 'album_template' );
215
- }
216
-
217
- /**
218
- * Returns the gallery link url for an album
219
- *
220
- * @param $album FooGalleryAlbum
221
- * @param $gallery FooGallery
222
- *
223
- * @return string
224
- */
225
- function foogallery_album_build_gallery_link( $album, $gallery ) {
226
- //first check if we want to use custom URL's
227
- $gallery_link = $album->get_meta( 'default_gallery_link', '' );
228
-
229
- if ( 'custom_url' === $gallery_link ) {
230
- //check if the gallery has a custom url, and if so, then use it
231
- $url = get_post_meta( $gallery->ID, 'custom_url', true );
232
- }
233
-
234
- if ( empty( $url ) ) {
235
- $slug = foogallery_album_gallery_url_slug();
236
- $format = $album->get_meta( 'default_gallery_link_format', 'default' );
237
-
238
- if ( 'default' === $format && 'default' === foogallery_determine_best_link_format_default() ) {
239
- $url = untrailingslashit( trailingslashit( get_permalink() ) . $slug . '/' . $gallery->slug );
240
- } else {
241
- $url = add_query_arg( $slug, $gallery->slug );
242
- }
243
-
244
- $use_hash = $album->get_meta( 'default_album_hash', 'remember' );
245
-
246
- if ( 'remember' === $use_hash ) {
247
- //add the album hash if required
248
- $url .= '#' . $album->slug;
249
- }
250
- }
251
-
252
- return apply_filters( 'foogallery_album_build_gallery_link', $url );
253
- }
254
-
255
- /**
256
- * Returns the gallery slug used when generating gallery URL's
257
- *
258
- * @return string
259
- */
260
- function foogallery_album_gallery_url_slug() {
261
- $slug = foogallery_get_setting( 'album_gallery_slug', 'gallery' );
262
- return apply_filters( 'foogallery_album_gallery_url_slug', $slug );
263
- }
264
-
265
- /**
266
- * Returns the gallery link target for an album
267
- *
268
- * @param $album FooGalleryAlbum
269
- * @param $gallery FooGallery
270
- *
271
- * @return string
272
- */
273
- function foogallery_album_build_gallery_link_target( $album, $gallery ) {
274
- //first check if we want to use custom URL's
275
- $gallery_link = $album->get_meta( 'default_gallery_link', '' );
276
-
277
- if ( 'custom_url' === $gallery_link ) {
278
- //check if the gallery has a custom target, and if so, then use it
279
- $target = get_post_meta( $gallery->ID, 'custom_target', true );
280
- }
281
-
282
- if ( empty( $target ) ) {
283
- $target = '_self';
284
- }
285
-
286
- return apply_filters( 'foogallery_album_build_gallery_link_target', $target );
287
- }
288
-
289
- function foogallery_album_get_current_gallery() {
290
- $slug = foogallery_album_gallery_url_slug();
291
-
292
- $gallery = get_query_var( $slug );
293
-
294
- if ( empty( $gallery ) ) {
295
- $gallery = safe_get_from_request( $slug );
296
- }
297
-
298
- return apply_filters( 'foogallery_album_get_current_gallery', $gallery );
299
- }
300
-
301
- function foogallery_album_remove_gallery_from_link() {
302
- $gallery = foogallery_album_get_current_gallery();
303
- $slug = foogallery_album_gallery_url_slug();
304
-
305
- $url = untrailingslashit( remove_query_arg( $slug ) );
306
-
307
- return str_replace( $slug . '/' . $gallery, '', $url);
308
- }
309
-
310
- /**
311
- * Get a foogallery album template setting for the current foogallery that is being output to the frontend
312
- * @param string $key
313
- * @param string $default
314
- *
315
- * @return bool
316
- */
317
- function foogallery_album_template_setting( $key, $default = '' ) {
318
- global $current_foogallery_album;
319
- global $current_foogallery_album_arguments;
320
- global $current_foogallery_album_template;
321
-
322
- $settings_key = "{$current_foogallery_album_template}_{$key}";
323
-
324
- if ( $current_foogallery_album_arguments && array_key_exists( $key, $current_foogallery_album_arguments ) ) {
325
- //try to get the value from the arguments
326
- $value = $current_foogallery_album_arguments[ $key ];
327
-
328
- } else if ( $current_foogallery_album->settings && array_key_exists( $settings_key, $current_foogallery_album->settings ) ) {
329
- //then get the value out of the saved gallery settings
330
- $value = $current_foogallery_album->settings[ $settings_key ];
331
- } else {
332
- //otherwise set it to the default
333
- $value = $default;
334
- }
335
-
336
- $value = apply_filters( 'foogallery_album_template_setting-' . $key, $value );
337
-
338
- return $value;
339
- }
340
-
341
- /**
342
- * uninstall all albums and setting for albums
343
- */
344
- function foogallery_album_uninstall() {
345
- if ( !current_user_can( 'install_plugins' ) ) exit;
346
-
347
- //delete all albums posts
348
- global $wpdb;
349
- $query = "SELECT p.ID FROM {$wpdb->posts} AS p WHERE p.post_type IN (%s)";
350
- $gallery_post_ids = $wpdb->get_col( $wpdb->prepare( $query, FOOGALLERY_CPT_ALBUM ) );
351
-
352
- if ( !empty( $gallery_post_ids ) ) {
353
- $deleted = 0;
354
- foreach ( $gallery_post_ids as $post_id ) {
355
- $del = wp_delete_post( $post_id );
356
- if ( false !== $del ) {
357
- ++$deleted;
358
- }
359
- }
360
- }
361
  }
1
+ <?php
2
+
3
+ /**
4
+ * Builds up a FooGallery album shortcode
5
+ *
6
+ * @param $album_id
7
+ *
8
+ * @return string
9
+ */
10
+ function foogallery_build_album_shortcode( $album_id ) {
11
+ return '[' . foogallery_album_shortcode_tag() . ' id="' . $album_id . '"]';
12
+ }
13
+
14
+ /**
15
+ * Returns the album shortcode tag
16
+ *
17
+ * @return string
18
+ */
19
+ function foogallery_album_shortcode_tag() {
20
+ return apply_filters( 'foogallery_album_shortcode_tag', FOOGALLERY_CPT_ALBUM );
21
+ }
22
+
23
+ /**
24
+ * Return all the album templates used within FooGallery
25
+ *
26
+ * @return array
27
+ */
28
+ function foogallery_album_templates() {
29
+ $album_templates[] = array(
30
+ 'slug' => 'default',
31
+ 'name' => __( 'Responsive Album Layout', 'foogallery' ),
32
+ 'fields' => array(
33
+ array(
34
+ 'id' => 'thumbnail_dimensions',
35
+ 'title' => __( 'Thumbnail Size', 'foogallery' ),
36
+ 'desc' => __( 'Choose the size of your gallery thumbnails.', 'foogallery' ),
37
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
38
+ 'type' => 'thumb_size',
39
+ 'default' => array(
40
+ 'width' => get_option( 'thumbnail_size_w' ),
41
+ 'height' => get_option( 'thumbnail_size_h' ),
42
+ 'crop' => true,
43
+ ),
44
+ ),
45
+ array(
46
+ 'id' => 'title_bg',
47
+ 'title' => __( 'Title Background Color', 'foogallery' ),
48
+ 'desc' => __( 'The color of the title that overlays the album thumbnails', 'foogallery' ),
49
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
50
+ 'type' => 'colorpicker',
51
+ 'default' => '#fff'
52
+ ),
53
+ array(
54
+ 'id' => 'title_font_color',
55
+ 'title' => __( 'Title Text Color', 'foogallery' ),
56
+ 'desc' => __( 'The color of the title text that overlays the album thumbnails', 'foogallery' ),
57
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
58
+ 'type' => 'colorpicker',
59
+ 'default' => '#000000'
60
+ ),
61
+ array(
62
+ 'id' => 'alignment',
63
+ 'title' => __( 'Alignment', 'foogallery' ),
64
+ 'desc' => __( 'The horizontal alignment of the gallery thumbnails inside the album.', 'foogallery' ),
65
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
66
+ 'default' => 'alignment-left',
67
+ 'type' => 'select',
68
+ 'choices' => array(
69
+ 'alignment-left' => __( 'Left', 'foogallery' ),
70
+ 'alignment-center' => __( 'Center', 'foogallery' ),
71
+ 'alignment-right' => __( 'Right', 'foogallery' ),
72
+ )
73
+ ),
74
+ array(
75
+ 'id' => 'gallery_link',
76
+ 'title' => __( 'Gallery Link', 'foogallery' ),
77
+ 'section' => __( 'URL Settings', 'foogallery' ),
78
+ 'default' => '',
79
+ 'type' => 'radio',
80
+ 'spacer' => '<span class="spacer"></span>',
81
+ 'choices' => array(
82
+ '' => __('Default', 'foogallery'),
83
+ 'custom_url' => __('Custom URL', 'foogallery')
84
+ ),
85
+ 'desc' => __( 'You can choose to link each gallery to the default embedded gallery, or you can choose to link to the gallery custom URL (if set).', 'foogallery' ),
86
+ ),
87
+ array(
88
+ 'id' => 'gallery_link_format',
89
+ 'title' => __( 'Gallery Link Format', 'foogallery' ),
90
+ 'desc' => __( 'The format of the URL for each individual gallery in the album.', 'foogallery' ),
91
+ 'section' => __( 'URL Settings', 'foogallery' ),
92
+ 'type' => 'radio',
93
+ 'choices' => array(
94
+ 'default' => __('Pretty, e.g. ', 'foogallery') . '<code>/page-with-album/' . foogallery_album_gallery_url_slug() . '/some-gallery</code>',
95
+ 'querystring' => __('Querystring e.g. ', 'foogallery') . '<code>/page-with-album?' . foogallery_album_gallery_url_slug() . '=some-gallery</code>'
96
+ ),
97
+ 'default' => foogallery_determine_best_link_format_default()
98
+ ),
99
+ array(
100
+ 'id' => 'url_help',
101
+ 'title' => __( 'Please Note', 'foogallery' ),
102
+ 'section' => __( 'URL Settings', 'foogallery' ),
103
+ 'type' => 'help',
104
+ 'help' => true,
105
+ 'desc' => __( 'If you are getting 404\'s when clicking on the album galleries, then change to the querystring format. To force your rewrite rules to flush, simply deactivate and activate the albums extension again.', 'foogallery' ),
106
+ ),
107
+ array(
108
+ 'id' => 'album_hash',
109
+ 'title' => __( 'Remember Scroll Position', 'foogallery' ),
110
+ 'desc' => __( 'When a gallery is loaded in your album, the page is refreshed which means the scroll position will be lost .', 'foogallery' ),
111
+ 'section' => __( 'URL Settings', 'foogallery' ),
112
+ 'type' => 'radio',
113
+ 'choices' => array(
114
+ 'none' => __('Don\'t Remember', 'foogallery'),
115
+ 'remember' => __('Remember Scroll Position', 'foogallery')
116
+ ),
117
+ 'default' => 'none'
118
+ )
119
+ )
120
+ );
121
+
122
+ $album_templates[] = array(
123
+ 'slug' => 'stack',
124
+ 'name' => __( 'All-In-One Stack Album', 'foogallery' ),
125
+ 'fields' => array(
126
+ array(
127
+ 'id' => 'lightbox',
128
+ 'title' => __( 'Lightbox', 'foogallery' ),
129
+ 'desc' => __( 'Choose which lightbox you want to use to display images.', 'foogallery' ),
130
+ 'type' => 'lightbox',
131
+ ),
132
+
133
+ array(
134
+ 'id' => 'thumbnail_dimensions',
135
+ 'title' => __( 'Thumbnail Size', 'foogallery' ),
136
+ 'desc' => __( 'Choose the size of your image stack thumbnails.', 'foogallery' ),
137
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
138
+ 'type' => 'thumb_size',
139
+ 'default' => array(
140
+ 'width' => get_option( 'thumbnail_size_w' ),
141
+ 'height' => get_option( 'thumbnail_size_h' ),
142
+ 'crop' => true,
143
+ ),
144
+ ),
145
+
146
+ array(
147
+ 'id' => 'random_angle',
148
+ 'title' => __( 'Thumbnail Rotation', 'foogallery' ),
149
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
150
+ 'desc' => __( 'Choose how thumbnails in each gallery are shown when clicking an image stack.', 'foogallery' ),
151
+ 'type' => 'radio',
152
+ 'default' => 'false',
153
+ 'choices' => array(
154
+ 'false' => __( 'Normal', 'foogallery' ),
155
+ 'true' => __( 'Random Angles', 'foogallery' )
156
+ )
157
+ ),
158
+
159
+ array(
160
+ 'id' => 'gutter',
161
+ 'title' => __( 'Thumbnail Gutter', 'foogallery' ),
162
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
163
+ 'desc' => __( 'The spacing between each image stack.', 'foogallery' ),
164
+ 'type' => 'number',
165
+ 'default' => 50
166
+ ),
167
+
168
+ array(
169
+ 'id' => 'delay',
170
+ 'title' => __( 'Expand Delay', 'foogallery' ),
171
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
172
+ 'desc' => __( 'The delay between expanding each image on a image stack.', 'foogallery' ),
173
+ 'type' => 'number',
174
+ 'default' => 0
175
+ ),
176
+
177
+ array(
178
+ 'id' => 'pile_angles',
179
+ 'title' => __( 'Image Stack Angles', 'foogallery' ),
180
+ 'section' => __( 'Thumbnail Settings', 'foogallery' ),
181
+ 'desc' => __( 'The angle of the images behind the thumbnail in each image stack.', 'foogallery' ),
182
+ 'type' => 'radio',
183
+ 'default' => '1',
184
+ 'choices' => array(
185
+ '1' => __( 'Low', 'foogallery' ),
186
+ '2' => __( 'Normal', 'foogallery' ),
187
+ '3' => __( 'More Than Normal', 'foogallery' ),
188
+ '5' => __( 'High', 'foogallery' ),
189
+ )
190
+ )
191
+ )
192
+ );
193
+
194
+ return apply_filters( 'foogallery_album_templates', $album_templates );
195
+ }
196
+
197
+ function foogallery_determine_best_link_format_default() {
198
+ global $wp_rewrite;
199
+ if ( '' === $wp_rewrite->permalink_structure ) {
200
+ //we are using ?page_id
201
+ return 'querystring';
202
+ }
203
+
204
+ //we are using permalinks
205
+ return 'default';
206
+ }
207
+
208
+ /**
209
+ * Returns the default album template
210
+ *
211
+ * @return string
212
+ */
213
+ function foogallery_default_album_template() {
214
+ return foogallery_get_setting( 'album_template' );
215
+ }
216
+
217
+ /**
218
+ * Returns the gallery link url for an album
219
+ *
220
+ * @param $album FooGalleryAlbum
221
+ * @param $gallery FooGallery
222
+ *
223
+ * @return string
224
+ */
225
+ function foogallery_album_build_gallery_link( $album, $gallery ) {
226
+ //first check if we want to use custom URL's
227
+ $gallery_link = $album->get_meta( 'default_gallery_link', '' );
228
+
229
+ if ( 'custom_url' === $gallery_link ) {
230
+ //check if the gallery has a custom url, and if so, then use it
231
+ $url = get_post_meta( $gallery->ID, 'custom_url', true );
232
+ }
233
+
234
+ if ( empty( $url ) ) {
235
+ $slug = foogallery_album_gallery_url_slug();
236
+ $format = $album->get_meta( 'default_gallery_link_format', 'default' );
237
+
238
+ if ( 'default' === $format && 'default' === foogallery_determine_best_link_format_default() ) {
239
+ $url = untrailingslashit( trailingslashit( get_permalink() ) . $slug . '/' . $gallery->slug );
240
+ } else {
241
+ $url = add_query_arg( $slug, $gallery->slug );
242
+ }
243
+
244
+ $use_hash = $album->get_meta( 'default_album_hash', 'remember' );
245
+
246
+ if ( 'remember' === $use_hash ) {
247
+ //add the album hash if required
248
+ $url .= '#' . $album->slug;
249
+ }
250
+ }
251
+
252
+ return apply_filters( 'foogallery_album_build_gallery_link', $url );
253
+ }
254
+
255
+ /**
256
+ * Returns the gallery slug used when generating gallery URL's
257
+ *
258
+ * @return string
259
+ */
260
+ function foogallery_album_gallery_url_slug() {
261
+ $slug = foogallery_get_setting( 'album_gallery_slug', 'gallery' );
262
+ return apply_filters( 'foogallery_album_gallery_url_slug', $slug );
263
+ }
264
+
265
+ /**
266
+ * Returns the gallery link target for an album
267
+ *
268
+ * @param $album FooGalleryAlbum
269
+ * @param $gallery FooGallery
270
+ *
271
+ * @return string
272
+ */
273
+ function foogallery_album_build_gallery_link_target( $album, $gallery ) {
274
+ //first check if we want to use custom URL's
275
+ $gallery_link = $album->get_meta( 'default_gallery_link', '' );
276
+
277
+ if ( 'custom_url' === $gallery_link ) {
278
+ //check if the gallery has a custom target, and if so, then use it
279
+ $target = get_post_meta( $gallery->ID, 'custom_target', true );
280
+ }
281
+
282
+ if ( empty( $target ) ) {
283
+ $target = '_self';
284
+ }
285
+
286
+ return apply_filters( 'foogallery_album_build_gallery_link_target', $target );
287
+ }
288
+
289
+ function foogallery_album_get_current_gallery() {
290
+ $slug = foogallery_album_gallery_url_slug();
291
+
292
+ $gallery = get_query_var( $slug );
293
+
294
+ if ( empty( $gallery ) ) {
295
+ $gallery = safe_get_from_request( $slug );
296
+ }
297
+
298
+ return apply_filters( 'foogallery_album_get_current_gallery', $gallery );
299
+ }
300
+
301
+ function foogallery_album_remove_gallery_from_link() {
302
+ $gallery = foogallery_album_get_current_gallery();
303
+ $slug = foogallery_album_gallery_url_slug();
304
+
305
+ $url = untrailingslashit( remove_query_arg( $slug ) );
306
+
307
+ return str_replace( $slug . '/' . $gallery, '', $url);
308
+ }
309
+
310
+ /**
311
+ * Get a foogallery album template setting for the current foogallery that is being output to the frontend
312
+ * @param string $key
313
+ * @param string $default
314
+ *
315
+ * @return bool
316
+ */
317
+ function foogallery_album_template_setting( $key, $default = '' ) {
318
+ global $current_foogallery_album;
319
+ global $current_foogallery_album_arguments;
320
+ global $current_foogallery_album_template;
321
+
322
+ $settings_key = "{$current_foogallery_album_template}_{$key}";
323
+
324
+ if ( $current_foogallery_album_arguments && array_key_exists( $key, $current_foogallery_album_arguments ) ) {
325
+ //try to get the value from the arguments
326
+ $value = $current_foogallery_album_arguments[ $key ];
327
+
328
+ } else if ( $current_foogallery_album->settings && array_key_exists( $settings_key, $current_foogallery_album->settings ) ) {
329
+ //then get the value out of the saved gallery settings
330
+ $value = $current_foogallery_album->settings[ $settings_key ];
331
+ } else {
332
+ //otherwise set it to the default
333
+ $value = $default;
334
+ }
335
+
336
+ $value = apply_filters( 'foogallery_album_template_setting-' . $key, $value );
337
+
338
+ return $value;
339
+ }
340
+
341
+ /**
342
+ * uninstall all albums and setting for albums
343
+ */
344
+ function foogallery_album_uninstall() {
345
+ if ( !current_user_can( 'install_plugins' ) ) exit;
346
+
347
+ //delete all albums posts
348
+ global $wpdb;
349
+ $query = "SELECT p.ID FROM {$wpdb->posts} AS p WHERE p.post_type IN (%s)";
350
+ $gallery_post_ids = $wpdb->get_col( $wpdb->prepare( $query, FOOGALLERY_CPT_ALBUM ) );
351
+
352
+ if ( !empty( $gallery_post_ids ) ) {
353
+ $deleted = 0;
354
+ foreach ( $gallery_post_ids as $post_id ) {
355
+ $del = wp_delete_post( $post_id );
356
+ if ( false !== $del ) {
357
+ ++$deleted;
358
+ }
359
+ }
360
+ }
361
  }
extensions/albums/js/admin-foogallery-album.js CHANGED
@@ -1,148 +1,148 @@
1
- (function(FOOGALLERYALBUM, $, undefined) {
2
-
3
- FOOGALLERYALBUM.bindElements = function() {
4
- $('.foogallery-album-gallery-list')
5
- .on('click', '.foogallery-gallery-select', function(e) {
6
- $(this).toggleClass('selected');
7
- FOOGALLERYALBUM.changeSelection();
8
- })
9
- .sortable({
10
- items: 'li',
11
- distance: 10,
12
- placeholder: 'attachment placeholder',
13
- stop : function() {
14
- FOOGALLERYALBUM.changeSelection();
15
- }
16
- });
17
-
18
- //init any colorpickers
19
- $('.colorpicker').spectrum({
20
- preferredFormat: "rgb",
21
- showInput: true,
22
- clickoutFiresChange: true
23
- });
24
-
25
- $('.foogallery-album-info-modal').prependTo('body');
26
- };
27
-
28
- FOOGALLERYALBUM.changeSelection = function() {
29
- var ids = '',
30
- none = true;
31
- $('.foogallery-gallery-select.selected').each(function() {
32
- ids += $(this).data('foogallery-id') + ',';
33
- none = false;
34
- });
35
-
36
- if (!none) {
37
- ids = ids.substring(0, ids.length - 1);
38
- }
39
- //build up the list of ids
40
- $('#foogallery_album_galleries').val(ids);
41
- };
42
-
43
- FOOGALLERYALBUM.initSettings = function() {
44
- $('#FooGallerySettings_AlbumTemplate').change(function() {
45
- var $this = $(this),
46
- selectedTemplate = $this.val();
47
-
48
- //hide all template fields
49
- $('.foogallery-album-metabox-settings .foogallery_template_field').not('.foogallery_template_field_selector').hide();
50
-
51
- //show all fields for the selected template only
52
- $('.foogallery-album-metabox-settings .foogallery_template_field-' + selectedTemplate).show();
53
-
54
- //trigger a change so custom template js can do something
55
- FOOGALLERYALBUM.triggerTemplateChangedEvent();
56
- });
57
-
58
- //trigger this onload too!
59
- FOOGALLERYALBUM.triggerTemplateChangedEvent();
60
- };
61
-
62
- FOOGALLERYALBUM.triggerTemplateChangedEvent = function() {
63
- var selectedTemplate = $('#FooGallerySettings_AlbumTemplate').val();
64
- $('body').trigger('foogallery-album-template-changed-' + selectedTemplate );
65
- };
66
-
67
- FOOGALLERYALBUM.initAlbumInfoButtons = function() {
68
- $('.foogallery-album-gallery-list .attachment-preview').on('click', 'a.info', function(e) {
69
-
70
- e.preventDefault();
71
-
72
- e.stopPropagation();
73
-
74
- var $this = $(this),
75
- $modal = $('.foogallery-album-info-modal'),
76
- $spinner = $modal.find('.media-frame-title .spinner'),
77
- $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
78
- $details = $modal.find('.gallery-details'),
79
- data = 'action=foogallery_get_gallery_details' +
80
- '&foogallery_id=' + $this.data('gallery-id') +
81
- '&_wpnonce=' + $nonce.val() +
82
- '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val());
83
-
84
- $details.html( $details.data('loading') + $this.data('gallery-title') + '...' );
85
- $spinner.addClass('is-active');
86
-
87
- $.ajax({
88
- type: "POST",
89
- url: ajaxurl,
90
- data: data,
91
- success: function(data) {
92
- $details.html(data);
93
- },
94
- complete: function() {
95
- $spinner.removeClass('is-active');
96
- }
97
- });
98
-
99
- $modal.show();
100
- $('.media-modal-backdrop').show();
101
- });
102
-
103
- $('.foogallery-album-info-modal .gallery-details-save').on('click', function(e) {
104
- e.preventDefault();
105
-
106
- var $this = $(this),
107
- $modal = $('.foogallery-album-info-modal'),
108
- $spinner = $modal.find('.media-frame-toolbar .spinner'),
109
- $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
110
- $form = $modal.find('form[name="foogallery_gallery_details"]'),
111
- data = 'action=foogallery_save_gallery_details' +
112
- '&_wpnonce=' + $nonce.val() +
113
- '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val()) +
114
- '& ' + $form.serialize();
115
-
116
- $this.attr('disabled', 'disabled');
117
- $spinner.addClass('is-active');
118
-
119
- $.ajax({
120
- type: "POST",
121
- url: ajaxurl,
122
- data: data,
123
- success: function() {
124
- $('.foogallery-album-info-modal').hide();
125
- $('.media-modal-backdrop').hide();
126
- },
127
- complete: function() {
128
- $spinner.removeClass('is-active');
129
- $this.removeAttr('disabled');
130
- }
131
- });
132
- });
133
-
134
- $('.foogallery-album-info-modal .media-modal-close').on('click', function() {
135
- $('.foogallery-album-info-modal').hide();
136
- $('.media-modal-backdrop').hide();
137
- });
138
- };
139
-
140
- $(function() { //wait for ready
141
- FOOGALLERYALBUM.bindElements();
142
-
143
- FOOGALLERYALBUM.initSettings();
144
-
145
- FOOGALLERYALBUM.initAlbumInfoButtons();
146
- });
147
-
148
  }(window.FOOGALLERYALBUM = window.FOOGALLERYALBUM || {}, jQuery));
1
+ (function(FOOGALLERYALBUM, $, undefined) {
2
+
3
+ FOOGALLERYALBUM.bindElements = function() {
4
+ $('.foogallery-album-gallery-list')
5
+ .on('click', '.foogallery-gallery-select', function(e) {
6
+ $(this).toggleClass('selected');
7
+ FOOGALLERYALBUM.changeSelection();
8
+ })
9
+ .sortable({
10
+ items: 'li',
11
+ distance: 10,
12
+ placeholder: 'attachment placeholder',
13
+ stop : function() {
14
+ FOOGALLERYALBUM.changeSelection();
15
+ }
16
+ });
17
+
18
+ //init any colorpickers
19
+ $('.colorpicker').spectrum({
20
+ preferredFormat: "rgb",
21
+ showInput: true,
22
+ clickoutFiresChange: true
23
+ });
24
+
25
+ $('.foogallery-album-info-modal').prependTo('body');
26
+ };
27
+
28
+ FOOGALLERYALBUM.changeSelection = function() {
29
+ var ids = '',
30
+ none = true;
31
+ $('.foogallery-gallery-select.selected').each(function() {
32
+ ids += $(this).data('foogallery-id') + ',';
33
+ none = false;
34
+ });
35
+
36
+ if (!none) {
37
+ ids = ids.substring(0, ids.length - 1);
38
+ }
39
+ //build up the list of ids
40
+ $('#foogallery_album_galleries').val(ids);
41
+ };
42
+
43
+ FOOGALLERYALBUM.initSettings = function() {
44
+ $('#FooGallerySettings_AlbumTemplate').change(function() {
45
+ var $this = $(this),
46
+ selectedTemplate = $this.val();
47
+
48
+ //hide all template fields
49
+ $('.foogallery-album-metabox-settings .foogallery_template_field').not('.foogallery_template_field_selector').hide();
50
+
51
+ //show all fields for the selected template only
52
+ $('.foogallery-album-metabox-settings .foogallery_template_field-' + selectedTemplate).show();
53
+
54
+ //trigger a change so custom template js can do something
55
+ FOOGALLERYALBUM.triggerTemplateChangedEvent();
56
+ });
57
+
58
+ //trigger this onload too!
59
+ FOOGALLERYALBUM.triggerTemplateChangedEvent();
60
+ };
61
+
62
+ FOOGALLERYALBUM.triggerTemplateChangedEvent = function() {
63
+ var selectedTemplate = $('#FooGallerySettings_AlbumTemplate').val();
64
+ $('body').trigger('foogallery-album-template-changed-' + selectedTemplate );
65
+ };
66
+
67
+ FOOGALLERYALBUM.initAlbumInfoButtons = function() {
68
+ $('.foogallery-album-gallery-list .attachment-preview').on('click', 'a.info', function(e) {
69
+
70
+ e.preventDefault();
71
+
72
+ e.stopPropagation();
73
+
74
+ var $this = $(this),
75
+ $modal = $('.foogallery-album-info-modal'),
76
+ $spinner = $modal.find('.media-frame-title .spinner'),
77
+ $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
78
+ $details = $modal.find('.gallery-details'),
79
+ data = 'action=foogallery_get_gallery_details' +
80
+ '&foogallery_id=' + $this.data('gallery-id') +
81
+ '&_wpnonce=' + $nonce.val() +
82
+ '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val());
83
+
84
+ $details.html( $details.data('loading') + $this.data('gallery-title') + '...' );
85
+ $spinner.addClass('is-active');
86
+
87
+ $.ajax({
88
+ type: "POST",
89
+ url: ajaxurl,
90
+ data: data,
91
+ success: function(data) {
92
+ $details.html(data);
93
+ },
94
+ complete: function() {
95
+ $spinner.removeClass('is-active');
96
+ }
97
+ });
98
+
99
+ $modal.show();
100
+ $('.media-modal-backdrop').show();
101
+ });
102
+
103
+ $('.foogallery-album-info-modal .gallery-details-save').on('click', function(e) {
104
+ e.preventDefault();
105
+
106
+ var $this = $(this),
107
+ $modal = $('.foogallery-album-info-modal'),
108
+ $spinner = $modal.find('.media-frame-toolbar .spinner'),
109
+ $nonce = $modal.find('#foogallery_album_gallery_details_nonce'),
110
+ $form = $modal.find('form[name="foogallery_gallery_details"]'),
111
+ data = 'action=foogallery_save_gallery_details' +
112
+ '&_wpnonce=' + $nonce.val() +
113
+ '&_wp_http_referer=' + encodeURIComponent($('input[name="_wp_http_referer"]').val()) +
114
+ '& ' + $form.serialize();
115
+
116
+ $this.attr('disabled', 'disabled');
117
+ $spinner.addClass('is-active');
118
+
119
+ $.ajax({
120
+ type: "POST",
121
+ url: ajaxurl,
122
+ data: data,
123
+ success: function() {
124
+ $('.foogallery-album-info-modal').hide();
125
+ $('.media-modal-backdrop').hide();
126
+ },
127
+ complete: function() {
128
+ $spinner.removeClass('is-active');
129
+ $this.removeAttr('disabled');
130
+ }
131
+ });
132
+ });
133
+
134
+ $('.foogallery-album-info-modal .media-modal-close').on('click', function() {
135
+ $('.foogallery-album-info-modal').hide();
136
+ $('.media-modal-backdrop').hide();
137
+ });
138
+ };
139
+
140
+ $(function() { //wait for ready
141
+ FOOGALLERYALBUM.bindElements();
142
+
143
+ FOOGALLERYALBUM.initSettings();
144
+
145
+ FOOGALLERYALBUM.initAlbumInfoButtons();
146
+ });
147
+
148
  }(window.FOOGALLERYALBUM = window.FOOGALLERYALBUM || {}, jQuery));
extensions/albums/js/album-stack.js CHANGED
@@ -1,863 +1,863 @@
1
- /* Modernizr 2.8.3 (Custom Build) | MIT & BSD
2
- * Build: http://modernizr.com/download/#-csstransitions-prefixed-testprop-testallprops-domprefixes
3
- */
4
- if (!window.FooGalleryStackAlbumModernizr) {
5
- window.FooGalleryStackAlbumModernizr=function(a,b,c){function w(a){i.cssText=a}function x(a,b){return w(prefixes.join(a+";")+(b||""))}function y(a,b){return typeof a===b}function z(a,b){return!!~(""+a).indexOf(b)}function A(a,b){for(var d in a){var e=a[d];if(!z(e,"-")&&i[e]!==c)return b=="pfx"?e:!0}return!1}function B(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:y(f,"function")?f.bind(d||b):f}return!1}function C(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+m.join(d+" ")+d).split(" ");return y(b,"string")||y(b,"undefined")?A(e,b):(e=(a+" "+n.join(d+" ")+d).split(" "),B(e,b,c))}var d="2.8.3",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l="Webkit Moz O ms",m=l.split(" "),n=l.toLowerCase().split(" "),o={},p={},q={},r=[],s=r.slice,t,u={}.hasOwnProperty,v;!y(u,"undefined")&&!y(u.call,"undefined")?v=function(a,b){return u.call(a,b)}:v=function(a,b){return b in a&&y(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=s.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(s.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(s.call(arguments)))};return e}),o.csstransitions=function(){return C("transition")};for(var D in o)v(o,D)&&(t=D.toLowerCase(),e[t]=o[D](),r.push((e[t]?"":"no-")+t));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)v(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof enableClasses!="undefined"&&enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},w(""),h=j=null,e._version=d,e._domPrefixes=n,e._cssomPrefixes=m,e.testProp=function(a){return A([a])},e.testAllProps=C,e.prefixed=function(a,b,c){return b?C(a,b,c):C(a,"pfx")},e}(this,this.document);
6
- }
7
-
8
- /**
9
- * jquery.stapel.js v1.0.0
10
- * http://www.codrops.com
11
- *
12
- * Licensed under the MIT license.
13
- * http://www.opensource.org/licenses/mit-license.php
14
- *
15
- * Copyright 2012, Codrops
16
- * http://www.codrops.com
17
- */
18
- ;( function( $, window, undefined ) {
19
-
20
- 'use strict';
21
-
22
- /*
23
- * debouncedresize: special jQuery event that happens once after a window resize
24
- *
25
- * latest version and complete README available on Github:
26
- * https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
27
- *
28
- * Copyright 2011 @louis_remi
29
- * Licensed under the MIT license.
30
- */
31
- var $event = $.event,
32
- $special,
33
- resizeTimeout;
34
-
35
- $special = $event.special.debouncedresize = {
36
- setup: function() {
37
- $( this ).on( "resize", $special.handler );
38
- },
39
- teardown: function() {
40
- $( this ).off( "resize", $special.handler );
41
- },
42
- handler: function( event, execAsap ) {
43
- // Save the context
44
- var context = this,
45
- args = arguments,
46
- dispatch = function() {
47
- // set correct event type
48
- event.type = "debouncedresize";
49
- $event.dispatch.apply( context, args );
50
- };
51
-
52
- if ( resizeTimeout ) {
53
- clearTimeout( resizeTimeout );
54
- }
55
-
56
- execAsap ?
57
- dispatch() :
58
- resizeTimeout = setTimeout( dispatch, $special.threshold );
59
- },
60
- threshold: 150
61
- };
62
-
63
- // ======================= imagesLoaded Plugin ===============================
64
- // https://github.com/desandro/imagesloaded
65
-
66
- // $('#my-container').imagesLoaded(myFunction)
67
- // execute a callback when all images have loaded.
68
- // needed because .load() doesn't work on cached images
69
-
70
- // callback function gets image collection as argument
71
- // this is the container
72
-
73
- // original: mit license. paul irish. 2010.
74
- // contributors: Oren Solomianik, David DeSandro, Yiannis Chatzikonstantinou
75
-
76
- // blank image data-uri bypasses webkit log warning (thx doug jones)
77
- var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
78
-
79
- $.fn.imagesLoaded = function( callback ) {
80
- var $this = this,
81
- deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
82
- hasNotify = $.isFunction(deferred.notify),
83
- $images = $this.find('img').add( $this.filter('img') ),
84
- loaded = [],
85
- proper = [],
86
- broken = [];
87
-
88
- // Register deferred callbacks
89
- if ($.isPlainObject(callback)) {
90
- $.each(callback, function (key, value) {
91
- if (key === 'callback') {
92
- callback = value;
93
- } else if (deferred) {
94
- deferred[key](value);
95
- }
96
- });
97
- }
98
-
99
- function doneLoading() {
100
- var $proper = $(proper),
101
- $broken = $(broken);
102
-
103
- if ( deferred ) {
104
- if ( broken.length ) {
105
- deferred.reject( $images, $proper, $broken );
106
- } else {
107
- deferred.resolve( $images );
108
- }
109
- }
110
-
111
- if ( $.isFunction( callback ) ) {
112
- callback.call( $this, $images, $proper, $broken );
113
- }
114
- }
115
-
116
- function imgLoaded( img, isBroken ) {
117
- // don't proceed if BLANK image, or image is already loaded
118
- if ( img.src === BLANK || $.inArray( img, loaded ) !== -1 ) {
119
- return;
120
- }
121
-
122
- // store element in loaded images array
123
- loaded.push( img );
124
-
125
- // keep track of broken and properly loaded images
126
- if ( isBroken ) {
127
- broken.push( img );
128
- } else {
129
- proper.push( img );
130
- }
131
-
132
- // cache image and its state for future calls
133
- $.data( img, 'imagesLoaded', { isBroken: isBroken, src: img.src } );
134
-
135
- // trigger deferred progress method if present
136
- if ( hasNotify ) {
137
- deferred.notifyWith( $(img), [ isBroken, $images, $(proper), $(broken) ] );
138
- }
139
-
140
- // call doneLoading and clean listeners if all images are loaded
141
- if ( $images.length === loaded.length ){
142
- setTimeout( doneLoading );
143
- $images.unbind( '.imagesLoaded' );
144
- }
145
- }
146
-
147
- // if no images, trigger immediately
148
- if ( !$images.length ) {
149
- doneLoading();
150
- } else {
151
- $images.bind( 'load.imagesLoaded error.imagesLoaded', function( event ){
152
- // trigger imgLoaded
153
- imgLoaded( event.target, event.type === 'error' );
154
- }).each( function( i, el ) {
155
- var src = el.src;
156
-
157
- // find out if this image has been already checked for status
158
- // if it was, and src has not changed, call imgLoaded on it
159
- var cached = $.data( el, 'imagesLoaded' );
160
- if ( cached && cached.src === src ) {
161
- imgLoaded( el, cached.isBroken );
162
- return;
163
- }
164
-
165
- // if complete is true and browser supports natural sizes, try
166
- // to check for image status manually
167
- if ( el.complete && el.naturalWidth !== undefined ) {
168
- imgLoaded( el, el.naturalWidth === 0 || el.naturalHeight === 0 );
169
- return;
170
- }
171
-
172
- // cached images don't fire load sometimes, so we reset src, but only when
173
- // dealing with IE, or image is complete (loaded) and failed manual check
174
- // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
175
- if ( el.readyState || el.complete ) {
176
- el.src = BLANK;
177
- el.src = src;
178
- }
179
- });
180
- }
181
-
182
- return deferred ? deferred.promise( $this ) : $this;
183
- };
184
-
185
- // global
186
- var $window = $( window ),
187
- FooGalleryStackAlbumModernizr = window.FooGalleryStackAlbumModernizr;
188
-
189
- $.Stapel = function( options, element ) {
190
-
191
- this.el = $( element );
192
- this._init( options );
193
-
194
- };
195
-
196
- // the options
197
- $.Stapel.defaults = {
198
- // space between the items
199
- gutter : 40,
200
- // the rotations degree for the 2nd and 3rd item
201
- // (to give a more realistic pile effect)
202
- pileAngles : 2,
203
- // animation settings for the clicked pile's items
204
- pileAnimation : {
205
- openSpeed : 400,
206
- openEasing : 'ease-in-out', // try this :) 'cubic-bezier(.47,1.34,.9,1.03)',
207
- closeSpeed : 400,
208
- closeEasing : 'ease-in-out'
209
- },
210
- // animation settings for the other piles
211
- otherPileAnimation : {
212
- openSpeed : 400,
213
- openEasing : 'ease-in-out',
214
- closeSpeed : 350,
215
- closeEasing : 'ease-in-out'
216
- },
217
- // delay for each item of the pile
218
- delay : 0,
219
- // random rotation for the items once opened
220
- randomAngle : false,
221
- onLoad : function() { return false; },
222
- onBeforeOpen : function( pileName ) { return false; },
223
- onAfterOpen : function( pileName, totalItems ) { return false; },
224
- onBeforeClose : function( pileName ) { return false; },
225
- onAfterClose : function( pileName, totalItems ) { return false; }
226
- };
227
-
228
- $.Stapel.prototype = {
229
-
230
- _init : function( options ) {
231
-
232
- // options
233
- this.options = $.extend( true, {}, $.Stapel.defaults, options );
234
-
235
- // cache some elements
236
- this._config();
237
-
238
- // preload images
239
- var self = this;
240
- this.el.imagesLoaded( function() {
241
- self.options.onLoad();
242
- self._layout();
243
- self._initEvents();
244
- if (typeof FOOBOX != 'undefined') {
245
- FOOBOX.init();
246
- }
247
- } );
248
-
249
- },
250
- _config : function() {
251
-
252
- // css transitions support
253
- this.support = FooGalleryStackAlbumModernizr.csstransitions;
254
-
255
- var transEndEventNames = {
256
- 'WebkitTransition' : 'webkitTransitionEnd',
257
- 'MozTransition' : 'transitionend',
258
- 'OTransition' : 'oTransitionEnd',
259
- 'msTransition' : 'MSTransitionEnd',
260
- 'transition' : 'transitionend'
261
- },
262
- transformNames = {
263
- 'WebkitTransform' : '-webkit-transform',
264
- 'MozTransform' : '-moz-transform',
265
- 'OTransform' : '-o-transform',
266
- 'msTransform' : '-ms-transform',
267
- 'transform' : 'transform'
268
- };
269
-
270
- if( this.support ) {
271
-
272
- this.transEndEventName = transEndEventNames[ FooGalleryStackAlbumModernizr.prefixed( 'transition' ) ] + '.cbpFWSlider';
273
- this.transformName = transformNames[ FooGalleryStackAlbumModernizr.prefixed( 'transform' ) ];
274
-
275
- }
276
-
277
- // true if one pile is opened
278
- this.spread = false;
279
-
280
- // the li's
281
- this.items = this.el.children( 'li' ).hide();
282
-
283
- // close pile
284
- this.close = $( '#tp-close' );
285
-
286
- },
287
- _getSize : function() {
288
-
289
- this.elWidth = this.el.outerWidth( true );
290
-
291
- },
292
- _initEvents : function() {
293
-
294
- var self = this;
295
- $window.on( 'debouncedresize.stapel', function() { self._resize(); } );
296
- this.items.on( 'click.stapel', function() {
297
-
298
- var $item = $( this );
299
-
300
- if( !self.spread && $item.data( 'isPile' ) ) {
301
-
302
- self.spread = true;
303
- self.pileName = $item.data( 'pileName' );
304
- self.options.onBeforeOpen( self.pileName );
305
- self._openPile();
306
-
307
- return false;
308
-
309
- }
310
-
311
- } );
312
-
313
- },
314
- _layout : function() {
315
-
316
- /*
317
- piles() : save the items info in a object with the following structure:
318
-
319
- this.piles = {
320
-
321
- pileName : {
322
-
323
- // elements of this pile (note that an element can be also in a different pile)
324
- // for each element, the finalPosition is the position of the element when the pile is opened
325
- elements : [
326
- { el : HTMLELEMENT, finalPosition : { left : LEFT, top : TOP } },
327
- {},
328
- {},
329
- ...
330
- ],
331
- // this is the position of the pile (all elements of the pile) when the pile is closed
332
- position : { left : LEFT, top : TOP },
333
- index : INDEX
334
- },
335
-
336
- // more piles
337
- ...
338
-
339
- }
340
- */
341
- this._piles();
342
-
343
- // items width & height
344
- // assuming here that all items have the same width and height
345
- this.itemSize = { width : this.items.outerWidth( true ) , height : this.items.outerHeight( true ) };
346
-
347
- // remove original elements
348
- this.items.remove();
349
-
350
- // applies some initial style for the items
351
- this._setInitialStyle();
352
-
353
- this.el.css( 'min-width', this.itemSize.width + this.options.gutter );
354
-
355
- // gets the current ul size (needed for the calculation of each item's position)
356
- this._getSize();
357
-
358
- // calculate and set each Pile's elements position based on the current ul width
359
- // this function will also be called on window resize
360
- this._setItemsPosition();
361
-
362
- // new items
363
- this.items = this.el.children( 'li' ).show();
364
- // total items
365
- this.itemsCount = this.items.length;
366
-
367
- },
368
- _piles : function() {
369
-
370
- var piles = {};
371
- this.pilesArr = [];
372
- var pile, self = this, idx = 0;
373
- this.items.each( function() {
374
-
375
- var $item = $( this ),
376
- itemPile = $item.attr( 'data-pile' ) || 'nopile-' + $item.index(),
377
- attr = itemPile.split( ',' );
378
-
379
- for( var i = 0, total = attr.length; i < total; ++i ) {
380
-
381
- var pileName = $.trim( attr[i] );
382
- pile = piles[ pileName ];
383
-
384
- if( !pile ) {
385
-
386
- pile = piles[ pileName ] = {
387
- name : pileName,
388
- elements : [],
389
- position : { left : 0, top : 0 },
390
- index : idx
391
- };
392
-
393
- self.pilesArr.push(pile);
394
-
395
- ++idx;
396
-
397
- }
398
-
399
- var clone = $item.clone().get(0);
400
- pile.elements.push( { el : clone, finalPosition : { left : 0, top : 0 } } );
401
- var $clone = $(clone);
402
- $clone.appendTo(self.el);
403
- }
404
-
405
- } );
406
-
407
- },
408
- _setInitialStyle : function() {
409
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
410
-
411
- var p = this.pilesArr[j];
412
-
413
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
414
-
415
- var $el = $( p.elements[i].el ),
416
- styleCSS = { transform : 'rotate(0deg)' };
417
-
418
- this._applyInitialTransition( $el );
419
-
420
- if( i === len - 2 ) {
421
- styleCSS = { transform : 'rotate(' + this.options.pileAngles + 'deg)' };
422
- }
423
- else if( i === len - 3 ) {
424
- styleCSS = { transform : 'rotate(-' + this.options.pileAngles + 'deg)' };
425
- }
426
- else if( i !== len - 1 ) {
427
- var extraStyle = { visibility : 'hidden' };
428
- $el.css( extraStyle ).data( 'extraStyle', extraStyle );
429
- }
430
- else if( p.name.substr( 0, 6 ) !== 'nopile' ) {
431
- $el.data( 'front', true ).append( '<div class="tp-title-cover"><div class="tp-title"><span>' + p.name + '</span><span>' + len + '</span></div></div>' );
432
- }
433
-
434
- $el.css( styleCSS ).data( {
435
- initialStyle : styleCSS,
436
- pileName : p.name,
437
- pileCount : len,
438
- shadow : $el.css( 'box-shadow' ),
439
- isPile : p.name.substr( 0, 6 ) === 'nopile' ? false : true
440
- } );
441
-
442
- }
443
-
444
- }
445
-
446
- },
447
- _applyInitialTransition : function( $el ) {
448
-
449
- if( this.support ) {
450
- $el.css( 'transition', 'left 400ms ease-in-out, top 400ms ease-in-out' );
451
- }
452
-
453
- },
454
- _setItemsPosition : function() {
455
-
456
- var accumL = 0, accumT = 0,
457
- l, t, ml = 0,
458
- lastItemTop = 0;
459
-
460
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
461
-
462
- var p = this.pilesArr[j],
463
-
464
- //for( var pile in this.piles ) {
465
- //
466
- // var p = this.piles[pile],
467
- stepW = this.itemSize.width + this.options.gutter,
468
-
469
- accumIL = 0, accumIT = 0, il, it;
470
-
471
- if( accumL + stepW <= this.elWidth ) {
472
-
473
- l = accumL;
474
- t = accumT;
475
- accumL += stepW;
476
-
477
- }
478
- else {
479
-
480
- if( ml === 0 ) {
481
- ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
482
- }
483
-
484
- accumT += this.itemSize.height + this.options.gutter;
485
- l = 0;
486
- t = accumT;
487
- accumL = stepW;
488
-
489
- }
490
-
491
- p.position.left = l;
492
- p.position.top = t;
493
-
494
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
495
-
496
- var elem = p.elements[i],
497
- fp = elem.finalPosition;
498
-
499
- if( accumIL + stepW <= this.elWidth ) {
500
-
501
- il = accumIL;
502
- it = accumIT;
503
- accumIL += stepW;
504
-
505
- }
506
- else {
507
-
508
- accumIT += this.itemSize.height + this.options.gutter;
509
- il = 0;
510
- it = accumIT;
511
- accumIL = stepW;
512
-
513
- }
514
-
515
- fp.left = il;
516
- fp.top = it;
517
-
518
- var $el = $( elem.el );
519
-
520
- if(p.name !== this.pileName ) {
521
-
522
- $el.css( { left : p.position.left, top : p.position.top } );
523
-
524
- }
525
- else {
526
-
527
- lastItemTop = elem.finalPosition.top;
528
- $el.css( { left : elem.finalPosition.left, top : lastItemTop } );
529
-
530
- }
531
-
532
- }
533
-
534
- }
535
-
536
- if( ml === 0 ) {
537
- ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
538
- }
539
-
540
- // the position of the items will influence the final margin left value and height for the ul
541
- // center the ul
542
- lastItemTop = this.spread ? lastItemTop : accumT;
543
- this.el.css( {
544
- marginLeft : ml,
545
- height : lastItemTop + this.itemSize.height
546
- } );
547
-
548
- },
549
- _openPile : function() {
550
-
551
- if( !this.spread ) {
552
- return false;
553
- }
554
-
555
- // final style
556
- var fs;
557
-
558
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
559
-
560
- var p = this.pilesArr[j],
561
-
562
- //for( var pile in this.piles ) {
563
- //
564
- // var p = this.piles[ pile ],
565
-
566
- cnt = 0;
567
-
568
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
569
-
570
- var elem = p.elements[i],
571
- $item = $( elem.el ),
572
- $img = $item.find( 'img' ),
573
- styleCSS = p.name === this.pileName ? {
574
- zIndex : 9999,
575
- visibility : 'visible',
576
- transition : this.support ? 'left ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', top ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing : 'none'
577
- } : {
578
- zIndex : 1,
579
- transition : this.support ? 'opacity ' + this.options.otherPileAnimation.closeSpeed + 'ms ' + this.options.otherPileAnimation.closeEasing : 'none'
580
- };
581
-
582
- if( p.name === this.pileName ) {
583
-
584
- if( $item.data( 'front' ) ) {
585
- $item.find( 'div.tp-title' ).hide();
586
- }
587
-
588
- if( i < len - 1 ) {
589
- $img.css( 'visibility', 'visible' );
590
- }
591
-
592
- fs = elem.finalPosition;
593
- fs.transform = this.options.randomAngle && i !== p.index ? 'rotate(' + Math.floor( Math.random() * ( 5 + 5 + 1 ) - 5 ) + 'deg)' : 'none';
594
-
595
- if( !this.support ) {
596
- $item.css( 'transform', 'none' );
597
- }
598
-
599
- // hack: remove box-shadow while animating to prevent the shadow stack effect
600
- if( i < len - 3 ) {
601
- $item.css( 'box-shadow', 'none' );
602
- }
603
-
604
- }
605
- else if( i < len - 1 ) {
606
- $img.css( 'visibility', 'hidden' );
607
- }
608
-
609
- $item.css( styleCSS );
610
-
611
- var self = this;
612
-
613
- p.name === this.pileName ?
614
- this._applyTransition( $item, fs, this.options.pileAnimation.openSpeed, function( evt ) {
615
-
616
- var target = this.target || this.nodeName;
617
- if( target !== 'LI' ) {
618
- return;
619
- }
620
-
621
- var $el = $( this );
622
-
623
- // hack: remove box-shadow while animating to prevent the shadow stack effect
624
- $el.css( 'box-shadow', $el.data( 'shadow' ) );
625
-
626
- if( self.support ) {
627
- $el.off( self.transEndEventName );
628
- }
629
-
630
- ++cnt;
631
-
632
- if( cnt === $el.data( 'pileCount' ) ) {
633
-
634
- $( document ).one( 'mousemove.stapel', function() {
635
- self.el.addClass( 'tp-open' );
636
- } );
637
- self.options.onAfterOpen( self.pileName, cnt );
638
-
639
- }
640
-
641
- } ) :
642
- this._applyTransition( $item, { opacity : 0 }, this.options.otherPileAnimation.closeSpeed );
643
-
644
- }
645
-
646
- }
647
-
648
- this.el.css( 'height', fs.top + this.itemSize.height );
649
-
650
- },
651
- _closePile : function() {
652
-
653
- var self = this;
654
-
655
- // close..
656
- if( this.spread ) {
657
-
658
- this.spread = false;
659
-
660
- this.options.onBeforeClose( this.pileName );
661
-
662
- this.el.removeClass( 'tp-open' );
663
-
664
- // final style
665
- var fs;
666
- for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
667
-
668
- var p = this.pilesArr[j],
669
-
670
- //for( var pile in this.piles ) {
671
- //
672
- // var p = this.piles[ pile ],
673
-
674
- cnt = 0;
675
-
676
- for( var i = 0, len = p.elements.length; i < len; ++i ) {
677
-
678
- var $item = $( p.elements[i].el ),
679
- styleCSS = p.name === this.pileName ? {
680
- transition : this.support ? 'left ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', top ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing : 'none'
681
- } : {
682
- transition : this.support ? 'opacity ' + this.options.otherPileAnimation.openSpeed + 'ms ' + this.options.otherPileAnimation.openEasing : 'none'
683
- };
684
-
685
- $item.css( styleCSS );
686
-
687
- fs = p.position;
688
-
689
- if(p.name === this.pileName ) {
690
-
691
- $.extend( fs, $item.data( 'initialStyle' ) );
692
-
693
- // hack: remove box-shadow while animating to prevent the shadow stack effect
694
- if( i < len - 3 ) {
695
- $item.css( 'box-shadow', 'none' );
696
- }
697
-
698
- }
699
-
700
- p.name === this.pileName ? this._applyTransition( $item, fs, this.options.pileAnimation.closeSpeed, function( evt ) {
701
-
702
- var target = this.target || this.nodeName;
703
- if( target !== 'LI' ) {
704
- return;
705
- }
706
-
707
- var $el = $( this ), extraStyle = $el.data( 'extraStyle' );
708
-
709
- // hack: remove box-shadow while animating to prevent the shadow stack effect
710
- $el.css( 'box-shadow', $el.data( 'shadow' ) );
711
-
712
- if( self.support ) {
713
- $el.off( self.transEndEventName );
714
- self._applyInitialTransition( $el );
715
- }
716
- else {
717
- $el.css( $el.data( 'initialStyle' ) );
718
- }
719
-
720
- if( extraStyle ) {
721
- $el.css( extraStyle );
722
- }
723
-
724
- ++cnt;
725
-
726
- if( $el.data( 'front' ) ) {
727
- $el.find( 'div.tp-title' ).show();
728
- }
729
-
730
- if( cnt === $el.data( 'pileCount' ) ) {
731
- self.options.onAfterClose( $el.data( 'pileName' ), cnt );
732
- }
733
-
734
- } ) : this._applyTransition( $item, { opacity : 1 }, this.options.otherPileAnimation.openSpeed, function( evt ) {
735
-
736
- var target = this.target || this.nodeName;
737
- if( target !== 'LI' ) {
738
- return;
739
- }
740
-
741
- var $el = $( this );
742
-
743
- if( $el.index() < len - 1 ) {
744
- $el.find( 'img' ).css( 'visibility', 'visible' );
745
- }
746
-
747
- if( self.support ) {
748
- $el.off( self.transEndEventName );
749
- self._applyInitialTransition( $el );
750
- }
751
-
752
- } );
753
-
754
- }
755
-
756
- }
757
-
758
- // reset pile name
759
- this.pileName = '';
760
-
761
- // update ul height
762
- this.el.css( 'height', fs.top + this.itemSize.height );
763
-
764
- }
765
-
766
- return false;
767
-
768
- },
769
- _resize : function() {
770
-
771
- // get ul size again
772
- this._getSize();
773
- // reset items positions
774
- this._setItemsPosition();
775
-
776
- },
777
- _applyTransition : function( el, styleCSS, speed, fncomplete ) {
778
-
779
- $.fn.applyStyle = this.support ? $.fn.css : $.fn.animate;
780
-
781
- if( fncomplete && this.support ) {
782
-
783
- el.on( this.transEndEventName, fncomplete );
784
-
785
- }
786
-
787
- fncomplete = fncomplete || function() { return false; };
788
-
789
- el.stop().applyStyle( styleCSS, $.extend( true, [], { duration : speed + 'ms', complete : fncomplete } ) );
790
-
791
- },
792
- closePile : function() {
793
-
794
- this._closePile();
795
-
796
- }
797
-
798
- };
799
-
800
- var logError = function( message ) {
801
-
802
- if ( window.console ) {
803
-
804
- window.console.error( message );
805
-
806
- }
807
-
808
- };
809
-
810
- $.fn.stapel = function( options ) {
811
-
812
- var instance = $.data( this, 'stapel' );
813
-
814
- if ( typeof options === 'string' ) {
815
-
816
- var args = Array.prototype.slice.call( arguments, 1 );
817
-
818
- this.each(function() {
819
-
820
- if ( !instance ) {
821
-
822
- logError( "cannot call methods on stapel prior to initialization; " +
823
- "attempted to call method '" + options + "'" );
824
- return;
825
-
826
- }
827
-
828
- if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
829
-
830
- logError( "no such method '" + options + "' for stapel instance" );
831
- return;
832
-
833
- }
834
-
835
- instance[ options ].apply( instance, args );
836
-
837
- });
838
-
839
- }
840
- else {
841
-
842
- this.each(function() {
843
-
844
- if ( instance ) {
845
-
846
- instance._init();
847
-
848
- }
849
- else {
850
-
851
- instance = $.data( this, 'stapel', new $.Stapel( options, this ) );
852
-
853
- }
854
-
855
- });
856
-
857
- }
858
-
859
- return instance;
860
-
861
- };
862
-
863
  } )( jQuery, window );
1
+ /* Modernizr 2.8.3 (Custom Build) | MIT & BSD
2
+ * Build: http://modernizr.com/download/#-csstransitions-prefixed-testprop-testallprops-domprefixes
3
+ */
4
+ if (!window.FooGalleryStackAlbumModernizr) {
5
+ window.FooGalleryStackAlbumModernizr=function(a,b,c){function w(a){i.cssText=a}function x(a,b){return w(prefixes.join(a+";")+(b||""))}function y(a,b){return typeof a===b}function z(a,b){return!!~(""+a).indexOf(b)}function A(a,b){for(var d in a){var e=a[d];if(!z(e,"-")&&i[e]!==c)return b=="pfx"?e:!0}return!1}function B(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:y(f,"function")?f.bind(d||b):f}return!1}function C(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+m.join(d+" ")+d).split(" ");return y(b,"string")||y(b,"undefined")?A(e,b):(e=(a+" "+n.join(d+" ")+d).split(" "),B(e,b,c))}var d="2.8.3",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l="Webkit Moz O ms",m=l.split(" "),n=l.toLowerCase().split(" "),o={},p={},q={},r=[],s=r.slice,t,u={}.hasOwnProperty,v;!y(u,"undefined")&&!y(u.call,"undefined")?v=function(a,b){return u.call(a,b)}:v=function(a,b){return b in a&&y(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=s.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(s.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(s.call(arguments)))};return e}),o.csstransitions=function(){return C("transition")};for(var D in o)v(o,D)&&(t=D.toLowerCase(),e[t]=o[D](),r.push((e[t]?"":"no-")+t));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)v(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof enableClasses!="undefined"&&enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},w(""),h=j=null,e._version=d,e._domPrefixes=n,e._cssomPrefixes=m,e.testProp=function(a){return A([a])},e.testAllProps=C,e.prefixed=function(a,b,c){return b?C(a,b,c):C(a,"pfx")},e}(this,this.document);
6
+ }
7
+
8
+ /**
9
+ * jquery.stapel.js v1.0.0
10
+ * http://www.codrops.com
11
+ *
12
+ * Licensed under the MIT license.
13
+ * http://www.opensource.org/licenses/mit-license.php
14
+ *
15
+ * Copyright 2012, Codrops
16
+ * http://www.codrops.com
17
+ */
18
+ ;( function( $, window, undefined ) {
19
+
20
+ 'use strict';
21
+
22
+ /*
23
+ * debouncedresize: special jQuery event that happens once after a window resize
24
+ *
25
+ * latest version and complete README available on Github:
26
+ * https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
27
+ *
28
+ * Copyright 2011 @louis_remi
29
+ * Licensed under the MIT license.
30
+ */
31
+ var $event = $.event,
32
+ $special,
33
+ resizeTimeout;
34
+
35
+ $special = $event.special.debouncedresize = {
36
+ setup: function() {
37
+ $( this ).on( "resize", $special.handler );
38
+ },
39
+ teardown: function() {
40
+ $( this ).off( "resize", $special.handler );
41
+ },
42
+ handler: function( event, execAsap ) {
43
+ // Save the context
44
+ var context = this,
45
+ args = arguments,
46
+ dispatch = function() {
47
+ // set correct event type
48
+ event.type = "debouncedresize";
49
+ $event.dispatch.apply( context, args );
50
+ };
51
+
52
+ if ( resizeTimeout ) {
53
+ clearTimeout( resizeTimeout );
54
+ }
55
+
56
+ execAsap ?
57
+ dispatch() :
58
+ resizeTimeout = setTimeout( dispatch, $special.threshold );
59
+ },
60
+ threshold: 150
61
+ };
62
+
63
+ // ======================= imagesLoaded Plugin ===============================
64
+ // https://github.com/desandro/imagesloaded
65
+
66
+ // $('#my-container').imagesLoaded(myFunction)
67
+ // execute a callback when all images have loaded.
68
+ // needed because .load() doesn't work on cached images
69
+
70
+ // callback function gets image collection as argument
71
+ // this is the container
72
+
73
+ // original: mit license. paul irish. 2010.
74
+ // contributors: Oren Solomianik, David DeSandro, Yiannis Chatzikonstantinou
75
+
76
+ // blank image data-uri bypasses webkit log warning (thx doug jones)
77
+ var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
78
+
79
+ $.fn.imagesLoaded = function( callback ) {
80
+ var $this = this,
81
+ deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
82
+ hasNotify = $.isFunction(deferred.notify),
83
+ $images = $this.find('img').add( $this.filter('img') ),
84
+ loaded = [],
85
+ proper = [],
86
+ broken = [];
87
+
88
+ // Register deferred callbacks
89
+ if ($.isPlainObject(callback)) {
90
+ $.each(callback, function (key, value) {
91
+ if (key === 'callback') {
92
+ callback = value;
93
+ } else if (deferred) {
94
+ deferred[key](value);
95
+ }
96
+ });
97
+ }
98
+
99
+ function doneLoading() {
100
+ var $proper = $(proper),
101
+ $broken = $(broken);
102
+
103
+ if ( deferred ) {
104
+ if ( broken.length ) {
105
+ deferred.reject( $images, $proper, $broken );
106
+ } else {
107
+ deferred.resolve( $images );
108
+ }
109
+ }
110
+
111
+ if ( $.isFunction( callback ) ) {
112
+ callback.call( $this, $images, $proper, $broken );
113
+ }
114
+ }
115
+
116
+ function imgLoaded( img, isBroken ) {
117
+ // don't proceed if BLANK image, or image is already loaded
118
+ if ( img.src === BLANK || $.inArray( img, loaded ) !== -1 ) {
119
+ return;
120
+ }
121
+
122
+ // store element in loaded images array
123
+ loaded.push( img );
124
+
125
+ // keep track of broken and properly loaded images
126
+ if ( isBroken ) {
127
+ broken.push( img );
128
+ } else {
129
+ proper.push( img );
130
+ }
131
+
132
+ // cache image and its state for future calls
133
+ $.data( img, 'imagesLoaded', { isBroken: isBroken, src: img.src } );
134
+
135
+ // trigger deferred progress method if present
136
+ if ( hasNotify ) {
137
+ deferred.notifyWith( $(img), [ isBroken, $images, $(proper), $(broken) ] );
138
+ }
139
+
140
+ // call doneLoading and clean listeners if all images are loaded
141
+ if ( $images.length === loaded.length ){
142
+ setTimeout( doneLoading );
143
+ $images.unbind( '.imagesLoaded' );
144
+ }
145
+ }
146
+
147
+ // if no images, trigger immediately
148
+ if ( !$images.length ) {
149
+ doneLoading();
150
+ } else {
151
+ $images.bind( 'load.imagesLoaded error.imagesLoaded', function( event ){
152
+ // trigger imgLoaded
153
+ imgLoaded( event.target, event.type === 'error' );
154
+ }).each( function( i, el ) {
155
+ var src = el.src;
156
+
157
+ // find out if this image has been already checked for status
158
+ // if it was, and src has not changed, call imgLoaded on it
159
+ var cached = $.data( el, 'imagesLoaded' );
160
+ if ( cached && cached.src === src ) {
161
+ imgLoaded( el, cached.isBroken );
162
+ return;
163
+ }
164
+
165
+ // if complete is true and browser supports natural sizes, try
166
+ // to check for image status manually
167
+ if ( el.complete && el.naturalWidth !== undefined ) {
168
+ imgLoaded( el, el.naturalWidth === 0 || el.naturalHeight === 0 );
169
+ return;
170
+ }
171
+
172
+ // cached images don't fire load sometimes, so we reset src, but only when
173
+ // dealing with IE, or image is complete (loaded) and failed manual check
174
+ // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
175
+ if ( el.readyState || el.complete ) {
176
+ el.src = BLANK;
177
+ el.src = src;
178
+ }
179
+ });
180
+ }
181
+
182
+ return deferred ? deferred.promise( $this ) : $this;
183
+ };
184
+
185
+ // global
186
+ var $window = $( window ),
187
+ FooGalleryStackAlbumModernizr = window.FooGalleryStackAlbumModernizr;
188
+
189
+ $.Stapel = function( options, element ) {
190
+
191
+ this.el = $( element );
192
+ this._init( options );
193
+
194
+ };
195
+
196
+ // the options
197
+ $.Stapel.defaults = {
198
+ // space between the items
199
+ gutter : 40,
200
+ // the rotations degree for the 2nd and 3rd item
201
+ // (to give a more realistic pile effect)
202
+ pileAngles : 2,
203
+ // animation settings for the clicked pile's items
204
+ pileAnimation : {
205
+ openSpeed : 400,
206
+ openEasing : 'ease-in-out', // try this :) 'cubic-bezier(.47,1.34,.9,1.03)',
207
+ closeSpeed : 400,
208
+ closeEasing : 'ease-in-out'
209
+ },
210
+ // animation settings for the other piles
211
+ otherPileAnimation : {
212
+ openSpeed : 400,
213
+ openEasing : 'ease-in-out',
214
+ closeSpeed : 350,
215
+ closeEasing : 'ease-in-out'
216
+ },
217
+ // delay for each item of the pile
218
+ delay : 0,
219
+ // random rotation for the items once opened
220
+ randomAngle : false,
221
+ onLoad : function() { return false; },
222
+ onBeforeOpen : function( pileName ) { return false; },
223
+ onAfterOpen : function( pileName, totalItems ) { return false; },
224
+ onBeforeClose : function( pileName ) { return false; },
225
+ onAfterClose : function( pileName, totalItems ) { return false; }
226
+ };
227
+
228
+ $.Stapel.prototype = {
229
+
230
+ _init : function( options ) {
231
+
232
+ // options
233
+ this.options = $.extend( true, {}, $.Stapel.defaults, options );
234
+
235
+ // cache some elements
236
+ this._config();
237
+
238
+ // preload images
239
+ var self = this;
240
+ this.el.imagesLoaded( function() {
241
+ self.options.onLoad();
242
+ self._layout();
243
+ self._initEvents();
244
+ if (typeof FOOBOX != 'undefined') {
245
+ FOOBOX.init();
246
+ }
247
+ } );
248
+
249
+ },
250
+ _config : function() {
251
+
252
+ // css transitions support
253
+ this.support = FooGalleryStackAlbumModernizr.csstransitions;
254
+
255
+ var transEndEventNames = {
256
+ 'WebkitTransition' : 'webkitTransitionEnd',
257
+ 'MozTransition' : 'transitionend',
258
+ 'OTransition' : 'oTransitionEnd',
259
+ 'msTransition' : 'MSTransitionEnd',
260
+ 'transition' : 'transitionend'
261
+ },
262
+ transformNames = {
263
+ 'WebkitTransform' : '-webkit-transform',
264
+ 'MozTransform' : '-moz-transform',
265
+ 'OTransform' : '-o-transform',
266
+ 'msTransform' : '-ms-transform',
267
+ 'transform' : 'transform'
268
+ };
269
+
270
+ if( this.support ) {
271
+
272
+ this.transEndEventName = transEndEventNames[ FooGalleryStackAlbumModernizr.prefixed( 'transition' ) ] + '.cbpFWSlider';
273
+ this.transformName = transformNames[ FooGalleryStackAlbumModernizr.prefixed( 'transform' ) ];
274
+
275
+ }
276
+
277
+ // true if one pile is opened
278
+ this.spread = false;
279
+
280
+ // the li's
281
+ this.items = this.el.children( 'li' ).hide();
282
+
283
+ // close pile
284
+ this.close = $( '#tp-close' );
285
+
286
+ },
287
+ _getSize : function() {
288
+
289
+ this.elWidth = this.el.outerWidth( true );
290
+
291
+ },
292
+ _initEvents : function() {
293
+
294
+ var self = this;
295
+ $window.on( 'debouncedresize.stapel', function() { self._resize(); } );
296
+ this.items.on( 'click.stapel', function() {
297
+
298
+ var $item = $( this );
299
+
300
+ if( !self.spread && $item.data( 'isPile' ) ) {
301
+
302
+ self.spread = true;
303
+ self.pileName = $item.data( 'pileName' );
304
+ self.options.onBeforeOpen( self.pileName );
305
+ self._openPile();
306
+
307
+ return false;
308
+
309
+ }
310
+
311
+ } );
312
+
313
+ },
314
+ _layout : function() {
315
+
316
+ /*
317
+ piles() : save the items info in a object with the following structure:
318
+
319
+ this.piles = {
320
+
321
+ pileName : {
322
+
323
+ // elements of this pile (note that an element can be also in a different pile)
324
+ // for each element, the finalPosition is the position of the element when the pile is opened
325
+ elements : [
326
+ { el : HTMLELEMENT, finalPosition : { left : LEFT, top : TOP } },
327
+ {},
328
+ {},
329
+ ...
330
+ ],
331
+ // this is the position of the pile (all elements of the pile) when the pile is closed
332
+ position : { left : LEFT, top : TOP },
333
+ index : INDEX
334
+ },
335
+
336
+ // more piles
337
+ ...
338
+
339
+ }
340
+ */
341
+ this._piles();
342
+
343
+ // items width & height
344
+ // assuming here that all items have the same width and height
345
+ this.itemSize = { width : this.items.outerWidth( true ) , height : this.items.outerHeight( true ) };
346
+
347
+ // remove original elements
348
+ this.items.remove();
349
+
350
+ // applies some initial style for the items
351
+ this._setInitialStyle();
352
+
353
+ this.el.css( 'min-width', this.itemSize.width + this.options.gutter );
354
+
355
+ // gets the current ul size (needed for the calculation of each item's position)
356
+ this._getSize();
357
+
358
+ // calculate and set each Pile's elements position based on the current ul width
359
+ // this function will also be called on window resize
360
+ this._setItemsPosition();
361
+
362
+ // new items
363
+ this.items = this.el.children( 'li' ).show();
364
+ // total items
365
+ this.itemsCount = this.items.length;
366
+
367
+ },
368
+ _piles : function() {
369
+
370
+ var piles = {};
371
+ this.pilesArr = [];
372
+ var pile, self = this, idx = 0;
373
+ this.items.each( function() {
374
+
375
+ var $item = $( this ),
376
+ itemPile = $item.attr( 'data-pile' ) || 'nopile-' + $item.index(),
377
+ attr = itemPile.split( ',' );
378
+
379
+ for( var i = 0, total = attr.length; i < total; ++i ) {
380
+
381
+ var pileName = $.trim( attr[i] );
382
+ pile = piles[ pileName ];
383
+
384
+ if( !pile ) {
385
+
386
+ pile = piles[ pileName ] = {
387
+ name : pileName,
388
+ elements : [],
389
+ position : { left : 0, top : 0 },
390
+ index : idx
391
+ };
392
+
393
+ self.pilesArr.push(pile);
394
+
395
+ ++idx;
396
+
397
+ }
398
+
399
+ var clone = $item.clone().get(0);
400
+ pile.elements.push( { el : clone, finalPosition : { left : 0, top : 0 } } );
401
+ var $clone = $(clone);
402
+ $clone.appendTo(self.el);
403
+ }
404
+
405
+ } );
406
+
407
+ },
408
+ _setInitialStyle : function() {
409
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
410
+
411
+ var p = this.pilesArr[j];
412
+
413
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
414
+
415
+ var $el = $( p.elements[i].el ),
416
+ styleCSS = { transform : 'rotate(0deg)' };
417
+
418
+ this._applyInitialTransition( $el );
419
+
420
+ if( i === len - 2 ) {
421
+ styleCSS = { transform : 'rotate(' + this.options.pileAngles + 'deg)' };
422
+ }
423
+ else if( i === len - 3 ) {
424
+ styleCSS = { transform : 'rotate(-' + this.options.pileAngles + 'deg)' };
425
+ }
426
+ else if( i !== len - 1 ) {
427
+ var extraStyle = { visibility : 'hidden' };
428
+ $el.css( extraStyle ).data( 'extraStyle', extraStyle );
429
+ }
430
+ else if( p.name.substr( 0, 6 ) !== 'nopile' ) {
431
+ $el.data( 'front', true ).append( '<div class="tp-title-cover"><div class="tp-title"><span>' + p.name + '</span><span>' + len + '</span></div></div>' );
432
+ }
433
+
434
+ $el.css( styleCSS ).data( {
435
+ initialStyle : styleCSS,
436
+ pileName : p.name,
437
+ pileCount : len,
438
+ shadow : $el.css( 'box-shadow' ),
439
+ isPile : p.name.substr( 0, 6 ) === 'nopile' ? false : true
440
+ } );
441
+
442
+ }
443
+
444
+ }
445
+
446
+ },
447
+ _applyInitialTransition : function( $el ) {
448
+
449
+ if( this.support ) {
450
+ $el.css( 'transition', 'left 400ms ease-in-out, top 400ms ease-in-out' );
451
+ }
452
+
453
+ },
454
+ _setItemsPosition : function() {
455
+
456
+ var accumL = 0, accumT = 0,
457
+ l, t, ml = 0,
458
+ lastItemTop = 0;
459
+
460
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
461
+
462
+ var p = this.pilesArr[j],
463
+
464
+ //for( var pile in this.piles ) {
465
+ //
466
+ // var p = this.piles[pile],
467
+ stepW = this.itemSize.width + this.options.gutter,
468
+
469
+ accumIL = 0, accumIT = 0, il, it;
470
+
471
+ if( accumL + stepW <= this.elWidth ) {
472
+
473
+ l = accumL;
474
+ t = accumT;
475
+ accumL += stepW;
476
+
477
+ }
478
+ else {
479
+
480
+ if( ml === 0 ) {
481
+ ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
482
+ }
483
+
484
+ accumT += this.itemSize.height + this.options.gutter;
485
+ l = 0;
486
+ t = accumT;
487
+ accumL = stepW;
488
+
489
+ }
490
+
491
+ p.position.left = l;
492
+ p.position.top = t;
493
+
494
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
495
+
496
+ var elem = p.elements[i],
497
+ fp = elem.finalPosition;
498
+
499
+ if( accumIL + stepW <= this.elWidth ) {
500
+
501
+ il = accumIL;
502
+ it = accumIT;
503
+ accumIL += stepW;
504
+
505
+ }
506
+ else {
507
+
508
+ accumIT += this.itemSize.height + this.options.gutter;
509
+ il = 0;
510
+ it = accumIT;
511
+ accumIL = stepW;
512
+
513
+ }
514
+
515
+ fp.left = il;
516
+ fp.top = it;
517
+
518
+ var $el = $( elem.el );
519
+
520
+ if(p.name !== this.pileName ) {
521
+
522
+ $el.css( { left : p.position.left, top : p.position.top } );
523
+
524
+ }
525
+ else {
526
+
527
+ lastItemTop = elem.finalPosition.top;
528
+ $el.css( { left : elem.finalPosition.left, top : lastItemTop } );
529
+
530
+ }
531
+
532
+ }
533
+
534
+ }
535
+
536
+ if( ml === 0 ) {
537
+ ml = Math.ceil( ( this.elWidth - accumL + this.options.gutter ) / 2 );
538
+ }
539
+
540
+ // the position of the items will influence the final margin left value and height for the ul
541
+ // center the ul
542
+ lastItemTop = this.spread ? lastItemTop : accumT;
543
+ this.el.css( {
544
+ marginLeft : ml,
545
+ height : lastItemTop + this.itemSize.height
546
+ } );
547
+
548
+ },
549
+ _openPile : function() {
550
+
551
+ if( !this.spread ) {
552
+ return false;
553
+ }
554
+
555
+ // final style
556
+ var fs;
557
+
558
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
559
+
560
+ var p = this.pilesArr[j],
561
+
562
+ //for( var pile in this.piles ) {
563
+ //
564
+ // var p = this.piles[ pile ],
565
+
566
+ cnt = 0;
567
+
568
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
569
+
570
+ var elem = p.elements[i],
571
+ $item = $( elem.el ),
572
+ $img = $item.find( 'img' ),
573
+ styleCSS = p.name === this.pileName ? {
574
+ zIndex : 9999,
575
+ visibility : 'visible',
576
+ transition : this.support ? 'left ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', top ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.openSpeed + 'ms ' + ( ( len - i - 1 ) * this.options.delay ) + 'ms ' + this.options.pileAnimation.openEasing : 'none'
577
+ } : {
578
+ zIndex : 1,
579
+ transition : this.support ? 'opacity ' + this.options.otherPileAnimation.closeSpeed + 'ms ' + this.options.otherPileAnimation.closeEasing : 'none'
580
+ };
581
+
582
+ if( p.name === this.pileName ) {
583
+
584
+ if( $item.data( 'front' ) ) {
585
+ $item.find( 'div.tp-title' ).hide();
586
+ }
587
+
588
+ if( i < len - 1 ) {
589
+ $img.css( 'visibility', 'visible' );
590
+ }
591
+
592
+ fs = elem.finalPosition;
593
+ fs.transform = this.options.randomAngle && i !== p.index ? 'rotate(' + Math.floor( Math.random() * ( 5 + 5 + 1 ) - 5 ) + 'deg)' : 'none';
594
+
595
+ if( !this.support ) {
596
+ $item.css( 'transform', 'none' );
597
+ }
598
+
599
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
600
+ if( i < len - 3 ) {
601
+ $item.css( 'box-shadow', 'none' );
602
+ }
603
+
604
+ }
605
+ else if( i < len - 1 ) {
606
+ $img.css( 'visibility', 'hidden' );
607
+ }
608
+
609
+ $item.css( styleCSS );
610
+
611
+ var self = this;
612
+
613
+ p.name === this.pileName ?
614
+ this._applyTransition( $item, fs, this.options.pileAnimation.openSpeed, function( evt ) {
615
+
616
+ var target = this.target || this.nodeName;
617
+ if( target !== 'LI' ) {
618
+ return;
619
+ }
620
+
621
+ var $el = $( this );
622
+
623
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
624
+ $el.css( 'box-shadow', $el.data( 'shadow' ) );
625
+
626
+ if( self.support ) {
627
+ $el.off( self.transEndEventName );
628
+ }
629
+
630
+ ++cnt;
631
+
632
+ if( cnt === $el.data( 'pileCount' ) ) {
633
+
634
+ $( document ).one( 'mousemove.stapel', function() {
635
+ self.el.addClass( 'tp-open' );
636
+ } );
637
+ self.options.onAfterOpen( self.pileName, cnt );
638
+
639
+ }
640
+
641
+ } ) :
642
+ this._applyTransition( $item, { opacity : 0 }, this.options.otherPileAnimation.closeSpeed );
643
+
644
+ }
645
+
646
+ }
647
+
648
+ this.el.css( 'height', fs.top + this.itemSize.height );
649
+
650
+ },
651
+ _closePile : function() {
652
+
653
+ var self = this;
654
+
655
+ // close..
656
+ if( this.spread ) {
657
+
658
+ this.spread = false;
659
+
660
+ this.options.onBeforeClose( this.pileName );
661
+
662
+ this.el.removeClass( 'tp-open' );
663
+
664
+ // final style
665
+ var fs;
666
+ for (var j =0, pile_len = this.pilesArr.length; j < pile_len; j++){
667
+
668
+ var p = this.pilesArr[j],
669
+
670
+ //for( var pile in this.piles ) {
671
+ //
672
+ // var p = this.piles[ pile ],
673
+
674
+ cnt = 0;
675
+
676
+ for( var i = 0, len = p.elements.length; i < len; ++i ) {
677
+
678
+ var $item = $( p.elements[i].el ),
679
+ styleCSS = p.name === this.pileName ? {
680
+ transition : this.support ? 'left ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', top ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing + ', ' + this.transformName + ' ' + this.options.pileAnimation.closeSpeed + 'ms ' + this.options.pileAnimation.closeEasing : 'none'
681
+ } : {
682
+ transition : this.support ? 'opacity ' + this.options.otherPileAnimation.openSpeed + 'ms ' + this.options.otherPileAnimation.openEasing : 'none'
683
+ };
684
+
685
+ $item.css( styleCSS );
686
+
687
+ fs = p.position;
688
+
689
+ if(p.name === this.pileName ) {
690
+
691
+ $.extend( fs, $item.data( 'initialStyle' ) );
692
+
693
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
694
+ if( i < len - 3 ) {
695
+ $item.css( 'box-shadow', 'none' );
696
+ }
697
+
698
+ }
699
+
700
+ p.name === this.pileName ? this._applyTransition( $item, fs, this.options.pileAnimation.closeSpeed, function( evt ) {
701
+
702
+ var target = this.target || this.nodeName;
703
+ if( target !== 'LI' ) {
704
+ return;
705
+ }
706
+
707
+ var $el = $( this ), extraStyle = $el.data( 'extraStyle' );
708
+
709
+ // hack: remove box-shadow while animating to prevent the shadow stack effect
710
+ $el.css( 'box-shadow', $el.data( 'shadow' ) );
711
+
712
+ if( self.support ) {
713
+ $el.off( self.transEndEventName );
714
+ self._applyInitialTransition( $el );
715
+ }
716
+ else {
717
+ $el.css( $el.data( 'initialStyle' ) );
718
+ }
719
+
720
+ if( extraStyle ) {
721
+ $el.css( extraStyle );
722
+ }
723
+
724
+ ++cnt;
725
+
726
+ if( $el.data( 'front' ) ) {
727
+ $el.find( 'div.tp-title' ).show();
728
+ }
729
+
730
+ if( cnt === $el.data( 'pileCount' ) ) {
731
+ self.options.onAfterClose( $el.data( 'pileName' ), cnt );
732
+ }
733
+
734
+ } ) : this._applyTransition( $item, { opacity : 1 }, this.options.otherPileAnimation.openSpeed, function( evt ) {
735
+
736
+ var target = this.target || this.nodeName;
737
+ if( target !== 'LI' ) {
738
+ return;
739
+ }
740
+
741
+ var $el = $( this );
742
+
743
+ if( $el.index() < len - 1 ) {
744
+ $el.find( 'img' ).css( 'visibility', 'visible' );
745
+ }
746
+
747
+ if( self.support ) {
748
+ $el.off( self.transEndEventName );
749
+ self._applyInitialTransition( $el );
750
+ }
751
+
752
+ } );
753
+
754
+ }
755
+
756
+ }
757
+
758
+ // reset pile name
759
+ this.pileName = '';
760
+
761
+ // update ul height
762
+ this.el.css( 'height', fs.top + this.itemSize.height );
763
+
764
+ }
765
+
766
+ return false;
767
+
768
+ },
769
+ _resize : function() {
770
+
771
+ // get ul size again
772
+ this._getSize();
773
+ // reset items positions
774
+ this._setItemsPosition();
775
+
776
+ },
777
+ _applyTransition : function( el, styleCSS, speed, fncomplete ) {
778
+
779
+ $.fn.applyStyle = this.support ? $.fn.css : $.fn.animate;
780
+
781
+ if( fncomplete && this.support ) {
782
+
783
+ el.on( this.transEndEventName, fncomplete );
784
+
785
+ }
786
+
787
+ fncomplete = fncomplete || function() { return false; };
788
+
789
+ el.stop().applyStyle( styleCSS, $.extend( true, [], { duration : speed + 'ms', complete : fncomplete } ) );
790
+
791
+ },
792
+ closePile : function() {
793
+
794
+ this._closePile();
795
+
796
+ }
797
+
798
+ };
799
+
800
+ var logError = function( message ) {
801
+
802
+ if ( window.console ) {
803
+
804
+ window.console.error( message );
805
+
806
+ }
807
+
808
+ };
809
+
810
+ $.fn.stapel = function( options ) {
811
+
812
+ var instance = $.data( this, 'stapel' );
813
+
814
+ if ( typeof options === 'string' ) {
815
+
816
+ var args = Array.prototype.slice.call( arguments, 1 );
817
+
818
+ this.each(function() {
819
+
820
+ if ( !instance ) {
821
+
822
+ logError( "cannot call methods on stapel prior to initialization; " +
823
+ "attempted to call method '" + options + "'" );
824
+ return;
825
+
826
+ }
827
+
828
+ if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
829
+
830
+ logError( "no such method '" + options + "' for stapel instance" );
831
+ return;
832
+
833
+ }
834
+
835
+ instance[ options ].apply( instance, args );
836
+
837
+ });
838
+
839
+ }
840
+ else {
841
+
842
+ this.each(function() {
843
+
844
+ if ( instance ) {
845
+
846
+ instance._init();
847
+
848
+ }
849
+ else {
850
+
851
+ instance = $.data( this, 'stapel', new $.Stapel( options, this ) );
852
+
853
+ }
854
+
855
+ });
856
+
857
+ }
858
+
859
+ return instance;
860
+
861
+ };
862
+
863
  } )( jQuery, window );
extensions/albums/public/class-foogallery-album-template-loader.php CHANGED
@@ -1,184 +1,184 @@
1
- <?php
2
-
3
- /**
4
- * Template loader for FooGallery Albums
5
- *
6
- * @package FooGallery
7
- * @author Brad vincent
8
- */
9
- class FooGallery_Album_Template_Loader {
10
-
11
- /**
12
- * Locates and renders the album based on the template
13
- * Will look in the following locations
14
- * wp-content/themes/{child-theme}/foogallery/album-{template}.php
15
- * wp-content/themes/{theme}/foogallery/album-{template}.php
16
- * wp-content/plugins/foogallery/templates/album-{template}.php
17
- *
18
- * @param $args array Arguments passed in from the shortcode
19
- */
20
- public function render_template( $args ) {
21
- //do some work before we locate the template
22
- global $current_foogallery_album;
23
- global $current_foogallery_album_arguments;
24
- global $current_foogallery_album_template;
25
-
26
- //set the arguments
27
- $current_foogallery_album_arguments = $args;
28
-
29
- //load our album
30
- $current_foogallery_album = $this->find_album( $args );
31
-
32
- if ( false === $current_foogallery_album ) {
33
- _e( 'Could not load the album!', 'foogallery' );
34
- return;
35
- }
36
-
37
- //find the gallery template we will use to render the gallery
38
- $current_foogallery_album_template = $this->get_arg( $args, 'template', $current_foogallery_album->album_template );
39
-
40
- //set a default if we have no gallery template
41
- if ( empty($current_foogallery_album_template) ) {
42
- $current_foogallery_album_template = foogallery_get_default( 'album_template' );
43
- }
44
-
45
- //if we still have not default, then use the first one we can find
46
- if ( empty($current_foogallery_album_template) ) {
47
- $available_templates = foogallery_album_templates();
48
- $current_foogallery_album_template = $available_templates[0]['slug'];
49
- }
50
-
51
- //check if we have any galleries
52
- if ( ! $current_foogallery_album->has_galleries() ) {
53
- //no galleries!
54
- do_action( "foogallery_album_template_no_galleries-($current_foogallery_album_template)", $current_foogallery_album );
55
- } else {
56
-
57
- //create locator instance
58
- $instance_name = FOOGALLERY_SLUG . '_album_templates';
59
- $loader = new Foo_Plugin_File_Locator_v1( $instance_name, FOOGALLERY_FILE, 'templates', FOOGALLERY_SLUG );
60
-
61
- //allow extensions to very easily add pickup locations for their files
62
- $this->add_extension_pickup_locations( $loader, apply_filters( $instance_name . '_files', array() ) );
63
-
64
- if ( false !== ($template_location = $loader->locate_file( "album-{$current_foogallery_album_template}.php" )) ) {
65
-
66
- //we have found a template!
67
- do_action( 'foogallery_located_album_template', $current_foogallery_album );
68
- do_action( "foogallery_located_album_template-{$current_foogallery_album_template}", $current_foogallery_album );
69
-
70
- //try to include some JS
71
- if ( false !== ($js_location = $loader->locate_file( "album-{$current_foogallery_album_template}.js" )) ) {
72
- wp_enqueue_script( "foogallery-album-template-{$current_foogallery_album_template}", $js_location['url'] );
73
- }
74
-
75
- //try to include some CSS
76
- if ( false !== ($css_location = $loader->locate_file( "album-{$current_foogallery_album_template}.css" )) ) {
77
- wp_enqueue_style( "foogallery-album-template-{$current_foogallery_album_template}", $css_location['url'] );
78
- }
79
-
80
- //finally include the actual php template!
81
- if ( $template_location ) {
82
- load_template( $template_location['path'], false );
83
- }
84
-
85
- //we have loaded all files, now let extensions do some stuff
86
- do_action( "foogallery_loaded_album_template", $current_foogallery_album );
87
- do_action( "foogallery_loaded_album_template-($current_foogallery_album_template)", $current_foogallery_album );
88
-
89
- } else {
90
- //we could not find a template!
91
- _e( 'No album template found!', 'foogallery' );
92
- }
93
- }
94
- }
95
-
96
- /**
97
- * Add pickup locations to the loader to make it easier for extensions
98
- *
99
- * @param $loader Foo_Plugin_File_Locator_v1
100
- * @param $extension_files array
101
- */
102
- function add_extension_pickup_locations( $loader, $extension_files ) {
103
- if ( count( $extension_files ) > 0 ) {
104
- $position = 120;
105
- foreach ( $extension_files as $file ) {
106
-
107
- //add pickup location for php template
108
- $loader->add_location( $position, array(
109
- 'path' => trailingslashit( plugin_dir_path( $file ) ),
110
- 'url' => trailingslashit( plugin_dir_url( $file ) )
111
- ) );
112
-
113
- $position++;
114
-
115
- //add pickup location for extensions js folder
116
- $loader->add_location( $position, array(
117
- 'path' => trailingslashit( plugin_dir_path( $file ) . 'js' ),
118
- 'url' => trailingslashit( plugin_dir_url( $file ) . 'js' )
119
- ) );
120
-
121
- $position++;
122
-
123
- //add pickup location for extension css folder
124
- $loader->add_location( $position, array(
125
- 'path' => trailingslashit( plugin_dir_path( $file ) . 'css' ),
126
- 'url' => trailingslashit( plugin_dir_url( $file ) . 'css' )
127
- ) );
128
-
129
- $position++;
130
-
131
- }
132
- }
133
- }
134
-
135
- /**
136
- * load the gallery based on either the id or slug, passed in via arguments
137
- *
138
- * @param $args array Arguments passed in from the shortcode
139
- *
140
- * @return bool|FooGallery The gallery object we want to render
141
- */
142
- function find_album( $args ) {
143
-
144
- $id = intval( $this->get_arg( $args, 'id' ), 0 );
145
-
146
- if ( $id > 0 ) {
147
-
148
- //load album by ID
149
- return FooGalleryAlbum::get_by_id( $id );
150
-
151
- } else {
152
-
153
- //take into account the cases where id is passed in via the 'album' attribute
154
- $album = $this->get_arg( 'album', 0 );
155
-
156
- if ( intval( $album ) > 0 ) {
157
- //we have an id, so load
158
- return FooGalleryAlbum::get_by_id( intval( $album ) );
159
- }
160
-
161
- //we are dealing with a slug
162
- return FooGalleryAlbum::get_by_slug( $album );
163
- }
164
- }
165
-
166
- /**
167
- * Helper to get an argument value from an array arguments
168
- *
169
- * @param $args Array the array of arguments to search
170
- * @param $key string the key of the argument you are looking for
171
- * @param $default string a default value if the argument is not found
172
- *
173
- * @return string
174
- */
175
- function get_arg( $args, $key, $default = '' ) {
176
- if ( empty($args)
177
- || !is_array( $args )
178
- || !array_key_exists( $key, $args ) ) {
179
- return $default;
180
- }
181
-
182
- return $args[ $key ];
183
- }
184
- }
1
+ <?php
2
+
3
+ /**
4
+ * Template loader for FooGallery Albums
5
+ *
6
+ * @package FooGallery
7
+ * @author Brad vincent
8
+ */
9
+ class FooGallery_Album_Template_Loader {
10
+
11
+ /**
12
+ * Locates and renders the album based on the template
13
+ * Will look in the following locations
14
+ * wp-content/themes/{child-theme}/foogallery/album-{template}.php
15
+ * wp-content/themes/{theme}/foogallery/album-{template}.php
16
+ * wp-content/plugins/foogallery/templates/album-{template}.php
17
+ *
18
+ * @param $args array Arguments passed in from the shortcode
19
+ */
20
+ public function render_template( $args ) {
21
+ //do some work before we locate the template
22
+ global $current_foogallery_album;
23
+ global $current_foogallery_album_arguments;
24
+ global $current_foogallery_album_template;
25
+
26
+ //set the arguments
27
+ $current_foogallery_album_arguments = $args;
28
+
29
+ //load our album
30
+ $current_foogallery_album = $this->find_album( $args );
31
+
32
+ if ( false === $current_foogallery_album ) {
33
+ _e( 'Could not load the album!', 'foogallery' );
34
+ return;
35
+ }
36
+
37
+ //find the gallery template we will use to render the gallery
38
+ $current_foogallery_album_template = $this->get_arg( $args, 'template', $current_foogallery_album->album_template );
39
+
40
+ //set a default if we have no gallery template
41
+ if ( empty($current_foogallery_album_template) ) {
42
+ $current_foogallery_album_template = foogallery_get_default( 'album_template' );
43
+ }
44
+
45
+ //if we still have not default, then use the first one we can find
46
+ if ( empty($current_foogallery_album_template) ) {
47
+ $available_templates = foogallery_album_templates();
48
+ $current_foogallery_album_template = $available_templates[0]['slug'];
49
+ }
50
+
51
+ //check if we have any galleries
52
+ if ( ! $current_foogallery_album->has_galleries() ) {
53
+ //no galleries!
54
+ do_action( "foogallery_album_template_no_galleries-($current_foogallery_album_template)", $current_foogallery_album );
55
+ } else {
56
+
57
+ //create locator instance
58
+ $instance_name = FOOGALLERY_SLUG . '_album_templates';
59
+ $loader = new Foo_Plugin_File_Locator_v1( $instance_name, FOOGALLERY_FILE, 'templates', FOOGALLERY_SLUG );
60
+
61
+ //allow extensions to very easily add pickup locations for their files
62
+ $this->add_extension_pickup_locations( $loader, apply_filters( $instance_name . '_files', array() ) );
63
+
64
+ if ( false !== ($template_location = $loader->locate_file( "album-{$current_foogallery_album_template}.php" )) ) {
65
+
66
+ //we have found a template!
67
+ do_action( 'foogallery_located_album_template', $current_foogallery_album );
68
+ do_action( "foogallery_located_album_template-{$current_foogallery_album_template}", $current_foogallery_album );
69
+
70
+ //try to include some JS
71
+ if ( false !== ($js_location = $loader->locate_file( "album-{$current_foogallery_album_template}.js" )) ) {
72
+ wp_enqueue_script( "foogallery-album-template-{$current_foogallery_album_template}", $js_location['url'] );
73
+ }
74
+
75
+ //try to include some CSS
76
+ if ( false !== ($css_location = $loader->locate_file( "album-{$current_foogallery_album_template}.css" )) ) {
77
+ wp_enqueue_style( "foogallery-album-template-{$current_foogallery_album_template}", $css_location['url'] );
78
+ }
79
+
80
+ //finally include the actual php template!
81
+ if ( $template_location ) {
82
+ load_template( $template_location['path'], false );
83
+ }
84
+
85
+ //we have loaded all files, now let extensions do some stuff
86
+ do_action( "foogallery_loaded_album_template", $current_foogallery_album );
87
+ do_action( "foogallery_loaded_album_template-($current_foogallery_album_template)", $current_foogallery_album );
88
+
89
+ } else {
90
+ //we could not find a template!
91
+ _e( 'No album template found!', 'foogallery' );
92
+ }
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Add pickup locations to the loader to make it easier for extensions
98
+ *
99
+ * @param $loader Foo_Plugin_File_Locator_v1
100
+ * @param $extension_files array
101
+ */
102
+ function add_extension_pickup_locations( $loader, $extension_files ) {
103
+ if ( count( $extension_files ) > 0 ) {
104
+ $position = 120;
105
+ foreach ( $extension_files as $file ) {
106
+
107
+ //add pickup location for php template
108
+ $loader->add_location( $position, array(
109
+ 'path' => trailingslashit( plugin_dir_path( $file ) ),
110
+ 'url' => trailingslashit( plugin_dir_url( $file ) )
111
+ ) );
112
+
113
+ $position++;
114
+
115
+ //add pickup location for extensions js folder
116
+ $loader->add_location( $position, array(
117
+ 'path' => trailingslashit( plugin_dir_path( $file ) . 'js' ),
118
+ 'url' => trailingslashit( plugin_dir_url( $file ) . 'js' )
119
+ ) );
120
+
121
+ $position++;
122
+
123
+ //add pickup location for extension css folder
124
+ $loader->add_location( $position, array(
125
+ 'path' => trailingslashit( plugin_dir_path( $file ) . 'css' ),
126
+ 'url' => trailingslashit( plugin_dir_url( $file ) . 'css' )
127
+ ) );
128
+
129
+ $position++;
130
+
131
+ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * load the gallery based on either the id or slug, passed in via arguments
137
+ *
138
+ * @param $args array Arguments passed in from the shortcode
139
+ *
140
+ * @return bool|FooGallery The gallery object we want to render
141
+ */
142
+ function find_album( $args ) {
143
+
144
+ $id = intval( $this->get_arg( $args, 'id' ), 0 );
145
+
146
+ if ( $id > 0 ) {
147
+
148
+ //load album by ID
149
+ return FooGalleryAlbum::get_by_id( $id );
150
+
151
+ } else {
152
+
153
+ //take into account the cases where id is passed in via the 'album' attribute
154
+ $album = $this->get_arg( 'album', 0 );
155
+
156
+ if ( intval( $album ) > 0 ) {
157
+ //we have an id, so load
158
+ return FooGalleryAlbum::get_by_id( intval( $album ) );
159
+ }
160
+
161
+ //we are dealing with a slug
162
+ return FooGalleryAlbum::get_by_slug( $album );
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Helper to get an argument value from an array arguments
168
+ *
169
+ * @param $args Array the array of arguments to search
170
+ * @param $key string the key of the argument you are looking for
171
+ * @param $default string a default value if the argument is not found
172
+ *
173
+ * @return string
174
+ */
175
+ function get_arg( $args, $key, $default = '' ) {
176
+ if ( empty($args)
177
+ || !is_array( $args )
178
+ || !array_key_exists( $key, $args ) ) {
179
+ return $default;
180
+ }
181
+
182
+ return $args[ $key ];
183
+ }
184
+ }
extensions/albums/public/class-rewrite-rules.php CHANGED
@@ -1,17 +1,17 @@
1
- <?php
2
- /**
3
- * FooGallery Album Rewrite Rules
4
- */
5
- if (!class_exists('FooGallery_Album_Rewrite_Rules')) {
6
-
7
- class FooGallery_Album_Rewrite_Rules {
8
-
9
- function __construct() {
10
- add_action( 'init', array( $this, 'add_gallery_endpoint' ) );
11
- }
12
-
13
- function add_gallery_endpoint() {
14
- add_rewrite_endpoint( foogallery_album_gallery_url_slug(), EP_ALL );
15
- }
16
- }
17
  }
1
+ <?php
2
+ /**
3
+ * FooGallery Album Rewrite Rules
4
+ */
5
+ if (!class_exists('FooGallery_Album_Rewrite_Rules')) {
6
+
7
+ class FooGallery_Album_Rewrite_Rules {
8
+
9
+ function __construct() {
10
+ add_action( 'init', array( $this, 'add_gallery_endpoint' ) );
11
+ }
12
+
13
+ function add_gallery_endpoint() {
14
+ add_rewrite_endpoint( foogallery_album_gallery_url_slug(), EP_ALL );
15
+ }
16
+ }
17
  }
extensions/albums/public/class-shortcodes.php CHANGED
@@ -1,48 +1,48 @@
1
- <?php
2
- /*
3
- * FooGallery Album Shortcode
4
- */
5
-
6
- if ( ! class_exists( 'FooGallery_Album_Shortcodes' ) ) {
7
-
8
- class FooGallery_Album_Shortcodes {
9
-
10
- function __construct() {
11
- add_action( 'init', array( $this, 'init_shortcode' ) );
12
- add_action( 'foogallery_loaded_album_template', array( $this, 'render_custom_css' ) );
13
- }
14
-
15
- function init_shortcode() {
16
- add_shortcode( foogallery_album_shortcode_tag(), array( $this, 'render_foogallery_album_shortcode' ) );
17
- }
18
-
19
- function render_foogallery_album_shortcode( $atts ) {
20
-
21
- $args = wp_parse_args( $atts, array(
22
- 'id' => 0,
23
- 'album' => '',
24
- ) );
25
-
26
- $args = apply_filters( 'foogallery-album_shortcode_atts', $args );
27
-
28
- //create new instance of template engine
29
- $engine = new FooGallery_Album_Template_Loader();
30
-
31
- ob_start();
32
-
33
- $engine->render_template( $args );
34
-
35
- $output_string = ob_get_contents();
36
- ob_end_clean();
37
- return $output_string;
38
- }
39
-
40
- function render_custom_css( $foogallery_album ) {
41
- if ( !empty( $foogallery_album->custom_css ) ) {
42
- echo '<style type="text/css">';
43
- echo $foogallery_album->custom_css;
44
- echo '</style>';
45
- }
46
- }
47
- }
48
- }
1
+ <?php
2
+ /*
3
+ * FooGallery Album Shortcode
4
+ */
5
+
6
+ if ( ! class_exists( 'FooGallery_Album_Shortcodes' ) ) {
7
+
8
+ class FooGallery_Album_Shortcodes {
9
+
10
+ function __construct() {
11
+ add_action( 'init', array( $this, 'init_shortcode' ) );
12
+ add_action( 'foogallery_loaded_album_template', array( $this, 'render_custom_css' ) );
13
+ }
14
+
15
+ function init_shortcode() {
16
+ add_shortcode( foogallery_album_shortcode_tag(), array( $this, 'render_foogallery_album_shortcode' ) );
17
+ }
18
+
19
+ function render_foogallery_album_shortcode( $atts ) {
20
+
21
+ $args = wp_parse_args( $atts, array(
22
+ 'id' => 0,
23
+ 'album' => '',
24
+ ) );
25
+
26
+ $args = apply_filters( 'foogallery-album_shortcode_atts', $args );
27
+
28
+ //create new instance of template engine
29
+ $engine = new FooGallery_Album_Template_Loader();
30
+
31
+ ob_start();
32
+
33
+ $engine->render_template( $args );
34
+
35
+ $output_string = ob_get_contents();
36
+ ob_end_clean();
37
+ return $output_string;
38
+ }
39
+
40
+ function render_custom_css( $foogallery_album ) {
41
+ if ( !empty( $foogallery_album->custom_css ) ) {
42
+ echo '<style type="text/css">';
43
+ echo $foogallery_album->custom_css;
44
+ echo '</style>';
45
+ }
46
+ }
47
+ }
48
+ }
extensions/default-templates/class-default-templates-extension.php CHANGED
@@ -1,13 +1,13 @@
1
- <?php
2
- /**
3
- * Legacy Default Extensions Class for previous versions where the default templates were an extension.
4
- * The class is now empty and has no logic. It is purely here so that existing installs do not break
5
- */
6
-
7
- if ( ! class_exists( 'FooGallery_Default_Templates_Extension' ) ) {
8
-
9
- class FooGallery_Default_Templates_Extension {
10
- function __construct() {
11
- }
12
- }
13
- }
1
+ <?php
2
+ /**
3
+ * Legacy Default Extensions Class for previous versions where the default templates were an extension.
4
+ * The class is now empty and has no logic. It is purely here so that existing installs do not break
5
+ */
6
+
7
+ if ( ! class_exists( 'FooGallery_Default_Templates_Extension' ) ) {
8
+
9
+ class FooGallery_Default_Templates_Extension {
10
+ function __construct() {
11
+ }
12
+ }
13
+ }
extensions/default-templates/class-default-templates.php CHANGED
@@ -1,52 +1,52 @@
1
- <?php
2
- /**
3
- * Class to include and init default templates.
4
- * The templates are no longer an extension and are built in and included by default
5
- */
6
-
7
- if ( ! class_exists( 'FooGallery_Default_Templates' ) ) {
8
-
9
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL', plugin_dir_url( __FILE__ ) );
10
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH', plugin_dir_path( __FILE__ ) );
11
-
12
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL . 'shared/' );
13
- define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_PATH', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'shared/' );
14
-
15
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'functions.php' );
16
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'default/class-default-gallery-template.php' );
17
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'image-viewer/class-image-viewer-gallery-template.php' );
18
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'justified/class-justified-gallery-template.php' );
19
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'masonry/class-masonry-gallery-template.php' );
20
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'simple-portfolio/class-simple-portfolio-gallery-template.php' );
21
- require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'thumbnail/class-thumbnail-gallery-template.php' );
22
-
23
- class FooGallery_Default_Templates {
24
-
25
- function __construct() {
26
- new FooGallery_Default_Gallery_Template();
27
- new FooGallery_Image_Viewer_Gallery_Template();
28
- new FooGallery_Justified_Gallery_Template();
29
- new FooGallery_Masonry_Gallery_Template();
30
- new FooGallery_Simple_Portfolio_Gallery_Template();
31
- new FooGallery_Thumbnail_Gallery_Template();
32
-
33
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
34
- }
35
-
36
- /***
37
- * Enqueue the assets needed by the default templates
38
- * @param $hook_suffix
39
- */
40
- function enqueue_assets( $hook_suffix ){
41
- if( in_array( $hook_suffix, array( 'post.php', 'post-new.php' ) ) ) {
42
- $screen = get_current_screen();
43
-
44
- if ( is_object( $screen ) && FOOGALLERY_CPT_GALLERY == $screen->post_type ){
45
-
46
- // Register, enqueue scripts and styles here
47
- wp_enqueue_style( 'foogallery-core-admin-settings', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/admin-foogallery.css', array(), FOOGALLERY_VERSION );
48
- }
49
- }
50
- }
51
- }
52
- }
1
+ <?php
2
+ /**
3
+ * Class to include and init default templates.
4
+ * The templates are no longer an extension and are built in and included by default
5
+ */
6
+
7
+ if ( ! class_exists( 'FooGallery_Default_Templates' ) ) {
8
+
9
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL', plugin_dir_url( __FILE__ ) );
10
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH', plugin_dir_path( __FILE__ ) );
11
+
12
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_URL . 'shared/' );
13
+ define( 'FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_PATH', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'shared/' );
14
+
15
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'functions.php' );
16
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'default/class-default-gallery-template.php' );
17
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'image-viewer/class-image-viewer-gallery-template.php' );
18
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'justified/class-justified-gallery-template.php' );
19
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'masonry/class-masonry-gallery-template.php' );
20
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'simple-portfolio/class-simple-portfolio-gallery-template.php' );
21
+ require_once( FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_PATH . 'thumbnail/class-thumbnail-gallery-template.php' );
22
+
23
+ class FooGallery_Default_Templates {
24
+
25
+ function __construct() {
26
+ new FooGallery_Default_Gallery_Template();
27
+ new FooGallery_Image_Viewer_Gallery_Template();
28
+ new FooGallery_Justified_Gallery_Template();
29
+ new FooGallery_Masonry_Gallery_Template();
30
+ new FooGallery_Simple_Portfolio_Gallery_Template();
31
+ new FooGallery_Thumbnail_Gallery_Template();
32
+
33
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
34
+ }
35
+
36
+ /***
37
+ * Enqueue the assets needed by the default templates
38
+ * @param $hook_suffix
39
+ */
40
+ function enqueue_assets( $hook_suffix ){
41
+ if( in_array( $hook_suffix, array( 'post.php', 'post-new.php' ) ) ) {
42
+ $screen = get_current_screen();
43
+
44
+ if ( is_object( $screen ) && FOOGALLERY_CPT_GALLERY == $screen->post_type ){
45
+
46
+ // Register, enqueue scripts and styles here
47
+ wp_enqueue_style( 'foogallery-core-admin-settings', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/admin-foogallery.css', array(), FOOGALLERY_VERSION );
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
extensions/default-templates/default/class-default-gallery-template.php CHANGED
@@ -1,203 +1,220 @@
1
- <?php
2
-
3
- if ( !class_exists( 'FooGallery_Default_Gallery_Template' ) ) {
4
-
5
- define('FOOGALLERY_DEFAULT_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
-
7
- class FooGallery_Default_Gallery_Template {
8
- /**
9
- * Wire up everything we need to run the extension
10
- */
11
- function __construct() {
12
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
-
14
- add_action( 'foogallery_located_template-default', array( $this, 'enqueue_dependencies' ) );
15
-
16
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
17
-
18
- //build up any preview arguments
19
- add_filter( 'foogallery_preview_arguments-default', array( $this, 'preview_arguments' ), 10, 2 );
20
-
21
- //build up the thumb dimensions from some arguments
22
- add_filter( 'foogallery_calculate_thumbnail_dimensions-default', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
23
-
24
- //build up the thumb dimensions on save
25
- add_filter( 'foogallery_template_thumbnail_dimensions-default', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
26
- }
27
-
28
- /**
29
- * Register myself so that all associated JS and CSS files can be found and automatically included
30
- * @param $extensions
31
- *
32
- * @return array
33
- */
34
- function register_myself( $extensions ) {
35
- $extensions[] = __FILE__;
36
- return $extensions;
37
- }
38
-
39
- /**
40
- * Add our gallery template to the list of templates available for every gallery
41
- * @param $gallery_templates
42
- *
43
- * @return array
44
- */
45
- function add_template( $gallery_templates ) {
46
- $gallery_templates[] = array(
47
- 'slug' => 'default',
48
- 'name' => __( 'Responsive Image Gallery', 'foogallery' ),
49
- 'preview_support' => true,
50
- 'common_fields_support' => true,
51
- 'paging_support' => true,
52
- 'lazyload_support' => true,
53
- 'mandatory_classes' => 'fg-default',
54
- 'thumbnail_dimensions' => true,
55
- 'fields' => array(
56
- array(
57
- 'id' => 'thumbnail_dimensions',
58
- 'title' => __( 'Thumbnail Size', 'foogallery' ),
59
- 'desc' => __( 'Choose the size of your thumbnails.', 'foogallery' ),
60
- 'section' => __( 'General', 'foogallery' ),
61
- 'type' => 'thumb_size_no_crop',
62
- 'default' => array(
63
- 'width' => get_option( 'thumbnail_size_w' ),
64
- 'height' => get_option( 'thumbnail_size_h' ),
65
- ),
66
- 'row_data'=> array(
67
- 'data-foogallery-change-selector' => 'input',
68
- 'data-foogallery-preview' => 'shortcode'
69
- )
70
- ),
71
- array(
72
- 'id' => 'thumbnail_link',
73
- 'title' => __( 'Link To', 'foogallery' ),
74
- 'section' => __( 'General', 'foogallery' ),
75
- 'default' => 'image',
76
- 'type' => 'thumb_link',
77
- 'desc' => __( 'You can choose to link each thumbnail to the full size image, the image\'s attachment page, a custom URL, or you can choose to not link to anything.', 'foogallery' ),
78
- ),
79
- array(
80
- 'id' => 'lightbox',
81
- 'title' => __( 'Lightbox', 'foogallery' ),
82
- 'desc' => __( 'Choose which lightbox you want to use. The lightbox will generally only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
83
- 'section' => __( 'General', 'foogallery' ),
84
- 'type' => 'lightbox',
85
- 'default' => 'none',
86
- 'row_data'=> array(
87
- 'data-foogallery-change-selector' => 'select'
88
- )
89
- ),
90
- array(
91
- 'id' => 'lightbox_foobox_help',
92
- 'title' => __( 'FooBox Help', 'foogallery' ),
93
- 'desc' => __( 'The FooBox lightbox is a separate plugin.', 'foogallery' ),
94
- 'section' => __( 'General', 'foogallery' ),
95
- 'type' => 'help',
96
- 'row_data'=> array(
97
- 'data-foogallery-hidden' => true,
98
- 'data-foogallery-show-when-field' => 'lightbox',
99
- 'data-foogallery-show-when-field-value' => 'foobox'
100
- )
101
- ),
102
- array(
103
- 'id' => 'spacing',
104
- 'title' => __( 'Spacing', 'foogallery' ),
105
- 'desc' => __( 'The spacing or gap between thumbnails in the gallery.', 'foogallery' ),
106
- 'section' => __( 'General', 'foogallery' ),
107
- 'type' => 'select',
108
- 'default' => 'fg-gutter-10',
109
- 'choices' => array(
110
- 'fg-gutter-0' => __( 'none', 'foogallery' ),
111
- 'fg-gutter-5' => __( '5 pixels', 'foogallery' ),
112
- 'fg-gutter-10' => __( '10 pixels', 'foogallery' ),
113
- 'fg-gutter-15' => __( '15 pixels', 'foogallery' ),
114
- 'fg-gutter-20' => __( '20 pixels', 'foogallery' ),
115
- 'fg-gutter-25' => __( '25 pixels', 'foogallery' ),
116
- ),
117
- 'row_data'=> array(
118
- 'data-foogallery-change-selector' => 'select',
119
- 'data-foogallery-preview' => 'class'
120
- )
121
- ),
122
- array(
123
- 'id' => 'alignment',
124
- 'title' => __( 'Alignment', 'foogallery' ),
125
- 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery.', 'foogallery' ),
126
- 'section' => __( 'General', 'foogallery' ),
127
- 'default' => 'fg-center',
128
- 'type' => 'radio',
129
- 'spacer' => '<span class="spacer"></span>',
130
- 'choices' => array(
131
- 'fg-left' => __( 'Left', 'foogallery' ),
132
- 'fg-center' => __( 'Center', 'foogallery' ),
133
- 'fg-right' => __( 'Right', 'foogallery' ),
134
- ),
135
- 'row_data'=> array(
136
- 'data-foogallery-change-selector' => 'input:radio',
137
- 'data-foogallery-preview' => 'class'
138
- )
139
- )
140
- )
141
- );
142
-
143
- return $gallery_templates;
144
- }
145
-
146
- /**
147
- * Enqueue scripts that the default gallery template relies on
148
- */
149
- function enqueue_dependencies( $gallery ) {
150
- //enqueue core files
151
- foogallery_enqueue_core_gallery_template_style();
152
- foogallery_enqueue_core_gallery_template_script();
153
- }
154
-
155
- /**
156
- * Build up a arguments used in the preview of the gallery
157
- * @param $args
158
- * @param $post_data
159
- *
160
- * @return mixed
161
- */
162
- function preview_arguments( $args, $post_data ) {
163
- $args['thumbnail_dimensions'] = $post_data[FOOGALLERY_META_SETTINGS]['default_thumbnail_dimensions'];
164
- return $args;
165
- }
166
-
167
- /**
168
- * Builds thumb dimensions from arguments
169
- *
170
- * @param array $dimensions
171
- * @param array $arguments
172
- *
173
- * @return mixed
174
- */
175
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
176
- if ( array_key_exists( 'thumbnail_dimensions', $arguments) ) {
177
- return array(
178
- 'height' => intval($arguments['thumbnail_dimensions']['height']),
179
- 'width' => intval($arguments['thumbnail_dimensions']['width']),
180
- 'crop' => '1'
181
- );
182
- }
183
- return null;
184
- }
185
-
186
- /**
187
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
188
- *
189
- * @param array $dimensions
190
- * @param FooGallery $foogallery
191
- *
192
- * @return mixed
193
- */
194
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
195
- $dimensions = $foogallery->get_meta( 'default_thumbnail_dimensions', array(
196
- 'width' => get_option( 'thumbnail_size_w' ),
197
- 'height' => get_option( 'thumbnail_size_h' )
198
- ) );
199
- $dimensions['crop'] = true;
200
- return $dimensions;
201
- }
202
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  }
1
+ <?php
2
+
3
+ if ( !class_exists( 'FooGallery_Default_Gallery_Template' ) ) {
4
+
5
+ define('FOOGALLERY_DEFAULT_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
+
7
+ class FooGallery_Default_Gallery_Template {
8
+ /**
9
+ * Wire up everything we need to run the extension
10
+ */
11
+ function __construct() {
12
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
+
14
+ add_action( 'foogallery_located_template-default', array( $this, 'enqueue_dependencies' ) );
15
+
16
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
17
+
18
+ //build up any preview arguments
19
+ add_filter( 'foogallery_preview_arguments-default', array( $this, 'preview_arguments' ), 10, 2 );
20
+
21
+ //build up the thumb dimensions from some arguments
22
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-default', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
23
+
24
+ //build up the thumb dimensions on save
25
+ add_filter( 'foogallery_template_thumbnail_dimensions-default', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
26
+
27
+ //build up the arguments needed for rendering this template
28
+ add_filter( 'foogallery_gallery_template_arguments-default', array( $this, 'build_gallery_template_arguments' ) );
29
+ }
30
+
31
+ /**
32
+ * Register myself so that all associated JS and CSS files can be found and automatically included
33
+ * @param $extensions
34
+ *
35
+ * @return array
36
+ */
37
+ function register_myself( $extensions ) {
38
+ $extensions[] = __FILE__;
39
+ return $extensions;
40
+ }
41
+
42
+ /**
43
+ * Add our gallery template to the list of templates available for every gallery
44
+ * @param $gallery_templates
45
+ *
46
+ * @return array
47
+ */
48
+ function add_template( $gallery_templates ) {
49
+ $gallery_templates[] = array(
50
+ 'slug' => 'default',
51
+ 'name' => __( 'Responsive Image Gallery', 'foogallery' ),
52
+ 'preview_support' => true,
53
+ 'common_fields_support' => true,
54
+ 'paging_support' => true,
55
+ 'lazyload_support' => true,
56
+ 'mandatory_classes' => 'fg-default',
57
+ 'thumbnail_dimensions' => true,
58
+ 'fields' => array(
59
+ array(
60
+ 'id' => 'thumbnail_dimensions',
61
+ 'title' => __( 'Thumbnail Size', 'foogallery' ),
62
+ 'desc' => __( 'Choose the size of your thumbnails.', 'foogallery' ),
63
+ 'section' => __( 'General', 'foogallery' ),
64
+ 'type' => 'thumb_size_no_crop',
65
+ 'default' => array(
66
+ 'width' => get_option( 'thumbnail_size_w' ),
67
+ 'height' => get_option( 'thumbnail_size_h' ),
68
+ ),
69
+ 'row_data'=> array(
70
+ 'data-foogallery-change-selector' => 'input',
71
+ 'data-foogallery-preview' => 'shortcode'
72
+ )
73
+ ),
74
+ array(
75
+ 'id' => 'thumbnail_link',
76
+ 'title' => __( 'Link To', 'foogallery' ),
77
+ 'section' => __( 'General', 'foogallery' ),
78
+ 'default' => 'image',
79
+ 'type' => 'thumb_link',
80
+ 'desc' => __( 'You can choose to link each thumbnail to the full size image, the image\'s attachment page, a custom URL, or you can choose to not link to anything.', 'foogallery' ),
81
+ ),
82
+ array(
83
+ 'id' => 'lightbox',
84
+ 'title' => __( 'Lightbox', 'foogallery' ),
85
+ 'desc' => __( 'Choose which lightbox you want to use. The lightbox will generally only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
86
+ 'section' => __( 'General', 'foogallery' ),
87
+ 'type' => 'lightbox',
88
+ 'default' => 'none',
89
+ 'row_data'=> array(
90
+ 'data-foogallery-change-selector' => 'select'
91
+ )
92
+ ),
93
+ array(
94
+ 'id' => 'lightbox_foobox_help',
95
+ 'title' => __( 'FooBox Help', 'foogallery' ),
96
+ 'desc' => __( 'The FooBox lightbox is a separate plugin.', 'foogallery' ),
97
+ 'section' => __( 'General', 'foogallery' ),
98
+ 'type' => 'help',
99
+ 'row_data'=> array(
100
+ 'data-foogallery-hidden' => true,
101
+ 'data-foogallery-show-when-field' => 'lightbox',
102
+ 'data-foogallery-show-when-field-value' => 'foobox'
103
+ )
104
+ ),
105
+ array(
106
+ 'id' => 'spacing',
107
+ 'title' => __( 'Spacing', 'foogallery' ),
108
+ 'desc' => __( 'The spacing or gap between thumbnails in the gallery.', 'foogallery' ),
109
+ 'section' => __( 'General', 'foogallery' ),
110
+ 'type' => 'select',
111
+ 'default' => 'fg-gutter-10',
112
+ 'choices' => array(
113
+ 'fg-gutter-0' => __( 'none', 'foogallery' ),
114
+ 'fg-gutter-5' => __( '5 pixels', 'foogallery' ),
115
+ 'fg-gutter-10' => __( '10 pixels', 'foogallery' ),
116
+ 'fg-gutter-15' => __( '15 pixels', 'foogallery' ),
117
+ 'fg-gutter-20' => __( '20 pixels', 'foogallery' ),
118
+ 'fg-gutter-25' => __( '25 pixels', 'foogallery' ),
119
+ ),
120
+ 'row_data'=> array(
121
+ 'data-foogallery-change-selector' => 'select',
122
+ 'data-foogallery-preview' => 'class'
123
+ )
124
+ ),
125
+ array(
126
+ 'id' => 'alignment',
127
+ 'title' => __( 'Alignment', 'foogallery' ),
128
+ 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery.', 'foogallery' ),
129
+ 'section' => __( 'General', 'foogallery' ),
130
+ 'default' => 'fg-center',
131
+ 'type' => 'radio',
132
+ 'spacer' => '<span class="spacer"></span>',
133
+ 'choices' => array(
134
+ 'fg-left' => __( 'Left', 'foogallery' ),
135
+ 'fg-center' => __( 'Center', 'foogallery' ),
136
+ 'fg-right' => __( 'Right', 'foogallery' ),
137
+ ),
138
+ 'row_data'=> array(
139
+ 'data-foogallery-change-selector' => 'input:radio',
140
+ 'data-foogallery-preview' => 'class'
141
+ )
142
+ )
143
+ )
144
+ );
145
+
146
+ return $gallery_templates;
147
+ }
148
+
149
+ /**
150
+ * Enqueue scripts that the default gallery template relies on
151
+ */
152
+ function enqueue_dependencies( $gallery ) {
153
+ //enqueue core files
154
+ foogallery_enqueue_core_gallery_template_style();
155
+ foogallery_enqueue_core_gallery_template_script();
156
+ }
157
+
158
+ /**
159
+ * Build up a arguments used in the preview of the gallery
160
+ * @param $args
161
+ * @param $post_data
162
+ *
163
+ * @return mixed
164
+ */
165
+ function preview_arguments( $args, $post_data ) {
166
+ $args['thumbnail_dimensions'] = $post_data[FOOGALLERY_META_SETTINGS]['default_thumbnail_dimensions'];
167
+ return $args;
168
+ }
169
+
170
+ /**
171
+ * Builds thumb dimensions from arguments
172
+ *
173
+ * @param array $dimensions
174
+ * @param array $arguments
175
+ *
176
+ * @return mixed
177
+ */
178
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
179
+ if ( array_key_exists( 'thumbnail_dimensions', $arguments) ) {
180
+ return array(
181
+ 'height' => intval($arguments['thumbnail_dimensions']['height']),
182
+ 'width' => intval($arguments['thumbnail_dimensions']['width']),
183
+ 'crop' => '1'
184
+ );
185
+ }
186
+ return null;
187
+ }
188
+
189
+ /**
190
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
191
+ *
192
+ * @param array $dimensions
193
+ * @param FooGallery $foogallery
194
+ *
195
+ * @return mixed
196
+ */
197
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
198
+ $dimensions = $foogallery->get_meta( 'default_thumbnail_dimensions', array(
199
+ 'width' => get_option( 'thumbnail_size_w' ),
200
+ 'height' => get_option( 'thumbnail_size_h' )
201
+ ) );
202
+ $dimensions['crop'] = true;
203
+ return $dimensions;
204
+ }
205
+
206
+ /**
207
+ * Build up the arguments needed for rendering this gallery template
208
+ *
209
+ * @param $args
210
+ * @return array
211
+ */
212
+ function build_gallery_template_arguments( $args ) {
213
+ $args = foogallery_gallery_template_setting( 'thumbnail_dimensions', array() );
214
+ $args['crop'] = '1'; //we now force thumbs to be cropped
215
+ $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
216
+
217
+ return $args;
218
+ }
219
+ }
220
  }
extensions/default-templates/default/gallery-default.php CHANGED
@@ -1,22 +1,18 @@
1
- <?php
2
- /**
3
- * FooGallery default responsive gallery template
4
- */
5
- global $current_foogallery;
6
- global $current_foogallery_arguments;
7
-
8
- $args = foogallery_gallery_template_setting( 'thumbnail_dimensions', array() );
9
- $args['crop'] = '1'; //we now force thumbs to be cropped
10
- $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
11
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
12
- $spacing = foogallery_gallery_template_setting( 'spacing', 'spacing-width-10' );
13
- $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
14
-
15
- $foogallery_default_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $spacing, $alignment );
16
- $foogallery_default_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_default_classes ) );
17
-
18
- ?><div <?php echo $foogallery_default_attributes; ?>>
19
- <?php foreach ( $current_foogallery->attachments() as $attachment ) {
20
- echo foogallery_attachment_html( $attachment, $args );
21
- } ?>
22
- </div>
1
+ <?php
2
+ /**
3
+ * FooGallery default responsive gallery template
4
+ */
5
+ global $current_foogallery;
6
+
7
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
8
+ $spacing = foogallery_gallery_template_setting( 'spacing', 'spacing-width-10' );
9
+ $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
10
+
11
+ $foogallery_default_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $spacing, $alignment );
12
+ $foogallery_default_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_default_classes ) );
13
+
14
+ ?><div <?php echo $foogallery_default_attributes; ?>>
15
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
16
+ echo foogallery_attachment_html( $attachment );
17
+ } ?>
18
+ </div>
 
 
 
 
extensions/default-templates/default/js/admin-gallery-default.js CHANGED
@@ -1,89 +1,89 @@
1
- (function (FOOGALLERY_DEF_TEMPLATE, $, undefined) {
2
-
3
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses = function() {
4
-
5
- var $previewImage = $('.foogallery-default-preview'),
6
- border_style = $('input[name="foogallery_settings[default_border-style]"]:checked').val(),
7
- hover_effect = $('input[name="foogallery_settings[default_hover-effect]"]:checked').val(),
8
- hover_effect_type = $('input[name="foogallery_settings[default_hover-effect-type]"]:checked').val(),
9
- caption_effect_type = $('input[name="foogallery_settings[default_caption-hover-effect]"]:checked').val(),
10
- classNames = 'foogallery-default-preview foogallery-container foogallery-default ' + border_style + ' ' + hover_effect_type;
11
-
12
- var $hoverEffectrow = $('.gallery_template_field-default-hover-effect'),
13
- $captionHoverRow = $('.gallery_template_field-default-caption-hover-effect'),
14
- $captionContentRow = $('.gallery_template_field-default-caption-content');
15
-
16
- if ( hover_effect_type === '' ) {
17
- //icon hover effect type
18
- $hoverEffectrow.show();
19
- $captionHoverRow.hide();
20
- $captionContentRow.hide();
21
- classNames += ' ' + hover_effect;
22
- } else if ( hover_effect_type === 'hover-effect-caption' ) {
23
- //caption hover effect type
24
- $hoverEffectrow.hide();
25
- $captionHoverRow.show();
26
- $captionContentRow.show();
27
- classNames += ' ' + caption_effect_type;
28
- } else {
29
- //no hover effect type
30
- $hoverEffectrow.hide();
31
- $captionHoverRow.hide();
32
- $captionContentRow.hide();
33
- }
34
-
35
- $previewImage.attr('class' , classNames);
36
- };
37
-
38
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent = function(){
39
- var $previewImage = $('.foogallery-default-preview'),
40
- $caption = $previewImage.find('.foogallery-caption'),
41
- $title = $previewImage.find('.foogallery-caption-title'),
42
- $desc = $previewImage.find('.foogallery-caption-desc'),
43
- caption_content = $('input[name="foogallery_settings[default_caption-content]"]:checked').val();
44
-
45
- $caption.add($title).add($desc).show();
46
- switch(caption_content){
47
- case 'title':
48
- $desc.hide();
49
- break;
50
- case 'desc':
51
- $title.hide();
52
- break;
53
- case 'none':
54
- $caption.hide();
55
- break;
56
- }
57
- };
58
-
59
- FOOGALLERY_DEF_TEMPLATE.adminReady = function () {
60
- $('body').on('foogallery-gallery-template-changed-default', function() {
61
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
62
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
63
- });
64
-
65
- $('input[name="foogallery_settings[default_border-style]"], ' +
66
- 'input[name="foogallery_settings[default_hover-effect]"], ' +
67
- 'input[name="foogallery_settings[default_hover-effect-type]"], ' +
68
- 'input[name="foogallery_settings[default_caption-hover-effect]"]').change(function() {
69
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
70
- });
71
-
72
- $('input[name="foogallery_settings[default_caption-content]"]').change(function() {
73
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
74
- });
75
-
76
- $('.foogallery-thumbnail-preview').click(function(e) {
77
- e.preventDefault();
78
- });
79
-
80
- //run when the page load for the first time too!
81
- FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
82
- FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
83
- };
84
-
85
- }(window.FOOGALLERY_DEF_TEMPLATE = window.FOOGALLERY_DEF_TEMPLATE || {}, jQuery));
86
-
87
- jQuery(function () {
88
- FOOGALLERY_DEF_TEMPLATE.adminReady();
89
  });
1
+ (function (FOOGALLERY_DEF_TEMPLATE, $, undefined) {
2
+
3
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses = function() {
4
+
5
+ var $previewImage = $('.foogallery-default-preview'),
6
+ border_style = $('input[name="foogallery_settings[default_border-style]"]:checked').val(),
7
+ hover_effect = $('input[name="foogallery_settings[default_hover-effect]"]:checked').val(),
8
+ hover_effect_type = $('input[name="foogallery_settings[default_hover-effect-type]"]:checked').val(),
9
+ caption_effect_type = $('input[name="foogallery_settings[default_caption-hover-effect]"]:checked').val(),
10
+ classNames = 'foogallery-default-preview foogallery-container foogallery-default ' + border_style + ' ' + hover_effect_type;
11
+
12
+ var $hoverEffectrow = $('.gallery_template_field-default-hover-effect'),
13
+ $captionHoverRow = $('.gallery_template_field-default-caption-hover-effect'),
14
+ $captionContentRow = $('.gallery_template_field-default-caption-content');
15
+
16
+ if ( hover_effect_type === '' ) {
17
+ //icon hover effect type
18
+ $hoverEffectrow.show();
19
+ $captionHoverRow.hide();
20
+ $captionContentRow.hide();
21
+ classNames += ' ' + hover_effect;
22
+ } else if ( hover_effect_type === 'hover-effect-caption' ) {
23
+ //caption hover effect type
24
+ $hoverEffectrow.hide();
25
+ $captionHoverRow.show();
26
+ $captionContentRow.show();
27
+ classNames += ' ' + caption_effect_type;
28
+ } else {
29
+ //no hover effect type
30
+ $hoverEffectrow.hide();
31
+ $captionHoverRow.hide();
32
+ $captionContentRow.hide();
33
+ }
34
+
35
+ $previewImage.attr('class' , classNames);
36
+ };
37
+
38
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent = function(){
39
+ var $previewImage = $('.foogallery-default-preview'),
40
+ $caption = $previewImage.find('.foogallery-caption'),
41
+ $title = $previewImage.find('.foogallery-caption-title'),
42
+ $desc = $previewImage.find('.foogallery-caption-desc'),
43
+ caption_content = $('input[name="foogallery_settings[default_caption-content]"]:checked').val();
44
+
45
+ $caption.add($title).add($desc).show();
46
+ switch(caption_content){
47
+ case 'title':
48
+ $desc.hide();
49
+ break;
50
+ case 'desc':
51
+ $title.hide();
52
+ break;
53
+ case 'none':
54
+ $caption.hide();
55
+ break;
56
+ }
57
+ };
58
+
59
+ FOOGALLERY_DEF_TEMPLATE.adminReady = function () {
60
+ $('body').on('foogallery-gallery-template-changed-default', function() {
61
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
62
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
63
+ });
64
+
65
+ $('input[name="foogallery_settings[default_border-style]"], ' +
66
+ 'input[name="foogallery_settings[default_hover-effect]"], ' +
67
+ 'input[name="foogallery_settings[default_hover-effect-type]"], ' +
68
+ 'input[name="foogallery_settings[default_caption-hover-effect]"]').change(function() {
69
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
70
+ });
71
+
72
+ $('input[name="foogallery_settings[default_caption-content]"]').change(function() {
73
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
74
+ });
75
+
76
+ $('.foogallery-thumbnail-preview').click(function(e) {
77
+ e.preventDefault();
78
+ });
79
+
80
+ //run when the page load for the first time too!
81
+ FOOGALLERY_DEF_TEMPLATE.setPreviewClasses();
82
+ FOOGALLERY_DEF_TEMPLATE.showHideCaptionContent();
83
+ };
84
+
85
+ }(window.FOOGALLERY_DEF_TEMPLATE = window.FOOGALLERY_DEF_TEMPLATE || {}, jQuery));
86
+
87
+ jQuery(function () {
88
+ FOOGALLERY_DEF_TEMPLATE.adminReady();
89
  });
extensions/default-templates/functions.php CHANGED
@@ -1,22 +1,22 @@
1
- <?php
2
- /**
3
- * FooGallery default extensions common functions
4
- */
5
-
6
- /**
7
- * Enqueue the core FooGallery stylesheet used by all default templates
8
- */
9
- function foogallery_enqueue_core_gallery_template_style() {
10
- $filename = foogallery_get_setting( 'enable_debugging', false ) ? '' : '.min';
11
- $css = apply_filters( 'foogallery_core_gallery_style', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/foogallery' . $filename . '.css' );
12
- foogallery_enqueue_style( 'foogallery-core', $css, array(), FOOGALLERY_VERSION );
13
- }
14
-
15
- /**
16
- * Enqueue the core FooGallery script used by all default templates
17
- */
18
- function foogallery_enqueue_core_gallery_template_script() {
19
- $filename = foogallery_get_setting( 'enable_debugging', false ) ? '' : '.min';
20
- $js = apply_filters( 'foogallery_core_gallery_script', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'js/foogallery' . $filename . '.js' );
21
- wp_enqueue_script( 'foogallery-core', $js, array('jquery'), FOOGALLERY_VERSION );
22
- }
1
+ <?php
2
+ /**
3
+ * FooGallery default extensions common functions
4
+ */
5
+
6
+ /**
7
+ * Enqueue the core FooGallery stylesheet used by all default templates
8
+ */
9
+ function foogallery_enqueue_core_gallery_template_style() {
10
+ $filename = foogallery_get_setting( 'enable_debugging', false ) ? '' : '.min';
11
+ $css = apply_filters( 'foogallery_core_gallery_style', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'css/foogallery' . $filename . '.css' );
12
+ foogallery_enqueue_style( 'foogallery-core', $css, array(), FOOGALLERY_VERSION );
13
+ }
14
+
15
+ /**
16
+ * Enqueue the core FooGallery script used by all default templates
17
+ */
18
+ function foogallery_enqueue_core_gallery_template_script() {
19
+ $filename = foogallery_get_setting( 'enable_debugging', false ) ? '' : '.min';
20
+ $js = apply_filters( 'foogallery_core_gallery_script', FOOGALLERY_DEFAULT_TEMPLATES_EXTENSION_SHARED_URL . 'js/foogallery' . $filename . '.js' );
21
+ wp_enqueue_script( 'foogallery-core', $js, array('jquery'), FOOGALLERY_VERSION );
22
+ }
extensions/default-templates/image-viewer/class-image-viewer-gallery-template.php CHANGED
@@ -1,280 +1,298 @@
1
- <?php
2
-
3
- if ( !class_exists( 'FooGallery_Image_Viewer_Gallery_Template' ) ) {
4
-
5
- define('FOOGALLERY_IMAGE_VIEWER_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
-
7
- class FooGallery_Image_Viewer_Gallery_Template {
8
- /**
9
- * Wire up everything we need to run the extension
10
- */
11
- function __construct() {
12
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
-
14
- //add extra fields to the templates
15
- add_filter( 'foogallery_override_gallery_template_fields-image-viewer', array( $this, 'add_common_thumbnail_fields' ), 10, 2 );
16
-
17
- add_action( 'foogallery_located_template-image-viewer', array( $this, 'enqueue_dependencies' ) );
18
-
19
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
20
-
21
- add_filter( 'foogallery_template_thumbnail_dimensions-image-viewer', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
22
-
23
- //override specific settings when saving the gallery
24
- add_filter( 'foogallery_save_gallery_settings-image-viewer', array( $this, 'override_settings'), 10, 3 );
25
-
26
- //build up any preview arguments
27
- add_filter( 'foogallery_preview_arguments-image-viewer', array( $this, 'preview_arguments' ), 10, 2 );
28
-
29
- //build up the thumb dimensions from some arguments
30
- add_filter( 'foogallery_calculate_thumbnail_dimensions-image-viewer', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
31
-
32
- //alter the crop value if needed
33
- add_filter( 'foogallery_render_gallery_template_field_value', array( $this, 'alter_field_value'), 10, 4 );
34
-
35
- }
36
-
37
- function alter_field_value( $value, $field, $gallery, $template ) {
38
- //only do something if we are dealing with the thumbnail_dimensions field in this template
39
- if ( 'image-viewer' === $template['slug'] && 'thumbnail_size' === $field['id'] ) {
40
- if ( !array_key_exists( 'crop', $value ) ) {
41
- $value['crop'] = true;
42
- }
43
- }
44
-
45
- return $value;
46
- }
47
-
48
- /**
49
- * Register myself so that all associated JS and CSS files can be found and automatically included
50
- * @param $extensions
51
- *
52
- * @return array
53
- */
54
- function register_myself( $extensions ) {
55
- $extensions[] = __FILE__;
56
- return $extensions;
57
- }
58
-
59
- /**
60
- * Add our gallery template to the list of templates available for every gallery
61
- * @param $gallery_templates
62
- *
63
- * @return array
64
- */
65
- function add_template( $gallery_templates ) {
66
-
67
- $gallery_templates[] = array(
68
- 'slug' => 'image-viewer',
69
- 'name' => __( 'Image Viewer', 'foogallery' ),
70
- 'preview_support' => true,
71
- 'common_fields_support' => true,
72
- 'lazyload_support' => true,
73
- 'mandatory_classes' => 'fg-image-viewer',
74
- 'thumbnail_dimensions' => true,
75
- 'fields' => array(
76
- array(
77
- 'id' => 'thumbnail-help',
78
- 'title' => __( 'Thumbnail Help', 'foogallery' ),
79
- 'desc' => __( 'It is recommended to crop your thumbnails, so that your gallery remains a constant size. If you do not crop, then the size of the gallery could potentially change for each thumbnail.', 'foogallery' ),
80
- 'section' => __( 'General', 'foogallery' ),
81
- 'type' => 'help'
82
- ),
83
- array(
84
- 'id' => 'thumbnail_size',
85
- 'title' => __( 'Thumb Size', 'foogallery' ),
86
- 'section' => __( 'General', 'foogallery' ),
87
- 'desc' => __( 'Choose the size of your thumbnails', 'foogallery' ),
88
- 'type' => 'thumb_size',
89
- 'default' => array(
90
- 'width' => 640,
91
- 'height' => 360,
92
- 'crop' => true
93
- ),
94
- 'row_data'=> array(
95
- 'data-foogallery-change-selector' => 'input',
96
- 'data-foogallery-preview' => 'shortcode'
97
- )
98
- ),
99
- array(
100
- 'id' => 'thumbnail_link',
101
- 'title' => __( 'Thumb Link', 'foogallery' ),
102
- 'section' => __( 'General', 'foogallery' ),
103
- 'default' => 'image' ,
104
- 'type' => 'thumb_link',
105
- 'desc' => __( 'You can choose to either link each thumbnail to the full size image or to the image\'s attachment page', 'foogallery')
106
- ),
107
- array(
108
- 'id' => 'lightbox',
109
- 'title' => __( 'Lightbox', 'foogallery' ),
110
- 'section' => __( 'General', 'foogallery' ),
111
- 'desc' => __( 'Choose which lightbox you want to use in the gallery', 'foogallery' ),
112
- 'default' => 'none',
113
- 'type' => 'lightbox'
114
- ),
115
- array(
116
- 'id' => 'alignment',
117
- 'title' => __( 'Alignment', 'foogallery' ),
118
- 'section' => __( 'General', 'foogallery' ),
119
- 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery', 'foogallery' ),
120
- 'default' => 'fg-center',
121
- 'type' => 'radio',
122
- 'spacer' => '<span class="spacer"></span>',
123
- 'choices' => array(
124
- 'fg-left' => __( 'Left', 'foogallery' ),
125
- 'fg-center' => __( 'Center', 'foogallery' ),
126
- 'fg-right' => __( 'Right', 'foogallery' ),
127
- ),
128
- 'row_data'=> array(
129
- 'data-foogallery-change-selector' => 'input:radio',
130
- 'data-foogallery-preview' => 'class'
131
- )
132
- ),
133
- array(
134
- 'id' => 'language-help',
135
- 'title' => __( 'Language Help', 'foogallery' ),
136
- 'desc' => __( 'This gallery template shows the below items of text. Change them to suit your preference or language.', 'foogallery' ),
137
- 'section' => __( 'General', 'foogallery' ),
138
- 'type' => 'help'
139
- ),
140
- array(
141
- 'id' => 'text-prev',
142
- 'title' => __( '"Prev" Text', 'foogallery' ),
143
- 'section' => __( 'General', 'foogallery' ),
144
- 'type' => 'text',
145
- 'default' => __('Prev', 'foogallery'),
146
- 'row_data'=> array(
147
- 'data-foogallery-change-selector' => 'input',
148
- 'data-foogallery-preview' => 'shortcode'
149
- )
150
- ),
151
- array(
152
- 'id' => 'text-of',
153
- 'title' => __( '"of" Text', 'foogallery' ),
154
- 'section' => __( 'General', 'foogallery' ),
155
- 'type' => 'text',
156
- 'default' => __('of', 'foogallery'),
157
- 'row_data'=> array(
158
- 'data-foogallery-change-selector' => 'input',
159
- 'data-foogallery-preview' => 'shortcode'
160
- )
161
- ),
162
- array(
163
- 'id' => 'text-next',
164
- 'title' => __( '"Next" Text', 'foogallery' ),
165
- 'section' => __( 'General', 'foogallery' ),
166
- 'type' => 'text',
167
- 'default' => __('Next', 'foogallery'),
168
- 'row_data'=> array(
169
- 'data-foogallery-change-selector' => 'input',
170
- 'data-foogallery-preview' => 'shortcode'
171
- )
172
- )
173
- )
174
- );
175
-
176
- return $gallery_templates;
177
- }
178
-
179
- /**
180
- * Add thumbnail fields to the gallery template
181
- *
182
- * @uses "foogallery_override_gallery_template_fields"
183
- * @param $fields
184
- * @param $template
185
- *
186
- * @return array
187
- */
188
- function add_common_thumbnail_fields( $fields, $template ) {
189
-
190
- //update specific fields
191
- foreach ($fields as &$field) {
192
- if ( 'rounded_corners' === $field['id'] ) {
193
- unset( $field['choices']['fg-round-full'] );
194
- }
195
- }
196
-
197
- return $fields;
198
- }
199
-
200
- /**
201
- * Enqueue scripts that the default gallery template relies on
202
- */
203
- function enqueue_dependencies( $gallery ) {
204
- //enqueue core files
205
- foogallery_enqueue_core_gallery_template_style();
206
- foogallery_enqueue_core_gallery_template_script();
207
- }
208
-
209
- /**
210
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
211
- *
212
- * @param array $dimensions
213
- * @param FooGallery $foogallery
214
- *
215
- * @return mixed
216
- */
217
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
218
- $dimensions = $foogallery->get_meta( 'image-viewer_thumbnail_size', array(
219
- 'width' => 640,
220
- 'height' => 360,
221
- 'crop' => true
222
- ) );
223
- if ( !array_key_exists( 'crop', $dimensions ) ) {
224
- $dimensions['crop'] = true;
225
- }
226
- return $dimensions;
227
- }
228
-
229
- /**
230
- * Override specific settings so that the gallery template will always work
231
- *
232
- * @param $settings
233
- * @param $post_id
234
- * @param $form_data
235
- *
236
- * @return mixed
237
- */
238
- function override_settings($settings, $post_id, $form_data) {
239
- if ( 'fg-round-full' === $settings['image-viewer_rounded_corners'] ) {
240
- $settings['image-viewer_rounded_corners'] = 'fg-round-large';
241
- }
242
-
243
- return $settings;
244
- }
245
-
246
- /**
247
- * Build up a arguments used in the preview of the gallery
248
- * @param $args
249
- * @param $post_data
250
- *
251
- * @return mixed
252
- */
253
- function preview_arguments( $args, $post_data ) {
254
- $args['thumbnail_size'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_thumbnail_size'];
255
- $args['text-prev'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_text-prev'];
256
- $args['text-of'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_text-of'];
257
- $args['text-next'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_text-next'];
258
- return $args;
259
- }
260
-
261
- /**
262
- * Builds thumb dimensions from arguments
263
- *
264
- * @param array $dimensions
265
- * @param array $arguments
266
- *
267
- * @return mixed
268
- */
269
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
270
- if ( array_key_exists( 'thumbnail_size', $arguments) ) {
271
- return array(
272
- 'height' => intval($arguments['thumbnail_size']['height']),
273
- 'width' => intval($arguments['thumbnail_size']['width']),
274
- 'crop' => $arguments['thumbnail_size']['crop']
275
- );
276
- }
277
- return null;
278
- }
279
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
  }
1
+ <?php
2
+
3
+ if ( !class_exists( 'FooGallery_Image_Viewer_Gallery_Template' ) ) {
4
+
5
+ define('FOOGALLERY_IMAGE_VIEWER_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
+
7
+ class FooGallery_Image_Viewer_Gallery_Template {
8
+ /**
9
+ * Wire up everything we need to run the extension
10
+ */
11
+ function __construct() {
12
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
+
14
+ //add extra fields to the templates
15
+ add_filter( 'foogallery_override_gallery_template_fields-image-viewer', array( $this, 'add_common_thumbnail_fields' ), 10, 2 );
16
+
17
+ add_action( 'foogallery_located_template-image-viewer', array( $this, 'enqueue_dependencies' ) );
18
+
19
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
20
+
21
+ add_filter( 'foogallery_template_thumbnail_dimensions-image-viewer', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
22
+
23
+ //override specific settings when saving the gallery
24
+ add_filter( 'foogallery_save_gallery_settings-image-viewer', array( $this, 'override_settings'), 10, 3 );
25
+
26
+ //build up any preview arguments
27
+ add_filter( 'foogallery_preview_arguments-image-viewer', array( $this, 'preview_arguments' ), 10, 2 );
28
+
29
+ //build up the thumb dimensions from some arguments
30
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-image-viewer', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
31
+
32
+ //alter the crop value if needed
33
+ add_filter( 'foogallery_render_gallery_template_field_value', array( $this, 'alter_field_value'), 10, 4 );
34
+
35
+ //build up the arguments needed for rendering this template
36
+ add_filter( 'foogallery_gallery_template_arguments-image-viewer', array( $this, 'build_gallery_template_arguments' ) );
37
+ }
38
+
39
+ function alter_field_value( $value, $field, $gallery, $template ) {
40
+ //only do something if we are dealing with the thumbnail_dimensions field in this template
41
+ if ( 'image-viewer' === $template['slug'] && 'thumbnail_size' === $field['id'] ) {
42
+ if ( !array_key_exists( 'crop', $value ) ) {
43
+ $value['crop'] = true;
44
+ }
45
+ }
46
+
47
+ return $value;
48
+ }
49
+
50
+ /**
51
+ * Register myself so that all associated JS and CSS files can be found and automatically included
52
+ * @param $extensions
53
+ *
54
+ * @return array
55
+ */
56
+ function register_myself( $extensions ) {
57
+ $extensions[] = __FILE__;
58
+ return $extensions;
59
+ }
60
+
61
+ /**
62
+ * Add our gallery template to the list of templates available for every gallery
63
+ * @param $gallery_templates
64
+ *
65
+ * @return array
66
+ */
67
+ function add_template( $gallery_templates ) {
68
+
69
+ $gallery_templates[] = array(
70
+ 'slug' => 'image-viewer',
71
+ 'name' => __( 'Image Viewer', 'foogallery' ),
72
+ 'preview_support' => true,
73
+ 'common_fields_support' => true,
74
+ 'lazyload_support' => true,
75
+ 'mandatory_classes' => 'fg-image-viewer',
76
+ 'thumbnail_dimensions' => true,
77
+ 'fields' => array(
78
+ array(
79
+ 'id' => 'thumbnail-help',
80
+ 'title' => __( 'Thumbnail Help', 'foogallery' ),
81
+ 'desc' => __( 'It is recommended to crop your thumbnails, so that your gallery remains a constant size. If you do not crop, then the size of the gallery could potentially change for each thumbnail.', 'foogallery' ),
82
+ 'section' => __( 'General', 'foogallery' ),
83
+ 'type' => 'help'
84
+ ),
85
+ array(
86
+ 'id' => 'thumbnail_size',
87
+ 'title' => __( 'Thumb Size', 'foogallery' ),
88
+ 'section' => __( 'General', 'foogallery' ),
89
+ 'desc' => __( 'Choose the size of your thumbnails', 'foogallery' ),
90
+ 'type' => 'thumb_size',
91
+ 'default' => array(
92
+ 'width' => 640,
93
+ 'height' => 360,
94
+ 'crop' => true
95
+ ),
96
+ 'row_data'=> array(
97
+ 'data-foogallery-change-selector' => 'input',
98
+ 'data-foogallery-preview' => 'shortcode'
99
+ )
100
+ ),
101
+ array(
102
+ 'id' => 'thumbnail_link',
103
+ 'title' => __( 'Thumb Link', 'foogallery' ),
104
+ 'section' => __( 'General', 'foogallery' ),
105
+ 'default' => 'image' ,
106
+ 'type' => 'thumb_link',
107
+ 'desc' => __( 'You can choose to either link each thumbnail to the full size image or to the image\'s attachment page', 'foogallery')
108
+ ),
109
+ array(
110
+ 'id' => 'lightbox',
111
+ 'title' => __( 'Lightbox', 'foogallery' ),
112
+ 'section' => __( 'General', 'foogallery' ),
113
+ 'desc' => __( 'Choose which lightbox you want to use in the gallery', 'foogallery' ),
114
+ 'default' => 'none',
115
+ 'type' => 'lightbox'
116
+ ),
117
+ array(
118
+ 'id' => 'alignment',
119
+ 'title' => __( 'Alignment', 'foogallery' ),
120
+ 'section' => __( 'General', 'foogallery' ),
121
+ 'desc' => __( 'The horizontal alignment of the thumbnails inside the gallery', 'foogallery' ),
122
+ 'default' => 'fg-center',
123
+ 'type' => 'radio',
124
+ 'spacer' => '<span class="spacer"></span>',
125
+ 'choices' => array(
126
+ 'fg-left' => __( 'Left', 'foogallery' ),
127
+ 'fg-center' => __( 'Center', 'foogallery' ),
128
+ 'fg-right' => __( 'Right', 'foogallery' ),
129
+ ),
130
+ 'row_data'=> array(
131
+ 'data-foogallery-change-selector' => 'input:radio',
132
+ 'data-foogallery-preview' => 'class'
133
+ )
134
+ ),
135
+ array(
136
+ 'id' => 'language-help',
137
+ 'title' => __( 'Language Help', 'foogallery' ),
138
+ 'desc' => __( 'This gallery template shows the below items of text. Change them to suit your preference or language.', 'foogallery' ),
139
+ 'section' => __( 'General', 'foogallery' ),
140
+ 'type' => 'help'
141
+ ),
142
+ array(
143
+ 'id' => 'text-prev',
144
+ 'title' => __( '"Prev" Text', 'foogallery' ),
145
+ 'section' => __( 'General', 'foogallery' ),
146
+ 'type' => 'text',
147
+ 'default' => __('Prev', 'foogallery'),
148
+ 'row_data'=> array(
149
+ 'data-foogallery-change-selector' => 'input',
150
+ 'data-foogallery-preview' => 'shortcode'
151
+ )
152
+ ),
153
+ array(
154
+ 'id' => 'text-of',
155
+ 'title' => __( '"of" Text', 'foogallery' ),
156
+ 'section' => __( 'General', 'foogallery' ),
157
+ 'type' => 'text',
158
+ 'default' => __('of', 'foogallery'),
159
+ 'row_data'=> array(
160
+ 'data-foogallery-change-selector' => 'input',
161
+ 'data-foogallery-preview' => 'shortcode'
162
+ )
163
+ ),
164
+ array(
165
+ 'id' => 'text-next',
166
+ 'title' => __( '"Next" Text', 'foogallery' ),
167
+ 'section' => __( 'General', 'foogallery' ),
168
+ 'type' => 'text',
169
+ 'default' => __('Next', 'foogallery'),
170
+ 'row_data'=> array(
171
+ 'data-foogallery-change-selector' => 'input',
172
+ 'data-foogallery-preview' => 'shortcode'
173
+ )
174
+ )
175
+ )
176
+ );
177
+
178
+ return $gallery_templates;
179
+ }
180
+
181
+ /**
182
+ * Add thumbnail fields to the gallery template
183
+ *
184
+ * @uses "foogallery_override_gallery_template_fields"
185
+ * @param $fields
186
+ * @param $template
187
+ *
188
+ * @return array
189
+ */
190
+ function add_common_thumbnail_fields( $fields, $template ) {
191
+
192
+ //update specific fields
193
+ foreach ($fields as &$field) {
194
+ if ( 'rounded_corners' === $field['id'] ) {
195
+ unset( $field['choices']['fg-round-full'] );
196
+ }
197
+ }
198
+
199
+ return $fields;
200
+ }
201
+
202
+ /**
203
+ * Enqueue scripts that the default gallery template relies on
204
+ */
205
+ function enqueue_dependencies( $gallery ) {
206
+ //enqueue core files
207
+ foogallery_enqueue_core_gallery_template_style();
208
+ foogallery_enqueue_core_gallery_template_script();
209
+ }
210
+
211
+ /**
212
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
213
+ *
214
+ * @param array $dimensions
215
+ * @param FooGallery $foogallery
216
+ *
217
+ * @return mixed
218
+ */
219
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
220
+ $dimensions = $foogallery->get_meta( 'image-viewer_thumbnail_size', array(
221
+ 'width' => 640,
222
+ 'height' => 360,
223
+ 'crop' => true
224
+ ) );
225
+ if ( !array_key_exists( 'crop', $dimensions ) ) {
226
+ $dimensions['crop'] = true;
227
+ }
228
+ return $dimensions;
229
+ }
230
+
231
+ /**
232
+ * Override specific settings so that the gallery template will always work
233
+ *
234
+ * @param $settings
235
+ * @param $post_id
236
+ * @param $form_data
237
+ *
238
+ * @return mixed
239
+ */
240
+ function override_settings($settings, $post_id, $form_data) {
241
+ if ( 'fg-round-full' === $settings['image-viewer_rounded_corners'] ) {
242
+ $settings['image-viewer_rounded_corners'] = 'fg-round-large';
243
+ }
244
+
245
+ return $settings;
246
+ }
247
+
248
+ /**
249
+ * Build up a arguments used in the preview of the gallery
250
+ * @param $args
251
+ * @param $post_data
252
+ *
253
+ * @return mixed
254
+ */
255
+ function preview_arguments( $args, $post_data ) {
256
+ $args['thumbnail_size'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_thumbnail_size'];
257
+ $args['text-prev'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_text-prev'];
258
+ $args['text-of'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_text-of'];
259
+ $args['text-next'] = $post_data[FOOGALLERY_META_SETTINGS]['image-viewer_text-next'];
260
+ return $args;
261
+ }
262
+
263
+ /**
264
+ * Builds thumb dimensions from arguments
265
+ *
266
+ * @param array $dimensions
267
+ * @param array $arguments
268
+ *
269
+ * @return mixed
270
+ */
271
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
272
+ if ( array_key_exists( 'thumbnail_size', $arguments) ) {
273
+ return array(
274
+ 'height' => intval($arguments['thumbnail_size']['height']),
275
+ 'width' => intval($arguments['thumbnail_size']['width']),
276
+ 'crop' => $arguments['thumbnail_size']['crop']
277
+ );
278
+ }
279
+ return null;
280
+ }
281
+
282
+ /**
283
+ * Build up the arguments needed for rendering this gallery template
284
+ *
285
+ * @param $args
286
+ * @return array
287
+ */
288
+ function build_gallery_template_arguments( $args ) {
289
+ $args = foogallery_gallery_template_setting( 'thumbnail_size', 'thumbnail' );
290
+ if ( !array_key_exists( 'crop', $args ) ) {
291
+ $args['crop'] = '1'; //we now force thumbs to be cropped by default
292
+ }
293
+ $args['link'] = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
294
+
295
+ return $args;
296
+ }
297
+ }
298
  }
extensions/default-templates/image-viewer/gallery-image-viewer.php CHANGED
@@ -1,43 +1,34 @@
1
- <?php
2
- /**
3
- * FooGallery Image Viewer gallery template
4
- * This is the template that is run when a FooGallery shortcode is rendered to the frontend
5
- */
6
- //the current FooGallery that is currently being rendered to the frontend
7
- global $current_foogallery;
8
- //the current shortcode args
9
- global $current_foogallery_arguments;
10
- //get our thumbnail sizing args
11
- $args = foogallery_gallery_template_setting( 'thumbnail_size', 'thumbnail' );
12
- if ( !array_key_exists( 'crop', $args ) ) {
13
- $args['crop'] = '1'; //we now force thumbs to be cropped by default
14
- }
15
- //add the link setting to the args
16
- $link = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
17
- $args['link'] = $link;
18
- //get which lightbox we want to use
19
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
20
-
21
- $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
22
- $text_prev = foogallery_gallery_template_setting( 'text-prev', __('Prev', 'foogallery') );
23
- $text_of = foogallery_gallery_template_setting( 'text-of', __('of', 'foogallery') );
24
- $text_next = foogallery_gallery_template_setting( 'text-next', __('Next', 'foogallery') );
25
-
26
- $attachments = $current_foogallery->attachments();
27
-
28
- $foogallery_imageviewer_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-link-' . $link, 'foogallery-lightbox-' . $lightbox, $alignment );
29
- $foogallery_imageviewer_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_imageviewer_classes ) );
30
- ?><div <?php echo $foogallery_imageviewer_attributes; ?>>
31
- <div class="fiv-inner">
32
- <div class="fiv-inner-container">
33
- <?php foreach ( $attachments as $attachment ) {
34
- echo foogallery_attachment_html( $attachment, $args );
35
- } ?>
36
- </div>
37
- <div class="fiv-ctrls">
38
- <div class="fiv-prev"><span><?php echo $text_prev; ?></span></div>
39
- <label class="fiv-count"><span class="fiv-count-current">1</span><?php echo $text_of; ?><span class="fiv-count-total"><?php echo count($attachments) ?></span></label>
40
- <div class="fiv-next"><span><?php echo $text_next; ?></span></div>
41
- </div>
42
- </div>
43
  </div>
1
+ <?php
2
+ /**
3
+ * FooGallery Image Viewer gallery template
4
+ * This is the template that is run when a FooGallery shortcode is rendered to the frontend
5
+ */
6
+ //the current FooGallery that is currently being rendered to the frontend
7
+ global $current_foogallery;
8
+ //the current shortcode args
9
+ global $current_foogallery_arguments;
10
+ //get our thumbnail sizing args
11
+
12
+ //get which lightbox we want to use
13
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
14
+ $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
15
+ $text_prev = foogallery_gallery_template_setting( 'text-prev', __('Prev', 'foogallery') );
16
+ $text_of = foogallery_gallery_template_setting( 'text-of', __('of', 'foogallery') );
17
+ $text_next = foogallery_gallery_template_setting( 'text-next', __('Next', 'foogallery') );
18
+ $link = foogallery_gallery_template_setting( 'thumbnail_link', 'image' );
19
+ $foogallery_imageviewer_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-link-' . $link, 'foogallery-lightbox-' . $lightbox, $alignment );
20
+ $foogallery_imageviewer_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_imageviewer_classes ) );
21
+ ?><div <?php echo $foogallery_imageviewer_attributes; ?>>
22
+ <div class="fiv-inner">
23
+ <div class="fiv-inner-container">
24
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
25
+ echo foogallery_attachment_html( $attachment );
26
+ } ?>
27
+ </div>
28
+ <div class="fiv-ctrls">
29
+ <div class="fiv-prev"><span><?php echo $text_prev; ?></span></div>
30
+ <label class="fiv-count"><span class="fiv-count-current">1</span><?php echo $text_of; ?><span class="fiv-count-total"><?php echo $current_foogallery->attachment_count(); ?></span></label>
31
+ <div class="fiv-next"><span><?php echo $text_next; ?></span></div>
32
+ </div>
33
+ </div>
 
 
 
 
 
 
 
 
 
34
  </div>
extensions/default-templates/image-viewer/js/admin-gallery-image-viewer.js CHANGED
@@ -1,123 +1,123 @@
1
- //Use this file to inject custom javascript behaviour into the foogallery edit page
2
- //For an example usage, check out wp-content/foogallery/extensions/default-templates/js/admin-gallery-default.js
3
-
4
- (function (IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION, $, undefined) {
5
-
6
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses = function() {
7
- var $previewImage = $('.foogallery-image-viewer-preview'),
8
- theme = $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val(),
9
- hover_effect = $('input[name="foogallery_settings[image-viewer_hover-effect]"]:checked').val(),
10
- hover_effect_type = $('input[name="foogallery_settings[image-viewer_hover-effect-type]"]:checked').val();
11
-
12
- var $styles = $('#image-preview-custom-styles');
13
- if (theme === 'fiv-custom'){
14
- var bg_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"]').val(),
15
- text_color = $('input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"]').val(),
16
- border_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"]').val(),
17
- hover_color = $('input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]').val();
18
-
19
- var css = '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
20
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
21
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
22
- css += 'background-color: '+bg_color+';';
23
- css += 'color: '+text_color+';';
24
- css += '}';
25
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
26
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-inner-container,';
27
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
28
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
29
- css += 'border-color: '+border_color+';';
30
- css += '}';
31
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev:hover,';
32
- css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next:hover {';
33
- css += 'background-color: '+hover_color+';';
34
- css += '}';
35
- $styles.remove();
36
- $('head').append('<style id="image-preview-custom-styles">'+css+'</style>');
37
- } else {
38
- $styles.remove();
39
- }
40
-
41
- $previewImage.attr('class' ,'foogallery-image-viewer-preview foogallery-container foogallery-image-viewer ' + theme);
42
- if (hover_effect_type !== 'hover-effect-none'){
43
- $previewImage.addClass(hover_effect_type + ' ' + hover_effect);
44
- }
45
-
46
- var $hoverEffectrow = $('.gallery_template_field-image-viewer-hover-effect');
47
- if ( hover_effect_type === '' ) {
48
- $hoverEffectrow.show();
49
- } else {
50
- $hoverEffectrow.hide();
51
- }
52
- };
53
-
54
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows = function(){
55
- var $theme_rows = $('.gallery_template_field-image-viewer-theme_custom_bgcolor')
56
- .add('.gallery_template_field-image-viewer-theme_custom_textcolor')
57
- .add('.gallery_template_field-image-viewer-theme_custom_hovercolor')
58
- .add('.gallery_template_field-image-viewer-theme_custom_bordercolor');
59
-
60
- if ( $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val() === 'fiv-custom' ) {
61
- $theme_rows.show();
62
- } else {
63
- $theme_rows.hide();
64
- }
65
- };
66
-
67
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent = function(){
68
- var $previewImage = $('.foogallery-image-viewer-preview'),
69
- $caption = $previewImage.find('.foogallery-caption'),
70
- $title = $previewImage.find('.foogallery-caption-title'),
71
- $desc = $previewImage.find('.foogallery-caption-desc'),
72
- caption_content = $('input[name="foogallery_settings[image-viewer_caption-content]"]:checked').val();
73
-
74
- $caption.add($title).add($desc).show();
75
- switch(caption_content){
76
- case 'title':
77
- $desc.hide();
78
- break;
79
- case 'desc':
80
- $title.hide();
81
- break;
82
- case 'none':
83
- $caption.hide();
84
- break;
85
- }
86
- };
87
-
88
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady = function () {
89
- $('body').on('foogallery-gallery-template-changed-image-viewer', function() {
90
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
91
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
92
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
93
- });
94
-
95
- var ps = 'input[name="foogallery_settings[image-viewer_hover-effect]"], ' +
96
- 'input[name="foogallery_settings[image-viewer_hover-effect-type]"], ' +
97
- 'input[name="foogallery_settings[image-viewer_theme]"], ' +
98
- 'input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"], ' +
99
- 'input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"], ' +
100
- 'input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"], ' +
101
- 'input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]';
102
- $(ps).change(function() {
103
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
104
- });
105
-
106
- $('input[name="foogallery_settings[image-viewer_caption-content]"]').change(function() {
107
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
108
- });
109
-
110
- $('input[name="foogallery_settings[image-viewer_theme]"]').change(function() {
111
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
112
- });
113
-
114
- $('.foogallery-image-viewer-preview').click(function(e) {
115
- e.preventDefault();
116
- });
117
- };
118
-
119
- }(window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION = window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION || {}, jQuery));
120
-
121
- jQuery(function () {
122
- IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady();
123
  });
1
+ //Use this file to inject custom javascript behaviour into the foogallery edit page
2
+ //For an example usage, check out wp-content/foogallery/extensions/default-templates/js/admin-gallery-default.js
3
+
4
+ (function (IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION, $, undefined) {
5
+
6
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses = function() {
7
+ var $previewImage = $('.foogallery-image-viewer-preview'),
8
+ theme = $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val(),
9
+ hover_effect = $('input[name="foogallery_settings[image-viewer_hover-effect]"]:checked').val(),
10
+ hover_effect_type = $('input[name="foogallery_settings[image-viewer_hover-effect-type]"]:checked').val();
11
+
12
+ var $styles = $('#image-preview-custom-styles');
13
+ if (theme === 'fiv-custom'){
14
+ var bg_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"]').val(),
15
+ text_color = $('input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"]').val(),
16
+ border_color = $('input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"]').val(),
17
+ hover_color = $('input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]').val();
18
+
19
+ var css = '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
20
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
21
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
22
+ css += 'background-color: '+bg_color+';';
23
+ css += 'color: '+text_color+';';
24
+ css += '}';
25
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner,';
26
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-inner-container,';
27
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev,';
28
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next {';
29
+ css += 'border-color: '+border_color+';';
30
+ css += '}';
31
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-prev:hover,';
32
+ css += '.foogallery-image-viewer-preview.fiv-custom > .fiv-inner > .fiv-ctrls > .fiv-next:hover {';
33
+ css += 'background-color: '+hover_color+';';
34
+ css += '}';
35
+ $styles.remove();
36
+ $('head').append('<style id="image-preview-custom-styles">'+css+'</style>');
37
+ } else {
38
+ $styles.remove();
39
+ }
40
+
41
+ $previewImage.attr('class' ,'foogallery-image-viewer-preview foogallery-container foogallery-image-viewer ' + theme);
42
+ if (hover_effect_type !== 'hover-effect-none'){
43
+ $previewImage.addClass(hover_effect_type + ' ' + hover_effect);
44
+ }
45
+
46
+ var $hoverEffectrow = $('.gallery_template_field-image-viewer-hover-effect');
47
+ if ( hover_effect_type === '' ) {
48
+ $hoverEffectrow.show();
49
+ } else {
50
+ $hoverEffectrow.hide();
51
+ }
52
+ };
53
+
54
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows = function(){
55
+ var $theme_rows = $('.gallery_template_field-image-viewer-theme_custom_bgcolor')
56
+ .add('.gallery_template_field-image-viewer-theme_custom_textcolor')
57
+ .add('.gallery_template_field-image-viewer-theme_custom_hovercolor')
58
+ .add('.gallery_template_field-image-viewer-theme_custom_bordercolor');
59
+
60
+ if ( $('input[name="foogallery_settings[image-viewer_theme]"]:checked').val() === 'fiv-custom' ) {
61
+ $theme_rows.show();
62
+ } else {
63
+ $theme_rows.hide();
64
+ }
65
+ };
66
+
67
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent = function(){
68
+ var $previewImage = $('.foogallery-image-viewer-preview'),
69
+ $caption = $previewImage.find('.foogallery-caption'),
70
+ $title = $previewImage.find('.foogallery-caption-title'),
71
+ $desc = $previewImage.find('.foogallery-caption-desc'),
72
+ caption_content = $('input[name="foogallery_settings[image-viewer_caption-content]"]:checked').val();
73
+
74
+ $caption.add($title).add($desc).show();
75
+ switch(caption_content){
76
+ case 'title':
77
+ $desc.hide();
78
+ break;
79
+ case 'desc':
80
+ $title.hide();
81
+ break;
82
+ case 'none':
83
+ $caption.hide();
84
+ break;
85
+ }
86
+ };
87
+
88
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady = function () {
89
+ $('body').on('foogallery-gallery-template-changed-image-viewer', function() {
90
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
91
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
92
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
93
+ });
94
+
95
+ var ps = 'input[name="foogallery_settings[image-viewer_hover-effect]"], ' +
96
+ 'input[name="foogallery_settings[image-viewer_hover-effect-type]"], ' +
97
+ 'input[name="foogallery_settings[image-viewer_theme]"], ' +
98
+ 'input[name="foogallery_settings[image-viewer_theme_custom_bgcolor]"], ' +
99
+ 'input[name="foogallery_settings[image-viewer_theme_custom_textcolor]"], ' +
100
+ 'input[name="foogallery_settings[image-viewer_theme_custom_bordercolor]"], ' +
101
+ 'input[name="foogallery_settings[image-viewer_theme_custom_hovercolor]"]';
102
+ $(ps).change(function() {
103
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.setPreviewClasses();
104
+ });
105
+
106
+ $('input[name="foogallery_settings[image-viewer_caption-content]"]').change(function() {
107
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideCaptionContent();
108
+ });
109
+
110
+ $('input[name="foogallery_settings[image-viewer_theme]"]').change(function() {
111
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.showHideRows();
112
+ });
113
+
114
+ $('.foogallery-image-viewer-preview').click(function(e) {
115
+ e.preventDefault();
116
+ });
117
+ };
118
+
119
+ }(window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION = window.IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION || {}, jQuery));
120
+
121
+ jQuery(function () {
122
+ IMAGE_VIEWER_TEMPLATE_FOOGALLERY_EXTENSION.adminReady();
123
  });
extensions/default-templates/justified/class-justified-gallery-template.php CHANGED
@@ -1,251 +1,270 @@
1
- <?php
2
-
3
- if ( !class_exists( 'FooGallery_Justified_Gallery_Template' ) ) {
4
-
5
- define('FOOGALLERY_JUSTIFIED_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
-
7
- class FooGallery_Justified_Gallery_Template {
8
- /**
9
- * Wire up everything we need to run the extension
10
- */
11
- function __construct() {
12
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
14
- add_filter( 'foogallery_template_thumbnail_dimensions-justified', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
15
-
16
- add_action( 'foogallery_located_template-justified', array( $this, 'enqueue_dependencies' ) );
17
-
18
- //add the data options needed for justified
19
- add_filter( 'foogallery_build_container_data_options-justified', array( $this, 'add_justified_options' ), 10, 3 );
20
-
21
- //build up any preview arguments
22
- add_filter( 'foogallery_preview_arguments-justified', array( $this, 'preview_arguments' ), 10, 2 );
23
-
24
- //build up the thumb dimensions from some arguments
25
- add_filter( 'foogallery_calculate_thumbnail_dimensions-justified', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
26
- }
27
-
28
- /**
29
- * Register myself so that all associated JS and CSS files can be found and automatically included
30
- * @param $extensions
31
- *
32
- * @return array
33
- */
34
- function register_myself( $extensions ) {
35
- $extensions[] = __FILE__;
36
- return $extensions;
37
- }
38
-
39
- /**
40
- * Add our gallery template to the list of templates available for every gallery
41
- * @param $gallery_templates
42
- *
43
- * @return array
44
- */
45
- function add_template( $gallery_templates ) {
46
- $gallery_templates[] = array(
47
- 'slug' => 'justified',
48
- 'name' => __( 'Justified Gallery', 'foogallery' ),
49
- 'preview_support' => true,
50
- 'common_fields_support' => true,
51
- 'lazyload_support' => true,
52
- 'paging_support' => true,
53
- 'mandatory_classes' => 'fg-justified',
54
- 'thumbnail_dimensions' => true,
55
- 'fields' => array(
56
- array(
57
- 'id' => 'thumb_height',
58
- 'title' => __( 'Thumb Height', 'foogallery' ),
59
- 'desc' => __( 'Choose the height of your thumbnails. Thumbnails will be generated on the fly and cached once generated', 'foogallery' ),
60
- 'section' => __( 'General', 'foogallery' ),
61
- 'type' => 'number',
62
- 'class' => 'small-text',
63
- 'default' => 250,
64
- 'step' => '10',
65
- 'min' => '0',
66
- 'row_data'=> array(
67
- 'data-foogallery-preview' => 'shortcode',
68
- 'data-foogallery-change-selector' => 'input',
69
- )
70
- ),
71
- array(
72
- 'id' => 'row_height',
73
- 'title' => __( 'Row Height', 'foogallery' ),
74
- 'desc' => __( 'The preferred height of your gallery rows. This can be different from the thumbnail height', 'foogallery' ),
75
- 'section' => __( 'General', 'foogallery' ),
76
- 'type' => 'number',
77
- 'class' => 'small-text',
78
- 'default' => 150,
79
- 'step' => '10',
80
- 'min' => '0',
81
- 'row_data'=> array(
82
- 'data-foogallery-change-selector' => 'input',
83
- 'data-foogallery-value-selector' => 'input',
84
- 'data-foogallery-preview' => 'shortcode',
85
- )
86
- ),
87
- array(
88
- 'id' => 'max_row_height',
89
- 'title' => __( 'Max Row Height', 'foogallery' ),
90
- 'desc' => __( 'A number (e.g 200) which specifies the maximum row height in pixels. A negative value for no limits. Alternatively, use a percentage (e.g. 200% which means that the row height cannot exceed 2 * rowHeight)', 'foogallery' ),
91
- 'section' => __( 'General', 'foogallery' ),
92
- 'type' => 'text',
93
- 'class' => 'small-text',
94
- 'default' => '200%',
95
- 'row_data'=> array(
96
- 'data-foogallery-change-selector' => 'input',
97
- 'data-foogallery-value-selector' => 'input',
98
- 'data-foogallery-preview' => 'shortcode',
99
- )
100
- ),
101
- array(
102
- 'id' => 'margins',
103
- 'title' => __( 'Margins', 'foogallery' ),
104
- 'desc' => __( 'The spacing between your thumbnails.', 'foogallery' ),
105
- 'section' => __( 'General', 'foogallery' ),
106
- 'type' => 'number',
107
- 'class' => 'small-text',
108
- 'default' => 1,
109
- 'step' => '1',
110
- 'min' => '0',
111
- 'row_data'=> array(
112
- 'data-foogallery-change-selector' => 'input',
113
- 'data-foogallery-value-selector' => 'input',
114
- 'data-foogallery-preview' => 'shortcode',
115
- )
116
- ),
117
- array(
118
- 'id' => 'thumbnail_link',
119
- 'title' => __( 'Thumbnail Link', 'foogallery' ),
120
- 'section' => __( 'General', 'foogallery' ),
121
- 'default' => 'image' ,
122
- 'type' => 'thumb_link',
123
- 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything.', 'foogallery' ),
124
- ),
125
- array(
126
- 'id' => 'lightbox',
127
- 'title' => __( 'Lightbox', 'foogallery' ),
128
- 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
129
- 'section' => __( 'General', 'foogallery' ),
130
- 'default' => 'none',
131
- 'type' => 'lightbox',
132
- ),
133
- array(
134
- 'id' => 'lastrow',
135
- 'title' => __( 'Last Row', 'foogallery' ),
136
- 'desc' => __( 'What should be done with the last row in the gallery?', 'foogallery' ),
137
- 'section' => __( 'General', 'foogallery' ),
138
- 'type' => 'radio',
139
- 'spacer' => '<span class="spacer"></span>',
140
- 'default' => 'center',
141
- 'choices' => array(
142
- 'hide' => __( 'Hide', 'foogallery' ),
143
- 'justify' => __( 'Justify', 'foogallery' ),
144
- 'nojustify' => __( 'No Justify', 'foogallery' ),
145
- 'right' => __( 'Right', 'foogallery' ),
146
- 'center' => __( 'Center', 'foogallery' ),
147
- 'left' => __( 'Left', 'foogallery' ),
148
- ),
149
- 'row_data'=> array(
150
- 'data-foogallery-change-selector' => 'input:radio',
151
- 'data-foogallery-value-selector' => 'input:checked',
152
- 'data-foogallery-preview' => 'shortcode',
153
- )
154
- ),
155
- ),
156
- );
157
-
158
- return $gallery_templates;
159
- }
160
-
161
- /**
162
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
163
- *
164
- * @param array $dimensions
165
- * @param FooGallery $foogallery
166
- *
167
- * @return mixed
168
- */
169
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
170
- $height = $foogallery->get_meta( 'justified_thumb_height', false );
171
- return array(
172
- 'height' => intval( $height ),
173
- 'width' => 0,
174
- 'crop' => false
175
- );
176
- }
177
-
178
- /**
179
- * Enqueue scripts that the default gallery template relies on
180
- */
181
- function enqueue_dependencies( $gallery ) {
182
- //enqueue core files
183
- foogallery_enqueue_core_gallery_template_style();
184
- foogallery_enqueue_core_gallery_template_script();
185
- }
186
-
187
- /**
188
- * Add the required justified options if needed
189
- *
190
- * @param $options
191
- * @param $gallery FooGallery
192
- *
193
- * @param $attributes array
194
- *
195
- * @return array
196
- */
197
- function add_justified_options($options, $gallery, $attributes) {
198
-
199
- $row_height = foogallery_gallery_template_setting( 'row_height', '150' );
200
- $max_row_height = foogallery_gallery_template_setting( 'max_row_height', '200%' );
201
- if ( strpos( $max_row_height, '%' ) === false ) {
202
- $max_row_height = intval( $max_row_height );
203
- }
204
- $margins = foogallery_gallery_template_setting( 'margins', '1' );
205
- $lastRow = foogallery_gallery_template_setting( 'lastrow', 'center' );
206
-
207
- $options['template']['rowHeight'] = intval($row_height);
208
- $options['template']['maxRowHeight'] = $max_row_height;
209
- $options['template']['margins'] = intval($margins);
210
- $options['template']['lastRow'] = $lastRow;
211
-
212
- return $options;
213
- }
214
-
215
- /**
216
- * Build up a arguments used in the preview of the gallery
217
- * @param $args
218
- * @param $post_data
219
- *
220
- * @return mixed
221
- */
222
- function preview_arguments( $args, $post_data ) {
223
- $args['thumbnail_height'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_thumb_height'];
224
- $args['row_height'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_row_height'];
225
- $args['max_row_height'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_max_row_height'];
226
- $args['margins'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_margins'];
227
- $args['lastrow'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_lastrow'];
228
- return $args;
229
- }
230
-
231
- /**
232
- * Builds thumb dimensions from arguments
233
- *
234
- * @param array $dimensions
235
- * @param array $arguments
236
- *
237
- * @return mixed
238
- */
239
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
240
- if ( array_key_exists( 'thumbnail_height', $arguments) ) {
241
- return array(
242
- 'height' => intval($arguments['thumbnail_height']),
243
- 'width' => 0,
244
- 'crop' => false
245
- );
246
- }
247
-
248
- return null;
249
- }
250
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  }
1
+ <?php
2
+
3
+ if ( !class_exists( 'FooGallery_Justified_Gallery_Template' ) ) {
4
+
5
+ define('FOOGALLERY_JUSTIFIED_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
+
7
+ class FooGallery_Justified_Gallery_Template {
8
+ /**
9
+ * Wire up everything we need to run the extension
10
+ */
11
+ function __construct() {
12
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
14
+ add_filter( 'foogallery_template_thumbnail_dimensions-justified', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
15
+
16
+ add_action( 'foogallery_located_template-justified', array( $this, 'enqueue_dependencies' ) );
17
+
18
+ //add the data options needed for justified
19
+ add_filter( 'foogallery_build_container_data_options-justified', array( $this, 'add_justified_options' ), 10, 3 );
20
+
21
+ //build up any preview arguments
22
+ add_filter( 'foogallery_preview_arguments-justified', array( $this, 'preview_arguments' ), 10, 2 );
23
+
24
+ //build up the thumb dimensions from some arguments
25
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-justified', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
26
+
27
+ //build up the arguments needed for rendering this template
28
+ add_filter( 'foogallery_gallery_template_arguments-justified', array( $this, 'build_gallery_template_arguments' ) );
29
+ }
30
+
31
+ /**
32
+ * Register myself so that all associated JS and CSS files can be found and automatically included
33
+ * @param $extensions
34
+ *
35
+ * @return array
36
+ */
37
+ function register_myself( $extensions ) {
38
+ $extensions[] = __FILE__;
39
+ return $extensions;
40
+ }
41
+
42
+ /**
43
+ * Add our gallery template to the list of templates available for every gallery
44
+ * @param $gallery_templates
45
+ *
46
+ * @return array
47
+ */
48
+ function add_template( $gallery_templates ) {
49
+ $gallery_templates[] = array(
50
+ 'slug' => 'justified',
51
+ 'name' => __( 'Justified Gallery', 'foogallery' ),
52
+ 'preview_support' => true,
53
+ 'common_fields_support' => true,
54
+ 'lazyload_support' => true,
55
+ 'paging_support' => true,
56
+ 'mandatory_classes' => 'fg-justified',
57
+ 'thumbnail_dimensions' => true,
58
+ 'fields' => array(
59
+ array(
60
+ 'id' => 'thumb_height',
61
+ 'title' => __( 'Thumb Height', 'foogallery' ),
62
+ 'desc' => __( 'Choose the height of your thumbnails. Thumbnails will be generated on the fly and cached once generated', 'foogallery' ),
63
+ 'section' => __( 'General', 'foogallery' ),
64
+ 'type' => 'number',
65
+ 'class' => 'small-text',
66
+ 'default' => 250,
67
+ 'step' => '10',
68
+ 'min' => '0',
69
+ 'row_data'=> array(
70
+ 'data-foogallery-preview' => 'shortcode',
71
+ 'data-foogallery-change-selector' => 'input',
72
+ )
73
+ ),
74
+ array(
75
+ 'id' => 'row_height',
76
+ 'title' => __( 'Row Height', 'foogallery' ),
77
+ 'desc' => __( 'The preferred height of your gallery rows. This can be different from the thumbnail height', 'foogallery' ),
78
+ 'section' => __( 'General', 'foogallery' ),
79
+ 'type' => 'number',
80
+ 'class' => 'small-text',
81
+ 'default' => 150,
82
+ 'step' => '10',
83
+ 'min' => '0',
84
+ 'row_data'=> array(
85
+ 'data-foogallery-change-selector' => 'input',
86
+ 'data-foogallery-value-selector' => 'input',
87
+ 'data-foogallery-preview' => 'shortcode',
88
+ )
89
+ ),
90
+ array(
91
+ 'id' => 'max_row_height',
92
+ 'title' => __( 'Max Row Height', 'foogallery' ),
93
+ 'desc' => __( 'A number (e.g 200) which specifies the maximum row height in pixels. A negative value for no limits. Alternatively, use a percentage (e.g. 200% which means that the row height cannot exceed 2 * rowHeight)', 'foogallery' ),
94
+ 'section' => __( 'General', 'foogallery' ),
95
+ 'type' => 'text',
96
+ 'class' => 'small-text',
97
+ 'default' => '200%',
98
+ 'row_data'=> array(
99
+ 'data-foogallery-change-selector' => 'input',
100
+ 'data-foogallery-value-selector' => 'input',
101
+ 'data-foogallery-preview' => 'shortcode',
102
+ )
103
+ ),
104
+ array(
105
+ 'id' => 'margins',
106
+ 'title' => __( 'Margins', 'foogallery' ),
107
+ 'desc' => __( 'The spacing between your thumbnails.', 'foogallery' ),
108
+ 'section' => __( 'General', 'foogallery' ),
109
+ 'type' => 'number',
110
+ 'class' => 'small-text',
111
+ 'default' => 1,
112
+ 'step' => '1',
113
+ 'min' => '0',
114
+ 'row_data'=> array(
115
+ 'data-foogallery-change-selector' => 'input',
116
+ 'data-foogallery-value-selector' => 'input',
117
+ 'data-foogallery-preview' => 'shortcode',
118
+ )
119
+ ),
120
+ array(
121
+ 'id' => 'thumbnail_link',
122
+ 'title' => __( 'Thumbnail Link', 'foogallery' ),
123
+ 'section' => __( 'General', 'foogallery' ),
124
+ 'default' => 'image' ,
125
+ 'type' => 'thumb_link',
126
+ 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything.', 'foogallery' ),
127
+ ),
128
+ array(
129
+ 'id' => 'lightbox',
130
+ 'title' => __( 'Lightbox', 'foogallery' ),
131
+ 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image".', 'foogallery' ),
132
+ 'section' => __( 'General', 'foogallery' ),
133
+ 'default' => 'none',
134
+ 'type' => 'lightbox',
135
+ ),
136
+ array(
137
+ 'id' => 'lastrow',
138
+ 'title' => __( 'Last Row', 'foogallery' ),
139
+ 'desc' => __( 'What should be done with the last row in the gallery?', 'foogallery' ),
140
+ 'section' => __( 'General', 'foogallery' ),
141
+ 'type' => 'radio',
142
+ 'spacer' => '<span class="spacer"></span>',
143
+ 'default' => 'center',
144
+ 'choices' => array(
145
+ 'hide' => __( 'Hide', 'foogallery' ),
146
+ 'justify' => __( 'Justify', 'foogallery' ),
147
+ 'nojustify' => __( 'No Justify', 'foogallery' ),
148
+ 'right' => __( 'Right', 'foogallery' ),
149
+ 'center' => __( 'Center', 'foogallery' ),
150
+ 'left' => __( 'Left', 'foogallery' ),
151
+ ),
152
+ 'row_data'=> array(
153
+ 'data-foogallery-change-selector' => 'input:radio',
154
+ 'data-foogallery-value-selector' => 'input:checked',
155
+ 'data-foogallery-preview' => 'shortcode',
156
+ )
157
+ ),
158
+ ),
159
+ );
160
+
161
+ return $gallery_templates;
162
+ }
163
+
164
+ /**
165
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
166
+ *
167
+ * @param array $dimensions
168
+ * @param FooGallery $foogallery
169
+ *
170
+ * @return mixed
171
+ */
172
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
173
+ $height = $foogallery->get_meta( 'justified_thumb_height', false );
174
+ return array(
175
+ 'height' => intval( $height ),
176
+ 'width' => 0,
177
+ 'crop' => false
178
+ );
179
+ }
180
+
181
+ /**
182
+ * Enqueue scripts that the default gallery template relies on
183
+ */
184
+ function enqueue_dependencies( $gallery ) {
185
+ //enqueue core files
186
+ foogallery_enqueue_core_gallery_template_style();
187
+ foogallery_enqueue_core_gallery_template_script();
188
+ }
189
+
190
+ /**
191
+ * Add the required justified options if needed
192
+ *
193
+ * @param $options
194
+ * @param $gallery FooGallery
195
+ *
196
+ * @param $attributes array
197
+ *
198
+ * @return array
199
+ */
200
+ function add_justified_options($options, $gallery, $attributes) {
201
+
202
+ $row_height = foogallery_gallery_template_setting( 'row_height', '150' );
203
+ $max_row_height = foogallery_gallery_template_setting( 'max_row_height', '200%' );
204
+ if ( strpos( $max_row_height, '%' ) === false ) {
205
+ $max_row_height = intval( $max_row_height );
206
+ }
207
+ $margins = foogallery_gallery_template_setting( 'margins', '1' );
208
+ $lastRow = foogallery_gallery_template_setting( 'lastrow', 'center' );
209
+
210
+ $options['template']['rowHeight'] = intval($row_height);
211
+ $options['template']['maxRowHeight'] = $max_row_height;
212
+ $options['template']['margins'] = intval($margins);
213
+ $options['template']['lastRow'] = $lastRow;
214
+
215
+ return $options;
216
+ }
217
+
218
+ /**
219
+ * Build up a arguments used in the preview of the gallery
220
+ * @param $args
221
+ * @param $post_data
222
+ *
223
+ * @return mixed
224
+ */
225
+ function preview_arguments( $args, $post_data ) {
226
+ $args['thumbnail_height'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_thumb_height'];
227
+ $args['row_height'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_row_height'];
228
+ $args['max_row_height'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_max_row_height'];
229
+ $args['margins'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_margins'];
230
+ $args['lastrow'] = $post_data[FOOGALLERY_META_SETTINGS]['justified_lastrow'];
231
+ return $args;
232
+ }
233
+
234
+ /**
235
+ * Builds thumb dimensions from arguments
236
+ *
237
+ * @param array $dimensions
238
+ * @param array $arguments
239
+ *
240
+ * @return mixed
241
+ */
242
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
243
+ if ( array_key_exists( 'thumbnail_height', $arguments) ) {
244
+ return array(
245
+ 'height' => intval($arguments['thumbnail_height']),
246
+ 'width' => 0,
247
+ 'crop' => false
248
+ );
249
+ }
250
+
251
+ return null;
252
+ }
253
+
254
+ /**
255
+ * Build up the arguments needed for rendering this gallery template
256
+ *
257
+ * @param $args
258
+ * @return array
259
+ */
260
+ function build_gallery_template_arguments( $args ) {
261
+ $height = foogallery_gallery_template_setting( 'thumb_height', '250' );
262
+ $args = array(
263
+ 'height' => $height,
264
+ 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' )
265
+ );
266
+
267
+ return $args;
268
+ }
269
+ }
270
  }
extensions/default-templates/justified/gallery-justified.php CHANGED
@@ -1,21 +1,15 @@
1
- <?php
2
- /**
3
- * FooGallery Justified gallery template
4
- */
5
- global $current_foogallery;
6
- global $current_foogallery_arguments;
7
- $height = foogallery_gallery_template_setting( 'thumb_height', '250' );
8
- $args = array(
9
- 'height' => $height,
10
- 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' )
11
- );
12
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
13
-
14
- $foogallery_justified_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox );
15
- $foogallery_justified_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_justified_classes) );
16
- ?>
17
- <div <?php echo $foogallery_justified_attributes; ?>>
18
- <?php foreach ( $current_foogallery->attachments() as $attachment ) {
19
- echo foogallery_attachment_html( $attachment, $args );
20
- } ?>
21
- </div>
1
+ <?php
2
+ /**
3
+ * FooGallery Justified gallery template
4
+ */
5
+ global $current_foogallery;
6
+ global $current_foogallery_arguments;
7
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
8
+ $foogallery_justified_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox );
9
+ $foogallery_justified_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_justified_classes) );
10
+ ?>
11
+ <div <?php echo $foogallery_justified_attributes; ?>>
12
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
13
+ echo foogallery_attachment_html( $attachment );
14
+ } ?>
15
+ </div>
 
 
 
 
 
 
extensions/default-templates/masonry/class-masonry-gallery-template.php CHANGED
@@ -1,266 +1,331 @@
1
- <?php
2
-
3
- if ( !class_exists( 'FooGallery_Masonry_Gallery_Template' ) ) {
4
-
5
- define('FOOGALLERY_MASONRY_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
-
7
- class FooGallery_Masonry_Gallery_Template {
8
- /**
9
- * Wire up everything we need to run the extension
10
- */
11
- function __construct() {
12
- add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
- add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
14
-
15
- add_action( 'foogallery_enqueue_preview_dependencies', array( $this, 'enqueue_preview_dependencies' ) );
16
-
17
- add_filter( 'foogallery_located_template-masonry', array( $this, 'enqueue_dependencies' ) );
18
-
19
- add_filter( 'foogallery_template_thumbnail_dimensions-masonry', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
20
-
21
- //add the data options needed for masonry
22
- add_filter( 'foogallery_build_container_data_options-masonry', array( $this, 'add_masonry_options' ), 10, 3 );
23
-
24
- //build up any preview arguments
25
- add_filter( 'foogallery_preview_arguments-masonry', array( $this, 'preview_arguments' ), 10, 2 );
26
-
27
- //build up the thumb dimensions from some arguments
28
- add_filter( 'foogallery_calculate_thumbnail_dimensions-masonry', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
29
- }
30
-
31
- /**
32
- * Register myself so that all associated JS and CSS files can be found and automatically included
33
- * @param $extensions
34
- *
35
- * @return array
36
- */
37
- function register_myself( $extensions ) {
38
- $extensions[] = __FILE__;
39
- return $extensions;
40
- }
41
-
42
- /**
43
- * Add our gallery template to the list of templates available for every gallery
44
- * @param $gallery_templates
45
- *
46
- * @return array
47
- */
48
- function add_template( $gallery_templates ) {
49
- $gallery_templates[] = array(
50
- 'slug' => 'masonry',
51
- 'name' => __( 'Masonry Image Gallery', 'foogallery' ),
52
- 'preview_support' => true,
53
- 'common_fields_support' => true,
54
- 'lazyload_support' => true,
55
- 'paging_support' => true,
56
- 'mandatory_classes' => 'fg-masonry',
57
- 'thumbnail_dimensions' => true,
58
- 'fields' => array(
59
- array(
60
- 'id' => 'thumbnail_width',
61
- 'title' => __( 'Thumb Width', 'foogallery' ),
62
- 'desc' => __( 'Choose the width of your thumbnails. Thumbnails will be generated on the fly and cached once generated', 'foogallery' ),
63
- 'section' => __( 'General', 'foogallery' ),
64
- 'type' => 'number',
65
- 'class' => 'small-text',
66
- 'default' => 150,
67
- 'step' => '1',
68
- 'min' => '0',
69
- 'row_data'=> array(
70
- 'data-foogallery-change-selector' => 'input',
71
- 'data-foogallery-preview' => 'shortcode'
72
- )
73
- ),
74
- array(
75
- 'id' => 'layout',
76
- 'title' => __( 'Masonry Layout', 'foogallery' ),
77
- 'desc' => __( 'Choose a fixed width thumb layout, or responsive columns.', 'foogallery' ),
78
- 'section' => __( 'General', 'foogallery' ),
79
- 'type' => 'radio',
80
- 'choices' => array(
81
- 'fixed' => __( 'Fixed Width', 'foogallery' ),
82
- 'col2' => __( '2 Columns', 'foogallery' ),
83
- 'col3' => __( '3 Columns', 'foogallery' ),
84
- 'col4' => __( '4 Columns', 'foogallery' ),
85
- 'col5' => __( '5 Columns', 'foogallery' )
86
- ),
87
- 'default' => 'fixed',
88
- 'row_data'=> array(
89
- 'data-foogallery-change-selector' => 'input:radio',
90
- 'data-foogallery-value-selector' => 'input:checked',
91
- 'data-foogallery-preview' => 'shortcode'
92
- )
93
- ),
94
- array(
95
- 'id' => 'gutter_width',
96
- 'title' => __( 'Gutter Width', 'foogallery' ),
97
- 'desc' => __( 'The spacing between your thumbnails. Only applicable when using a fixed layout!', 'foogallery' ),
98
- 'section' => __( 'General', 'foogallery' ),
99
- 'type' => 'number',
100
- 'class' => 'small-text',
101
- 'default' => 10,
102
- 'step' => '1',
103
- 'min' => '0',
104
- 'row_data'=> array(
105
- 'data-foogallery-hidden' => true,
106
- 'data-foogallery-change-selector' => 'input',
107
- 'data-foogallery-value-selector' => 'input',
108
- 'data-foogallery-show-when-field' => 'layout',
109
- 'data-foogallery-show-when-field-value' => 'fixed',
110
- 'data-foogallery-preview' => 'shortcode',
111
- )
112
- ),
113
- array(
114
- 'id' => 'gutter_percent',
115
- 'title' => __( 'Gutter Size', 'foogallery' ),
116
- 'desc' => __( 'Choose a gutter size when using responsive columns.', 'foogallery' ),
117
- 'section' => __( 'General', 'foogallery' ),
118
- 'type' => 'radio',
119
- 'choices' => array(
120
- 'fg-gutter-none' => __( 'No Gutter', 'foogallery' ),
121
- '' => __( 'Normal Size Gutter', 'foogallery' ),
122
- 'fg-gutter-large' => __( 'Larger Gutter', 'foogallery' )
123
- ),
124
- 'default' => '',
125
- 'row_data'=> array(
126
- 'data-foogallery-hidden' => true,
127
- 'data-foogallery-change-selector' => 'input:radio',
128
- 'data-foogallery-value-selector' => 'input:checked',
129
- 'data-foogallery-show-when-field' => 'layout',
130
- 'data-foogallery-show-when-field-operator' => '!==',
131
- 'data-foogallery-show-when-field-value' => 'fixed',
132
- 'data-foogallery-preview' => 'class'
133
- )
134
- ),
135
- array(
136
- 'id' => 'alignment',
137
- 'title' => __( 'Alignment', 'foogallery' ),
138
- 'desc' => __( 'You can choose to center align your images or leave them at the default (left). Only applicable when using a fixed layout!', 'foogallery' ),
139
- 'section' => __( 'General', 'foogallery' ),
140
- 'type' => 'radio',
141
- 'spacer' => '<span class="spacer"></span>',
142
- 'choices' => array(
143
- '' => __( 'Left', 'foogallery' ),
144
- 'fg-center' => __( 'Center', 'foogallery' )
145
- ),
146
- 'default' => 'fg-center',
147
- 'row_data'=> array(
148
- 'data-foogallery-hidden' => true,
149
- 'data-foogallery-show-when-field' => 'layout',
150
- 'data-foogallery-show-when-field-value' => 'fixed',
151
- 'data-foogallery-change-selector' => 'input:radio',
152
- 'data-foogallery-preview' => 'class'
153
- )
154
- ),
155
- array(
156
- 'id' => 'thumbnail_link',
157
- 'title' => __( 'Thumb Link', 'foogallery' ),
158
- 'default' => 'image' ,
159
- 'type' => 'thumb_link',
160
- 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything', 'foogallery' ),
161
- ),
162
- array(
163
- 'id' => 'lightbox',
164
- 'title' => __( 'Lightbox', 'foogallery' ),
165
- 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image"', 'foogallery' ),
166
- 'type' => 'lightbox',
167
- 'default' => 'none',
168
- ),
169
- ),
170
- );
171
-
172
-
173
- return $gallery_templates;
174
- }
175
-
176
- /**
177
- * Enqueue scripts that the masonry gallery template relies on
178
- */
179
- function enqueue_preview_dependencies() {
180
- wp_enqueue_script( 'masonry' );
181
- }
182
-
183
- /**
184
- * Enqueue scripts that the masonry gallery template relies on
185
- */
186
- function enqueue_dependencies() {
187
- wp_enqueue_script( 'masonry' );
188
-
189
- //enqueue core files
190
- foogallery_enqueue_core_gallery_template_style();
191
- foogallery_enqueue_core_gallery_template_script();
192
- }
193
-
194
- /**
195
- * Get the thumb dimensions arguments saved for the gallery for this gallery template
196
- *
197
- * @param array $dimensions
198
- * @param FooGallery $foogallery
199
- *
200
- * @return mixed
201
- */
202
- function get_thumbnail_dimensions( $dimensions, $foogallery ) {
203
- $width = $foogallery->get_meta( 'masonry_thumbnail_width', false );
204
- return array(
205
- 'height' => 0,
206
- 'width' => intval( $width ),
207
- 'crop' => false
208
- );
209
- }
210
-
211
- /**
212
- * Add the required masonry options if needed
213
- *
214
- * @param $options
215
- * @param $gallery FooGallery
216
- *
217
- * @param $attributes array
218
- *
219
- * @return array
220
- */
221
- function add_masonry_options($options, $gallery, $attributes) {
222
- $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
223
- $options['template']['layout'] = $layout;
224
- if ( 'fixed' === $layout ) {
225
- $width = foogallery_gallery_template_setting( 'thumbnail_width', '150' );
226
- $gutter_width = foogallery_gallery_template_setting( 'gutter_width', '10' );
227
- $options['template']['columnWidth'] = intval($width);
228
- $options['template']['gutter'] = intval($gutter_width);
229
- }
230
- return $options;
231
- }
232
-
233
- /**
234
- * Build up a arguments used in the preview of the gallery
235
- * @param $args
236
- * @param $post_data
237
- *
238
- * @return mixed
239
- */
240
- function preview_arguments( $args, $post_data ) {
241
- $args['thumbnail_width'] = $post_data[FOOGALLERY_META_SETTINGS]['masonry_thumbnail_width'];
242
- $args['layout'] = $post_data[FOOGALLERY_META_SETTINGS]['masonry_layout'];
243
- $args['gutter_width'] = $post_data[FOOGALLERY_META_SETTINGS]['masonry_gutter_width'];
244
- return $args;
245
- }
246
-
247
- /**
248
- * Builds thumb dimensions from arguments
249
- *
250
- * @param array $dimensions
251
- * @param array $arguments
252
- *
253
- * @return mixed
254
- */
255
- function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
256
- if ( array_key_exists( 'thumbnail_width', $arguments) ) {
257
- return array(
258
- 'height' => 0,
259
- 'width' => intval($arguments['thumbnail_width']),
260
- 'crop' => false
261
- );
262
- }
263
- return null;
264
- }
265
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
266
  }
1
+ <?php
2
+
3
+ if ( !class_exists( 'FooGallery_Masonry_Gallery_Template' ) ) {
4
+
5
+ define('FOOGALLERY_MASONRY_GALLERY_TEMPLATE_URL', plugin_dir_url( __FILE__ ));
6
+
7
+ class FooGallery_Masonry_Gallery_Template {
8
+ /**
9
+ * Wire up everything we need to run the extension
10
+ */
11
+ function __construct() {
12
+ add_filter( 'foogallery_gallery_templates', array( $this, 'add_template' ) );
13
+ add_filter( 'foogallery_gallery_templates_files', array( $this, 'register_myself' ) );
14
+
15
+ add_action( 'foogallery_enqueue_preview_dependencies', array( $this, 'enqueue_preview_dependencies' ) );
16
+
17
+ add_filter( 'foogallery_located_template-masonry', array( $this, 'enqueue_dependencies' ) );
18
+
19
+ add_filter( 'foogallery_template_thumbnail_dimensions-masonry', array( $this, 'get_thumbnail_dimensions' ), 10, 2 );
20
+
21
+ //add the data options needed for masonry
22
+ add_filter( 'foogallery_build_container_data_options-masonry', array( $this, 'add_masonry_options' ), 10, 3 );
23
+
24
+ //build up any preview arguments
25
+ add_filter( 'foogallery_preview_arguments-masonry', array( $this, 'preview_arguments' ), 10, 2 );
26
+
27
+ //build up the thumb dimensions from some arguments
28
+ add_filter( 'foogallery_calculate_thumbnail_dimensions-masonry', array( $this, 'build_thumbnail_dimensions_from_arguments' ), 10, 2 );
29
+
30
+ //build up the arguments needed for rendering this template
31
+ add_filter( 'foogallery_gallery_template_arguments-masonry', array( $this, 'build_gallery_template_arguments' ) );
32
+
33
+ //add extra fields to the templates
34
+ add_filter( 'foogallery_override_gallery_template_fields-masonry', array( $this, 'add_masonry_fields' ), 10, 2 );
35
+
36
+ //remove the captions if the captions are below thumbs
37
+ add_filter( 'foogallery_build_attachment_html_caption', array( $this, 'remove_captions' ), 10, 3 );
38
+ }
39
+
40
+ /**
41
+ * Register myself so that all associated JS and CSS files can be found and automatically included
42
+ * @param $extensions
43
+ *
44
+ * @return array
45
+ */
46
+ function register_myself( $extensions ) {
47
+ $extensions[] = __FILE__;
48
+ return $extensions;
49
+ }
50
+
51
+ /**
52
+ * Add our gallery template to the list of templates available for every gallery
53
+ * @param $gallery_templates
54
+ *
55
+ * @return array
56
+ */
57
+ function add_template( $gallery_templates ) {
58
+ $gallery_templates[] = array(
59
+ 'slug' => 'masonry',
60
+ 'name' => __( 'Masonry Image Gallery', 'foogallery' ),
61
+ 'preview_support' => true,
62
+ 'common_fields_support' => true,
63
+ 'lazyload_support' => true,
64
+ 'paging_support' => true,
65
+ 'mandatory_classes' => 'fg-masonry',
66
+ 'thumbnail_dimensions' => true,
67
+ 'fields' => array(
68
+ array(
69
+ 'id' => 'thumbnail_width',
70
+ 'title' => __( 'Thumb Width', 'foogallery' ),
71
+ 'desc' => __( 'Choose the width of your thumbnails. Thumbnails will be generated on the fly and cached once generated', 'foogallery' ),
72
+ 'section' => __( 'General', 'foogallery' ),
73
+ 'type' => 'number',
74
+ 'class' => 'small-text',
75
+ 'default' => 150,
76
+ 'step' => '1',
77
+ 'min' => '0',
78
+ 'row_data'=> array(
79
+ 'data-foogallery-change-selector' => 'input',
80
+ 'data-foogallery-preview' => 'shortcode'
81
+ )
82
+ ),
83
+ array(
84
+ 'id' => 'layout',
85
+ 'title' => __( 'Masonry Layout', 'foogallery' ),
86
+ 'desc' => __( 'Choose a fixed width thumb layout, or responsive columns.', 'foogallery' ),
87
+ 'section' => __( 'General', 'foogallery' ),
88
+ 'type' => 'radio',
89
+ 'choices' => array(
90
+ 'fixed' => __( 'Fixed Width', 'foogallery' ),
91
+ 'col2' => __( '2 Columns', 'foogallery' ),
92
+ 'col3' => __( '3 Columns', 'foogallery' ),
93
+ 'col4' => __( '4 Columns', 'foogallery' ),
94
+ 'col5' => __( '5 Columns', 'foogallery' )
95
+ ),
96
+ 'default' => 'fixed',
97
+ 'row_data'=> array(
98
+ 'data-foogallery-change-selector' => 'input:radio',
99
+ 'data-foogallery-value-selector' => 'input:checked',
100
+ 'data-foogallery-preview' => 'shortcode'
101
+ )
102
+ ),
103
+ array(
104
+ 'id' => 'gutter_width',
105
+ 'title' => __( 'Gutter Width', 'foogallery' ),
106
+ 'desc' => __( 'The spacing between your thumbnails. Only applicable when using a fixed layout!', 'foogallery' ),
107
+ 'section' => __( 'General', 'foogallery' ),
108
+ 'type' => 'number',
109
+ 'class' => 'small-text',
110
+ 'default' => 10,
111
+ 'step' => '1',
112
+ 'min' => '0',
113
+ 'row_data'=> array(
114
+ 'data-foogallery-hidden' => true,
115
+ 'data-foogallery-change-selector' => 'input',
116
+ 'data-foogallery-value-selector' => 'input',
117
+ 'data-foogallery-show-when-field' => 'layout',
118
+ 'data-foogallery-show-when-field-value' => 'fixed',
119
+ 'data-foogallery-preview' => 'shortcode',
120
+ )
121
+ ),
122
+ array(
123
+ 'id' => 'gutter_percent',
124
+ 'title' => __( 'Gutter Size', 'foogallery' ),
125
+ 'desc' => __( 'Choose a gutter size when using responsive columns.', 'foogallery' ),
126
+ 'section' => __( 'General', 'foogallery' ),
127
+ 'type' => 'radio',
128
+ 'choices' => array(
129
+ 'fg-gutter-none' => __( 'No Gutter', 'foogallery' ),
130
+ '' => __( 'Normal Size Gutter', 'foogallery' ),
131
+ 'fg-gutter-large' => __( 'Larger Gutter', 'foogallery' )
132
+ ),
133
+ 'default' => '',
134
+ 'row_data'=> array(
135
+ 'data-foogallery-hidden' => true,
136
+ 'data-foogallery-change-selector' => 'input:radio',
137
+ 'data-foogallery-value-selector' => 'input:checked',
138
+ 'data-foogallery-show-when-field' => 'layout',
139
+ 'data-foogallery-show-when-field-operator' => '!==',
140
+ 'data-foogallery-show-when-field-value' => 'fixed',
141
+ 'data-foogallery-preview' => 'class'
142
+ )
143
+ ),
144
+ array(
145
+ 'id' => 'alignment',
146
+ 'title' => __( 'Alignment', 'foogallery' ),
147
+ 'desc' => __( 'You can choose to center align your images or leave them at the default (left). Only applicable when using a fixed layout!', 'foogallery' ),
148
+ 'section' => __( 'General', 'foogallery' ),
149
+ 'type' => 'radio',
150
+ 'spacer' => '<span class="spacer"></span>',
151
+ 'choices' => array(
152
+ '' => __( 'Left', 'foogallery' ),
153
+ 'fg-center' => __( 'Center', 'foogallery' )
154
+ ),
155
+ 'default' => 'fg-center',
156
+ 'row_data'=> array(
157
+ 'data-foogallery-hidden' => true,
158
+ 'data-foogallery-show-when-field' => 'layout',
159
+ 'data-foogallery-show-when-field-value' => 'fixed',
160
+ 'data-foogallery-change-selector' => 'input:radio',
161
+ 'data-foogallery-preview' => 'class'
162
+ )
163
+ ),
164
+ array(
165
+ 'id' => 'thumbnail_link',
166
+ 'title' => __( 'Thumb Link', 'foogallery' ),
167
+ 'default' => 'image' ,
168
+ 'type' => 'thumb_link',
169
+ 'desc' => __( 'You can choose to link each thumbnail to the full size image, or to the image\'s attachment page, or you can choose to not link to anything', 'foogallery' ),
170
+ ),
171
+ array(
172
+ 'id' => 'lightbox',
173
+ 'title' => __( 'Lightbox', 'foogallery' ),
174
+ 'desc' => __( 'Choose which lightbox you want to display images with. The lightbox will only work if you set the thumbnail link to "Full Size Image"', 'foogallery' ),
175
+ 'type' => 'lightbox',
176
+ 'default' => 'none',
177
+ ),
178
+ ),
179
+ );
180
+
181
+
182
+ return $gallery_templates;
183
+ }
184
+
185
+ /**
186
+ * Enqueue scripts that the masonry gallery template relies on
187
+ */
188
+ function enqueue_preview_dependencies() {
189
+ wp_enqueue_script( 'masonry' );
190
+ }
191
+
192
+ /**
193
+ * Enqueue scripts that the masonry gallery template relies on
194
+ */
195
+ function enqueue_dependencies() {
196
+ wp_enqueue_script( 'masonry' );
197
+
198
+ //enqueue core files
199
+ foogallery_enqueue_core_gallery_template_style();
200
+ foogallery_enqueue_core_gallery_template_script();
201
+ }
202
+
203
+ /**
204
+ * Get the thumb dimensions arguments saved for the gallery for this gallery template
205
+ *
206
+ * @param array $dimensions
207
+ * @param FooGallery $foogallery
208
+ *
209
+ * @return mixed
210
+ */
211
+ function get_thumbnail_dimensions( $dimensions, $foogallery ) {
212
+ $width = $foogallery->get_meta( 'masonry_thumbnail_width', false );
213
+ return array(
214
+ 'height' => 0,
215
+ 'width' => intval( $width ),
216
+ 'crop' => false
217
+ );
218
+ }
219
+
220
+ /**
221
+ * Add the required masonry options if needed
222
+ *
223
+ * @param $options
224
+ * @param $gallery FooGallery
225
+ *
226
+ * @param $attributes array
227
+ *
228
+ * @return array
229
+ */
230
+ function add_masonry_options($options, $gallery, $attributes) {
231
+ $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
232
+ $options['template']['layout'] = $layout;
233
+ if ( 'fixed' === $layout ) {
234
+ $width = foogallery_gallery_template_setting( 'thumbnail_width', '150' );
235
+ $gutter_width = foogallery_gallery_template_setting( 'gutter_width', '10' );
236
+ $options['template']['columnWidth'] = intval($width);
237
+ $options['template']['gutter'] = intval($gutter_width);
238
+ }
239
+ return $options;
240
+ }
241
+
242
+ /**
243
+ * Build up a arguments used in the preview of the gallery
244
+ * @param $args
245
+ * @param $post_data
246
+ *
247
+ * @return mixed
248
+ */
249
+ function preview_arguments( $args, $post_data ) {
250
+ $args['thumbnail_width'] = $post_data[FOOGALLERY_META_SETTINGS]['masonry_thumbnail_width'];
251
+ $args['layout'] = $post_data[FOOGALLERY_META_SETTINGS]['masonry_layout'];
252
+ $args['gutter_width'] = $post_data[FOOGALLERY_META_SETTINGS]['masonry_gutter_width'];
253
+ return $args;
254
+ }
255
+
256
+ /**
257
+ * Builds thumb dimensions from arguments
258
+ *
259
+ * @param array $dimensions
260
+ * @param array $arguments
261
+ *
262
+ * @return mixed
263
+ */
264
+ function build_thumbnail_dimensions_from_arguments( $dimensions, $arguments ) {
265
+ if ( array_key_exists( 'thumbnail_width', $arguments) ) {
266
+ return array(
267
+ 'height' => 0,
268
+ 'width' => intval($arguments['thumbnail_width']),
269
+ 'crop' => false
270
+ );
271
+ }
272
+ return null;
273
+ }
274
+
275
+ /**
276
+ * Build up the arguments needed for rendering this gallery template
277
+ *
278
+ * @param $args
279
+ * @return array
280
+ */
281
+ function build_gallery_template_arguments( $args ) {
282
+ $args = array(
283
+ 'width' => foogallery_gallery_template_setting( 'thumbnail_width', '150' ),
284
+ 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' ),
285
+ 'crop' => false
286
+ );
287
+
288
+ return $args;
289
+ }
290
+
291
+ /**
292
+ * Add masonry-specific fields to the gallery template
293
+ *
294
+ * @uses "foogallery_override_gallery_template_fields"
295
+ * @param $fields
296
+ * @param $template
297
+ *
298
+ * @return array
299
+ */
300
+ function add_masonry_fields( $fields, $template ) {
301
+ //update specific fields
302
+ foreach ($fields as &$field) {
303
+ if ( 'hover_effect_caption_visibility' === $field['id'] ) {
304
+ $field['choices']['fg-captions-bottom'] = __( 'Below Thumbnail', 'foogallery' );
305
+ }
306
+ }
307
+
308
+ return $fields;
309
+ }
310
+
311
+ function remove_captions( $captions, $foogallery_attachment, $args ) {
312
+ global $current_foogallery_template;
313
+
314
+ //check if masonry
315
+ if ( 'masonry' === $current_foogallery_template ) {
316
+
317
+ $hover_effect_caption_visibility = foogallery_gallery_template_setting( 'hover_effect_caption_visibility', 'fg-caption-hover' );
318
+
319
+ //check if captions are set to show below the thumbs
320
+ if ( 'fg-captions-bottom' === $hover_effect_caption_visibility ) {
321
+ //if we have no captions then do not output captions at all
322
+ if ( !array_key_exists( 'title', $captions ) && !array_key_exists( 'desc', $captions ) ) {
323
+ $captions = false;
324
+ }
325
+ }
326
+ }
327
+
328
+ return $captions;
329
+ }
330
+ }
331
  }
extensions/default-templates/masonry/gallery-masonry.php CHANGED
@@ -1,26 +1,22 @@
1
- <?php
2
- /**
3
- * FooGallery masonry gallery template
4
- */
5
- global $current_foogallery;
6
- global $current_foogallery_arguments;
7
- $args = array(
8
- 'width' => foogallery_gallery_template_setting( 'thumbnail_width', '150' ),
9
- 'link' => foogallery_gallery_template_setting( 'thumbnail_link', 'image' ),
10
- 'crop' => false
11
- );
12
- $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
13
- $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
14
- $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
15
- $gutter_percent = '';
16
- if ( 'fixed' !== $layout ) {
17
- $gutter_percent = foogallery_gallery_template_setting( 'gutter_percent', '' );
18
- }
19
- $foogallery_masonry_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $alignment, $gutter_percent );
20
- $foogallery_masonry_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_masonry_classes) );
21
- ?>
22
- <div <?php echo $foogallery_masonry_attributes; ?>>
23
- <?php foreach ( $current_foogallery->attachments() as $attachment ) {
24
- echo foogallery_attachment_html( $attachment, $args );
25
- } ?>
26
  </div>
1
+ <?php
2
+ /**
3
+ * FooGallery masonry gallery template
4
+ */
5
+ global $current_foogallery;
6
+ global $current_foogallery_arguments;
7
+
8
+ $lightbox = foogallery_gallery_template_setting( 'lightbox', 'unknown' );
9
+ $alignment = foogallery_gallery_template_setting( 'alignment', 'fg-center' );
10
+ $layout = foogallery_gallery_template_setting( 'layout', 'fixed' );
11
+ $gutter_percent = '';
12
+ if ( 'fixed' !== $layout ) {
13
+ $gutter_percent = foogallery_gallery_template_setting( 'gutter_percent', '' );
14
+ }
15
+ $foogallery_masonry_classes = foogallery_build_class_attribute_safe( $current_foogallery, 'foogallery-lightbox-' . $lightbox, $alignment, $gutter_percent );
16
+ $foogallery_masonry_attributes = foogallery_build_container_attributes_safe( $current_foogallery, array( 'class' => $foogallery_masonry_classes) );
17
+ ?>
18
+ <div <?php echo $foogallery_masonry_attributes; ?>>
19
+ <?php foreach ( foogallery_current_gallery_attachments_for_rendering() as $attachment ) {
20
+ echo foogallery_attachment_html( $attachment );
21
+ } ?>
 
 
 
 
22
  </div>
extensions/default-templates/masonry/js/admin-gallery-masonry.js CHANGED
@@ -1,30 +1,30 @@
1
- (function (FOOGALLERY_MASONRY_TEMPLATE, $, undefined) {
2
-
3
- FOOGALLERY_MASONRY_TEMPLATE.showHideControls = function() {
4
-
5
- var layout = $('input[name="foogallery_settings[masonry_layout]"]:checked').val();
6
-
7
- if ( layout === 'fixed' ) {
8
- $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').show();
9
- $('.gallery_template_field-masonry-gutter_percent').hide();
10
- } else {
11
- $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').hide();
12
- $('.gallery_template_field-masonry-gutter_percent').show();
13
- }
14
- };
15
-
16
- FOOGALLERY_MASONRY_TEMPLATE.adminReady = function () {
17
- $('body').on('foogallery-gallery-template-changed-masonry', function() {
18
- FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
19
- });
20
-
21
- $('input[name="foogallery_settings[masonry_layout]"]').change(function() {
22
- FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
23
- });
24
- };
25
-
26
- }(window.FOOGALLERY_MASONRY_TEMPLATE = window.FOOGALLERY_MASONRY_TEMPLATE || {}, jQuery));
27
-
28
- jQuery(function () {
29
- FOOGALLERY_MASONRY_TEMPLATE.adminReady();
30
  });
1
+ (function (FOOGALLERY_MASONRY_TEMPLATE, $, undefined) {
2
+
3
+ FOOGALLERY_MASONRY_TEMPLATE.showHideControls = function() {
4
+
5
+ var layout = $('input[name="foogallery_settings[masonry_layout]"]:checked').val();
6
+
7
+ if ( layout === 'fixed' ) {
8
+ $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').show();
9
+ $('.gallery_template_field-masonry-gutter_percent').hide();
10
+ } else {
11
+ $('.gallery_template_field-masonry-gutter_width, .gallery_template_field-masonry-center_align').hide();
12
+ $('.gallery_template_field-masonry-gutter_percent').show();
13
+ }
14
+ };
15
+
16
+ FOOGALLERY_MASONRY_TEMPLATE.adminReady = function () {
17
+ $('body').on('foogallery-gallery-template-changed-masonry', function() {
18
+ FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
19
+ });
20
+
21
+ $('input[name="foogallery_settings[masonry_layout]"]').change(function() {
22
+ FOOGALLERY_MASONRY_TEMPLATE.showHideControls();
23
+ });
24
+ };
25
+
26
+ }(window.FOOGALLERY_MASONRY_TEMPLATE = window.FOOGALLERY_MASONRY_TEMPLATE || {}, jQuery));
27
+
28
+ jQuery(function () {
29
+ FOOGALLERY_MASONRY_TEMPLATE.adminReady();
30
  });
extensions/default-templates/shared/css/admin-foogallery.css CHANGED
@@ -1,78 +1,78 @@
1
- .foogallery-setting-caption_icon,
2
- .foogallery-setting-loading_icon {
3
- content: "";
4
- display: inline-block;
5
- position: relative;
6
- width: 40px;
7
- height: 40px;
8
- margin: 0;
9
- background: transparent no-repeat center center;
10
- background-size: 40px 40px;
11
- vertical-align: middle;
12
- }
13
- .foogallery-setting-caption_icon.fg-hover-zoom {
14
- background-image: url('../img/zoom.png');
15
- }
16
- .foogallery-setting-caption_icon.fg-hover-zoom2 {
17
- background-image: url('../img/zoom2.png');
18
- }
19
- .foogallery-setting-caption_icon.fg-hover-zoom3 {
20
- background-image: url('../img/zoom3.png');
21
- }
22
- .foogallery-setting-caption_icon.fg-hover-plus {
23
- background-image: url('../img/plus.png');
24
- }
25
- .foogallery-setting-caption_icon.fg-hover-circle-plus {
26
- background-image: url('../img/circle-plus.png');
27
- }
28
- .foogallery-setting-caption_icon.fg-hover-eye {
29
- background-image: url('../img/eye.png');
30
- }
31
- .foogallery-setting-caption_icon.fg-hover-external {
32
- background-image: url('../img/external.png');
33
- }
34
-
35
- .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td label {
36
- background-color: #eee;
37
- }
38
-
39
- .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td input:checked + label {
40
- background-color: #eee;
41
- }
42
-
43
- .foogallery-setting-loading_icon .fg-loader {
44
- position: absolute;
45
- top: 50%;
46
- left: 50%;
47
- transform: translateX(-50%) translateY(-50%);
48
- width: 1em;
49
- height: 1em;
50
- font-size: 5px;
51
- }
52
-
53
- .foogallery-setting-loading_icon.fg-loading-bars .fg-loader {
54
- font-size: 4px;
55
- width: 1em;
56
- height: 4em;
57
- }
58
-
59
- .foogallery-setting-loading_icon.fg-loading-partial .fg-loader {
60
- font-size: 4px;
61
- width: 10em;
62
- height: 10em;
63
- }
64
-
65
- .foogallery-setting-loading_icon.fg-loading-pulse .fg-loader {
66
- font-size: 4px;
67
- width: 2.5em;
68
- height: 2.5em;
69
- transform: translateX(-50%) translateY(-150%);
70
- }
71
-
72
- .foogallery-setting-loading_icon.fg-loading-trail .fg-loader {
73
- font-size: 20px;
74
- }
75
-
76
- .fg-item-inner {
77
- margin: 0;
78
  }
1
+ .foogallery-setting-caption_icon,
2
+ .foogallery-setting-loading_icon {
3
+ content: "";
4
+ display: inline-block;
5
+ position: relative;
6
+ width: 40px;
7
+ height: 40px;
8
+ margin: 0;
9
+ background: transparent no-repeat center center;
10
+ background-size: 40px 40px;
11
+ vertical-align: middle;
12
+ }
13
+ .foogallery-setting-caption_icon.fg-hover-zoom {
14
+ background-image: url('../img/zoom.png');
15
+ }
16
+ .foogallery-setting-caption_icon.fg-hover-zoom2 {
17
+ background-image: url('../img/zoom2.png');
18
+ }
19
+ .foogallery-setting-caption_icon.fg-hover-zoom3 {
20
+ background-image: url('../img/zoom3.png');
21
+ }
22
+ .foogallery-setting-caption_icon.fg-hover-plus {
23
+ background-image: url('../img/plus.png');
24
+ }
25
+ .foogallery-setting-caption_icon.fg-hover-circle-plus {
26
+ background-image: url('../img/circle-plus.png');
27
+ }
28
+ .foogallery-setting-caption_icon.fg-hover-eye {
29
+ background-image: url('../img/eye.png');
30
+ }
31
+ .foogallery-setting-caption_icon.fg-hover-external {
32
+ background-image: url('../img/external.png');
33
+ }
34
+
35
+ .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td label {
36
+ background-color: #eee;
37
+ }
38
+
39
+ .foogallery_template_field_type-htmlicon.foogallery_template_field_id-loading_icon td input:checked + label {
40
+ background-color: #eee;
41
+ }
42
+
43
+ .foogallery-setting-loading_icon .fg-loader {
44
+ position: absolute;
45
+ top: 50%;
46
+ left: 50%;
47
+ transform: translateX(-50%) translateY(-50%);
48
+ width: 1em;
49
+ height: 1em;
50
+ font-size: 5px;
51
+ }
52
+
53
+ .foogallery-setting-loading_icon.fg-loading-bars .fg-loader {
54
+ font-size: 4px;
55
+ width: 1em;
56
+ height: 4em;
57
+ }
58
+
59
+ .foogallery-setting-loading_icon.fg-loading-partial .fg-loader {
60
+ font-size: 4px;
61
+ width: 10em;
62
+ height: 10em;
63
+ }
64
+
65
+ .foogallery-setting-loading_icon.fg-loading-pulse .fg-loader {
66
+ font-size: 4px;
67
+ width: 2.5em;
68
+ height: 2.5em;
69
+ transform: translateX(-50%) translateY(-150%);
70
+ }
71
+
72
+ .foogallery-setting-loading_icon.fg-loading-trail .fg-loader {
73
+ font-size: 20px;
74
+ }
75
+
76
+ .fg-item-inner {
77
+ margin: 0;
78
  }
extensions/default-templates/shared/css/foogallery.css CHANGED
@@ -1,2314 +1,2410 @@
1
- .foogallery, .foogallery * {
2
- box-sizing: border-box;
3
- }
4
- .foogallery {
5
- display: block;
6
- z-index: 1;
7
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
8
- position: relative;
9
- line-height: 0;
10
- font-size: 0;
11
- width: 100%;
12
- max-width: 100%;
13
- }
14
- .foogallery .fg-item {
15
- display: inline-block;
16
- position: relative;
17
- background-color: transparent;
18
- z-index: 2;
19
- -webkit-user-select: none;
20
- -moz-user-select: none;
21
- -ms-user-select: none;
22
- user-select: none;
23
- }
24
- .foogallery .fg-item-inner {
25
- display: block;
26
- position: relative;
27
- visibility: hidden;
28
- overflow: hidden;
29
- opacity: 0;
30
- z-index: 3;
31
- margin: 0;
32
- border: solid 0 transparent;
33
- }
34
-
35
- .foogallery .fg-item.fg-loading,
36
- .foogallery .fg-item.fg-error {
37
- background: no-repeat center;
38
- }
39
-
40
- .foogallery .fg-item.fg-error {
41
- background-image: url('../img/image.png');
42
- }
43
-
44
- /* @2x Images (Pixel Ratio of 1.25+) */
45
- @media only screen and (-o-min-device-pixel-ratio: 5/4),
46
- only screen and (-webkit-min-device-pixel-ratio: 1.25),
47
- only screen and (min-device-pixel-ratio: 1.25),
48
- only screen and (min-resolution: 1.25dppx) {
49
- .foogallery .fg-item.fg-error {
50
- background-image: url('../img/image@2x.png');
51
- }
52
- }
53
-
54
- /* @3x Images (Pixel Ratio of 2.25+) */
55
- @media only screen and (-o-min-device-pixel-ratio: 9/4),
56
- only screen and (-webkit-min-device-pixel-ratio: 2.25),
57
- only screen and (min-device-pixel-ratio: 2.25),
58
- only screen and (min-resolution: 2.25dppx) {
59
- .foogallery .fg-item.fg-error {
60
- background-image: url('../img/image@3x.png');
61
- }
62
- }
63
-
64
- .foogallery .fg-item.fg-loaded {
65
- z-index: 4;
66
- }
67
- .foogallery .fg-loaded .fg-item-inner {
68
- visibility: visible;
69
- opacity: 1;
70
- z-index: 5;
71
- }
72
- .foogallery .fg-error .fg-item-inner {
73
- pointer-events: none;
74
- cursor: default;
75
- }
76
- .foogallery .fg-thumb {
77
- display: block;
78
- position: relative;
79
- border: none;
80
- outline: 0;
81
- text-decoration: none;
82
- z-index: 4;
83
- }
84
- .foogallery .fg-image {
85
- display: block;
86
- position: relative;
87
- border: none;
88
- outline: 0;
89
- text-decoration: none;
90
- z-index: 5;
91
- max-width: none;
92
- height: auto;
93
- margin: 0;
94
- }
95
- .foogallery .fg-loaded .fg-thumb {
96
- z-index: 6;
97
- }
98
- .foogallery .fg-loaded .fg-image {
99
- z-index: 7;
100
- }
101
-
102
-
103
- /* Item Style */
104
- .foogallery.fg-light .fg-item-inner {
105
- background-color: #FFF;
106
- color: #333;
107
- border-color: #FFF;
108
- }
109
- .foogallery.fg-dark .fg-item-inner {
110
- background-color: #333;
111
- color: #FFF;
112
- border-color: #333;
113
- }
114
- /* Idle / Loading / Error Style */
115
- .foogallery.fg-light .fg-item.fg-idle,
116
- .foogallery.fg-light .fg-item.fg-loading,
117
- .foogallery.fg-light .fg-item.fg-error {
118
- background-color: #eee;
119
- box-shadow: inset 0 0 0 1px #ddd;
120
- }
121
- .foogallery.fg-dark .fg-item.fg-idle,
122
- .foogallery.fg-dark .fg-item.fg-loading,
123
- .foogallery.fg-dark .fg-item.fg-error {
124
- background-color: #444;
125
- box-shadow: inset 0 0 0 1px #333;
126
- }
127
- /* Border Size */
128
- .foogallery.fg-border-thin .fg-item-inner {
129
- border-width: 4px;
130
- }
131
- .foogallery.fg-border-medium .fg-item-inner {
132
- border-width: 10px;
133
- }
134
- .foogallery.fg-border-thick .fg-item-inner {
135
- border-width: 16px;
136
- }
137
- /* Drop Shadows */
138
- .foogallery.fg-light.fg-shadow-outline .fg-item-inner {
139
- box-shadow: 0 0 0 1px #ddd;
140
- }
141
- .foogallery.fg-dark.fg-shadow-outline .fg-item-inner {
142
- box-shadow: 0 0 0 1px #222;
143
- }
144
- .foogallery.fg-light.fg-shadow-small .fg-item-inner,
145
- .foogallery.fg-dark.fg-shadow-small .fg-item-inner {
146
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
147
- }
148
- .foogallery.fg-light.fg-shadow-medium .fg-item-inner,
149
- .foogallery.fg-dark.fg-shadow-medium .fg-item-inner {
150
- box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
151
- }
152
- .foogallery.fg-light.fg-shadow-large .fg-item-inner,
153
- .foogallery.fg-dark.fg-shadow-large .fg-item-inner {
154
- box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
155
- }
156
- /* Inset Shadows */
157
- .foogallery.fg-shadow-inset-small .fg-thumb:after,
158
- .foogallery.fg-shadow-inset-medium .fg-thumb:after,
159
- .foogallery.fg-shadow-inset-large .fg-thumb:after {
160
- display: block;
161
- content: "";
162
- position: absolute;
163
- top: 0;
164
- left: 0;
165
- right: 0;
166
- bottom: 0;
167
- z-index: 7;
168
- }
169
- .foogallery.fg-light.fg-shadow-inset-small .fg-thumb:after,
170
- .foogallery.fg-dark.fg-shadow-inset-small .fg-thumb:after {
171
- box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
172
- }
173
- .foogallery.fg-light.fg-shadow-inset-medium .fg-thumb:after,
174
- .foogallery.fg-dark.fg-shadow-inset-medium .fg-thumb:after {
175
- box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
176
- }
177
- .foogallery.fg-light.fg-shadow-inset-large .fg-thumb:after,
178
- .foogallery.fg-dark.fg-shadow-inset-large .fg-thumb:after {
179
- box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
180
- }
181
-
182
- .foogallery.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
183
- .foogallery.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
184
- .foogallery.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
185
- border-radius: 50%;
186
- }
187
- /* Rounded Corners */
188
- .foogallery.fg-round-small .fg-item,
189
- .foogallery.fg-round-small .fg-item-inner {
190
- border-radius: 5px;
191
- }
192
- .foogallery.fg-round-medium .fg-item,
193
- .foogallery.fg-round-medium .fg-item-inner {
194
- border-radius: 10px;
195
- }
196
- .foogallery.fg-round-large .fg-item,
197
- .foogallery.fg-round-large .fg-item-inner {
198
- border-radius: 15px;
199
- }
200
- .foogallery.fg-round-full .fg-item,
201
- .foogallery.fg-round-full .fg-item-inner {
202
- border-radius: 50%;
203
- }
204
- /* Loader Styles */
205
- .foogallery .fg-loader {
206
- position: absolute;
207
- top: 50%;
208
- left: 50%;
209
- transform: translateX(-50%) translateY(-50%);
210
- width: 1em;
211
- height: 1em;
212
- font-size: 5px;
213
- visibility: hidden;
214
- opacity: 0;
215
- }
216
-
217
- .foogallery .fg-loading .fg-loader {
218
- visibility: visible;
219
- opacity: 1;
220
- }
221
- .fg-loading-default .fg-loader {
222
- border-radius: 50%;
223
- text-indent: -9999em;
224
- -webkit-animation: loading-default 1.1s infinite ease;
225
- animation: loading-default 1.1s infinite ease;
226
- }
227
-
228
- @-webkit-keyframes loading-default {
229
- 0%,
230
- 100% {
231
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 1),
232
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
233
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
234
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
235
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
236
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
237
- -2.6em 0 0 0 rgba(130, 130, 130, 0.5),
238
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7);
239
- }
240
- 12.5% {
241
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.7),
242
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 1), 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
243
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
244
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
245
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
246
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
247
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5);
248
- }
249
- 25% {
250
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.5),
251
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7),
252
- 2.5em 0 0 0 rgba(130, 130, 130, 1), 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
253
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
254
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
255
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
256
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
257
- }
258
- 37.5% {
259
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
260
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5),
261
- 2.5em 0 0 0 rgba(130, 130, 130, 0.7),
262
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 1), 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
263
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
264
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
265
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
266
- }
267
- 50% {
268
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
269
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
270
- 2.5em 0 0 0 rgba(130, 130, 130, 0.5),
271
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.7),
272
- 0 2.5em 0 0 rgba(130, 130, 130, 1), -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
273
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
274
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
275
- }
276
- 62.5% {
277
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
278
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
279
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
280
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.5),
281
- 0 2.5em 0 0 rgba(130, 130, 130, 0.7),
282
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 1), -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
283
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
284
- }
285
- 75% {
286
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
287
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
288
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
289
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
290
- 0 2.5em 0 0 rgba(130, 130, 130, 0.5),
291
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.7),
292
- -2.6em 0 0 0 rgba(130, 130, 130, 1), -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
293
- }
294
- 87.5% {
295
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
296
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
297
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
298
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
299
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
300
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.5),
301
- -2.6em 0 0 0 rgba(130, 130, 130, 0.7),
302
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 1);
303
- }
304
- }
305
-
306
- @keyframes loading-default {
307
- 0%,
308
- 100% {
309
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 1),
310
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
311
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
312
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
313
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
314
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
315
- -2.6em 0 0 0 rgba(130, 130, 130, 0.5),
316
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7);
317
- }
318
- 12.5% {
319
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.7),
320
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 1), 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
321
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
322
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
323
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
324
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
325
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5);
326
- }
327
- 25% {
328
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.5),
329
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7),
330
- 2.5em 0 0 0 rgba(130, 130, 130, 1), 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
331
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
332
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
333
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
334
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
335
- }
336
- 37.5% {
337
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
338
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5),
339
- 2.5em 0 0 0 rgba(130, 130, 130, 0.7),
340
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 1), 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
341
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
342
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
343
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
344
- }
345
- 50% {
346
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
347
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
348
- 2.5em 0 0 0 rgba(130, 130, 130, 0.5),
349
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.7),
350
- 0 2.5em 0 0 rgba(130, 130, 130, 1), -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
351
- -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
352
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
353
- }
354
- 62.5% {
355
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
356
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
357
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
358
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.5),
359
- 0 2.5em 0 0 rgba(130, 130, 130, 0.7),
360
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 1), -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
361
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
362
- }
363
- 75% {
364
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
365
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
366
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
367
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
368
- 0 2.5em 0 0 rgba(130, 130, 130, 0.5),
369
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.7),
370
- -2.6em 0 0 0 rgba(130, 130, 130, 1), -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
371
- }
372
- 87.5% {
373
- box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
374
- 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
375
- 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
376
- 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
377
- 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
378
- -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.5),
379
- -2.6em 0 0 0 rgba(130, 130, 130, 0.7),
380
- -1.8em -1.8em 0 0 rgba(130, 130, 130, 1);
381
- }
382
- }
383
- .fg-loading-bars .fg-loader,
384
- .fg-loading-bars .fg-loader:before,
385
- .fg-loading-bars .fg-loader:after {
386
- background: rgba(130, 130, 130, 1);
387
- -webkit-animation: loading-bars 1s infinite ease-in-out;
388
- animation: loading-bars 1s infinite ease-in-out;
389
- width: 1em;
390
- height: 4em;
391
- }
392
- .fg-loading-bars .fg-loader {
393
- color: rgba(130, 130, 130, 1);
394
- text-indent: -9999em;
395
- font-size: 4px;
396
- -webkit-animation-delay: -0.16s;
397
- animation-delay: -0.16s;
398
- }
399
- .fg-loading-bars .fg-loader:before,
400
- .fg-loading-bars .fg-loader:after {
401
- position: absolute;
402
- top: 0;
403
- content: '';
404
- }
405
- .fg-loading-bars .fg-loader:before {
406
- left: -1.5em;
407
- -webkit-animation-delay: -0.32s;
408
- animation-delay: -0.32s;
409
- }
410
- .fg-loading-bars .fg-loader:after {
411
- left: 1.5em;
412
- }
413
- @-webkit-keyframes loading-bars {
414
- 0%,
415
- 80%,
416
- 100% {
417
- box-shadow: 0 0;
418
- height: 4em;
419
- }
420
- 40% {
421
- box-shadow: 0 -2em;
422
- height: 5em;
423
- }
424
- }
425
- @keyframes loading-bars {
426
- 0%,
427
- 80%,
428
- 100% {
429
- box-shadow: 0 0;
430
- height: 4em;
431
- }
432
- 40% {
433
- box-shadow: 0 -2em;
434
- height: 5em;
435
- }
436
- }
437
- .fg-loading-trail .fg-loader {
438
- color: #828282;
439
- font-size: 20px;
440
- text-indent: -9999em;
441
- overflow: hidden;
442
- border-radius: 50%;
443
- -webkit-animation: loading-trail-1 1.7s infinite ease, loading-trail-2 1.7s infinite ease;
444
- animation: loading-trail-1 1.7s infinite ease, loading-trail-2 1.7s infinite ease;
445
- }
446
- @-webkit-keyframes loading-trail-1 {
447
- 0% {
448
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
449
- }
450
- 5%,
451
- 95% {
452
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
453
- }
454
- 10%,
455
- 59% {
456
- box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
457
- }
458
- 20% {
459
- box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
460
- }
461
- 38% {
462
- box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
463
- }
464
- 100% {
465
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
466
- }
467
- }
468
- @keyframes loading-trail-1 {
469
- 0% {
470
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
471
- }
472
- 5%,
473
- 95% {
474
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
475
- }
476
- 10%,
477
- 59% {
478
- box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
479
- }
480
- 20% {
481
- box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
482
- }
483
- 38% {
484
- box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
485
- }
486
- 100% {
487
- box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
488
- }
489
- }
490
- @-webkit-keyframes loading-trail-2 {
491
- 0% {
492
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
493
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
494
- }
495
- 100% {
496
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
497
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
498
- }
499
- }
500
- @keyframes loading-trail-2 {
501
- 0% {
502
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
503
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
504
- }
505
- 100% {
506
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
507
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
508
- }
509
- }
510
- .fg-loading-pulse .fg-loader,
511
- .fg-loading-pulse .fg-loader:before,
512
- .fg-loading-pulse .fg-loader:after {
513
- border-radius: 50%;
514
- width: 2.5em;
515
- height: 2.5em;
516
- -webkit-animation-fill-mode: both;
517
- animation-fill-mode: both;
518
- -webkit-animation: loading-pulse 1.8s infinite ease-in-out;
519
- animation: loading-pulse 1.8s infinite ease-in-out;
520
- }
521
- .fg-loading-pulse .fg-loader {
522
- color: #828282;
523
- font-size: 4px;
524
- text-indent: -9999em;
525
- transform: translateX(-50%) translateY(-150%);
526
- -webkit-animation-delay: -0.16s;
527
- animation-delay: -0.16s;
528
- }
529
- .fg-loading-pulse .fg-loader:before,
530
- .fg-loading-pulse .fg-loader:after {
531
- content: '';
532
- position: absolute;
533
- top: 0;
534
- }
535
- .fg-loading-pulse .fg-loader:before {
536
- left: -3.5em;
537
- -webkit-animation-delay: -0.32s;
538
- animation-delay: -0.32s;
539
- }
540
- .fg-loading-pulse .fg-loader:after {
541
- left: 3.5em;
542
- }
543
- @-webkit-keyframes loading-pulse {
544
- 0%,
545
- 80%,
546
- 100% {
547
- box-shadow: 0 2.5em 0 -1.3em;
548
- }
549
- 40% {
550
- box-shadow: 0 2.5em 0 0;
551
- }
552
- }
553
- @keyframes loading-pulse {
554
- 0%,
555
- 80%,
556
- 100% {
557
- box-shadow: 0 2.5em 0 -1.3em;
558
- }
559
- 40% {
560
- box-shadow: 0 2.5em 0 0;
561
- }
562
- }
563
- .fg-loading-dots .fg-loader {
564
- color: #828282;
565
- font-size: 5px;
566
- border-radius: 50%;
567
- text-indent: -9999em;
568
- -webkit-animation: loading-dots 1.3s infinite linear;
569
- animation: loading-dots 1.3s infinite linear;
570
- }
571
- @-webkit-keyframes loading-dots {
572
- 0%,
573
- 100% {
574
- box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
575
- }
576
- 12.5% {
577
- box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
578
- }
579
- 25% {
580
- box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
581
- }
582
- 37.5% {
583
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
584
- }
585
- 50% {
586
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
587
- }
588
- 62.5% {
589
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
590
- }
591
- 75% {
592
- box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
593
- }
594
- 87.5% {
595
- box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
596
- }
597
- }
598
- @keyframes loading-dots {
599
- 0%,
600
- 100% {
601
- box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
602
- }
603
- 12.5% {
604
- box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
605
- }
606
- 25% {
607
- box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
608
- }
609
- 37.5% {
610
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
611
- }
612
- 50% {
613
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
614
- }
615
- 62.5% {
616
- box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
617
- }
618
- 75% {
619
- box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
620
- }
621
- 87.5% {
622
- box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
623
- }
624
- }
625
- .fg-loading-partial .fg-loader,
626
- .fg-loading-partial .fg-loader:after {
627
- border-radius: 50%;
628
- width: 10em;
629
- height: 10em;
630
- }
631
- .fg-loading-partial .fg-loader {
632
- font-size: 4px;
633
- text-indent: -9999em;
634
- border-top: 1.1em solid rgba(130,130,130, 0.2);
635
- border-right: 1.1em solid rgba(130,130,130, 0.2);
636
- border-bottom: 1.1em solid rgba(130,130,130, 0.2);
637
- border-left: 1.1em solid #828282;
638
- -webkit-animation: loading-partial 1.1s infinite linear;
639
- animation: loading-partial 1.1s infinite linear;
640
- }
641
- @-webkit-keyframes loading-partial {
642
- 0% {
643
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
644
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
645
- }
646
- 100% {
647
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
648
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
649
- }
650
- }
651
- @keyframes loading-partial {
652
- 0% {
653
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
654
- transform: translateX(-50%) translateY(-50%) rotate(0deg);
655
- }
656
- 100% {
657
- -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
658
- transform: translateX(-50%) translateY(-50%) rotate(360deg);
659
- }
660
- }
661
- /* Loaded Effects */
662
- .foogallery.fg-loaded-fade-in .fg-item,
663
- .foogallery.fg-loaded-slide-up .fg-item,
664
- .foogallery.fg-loaded-slide-down .fg-item,
665
- .foogallery.fg-loaded-slide-left .fg-item,
666
- .foogallery.fg-loaded-slide-right .fg-item,
667
- .foogallery.fg-loaded-scale-up .fg-item,
668
- .foogallery.fg-loaded-swing-down .fg-item,
669
- .foogallery.fg-loaded-drop .fg-item,
670
- .foogallery.fg-loaded-fly .fg-item,
671
- .foogallery.fg-loaded-flip .fg-item {
672
- transition-timing-function: ease;
673
- transition-duration: 650ms;
674
- transition-property: background-color, transform;
675
- }
676
- .foogallery.fg-loaded-fade-in .fg-item-inner,
677
- .foogallery.fg-loaded-slide-up .fg-item-inner,
678
- .foogallery.fg-loaded-slide-down .fg-item-inner,
679
- .foogallery.fg-loaded-slide-left .fg-item-inner,
680
- .foogallery.fg-loaded-slide-right .fg-item-inner,
681
- .foogallery.fg-loaded-scale-up .fg-item-inner,
682
- .foogallery.fg-loaded-swing-down .fg-item-inner,
683
- .foogallery.fg-loaded-drop .fg-item-inner,
684
- .foogallery.fg-loaded-fly .fg-item-inner,
685
- .foogallery.fg-loaded-flip .fg-item-inner {
686
- transition-timing-function: ease;
687
- transition-duration: 650ms;
688
- }
689
- /* Only apply the perspective once loaded otherwise transitions could take place behind other items*/
690
- .foogallery.fg-loaded-swing-down .fg-item.fg-loaded,
691
- .foogallery.fg-loaded-drop .fg-item.fg-loaded,
692
- .foogallery.fg-loaded-fly .fg-item.fg-loaded,
693
- .foogallery.fg-loaded-flip .fg-item.fg-loaded {
694
- perspective: 1300px;
695
- }
696
- /* Fade In */
697
- .foogallery.fg-loaded-fade-in .fg-item-inner {
698
- transition-property: visibility, opacity;
699
- }
700
- /* Caption Styles */
701
- .foogallery .fg-caption {
702
- visibility: hidden;
703
- opacity: 0;
704
- background-color: rgba(0,0,0,0.6);
705
- color: #fff;
706
- position: absolute;
707
- z-index: 8;
708
- width: 100%;
709
- max-height: 100%;
710
- overflow: hidden;
711
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
712
- font-size: 13px;
713
- font-weight: 400;
714
- line-height: 1.3;
715
- border: none;
716
- text-align: center;
717
- cursor: pointer;
718
- }
719
- .foogallery .fg-caption a {
720
- text-decoration: none;
721
- color: #fff;
722
- border-bottom: 1px solid #FFF;
723
- }
724
- .foogallery .fg-caption a:hover {
725
- border-bottom: none;
726
- }
727
-
728
- .foogallery .fg-caption-title {
729
- white-space: nowrap;
730
- overflow: hidden;
731
- text-overflow: ellipsis;
732
- font-size: 16px;
733
- font-weight: 400;
734
- padding: 5px;
735
- }
736
- .foogallery .fg-caption-desc {
737
- padding: 5px;
738
- }
739
- .foogallery .fg-caption-title+.fg-caption-desc {
740
- padding-top: 0;
741
- }
742
-
743
- /* Always */
744
- .foogallery.fg-caption-always .fg-caption .fg-caption-inner:before {
745
- display: none;
746
- }
747
- .foogallery.fg-caption-always .fg-item.fg-loaded .fg-caption {
748
- left: 0;
749
- bottom: 0;
750
- transition-timing-function: ease;
751
- transition-duration: 300ms;
752
- transition-property: visibility, opacity;
753
- visibility: visible;
754
- opacity: 1;
755
- text-align: left;
756
- }
757
-
758
- /* On Hover */
759
- .foogallery.fg-caption-hover .fg-caption .fg-caption-inner {
760
- width: 100%;
761
- max-height: 100%;
762
- position: absolute;
763
- top: 50%;
764
- left: 0;
765
- transform: translateY(-50%);
766
- }
767
- .foogallery.fg-caption-hover .fg-item.fg-loaded .fg-thumb:before {
768
- display: none;
769
- }
770
- /* Icon & Overlay */
771
- .foogallery.fg-hover-zoom .fg-thumb:before,
772
- .foogallery.fg-hover-zoom2 .fg-thumb:before,
773
- .foogallery.fg-hover-zoom3 .fg-thumb:before,
774
- .foogallery.fg-hover-plus .fg-thumb:before,
775
- .foogallery.fg-hover-circle-plus .fg-thumb:before,
776
- .foogallery.fg-hover-eye .fg-thumb:before,
777
- .foogallery.fg-hover-external .fg-thumb:before,
778
- .foogallery.fg-hover-tint .fg-thumb:before {
779
- content: "";
780
- display: block;
781
- position: absolute;
782
- visibility: hidden;
783
- opacity: 0;
784
- top: 0;
785
- bottom: 0;
786
- left: 0;
787
- right: 0;
788
- z-index: 8;
789
- background: rgba(0,0,0,0.5) no-repeat center center;
790
- background-size: 32px 32px;
791
- }
792
-
793
- .foogallery.fg-hover-zoom .fg-item-inner:hover .fg-thumb:before,
794
- .foogallery.fg-hover-zoom2 .fg-item-inner:hover .fg-thumb:before,
795
- .foogallery.fg-hover-zoom3 .fg-item-inner:hover .fg-thumb:before,
796
- .foogallery.fg-hover-plus .fg-item-inner:hover .fg-thumb:before,
797
- .foogallery.fg-hover-circle-plus .fg-item-inner:hover .fg-thumb:before,
798
- .foogallery.fg-hover-eye .fg-item-inner:hover .fg-thumb:before,
799
- .foogallery.fg-hover-external .fg-item-inner:hover .fg-thumb:before,
800
- .foogallery.fg-hover-tint .fg-item-inner:hover .fg-thumb:before,
801
- .foogallery.fg-hover-zoom .fg-thumb:focus:before,
802
- .foogallery.fg-hover-zoom2 .fg-thumb:focus:before,
803
- .foogallery.fg-hover-zoom3 .fg-thumb:focus:before,
804
- .foogallery.fg-hover-plus .fg-thumb:focus:before,
805
- .foogallery.fg-hover-circle-plus .fg-thumb:focus:before,
806
- .foogallery.fg-hover-eye .fg-thumb:focus:before,
807
- .foogallery.fg-hover-external .fg-thumb:focus:before,
808
- .foogallery.fg-hover-tint .fg-thumb:focus:before {
809
- visibility: visible;
810
- opacity: 1;
811
- }
812
-
813
- /* Support captions showing the icon */
814
- .foogallery.fg-hover-zoom .fg-caption-inner:before,
815
- .foogallery.fg-hover-zoom2 .fg-caption-inner:before,
816
- .foogallery.fg-hover-zoom3 .fg-caption-inner:before,
817
- .foogallery.fg-hover-plus .fg-caption-inner:before,
818
- .foogallery.fg-hover-circle-plus .fg-caption-inner:before,
819
- .foogallery.fg-hover-eye .fg-caption-inner:before,
820
- .foogallery.fg-hover-external .fg-caption-inner:before,
821
- .foogallery.fg-hover-tint .fg-caption-inner:before {
822
- content: "";
823
- display: inline-block;
824
- position: relative;
825
- width: 32px;
826
- height: 32px;
827
- margin: 10px 0 5px 0;
828
- background: transparent no-repeat center center;
829
- background-size: 32px 32px;
830
- vertical-align: middle;
831
- }
832
-
833
-
834
- .foogallery.fg-hover-zoom .fg-thumb:before,
835
- .foogallery.fg-hover-zoom .fg-caption-inner:before {
836
- background-image: url('../img/zoom.png');
837
- }
838
-
839
- .foogallery.fg-hover-zoom2 .fg-thumb:before,
840
- .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
841
- background-image: url('../img/zoom2.png');
842
- }
843
-
844
- .foogallery.fg-hover-zoom3 .fg-thumb:before,
845
- .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
846
- background-image: url('../img/zoom3.png');
847
- }
848
-
849
- .foogallery.fg-hover-plus .fg-thumb:before,
850
- .foogallery.fg-hover-plus .fg-caption-inner:before {
851
- background-image: url('../img/plus.png');
852
- }
853
-
854
- .foogallery.fg-hover-circle-plus .fg-thumb:before,
855
- .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
856
- background-image: url('../img/circle-plus.png');
857
- }
858
-
859
- .foogallery.fg-hover-eye .fg-thumb:before,
860
- .foogallery.fg-hover-eye .fg-caption-inner:before {
861
- background-image: url('../img/eye.png');
862
- }
863
-
864
- .foogallery.fg-hover-external .fg-thumb:before,
865
- .foogallery.fg-hover-external .fg-caption-inner:before {
866
- background-image: url('../img/external.png');
867
- }
868
-
869
- /* @2x Images (Pixel Ratio of 1.25+) */
870
- @media only screen and (-o-min-device-pixel-ratio: 5/4),
871
- only screen and (-webkit-min-device-pixel-ratio: 1.25),
872
- only screen and (min-device-pixel-ratio: 1.25),
873
- only screen and (min-resolution: 1.25dppx) {
874
-
875
- .foogallery.fg-hover-zoom .fg-thumb:before,
876
- .foogallery.fg-hover-zoom .fg-caption-inner:before {
877
- background-image: url('../img/zoom@2x.png');
878
- }
879
-
880
- .foogallery.fg-hover-zoom2 .fg-thumb:before,
881
- .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
882
- background-image: url('../img/zoom2@2x.png');
883
- }
884
-
885
- .foogallery.fg-hover-zoom3 .fg-thumb:before,
886
- .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
887
- background-image: url('../img/zoom3@2x.png');
888
- }
889
-
890
- .foogallery.fg-hover-plus .fg-thumb:before,
891
- .foogallery.fg-hover-plus .fg-caption-inner:before {
892
- background-image: url('../img/plus@2x.png');
893
- }
894
-
895
- .foogallery.fg-hover-circle-plus .fg-thumb:before,
896
- .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
897
- background-image: url('../img/circle-plus@2x.png');
898
- }
899
-
900
- .foogallery.fg-hover-eye .fg-thumb:before,
901
- .foogallery.fg-hover-eye .fg-caption-inner:before {
902
- background-image: url('../img/eye@2x.png');
903
- }
904
-
905
- .foogallery.fg-hover-external .fg-thumb:before,
906
- .foogallery.fg-hover-external .fg-caption-inner:before {
907
- background-image: url('../img/external@2x.png');
908
- }
909
-
910
- }
911
-
912
- /* @3x Images (Pixel Ratio of 2.25+) */
913
- @media only screen and (-o-min-device-pixel-ratio: 9/4),
914
- only screen and (-webkit-min-device-pixel-ratio: 2.25),
915
- only screen and (min-device-pixel-ratio: 2.25),
916
- only screen and (min-resolution: 2.25dppx) {
917
-
918
- .foogallery.fg-hover-zoom .fg-thumb:before,
919
- .foogallery.fg-hover-zoom .fg-caption-inner:before {
920
- background-image: url('../img/zoom@3x.png');
921
- }
922
-
923
- .foogallery.fg-hover-zoom2 .fg-thumb:before,
924
- .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
925
- background-image: url('../img/zoom2@3x.png');
926
- }
927
-
928
- .foogallery.fg-hover-zoom3 .fg-thumb:before,
929
- .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
930
- background-image: url('../img/zoom3@3x.png');
931
- }
932
-
933
- .foogallery.fg-hover-plus .fg-thumb:before,
934
- .foogallery.fg-hover-plus .fg-caption-inner:before {
935
- background-image: url('../img/plus@3x.png');
936
- }
937
-
938
- .foogallery.fg-hover-circle-plus .fg-thumb:before,
939
- .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
940
- background-image: url('../img/circle-plus@3x.png');
941
- }
942
-
943
- .foogallery.fg-hover-eye .fg-thumb:before,
944
- .foogallery.fg-hover-eye .fg-caption-inner:before {
945
- background-image: url('../img/eye@3x.png');
946
- }
947
-
948
- .foogallery.fg-hover-external .fg-thumb:before,
949
- .foogallery.fg-hover-external .fg-caption-inner:before {
950
- background-image: url('../img/external@3x.png');
951
- }
952
-
953
- }
954
- /* Transitions */
955
- .foogallery.fg-caption-hover.fg-hover-instant .fg-caption,
956
- .foogallery.fg-caption-hover.fg-hover-fade .fg-caption,
957
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-caption,
958
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-caption,
959
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-caption,
960
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-caption,
961
- .foogallery.fg-caption-hover.fg-hover-push .fg-caption,
962
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-caption,
963
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption,
964
- .foogallery.fg-caption-hover.fg-hover-scale .fg-caption,
965
- .foogallery.fg-hover-instant .fg-thumb:before,
966
- .foogallery.fg-hover-fade .fg-thumb:before,
967
- .foogallery.fg-hover-slide-up .fg-thumb:before,
968
- .foogallery.fg-hover-slide-down .fg-thumb:before,
969
- .foogallery.fg-hover-slide-left .fg-thumb:before,
970
- .foogallery.fg-hover-slide-right .fg-thumb:before,
971
- .foogallery.fg-hover-push .fg-thumb,
972
- .foogallery.fg-hover-colorize .fg-thumb:before,
973
- .foogallery.fg-hover-grayscale .fg-thumb:before,
974
- .foogallery.fg-hover-scale .fg-item,
975
- .foogallery.fg-hover-scale .fg-thumb:before,
976
- .foogallery.fg-hover-colorize .fg-image,
977
- .foogallery.fg-hover-grayscale .fg-image {
978
- transition-timing-function: ease;
979
- transition-duration: 300ms;
980
- }
981
- /* Colorize */
982
- .foogallery.fg-hover-colorize .fg-image {
983
- /* Firefox 10+, Firefox on Android */
984
- filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'saturate\' values=\'0\'/></filter></svg>#grayscale");
985
- /* IE 6-9 */
986
- filter: gray;
987
- /* Chrome 19+, Safari 6+, Safari 6+ iOS */
988
- -webkit-filter: grayscale(100%);
989
- -webkit-transition-property: -webkit-filter;
990
- transition-property: filter;
991
- }
992
- .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image {
993
- -webkit-filter: none;
994
- filter: none;
995
- }
996
- .foogallery.fg-hover-colorize .fg-thumb:before,
997
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-caption {
998
- display: block;
999
- left: 0;
1000
- top: 0;
1001
- bottom: 0;
1002
- transition-property: visibility, opacity;
1003
- }
1004
- .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-thumb:before,
1005
- .foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:hover .fg-caption {
1006
- visibility: visible;
1007
- opacity: 1;
1008
- }
1009
- /* Fade */
1010
- .foogallery.fg-hover-fade .fg-loaded .fg-thumb:before,
1011
- .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption {
1012
- display: block;
1013
- left: 0;
1014
- top: 0;
1015
- bottom: 0;
1016
- transition-property: visibility, opacity;
1017
- }
1018
- .foogallery.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1019
- .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-caption {
1020
- visibility: visible;
1021
- opacity: 1;
1022
- }
1023
- /* Grayscale */
1024
- .foogallery.fg-hover-grayscale .fg-image {
1025
- -webkit-filter: none;
1026
- filter: none;
1027
- -webkit-transition-property: -webkit-filter;
1028
- transition-property: filter;
1029
- }
1030
- .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image {
1031
- /* For Webkit browsers */
1032
- -webkit-filter: grayscale(1);
1033
- -webkit-filter: grayscale(100%);
1034
- /* Standard */
1035
- filter: grayscale(100%);
1036
- /* For IE 6 - 9 */
1037
- filter: gray;
1038
- opacity: 1;
1039
- }
1040
- .foogallery.fg-hover-grayscale .fg-thumb:before,
1041
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption {
1042
- display: block;
1043
- left: 0;
1044
- top: 0;
1045
- bottom: 0;
1046
- transition-property: visibility, opacity;
1047
- }
1048
- .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-thumb:before,
1049
- .foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:hover .fg-caption {
1050
- visibility: visible;
1051
- opacity: 1;
1052
- }
1053
- /* Instant */
1054
- .foogallery.fg-hover-instant .fg-loaded .fg-thumb:before,
1055
- .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption {
1056
- display: block;
1057
- left: 0;
1058
- top: 0;
1059
- bottom: 0;
1060
- transition-property: none;
1061
- }
1062
- .foogallery.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1063
- .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-caption {
1064
- visibility: visible;
1065
- opacity: 1;
1066
- }
1067
- /* Push */
1068
- .foogallery.fg-hover-push .fg-loaded .fg-thumb:before,
1069
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1070
- display: block;
1071
- left: 0;
1072
- top: 0;
1073
- bottom: 0;
1074
- transform: translateX(100%);
1075
- visibility: visible;
1076
- opacity: 1;
1077
- }
1078
- .foogallery.fg-hover-push .fg-loaded .fg-thumb,
1079
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1080
- transition-property: transform;
1081
- }
1082
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-caption {
1083
- transform: translateY(0);
1084
- }
1085
- .foogallery.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,
1086
- .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb {
1087
- transform: translateX(-100%);
1088
- }
1089
- /* Scale */
1090
- .foogallery.fg-hover-scale .fg-item {
1091
- transition-property: transform;
1092
- z-index: 4;
1093
- }
1094
-
1095
- .foogallery.fg-hover-scale .fg-item:hover {
1096
- transform: scale(1.048);
1097
- z-index: 10;
1098
- }
1099
- .foogallery.fg-hover-scale .fg-thumb:before,
1100
- .foogallery.fg-caption-hover.fg-hover-scale .fg-caption {
1101
- display: block;
1102
- left: 0;
1103
- top: 0;
1104
- bottom: 0;
1105
- transition-property: visibility, opacity;
1106
- }
1107
- .foogallery.fg-hover-scale .fg-item-inner:hover .fg-thumb:before,
1108
- .foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:hover .fg-caption {
1109
- visibility: visible;
1110
- opacity: 1;
1111
- }
1112
- /* Slide */
1113
- .foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before,
1114
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,
1115
- .foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before,
1116
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,
1117
- .foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before,
1118
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,
1119
- .foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before,
1120
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1121
- display: block;
1122
- left: 0;
1123
- top: 0;
1124
- bottom: 0;
1125
- transition-property: transform;
1126
- visibility: visible;
1127
- opacity: 1;
1128
- }
1129
- .foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1130
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-caption,
1131
- .foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1132
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-caption,
1133
- .foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1134
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-caption,
1135
- .foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1136
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-caption {
1137
- transform: translateY(0) translateX(0);
1138
- }
1139
-
1140
-
1141
- /* Slide Up */
1142
- .foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before,
1143
- .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption {
1144
- transform: translateY(100%);
1145
- }
1146
-
1147
- /* Slide Down */
1148
- .foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before,
1149
- .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption {
1150
- transform: translateY(-100%);
1151
- }
1152
-
1153
- /* Slide Left */
1154
- .foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before,
1155
- .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption {
1156
- transform: translateX(100%);
1157
- }
1158
-
1159
- /* Slide Right */
1160
- .foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before,
1161
- .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1162
- transform: translateX(-100%);
1163
- }
1164
- .fg-paging-container, .fg-paging-container *, .fg-paging-container *:before, .fg-paging-container *:after {
1165
- -webkit-box-sizing: border-box;
1166
- -moz-box-sizing: border-box;
1167
- box-sizing: border-box;
1168
- }
1169
- .fg-paging-container {
1170
- display: block;
1171
- padding: 15px;
1172
- text-align: center;
1173
- font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1174
- -webkit-user-select: none;
1175
- -moz-user-select: none;
1176
- -ms-user-select: none;
1177
- user-select: none;
1178
- }
1179
- /* Utility */
1180
- .fg-sr-only {
1181
- position: absolute;
1182
- width: 1px;
1183
- height: 1px;
1184
- padding: 0;
1185
- margin: -1px;
1186
- overflow: hidden;
1187
- clip: rect(0,0,0,0);
1188
- border: 0;
1189
- }
1190
- .fg-paging-container .fg-dots,
1191
- .fg-paging-container .fg-dot-item {
1192
- display: inline-block;
1193
- margin: 0;
1194
- padding: 0;
1195
- outline: none;
1196
- list-style: none;
1197
- }
1198
- .fg-paging-container .fg-dot-item .fg-dot-link {
1199
- display: inline-block;
1200
- margin: 3px;
1201
- font-weight: 400;
1202
- line-height: 1.42857143;
1203
- text-align: center;
1204
- white-space: nowrap;
1205
- vertical-align: middle;
1206
- cursor: pointer;
1207
- user-select: none;
1208
- background-image: none;
1209
- text-decoration: none;
1210
- border: 1px solid transparent;
1211
- position: relative;
1212
- border-radius: 50%;
1213
- padding: 0;
1214
- font-size: 0;
1215
- outline: none;
1216
- color: transparent;
1217
- box-shadow: none;
1218
- }
1219
- .fg-paging-container .fg-dot-item .fg-dot-link:before {
1220
- content: "";
1221
- background-color: transparent;
1222
- border: 1px solid transparent;
1223
- display: block;
1224
- border-radius: 50%;
1225
- width: 9px;
1226
- height: 9px;
1227
- padding: 0;
1228
- margin: 2px;
1229
- }
1230
- .fg-paging-container .fg-dot-item .fg-dot-link:active,
1231
- .fg-paging-container .fg-dot-item .fg-dot-link:hover,
1232
- .fg-paging-container .fg-dot-item .fg-dot-link:focus {
1233
- text-decoration: none;
1234
- box-shadow: none;
1235
- outline: none;
1236
- }
1237
- .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,
1238
- .fg-paging-container .fg-dot-item.fg-selected .fg-dot-link {
1239
- cursor: not-allowed;
1240
- pointer-events: none;
1241
- }
1242
- .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link {
1243
- cursor: not-allowed;
1244
- pointer-events: none;
1245
- outline: none;
1246
- }
1247
-
1248
- /* Light - Dots */
1249
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link,
1250
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before {
1251
- transition-timing-function: ease-out;
1252
- transition-duration: 0.3s;
1253
- transition-property: color, border-color, background-color;
1254
- }
1255
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link {
1256
- background-color: #eee;
1257
- border-color: #9e9e9e;
1258
- }
1259
- .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link {
1260
- border-color: #8a8a8a;
1261
- }
1262
- .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before,
1263
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,
1264
- .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before {
1265
- background-color: #666;
1266
- border-color: #8a8a8a;
1267
- }
1268
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,
1269
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover,
1270
- .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus {
1271
- background-color: #eee;
1272
- border-color: #9e9e9e;
1273
- opacity: 0.5;
1274
- }
1275
-
1276
- /* Dark - Dots */
1277
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,
1278
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before {
1279
- transition-timing-function: ease-out;
1280
- transition-duration: 0.3s;
1281
- transition-property: color, border-color, background-color;
1282
- }
1283
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link {
1284
- background-color: #666;
1285
- border-color: #333;
1286
- }
1287
- .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link {
1288
- border-color: #444;
1289
- }
1290
- .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before,
1291
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,
1292
- .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before {
1293
- background-color: #333;
1294
- border-color: #444;
1295
- }
1296
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,
1297
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover,
1298
- .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus {
1299
- background-color: #666;
1300
- border-color: #333;
1301
- opacity: 0.5;
1302
- }
1303
- /* Base styles */
1304
- .fg-default:after {
1305
- content: '';
1306
- display: block;
1307
- clear: both;
1308
- }
1309
-
1310
- .fg-default .fg-item,
1311
- .fg-default .fg-item-inner,
1312
- .fg-default .fg-thumb {
1313
- display: inline-block;
1314
- vertical-align: top;
1315
- max-width: 100%;
1316
- }
1317
-
1318
- .fg-default .fg-image {
1319
- border-radius: 0;
1320
- display: block;
1321
- max-width: 100%;
1322
- height: auto;
1323
- margin: 0;
1324
- padding: 0;
1325
- }
1326
-
1327
- /* Horizontal alignment */
1328
- .fg-default .fg-image {
1329
- vertical-align: top;
1330
- }
1331
-
1332
- .fg-default.fg-left {
1333
- text-align: left;
1334
- }
1335
-
1336
- .fg-default.fg-center {
1337
- text-align: center;
1338
- }
1339
-
1340
- .fg-default.fg-right {
1341
- text-align: right;
1342
- }
1343
-
1344
- /* Gutter widths */
1345
- .fg-default.fg-gutter-5 {
1346
- padding-left: 5px;
1347
- margin-bottom: -5px;
1348
- }
1349
- .fg-default.fg-gutter-5 .fg-item {
1350
- margin-right: 5px;
1351
- margin-bottom: 5px;
1352
- }
1353
-
1354
- .fg-default.fg-gutter-10 {
1355
- padding-left: 10px;
1356
- margin-bottom: -10px;
1357
- }
1358
- .fg-default.fg-gutter-10 .fg-item {
1359
- margin-right: 10px;
1360
- margin-bottom: 10px;
1361
- }
1362
-
1363
- .fg-default.fg-gutter-15 {
1364
- padding-left: 15px;
1365
- margin-bottom: -15px;
1366
- }
1367
- .fg-default.fg-gutter-15 .fg-item {
1368
- margin-right: 15px;
1369
- margin-bottom: 15px;
1370
- }
1371
-
1372
- .fg-default.fg-gutter-20 {
1373
- padding-left: 20px;
1374
- margin-bottom: -20px;
1375
- }
1376
- .fg-default.fg-gutter-20 .fg-item {
1377
- margin-right: 20px;
1378
- margin-bottom: 20px;
1379
- }
1380
-
1381
- .fg-default.fg-gutter-25 {
1382
- padding-left: 25px;
1383
- margin-bottom: -25px;
1384
- }
1385
- .fg-default.fg-gutter-25 .fg-item {
1386
- margin-right: 25px;
1387
- margin-bottom: 25px;
1388
- }
1389
- /* Base styles */
1390
- .fg-masonry * {
1391
- -webkit-box-sizing: border-box;
1392
- -moz-box-sizing: border-box;
1393
- box-sizing: border-box;
1394
- }
1395
- .foogallery.fg-masonry.fg-center {
1396
- margin: 0 auto;
1397
- }
1398
- .fg-masonry .fg-thumb {
1399
- display: block;
1400
- }
1401
- .fg-masonry.fg-masonry-fixed .fg-thumb {
1402
- display: inline-block;
1403
- }
1404
- .fg-masonry.fg-masonry-fixed .fg-image {
1405
- max-width: 100%;
1406
- }
1407
-
1408
- .fg-masonry .fg-column-width {
1409
- display: inline-block;
1410
- visibility: hidden;
1411
- height: 0;
1412
- border: solid 0 transparent;
1413
- }
1414
- .fg-masonry.fg-masonry-fixed .fg-column-width {
1415
- -webkit-box-sizing: content-box;
1416
- -moz-box-sizing: content-box;
1417
- box-sizing: content-box;
1418
- }
1419
-
1420
- .fg-masonry.fg-masonry-5col .fg-image,
1421
- .fg-masonry.fg-masonry-4col .fg-image,
1422
- .fg-masonry.fg-masonry-3col .fg-image,
1423
- .fg-masonry.fg-masonry-2col .fg-image {
1424
- width: 100%;
1425
- height: auto;
1426
- max-width: 100%;
1427
- }
1428
-
1429
- .fg-masonry .fg-item {
1430
- line-height: 0;
1431
- font-size: 0;
1432
- }
1433
-
1434
- /* 2 column layouts */
1435
- /* 2 column layout - normal gutter */
1436
- .fg-masonry.fg-masonry-2col .fg-item { margin-bottom: 1%; width: 49%; }
1437
- .fg-masonry.fg-masonry-2col .fg-column-width { width: 49%; }
1438
- .fg-masonry.fg-masonry-2col .fg-gutter-width { width: 1%; }
1439
-
1440
- /* 2 column layout - no gutter */
1441
- .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
1442
- .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width { width: 50%; }
1443
- .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width { width: 0; }
1444
-
1445
- /* 2 column layout - large gutter */
1446
- .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 47%; }
1447
- .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width { width: 47%; }
1448
- .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width { width: 3%; }
1449
-
1450
- /* 3 column layouts */
1451
- /* 3 column layout - normal gutter */
1452
- .fg-masonry.fg-masonry-3col .fg-item { margin-bottom: 1%; width: 32%; }
1453
- .fg-masonry.fg-masonry-3col .fg-column-width { width: 32%; }
1454
- .fg-masonry.fg-masonry-3col .fg-gutter-width { width: 1%; }
1455
-
1456
- /* 3 column layout - no gutter */
1457
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item { margin-bottom: 0; width: 33%; }
1458
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width { width: 33%; }
1459
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width { width: 0; }
1460
-
1461
- /* 3 column layout - large gutter */
1462
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 30%; }
1463
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width { width: 30%; }
1464
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width { width: 3%; }
1465
-
1466
- /* 4 column layouts */
1467
- /* 4 column layout - normal gutter */
1468
- .fg-masonry.fg-masonry-4col .fg-item { margin-bottom: 1%; width: 24%; }
1469
- .fg-masonry.fg-masonry-4col .fg-column-width { width: 24%; }
1470
- .fg-masonry.fg-masonry-4col .fg-gutter-width { width: 1%; }
1471
-
1472
- /* 4 column layout - no gutter */
1473
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item { margin-bottom: 0; width: 25%; }
1474
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width { width: 25%; }
1475
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width { width: 0; }
1476
-
1477
- /* 4 column layout - large gutter */
1478
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 22%; }
1479
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width { width: 22%; }
1480
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width { width: 3%; }
1481
-
1482
- /* 5 column layouts */
1483
- /* 5 column layout - normal gutter */
1484
- .fg-masonry.fg-masonry-5col .fg-item { margin-bottom: 1%; width: 19%; }
1485
- .fg-masonry.fg-masonry-5col .fg-column-width { width: 19%; }
1486
- .fg-masonry.fg-masonry-5col .fg-gutter-width { width: 1%; }
1487
-
1488
- /* 5 column layout - no gutter */
1489
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item { margin-bottom: 0; width: 20%; }
1490
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width { width: 20%; }
1491
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width { width: 0; }
1492
-
1493
- /* 5 column layout - large gutter */
1494
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 17%; }
1495
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width { width: 17%; }
1496
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width { width: 3%; }
1497
-
1498
- /* Force 3 column layout < 720px */
1499
- @media screen and (max-width: 720px) {
1500
- /* default gutter */
1501
- .fg-masonry.fg-masonry-5col .fg-item,
1502
- .fg-masonry.fg-masonry-4col .fg-item { margin-bottom: 1%; width: 32%; }
1503
- .fg-masonry.fg-masonry-5col .fg-column-width,
1504
- .fg-masonry.fg-masonry-4col .fg-column-width { width: 32%; }
1505
- .fg-masonry.fg-masonry-5col .fg-gutter-width,
1506
- .fg-masonry.fg-masonry-4col .fg-gutter-width { width: 1%; }
1507
-
1508
- /* no gutter */
1509
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item,
1510
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item { margin-bottom: 0; width: 33%; }
1511
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width,
1512
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width { width: 33%; }
1513
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width,
1514
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width { width: 0; }
1515
-
1516
- /* large gutter */
1517
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item,
1518
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 30%; }
1519
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width,
1520
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width { width: 30%; }
1521
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width,
1522
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width { width: 3%; }
1523
-
1524
- }
1525
-
1526
- /* Force 2 column layout < 480px */
1527
- @media screen and (max-width: 480px) {
1528
- /* default gutter */
1529
- .fg-masonry.fg-masonry-5col .fg-item,
1530
- .fg-masonry.fg-masonry-4col .fg-item,
1531
- .fg-masonry.fg-masonry-3col .fg-item { margin-bottom: 1%; width: 49%; }
1532
- .fg-masonry.fg-masonry-5col .fg-column-width,
1533
- .fg-masonry.fg-masonry-4col .fg-column-width,
1534
- .fg-masonry.fg-masonry-3col .fg-column-width { width: 49%; }
1535
- .fg-masonry.fg-masonry-5col .fg-gutter-width,
1536
- .fg-masonry.fg-masonry-4col .fg-gutter-width,
1537
- .fg-masonry.fg-masonry-3col .fg-gutter-width { width: 1%; }
1538
-
1539
- /* no gutter */
1540
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item,
1541
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,
1542
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
1543
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width,
1544
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,
1545
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width { width: 50%; }
1546
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width,
1547
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,
1548
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width { width: 0; }
1549
-
1550
- /* large gutter */
1551
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item,
1552
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,
1553
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 47%; }
1554
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width,
1555
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,
1556
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width { width: 47%; }
1557
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width,
1558
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,
1559
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width { width: 3%; }
1560
- }
1561
-
1562
- /* Force 1 column layout < 320px */
1563
- @media screen and (max-width: 320px) {
1564
- /* default gutter */
1565
- .fg-masonry.fg-masonry-5col .fg-item,
1566
- .fg-masonry.fg-masonry-4col .fg-item,
1567
- .fg-masonry.fg-masonry-3col .fg-item,
1568
- .fg-masonry.fg-masonry-2col .fg-item { margin-bottom: 1%; width: 100%; }
1569
- .fg-masonry.fg-masonry-5col .fg-column-width,
1570
- .fg-masonry.fg-masonry-4col .fg-column-width,
1571
- .fg-masonry.fg-masonry-3col .fg-column-width,
1572
- .fg-masonry.fg-masonry-2col .fg-column-width { width: 100%; }
1573
- .fg-masonry.fg-masonry-5col .fg-gutter-width,
1574
- .fg-masonry.fg-masonry-4col .fg-gutter-width,
1575
- .fg-masonry.fg-masonry-3col .fg-gutter-width,
1576
- .fg-masonry.fg-masonry-2col .fg-gutter-width { width: 0; }
1577
-
1578
- /* no gutter */
1579
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item,
1580
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,
1581
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item,
1582
- .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item { margin-bottom: 0; width: 100%; }
1583
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width,
1584
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,
1585
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width,
1586
- .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width { width: 100%; }
1587
- .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width,
1588
- .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,
1589
- .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width,
1590
- .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width { width: 0; }
1591
-
1592
- /* large gutter */
1593
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item,
1594
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,
1595
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item,
1596
- .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 100%; }
1597
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width,
1598
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,
1599
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width,
1600
- .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width { width: 100%; }
1601
- .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width,
1602
- .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,
1603
- .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width,
1604
- .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width { width: 0; }
1605
- }
1606
-
1607
- /* Border Styles - We must apply width changing border styles to the fg-column-width element so that the plugin can correctly determine the item widths. */
1608
- .foogallery.fg-border-thin .fg-column-width {
1609
- border-width: 5px;
1610
- }
1611
- .foogallery.fg-border-medium .fg-column-width {
1612
- border-width: 10px;
1613
- }
1614
- .foogallery.fg-border-thick .fg-column-width {
1615
- border-width: 15px;
1616
- }
1617
- /* Base Styles */
1618
- .fg-justified {
1619
- box-sizing: border-box;
1620
- position: relative;
1621
- }
1622
- .foogallery.fg-justified .fg-item,
1623
- .foogallery.fg-justified .fg-item-inner,
1624
- .foogallery.fg-justified .fg-thumb,
1625
- .foogallery.fg-justified .fg-image {
1626
- box-sizing: border-box;
1627
- display: block;
1628
- margin: 0;
1629
- padding: 0;
1630
- }
1631
- .fg-justified .fg-item {
1632
- visibility: visible;
1633
- position: absolute;
1634
- }
1635
- .fg-justified .fg-item-inner {
1636
- position: relative;
1637
- width: 100%;
1638
- height: 100%;
1639
- }
1640
- .fg-justified .fg-thumb {
1641
- position: relative;
1642
- overflow: hidden;
1643
- }
1644
- .fg-justified .fg-image {
1645
- z-index: 1;
1646
- }
1647
- .fg-justified .fg-item.fg-positioned .fg-thumb {
1648
- width: 100%;
1649
- height: 100%;
1650
- }
1651
- .fg-justified .fg-item.fg-positioned .fg-image {
1652
- width: 100%;
1653
- height: auto;
1654
- min-height: 100%;
1655
- }
1656
- /* Base Styles */
1657
- .fg-simple_portfolio {
1658
- box-sizing: border-box;
1659
- position: relative;
1660
- font-size: 16px;
1661
- margin: 0 auto;
1662
- padding: 0;
1663
- /* The foogallery-portfolio container must have a width set and it is recommended to make the min-width the same as the item width. */
1664
- width: 100%;
1665
- }
1666
- .fg-simple_portfolio .fg-item {
1667
- position: absolute;
1668
- display: inline-block;
1669
- margin: 0;
1670
- padding: 0;
1671
- outline: none;
1672
- }
1673
- .fg-simple_portfolio .fg-item-inner,
1674
- .fg-simple_portfolio .fg-thumb,
1675
- .fg-simple_portfolio .fg-image {
1676
- display: block;
1677
- margin: 0;
1678
- padding: 0;
1679
- outline: none;
1680
- }
1681
- .fg-simple_portfolio .fg-item-inner {
1682
- position: relative;
1683
- width: 100%;
1684
- height: 100%;
1685
- }
1686
- .fg-simple_portfolio .fg-thumb {
1687
- box-sizing: border-box;
1688
- display: block;
1689
- margin: 0;
1690
- padding: 0;
1691
- border: none;
1692
- outline: none;
1693
- position: relative;
1694
- overflow: hidden;
1695
- }
1696
- .fg-simple_portfolio .fg-item.fg-positioned .fg-image {
1697
- width: 100%;
1698
- height: auto;
1699
- }
1700
- .fg-simple_portfolio .fg-image {
1701
- z-index: 1;
1702
- }
1703
-
1704
- .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption {
1705
- visibility: visible;
1706
- opacity: 1;
1707
- font-size: 13px;
1708
- position: relative;
1709
- display: block;
1710
- top: auto;
1711
- bottom: auto;
1712
- left: auto;
1713
- right: auto;
1714
- width: auto;
1715
- height: auto;
1716
- text-transform: none;
1717
- transform: none;
1718
- transition: none;
1719
- background-color: transparent;
1720
- border-style: solid;
1721
- border-color: transparent;
1722
- }
1723
- .foogallery.fg-simple_portfolio .fg-item-inner:hover .fg-caption {
1724
- transform: none;
1725
- transition: none;
1726
- }
1727
- .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner {
1728
- display: block;
1729
- top: auto;
1730
- bottom: auto;
1731
- left: auto;
1732
- right: auto;
1733
- width: auto;
1734
- height: auto;
1735
- border: none;
1736
- transform: none;
1737
- transition: none;
1738
- }
1739
- .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner:before {
1740
- display: none;
1741
- }
1742
- .foogallery.fg-simple_portfolio.fg-caption-hover .fg-item-inner .fg-thumb:before {
1743
- display: block;
1744
- }
1745
- .foogallery.fg-simple_portfolio.fg-caption-always .fg-item-inner:hover .fg-caption {
1746
- visibility: visible;
1747
- opacity: 1;
1748
- }
1749
-
1750
- .fg-simple_portfolio .fg-caption-title {
1751
- text-align: left;
1752
- }
1753
- .fg-simple_portfolio .fg-caption-desc {
1754
- text-align: justify;
1755
- }
1756
- .fg-simple_portfolio.fg-light .fg-caption,
1757
- .fg-simple_portfolio.fg-dark .fg-caption {
1758
- color: #828282;
1759
- }
1760
- .fg-simple_portfolio.fg-light .fg-caption a,
1761
- .fg-simple_portfolio.fg-dark .fg-caption a {
1762
- color: #828282;
1763
- border-bottom: 1px solid #828282;
1764
- }
1765
- .fg-simple_portfolio.fg-light .fg-caption a:hover,
1766
- .fg-simple_portfolio.fg-dark .fg-caption a:hover {
1767
- border-bottom: none;
1768
- }
1769
- .fg-simple_portfolio.fg-light .fg-caption-title,
1770
- .fg-simple_portfolio.fg-light .fg-caption-title a {
1771
- color: #222;
1772
- }
1773
- .fg-simple_portfolio.fg-dark .fg-caption-title,
1774
- .fg-simple_portfolio.fg-dark .fg-caption-title a {
1775
- color: #FFF;
1776
- }
1777
- .fg-simple_portfolio.fg-light .fg-caption-title a {
1778
- border-bottom: 1px solid #222;
1779
- }
1780
- .fg-simple_portfolio.fg-dark .fg-caption-title a {
1781
- border-bottom: 1px solid #FFF;
1782
- }
1783
-
1784
- .fg-simple_portfolio.fg-captions-top .fg-item.fg-positioned .fg-thumb {
1785
- position: absolute;
1786
- bottom: 0;
1787
- left: 0;
1788
- }
1789
-
1790
- /* Handle Border Sizing */
1791
- .fg-simple_portfolio .fg-caption {
1792
- border-width: 10px;
1793
- }
1794
- .fg-simple_portfolio .fg-caption-title+.fg-caption-desc {
1795
- margin-top: 5px;
1796
- }
1797
- .fg-simple_portfolio.fg-border-thin .fg-caption {
1798
- border-width: 10px 5px 5px 5px;
1799
- }
1800
- .fg-simple_portfolio.fg-captions-top.fg-border-thin .fg-caption {
1801
- border-width: 5px 5px 10px 5px;
1802
- }
1803
- .fg-simple_portfolio.fg-border-medium .fg-caption {
1804
- border-width: 10px 0 0 0;
1805
- }
1806
- .fg-simple_portfolio.fg-captions-top.fg-border-medium .fg-caption {
1807
- border-width: 0 0 10px 0;
1808
- }
1809
- .fg-simple_portfolio.fg-border-thick .fg-caption {
1810
- border-width: 15px 0 0 0;
1811
- }
1812
- .fg-simple_portfolio.fg-captions-top.fg-border-thick .fg-caption {
1813
- border-width: 0 0 15px 0;
1814
- }
1815
- .fg-simple_portfolio.fg-border-thick .fg-caption-title+.fg-caption-desc {
1816
- margin-top: 10px;
1817
- }
1818
- /* Polaroid */
1819
- .foogallery.fg-preset.fg-polaroid .fg-item {
1820
- -webkit-backface-visibility: hidden;
1821
- backface-visibility: hidden;
1822
- -webkit-transition: -webkit-transform 0.35s, background-color 0.65s;
1823
- transition: transform 0.35s, background-color 0.65s;
1824
- }
1825
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n+1) {
1826
- -webkit-transform: rotate(3deg);
1827
- transform: rotate(3deg);
1828
- }
1829
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n) {
1830
- -webkit-transform: rotate(-3deg);
1831
- transform: rotate(-3deg);
1832
- }
1833
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(3n) {
1834
- -webkit-transform: rotate(1deg);
1835
- transform: rotate(1deg);
1836
- }
1837
- .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(5n) {
1838
- -webkit-transform: rotate(-2deg);
1839
- transform: rotate(-2deg);
1840
- }
1841
-
1842
- .foogallery.fg-preset.fg-polaroid .fg-item:hover {
1843
- -webkit-transform: rotate(0);
1844
- transform: rotate(0);
1845
- }
1846
-
1847
- .foogallery.fg-preset.fg-polaroid .fg-caption {
1848
- position: relative;
1849
- width: auto;
1850
- font-family: "Segoe Print Regular",-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1851
- }
1852
-
1853
- .foogallery.fg-preset.fg-polaroid .fg-caption-inner,
1854
- .foogallery.fg-preset.fg-polaroid .fg-caption-title {
1855
- position: relative;
1856
- width: auto;
1857
- }
1858
- .foogallery.fg-preset.fg-polaroid .fg-caption-title {
1859
- text-align: center;
1860
- }
1861
- .foogallery.fg-preset.fg-polaroid .fg-caption-desc {
1862
- display: none;
1863
- }
1864
-
1865
- /* Themes */
1866
- .foogallery.fg-preset.fg-polaroid .fg-caption-title,
1867
- .foogallery.fg-light.fg-preset.fg-polaroid .fg-caption-title {
1868
- color: #333;
1869
- }
1870
- .foogallery.fg-dark.fg-preset.fg-polaroid .fg-caption-title {
1871
- color: #FFF;
1872
- }
1873
-
1874
- /* Handle Border Sizing */
1875
- .foogallery.fg-preset.fg-polaroid .fg-caption {
1876
- border-style: solid;
1877
- border-color: transparent;
1878
- border-width: 10px;
1879
- }
1880
- .foogallery.fg-preset.fg-polaroid .fg-caption-title+.fg-caption-desc {
1881
- margin-top: 5px;
1882
- }
1883
- .foogallery.fg-preset.fg-polaroid.fg-border-thin .fg-caption {
1884
- border-width: 10px 5px 5px 5px;
1885
- }
1886
- .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thin .fg-caption {
1887
- border-width: 5px 5px 10px 5px;
1888
- }
1889
- .foogallery.fg-preset.fg-polaroid.fg-border-medium .fg-caption {
1890
- border-width: 10px 0 0 0;
1891
- }
1892
- .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-medium .fg-caption {
1893
- border-width: 0 0 10px 0;
1894
- }
1895
- .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption {
1896
- border-width: 15px 0 0 0;
1897
- }
1898
- .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thick .fg-caption {
1899
- border-width: 0 0 15px 0;
1900
- }
1901
- .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption-title+.fg-caption-desc {
1902
- margin-top: 10px;
1903
- }
1904
- /* Base styles */
1905
- .fg-image-viewer {
1906
- display: block;
1907
- font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;
1908
- }
1909
- .fg-image-viewer.fg-left {
1910
- text-align: left;
1911
- }
1912
-
1913
- .fg-image-viewer.fg-center {
1914
- text-align: center;
1915
- }
1916
- .fg-image-viewer.fg-right {
1917
- text-align: right;
1918
- }
1919
-
1920
- .fiv-inner {
1921
- position: relative;
1922
- display: inline-block;
1923
- max-width: 100%;
1924
- overflow: hidden;
1925
- z-index: 6;
1926
- }
1927
- .fiv-inner .fiv-inner-container {
1928
- position: relative;
1929
- overflow: hidden;
1930
- max-width: 100%;
1931
- border-style: solid;
1932
- border-width: 0;
1933
- border-bottom-width: 4px;
1934
- z-index: 5;
1935
- }
1936
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb,
1937
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:hover,
1938
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:active,
1939
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:visited {
1940
- position: relative;
1941
- display: block;
1942
- border: none;
1943
- outline: none;
1944
- text-decoration: none;
1945
- box-shadow: none;
1946
- max-width: 100%;
1947
- }
1948
-
1949
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item {
1950
- position: relative;
1951
- visibility: visible;
1952
- opacity: 1;
1953
- border: none;
1954
- outline: none;
1955
- text-decoration: none;
1956
- box-shadow: none;
1957
- max-width: 100%;
1958
- }
1959
- .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb img {
1960
- display: block;
1961
- max-width: 100%;
1962
- height: auto;
1963
- border: none;
1964
- outline: none;
1965
- text-decoration: none;
1966
- }
1967
-
1968
- .fg-image-viewer .fiv-inner .fiv-ctrls {
1969
- display: block;
1970
- text-align: center;
1971
- font-size: 14px;
1972
- border-style: solid;
1973
- line-height: 34px;
1974
- }
1975
- .fg-image-viewer .fiv-inner .fiv-ctrls:after {
1976
- content: '';
1977
- display: block;
1978
- clear: both;
1979
- }
1980
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count {
1981
- display: inline-block;
1982
- font-weight: normal;
1983
- margin: 0;
1984
- }
1985
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,
1986
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
1987
- cursor: pointer;
1988
- -webkit-user-select: none;
1989
- -moz-user-select: none;
1990
- -ms-user-select: none;
1991
- user-select: none;
1992
- border: none;
1993
- min-width: 80px;
1994
- position: relative;
1995
- overflow: hidden;
1996
- transition: background-color .3s;
1997
- }
1998
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before,
1999
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2000
- display: block;
2001
- position: absolute;
2002
- font-size: 24px;
2003
- line-height: 30px;
2004
- top:0;
2005
- left:0;
2006
- width: 100%;
2007
- transform: translateY(0);
2008
- transition: transform .3s;
2009
- }
2010
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover:before,
2011
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover:before {
2012
- transform: translateY(-100%);
2013
- }
2014
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev span,
2015
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next span {
2016
- display: block;
2017
- width: 100%;
2018
- transform: translateY(100%);
2019
- transition: transform .3s;
2020
- }
2021
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover span,
2022
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover span {
2023
- transform: translateY(0);
2024
- }
2025
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev {
2026
- float: left;
2027
- }
2028
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before {
2029
- content: '\2190';
2030
- }
2031
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2032
- float: right;
2033
- }
2034
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2035
- content: '\2192';
2036
- }
2037
- .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count span {
2038
- margin: 0 4px;
2039
- }
2040
-
2041
- /*!* Theme - Default (Light) *!*/
2042
- /*.fg-image-viewer .fiv-inner,*/
2043
- /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,*/
2044
- /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {*/
2045
- /*background-color: #FFFFFF;*/
2046
- /*color: #1b1b1b;*/
2047
- /*}*/
2048
- /*.fg-image-viewer .fiv-inner,*/
2049
- /*.fg-image-viewer .fiv-inner .fiv-inner-container,*/
2050
- /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,*/
2051
- /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {*/
2052
- /*border-color: #e6e6e6;*/
2053
- /*}*/
2054
- /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover,*/
2055
- /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover {*/
2056
- /*background-color: #F2F2F2;*/
2057
- /*}*/
2058
-
2059
- /*!* Theme - Dark *!*/
2060
- /*.fg-image-viewer.fiv-dark .fiv-inner,*/
2061
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-prev,*/
2062
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-next {*/
2063
- /*background-color: #151515;*/
2064
- /*color: #FFFFFF;*/
2065
- /*}*/
2066
- /*.fg-image-viewer.fiv-dark .fiv-inner,*/
2067
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-inner-container,*/
2068
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-prev,*/
2069
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-next {*/
2070
- /*border-color: #2E2E2E;*/
2071
- /*}*/
2072
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-prev:hover,*/
2073
- /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-next:hover {*/
2074
- /*background-color: #000000;*/
2075
- /*}*/
2076
-
2077
- /* Captions */
2078
-
2079
- .foogallery.fg-image-viewer.fg-caption-always .fg-item-inner .fg-caption {
2080
- padding: 0;
2081
- border: none;
2082
- background: #000; /* Old browsers */
2083
- background: -moz-linear-gradient(left, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.8) 60%, rgba(0,0,0,0) 100%); /* FF3.6-15 */
2084
- background: -webkit-linear-gradient(left, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.8) 60%,rgba(0,0,0,0) 100%); /* Chrome10-25,Safari5.1-6 */
2085
- background: linear-gradient(to right, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.8) 60%,rgba(0,0,0,0) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
2086
- }
2087
- .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title {
2088
- padding: 10px 10px 10px 10px;
2089
- }
2090
- .foogallery.fg-image-viewer.fg-caption-always .fg-caption-desc {
2091
- padding: 10px 10px 10px 10px;
2092
- }
2093
- .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title+.fg-caption-desc {
2094
- padding: 0 10px 10px 10px;
2095
- }
2096
-
2097
- /* Theme - Default (Light) */
2098
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls,
2099
- .fg-image-viewer.fg-light .fiv-inner .fiv-inner-container,
2100
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-count,
2101
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev,
2102
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next {
2103
- background-color: #FFF;
2104
- color: #333;
2105
- border-color: #FFF;
2106
- }
2107
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev:hover,
2108
- .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next:hover {
2109
- background-color: #F2F2F2;
2110
- }
2111
- .fg-image-viewer.fg-light .fiv-prev,
2112
- .fg-image-viewer.fg-light .fiv-next {
2113
- box-shadow: inset 0 0 0 1px #ddd;
2114
- }
2115
-
2116
- /* Theme - Dark */
2117
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls,
2118
- .fg-image-viewer.fg-dark .fiv-inner .fiv-inner-container,
2119
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-count,
2120
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev,
2121
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next {
2122
- background-color: #333;
2123
- color: #FFF;
2124
- border-color: #333;
2125
- }
2126
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev:hover,
2127
- .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next:hover {
2128
- background-color: #444;
2129
- }
2130
- .fg-image-viewer.fg-dark .fiv-prev,
2131
- .fg-image-viewer.fg-dark .fiv-next {
2132
- box-shadow: inset 0 0 0 1px #222;
2133
- }
2134
-
2135
- /* Border Size */
2136
- .foogallery.fg-image-viewer.fg-border-thin .fg-item-inner,
2137
- .foogallery.fg-image-viewer.fg-border-medium .fg-item-inner,
2138
- .foogallery.fg-image-viewer.fg-border-thick .fg-item-inner {
2139
- border-width: 0;
2140
- }
2141
- .foogallery.fg-image-viewer .fiv-ctrls,
2142
- .foogallery.fg-image-viewer.fg-border-thin .fiv-inner-container {
2143
- border-width: 4px;
2144
- }
2145
- .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
2146
- .foogallery.fg-image-viewer.fg-border-medium .fiv-inner-container {
2147
- border-width: 10px;
2148
- }
2149
- .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,
2150
- .foogallery.fg-image-viewer.fg-border-thick .fiv-inner-container {
2151
- border-width: 16px;
2152
- }
2153
- .foogallery.fg-image-viewer .fiv-ctrls,
2154
- .foogallery.fg-image-viewer.fg-border-thin .fiv-ctrls,
2155
- .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
2156
- .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls {
2157
- border-top-width: 1px;
2158
- }
2159
-
2160
- /* Rounded Corners */
2161
- .foogallery.fg-image-viewer.fg-round-small .fg-item,
2162
- .foogallery.fg-image-viewer.fg-round-small .fg-item-inner,
2163
- .foogallery.fg-image-viewer.fg-round-small .fiv-inner {
2164
- border-radius: 5px;
2165
- }
2166
- .foogallery.fg-image-viewer.fg-round-small .fg-item,
2167
- .foogallery.fg-image-viewer.fg-round-small .fg-item-inner {
2168
- border-bottom-left-radius: 0;
2169
- border-bottom-right-radius: 0;
2170
- }
2171
- .foogallery.fg-image-viewer.fg-round-small .fiv-prev,
2172
- .foogallery.fg-image-viewer.fg-round-small .fiv-next {
2173
- border-radius: 3px;
2174
- }
2175
-
2176
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item,
2177
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item-inner,
2178
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-prev,
2179
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-next,
2180
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item,
2181
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item-inner,
2182
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-prev,
2183
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-next,
2184
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item,
2185
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item-inner,
2186
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-prev,
2187
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-next {
2188
- border-radius: 3px;
2189
- }
2190
-
2191
- .foogallery.fg-image-viewer.fg-round-medium .fg-item,
2192
- .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner,
2193
- .foogallery.fg-image-viewer.fg-round-medium .fiv-inner {
2194
- border-radius: 10px;
2195
- }
2196
- .foogallery.fg-image-viewer.fg-round-medium .fg-item,
2197
- .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner {
2198
- border-bottom-left-radius: 0;
2199
- border-bottom-right-radius: 0;
2200
- }
2201
- .foogallery.fg-image-viewer.fg-round-medium .fiv-prev,
2202
- .foogallery.fg-image-viewer.fg-round-medium .fiv-next {
2203
- border-radius: 5px;
2204
- }
2205
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item,
2206
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item-inner,
2207
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-prev,
2208
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-next {
2209
- border-radius: 5px;
2210
- }
2211
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item,
2212
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item-inner,
2213
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-prev,
2214
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-next,
2215
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item,
2216
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item-inner,
2217
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-prev,
2218
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-next {
2219
- border-radius: 3px;
2220
- }
2221
-
2222
- .foogallery.fg-image-viewer.fg-round-large .fg-item,
2223
- .foogallery.fg-image-viewer.fg-round-large .fg-item-inner,
2224
- .foogallery.fg-image-viewer.fg-round-large .fiv-inner {
2225
- border-radius: 15px;
2226
- }
2227
- .foogallery.fg-image-viewer.fg-round-large .fg-item,
2228
- .foogallery.fg-image-viewer.fg-round-large .fg-item-inner {
2229
- border-bottom-left-radius: 0;
2230
- border-bottom-right-radius: 0;
2231
- }
2232
- .foogallery.fg-image-viewer.fg-round-large .fiv-prev,
2233
- .foogallery.fg-image-viewer.fg-round-large .fiv-next {
2234
- border-radius: 11px;
2235
- }
2236
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item,
2237
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item-inner,
2238
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-prev,
2239
- .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-next {
2240
- border-radius: 11px;
2241
- }
2242
-
2243
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item,
2244
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item-inner,
2245
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-prev,
2246
- .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-next {
2247
- border-radius: 5px;
2248
- }
2249
-
2250
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item,
2251
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item-inner,
2252
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-prev,
2253
- .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-next {
2254
- border-radius: 3px;
2255
- }
2256
-
2257
- .foogallery.fg-image-viewer.fg-round-full .fiv-inner,
2258
- .foogallery.fg-image-viewer.fg-round-full .fiv-prev,
2259
- .foogallery.fg-image-viewer.fg-round-full .fiv-next {
2260
- border-radius: 50%;
2261
- }
2262
-
2263
- /* Drop Shadows */
2264
- .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fg-item-inner,
2265
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fg-item-inner,
2266
- .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fg-item-inner,
2267
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fg-item-inner,
2268
- .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fg-item-inner,
2269
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fg-item-inner,
2270
- .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fg-item-inner,
2271
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fg-item-inner {
2272
- box-shadow: none;
2273
- }
2274
-
2275
- .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fiv-inner {
2276
- box-shadow: 0 0 0 1px #ddd;
2277
- }
2278
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fiv-inner {
2279
- box-shadow: 0 0 0 1px #222;
2280
- }
2281
- .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fiv-inner,
2282
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fiv-inner {
2283
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
2284
- }
2285
- .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fiv-inner,
2286
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fiv-inner {
2287
- box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
2288
- }
2289
- .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fiv-inner,
2290
- .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fiv-inner {
2291
- box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
2292
- }
2293
- .foogallery.fg-thumbnail,
2294
- .foogallery.fg-thumbnail.fg-center {
2295
- text-align: center;
2296
- }
2297
- .foogallery.fg-thumbnail.fg-left {
2298
- float: left;
2299
- }
2300
- .foogallery.fg-thumbnail.fg-right {
2301
- float: right;
2302
- }
2303
-
2304
- .foogallery.fg-thumbnail .fg-item {
2305
- display: inline-block;
2306
- vertical-align: top;
2307
- max-width: 100%;
2308
- }
2309
- .foogallery.fg-thumbnail .fg-image {
2310
- max-width: 100%;
2311
- }
2312
- .foogallery.fg-thumbnail .fg-st-hidden {
2313
- display: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2314
  }
1
+ .foogallery, .foogallery * {
2
+ box-sizing: border-box;
3
+ }
4
+ .foogallery {
5
+ display: block;
6
+ z-index: 1;
7
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
8
+ position: relative;
9
+ line-height: 0;
10
+ font-size: 0;
11
+ width: 100%;
12
+ max-width: 100%;
13
+ }
14
+ .foogallery .fg-item {
15
+ display: inline-block;
16
+ position: relative;
17
+ background-color: transparent;
18
+ z-index: 2;
19
+ -webkit-user-select: none;
20
+ -moz-user-select: none;
21
+ -ms-user-select: none;
22
+ user-select: none;
23
+ }
24
+ .foogallery .fg-item-inner {
25
+ display: block;
26
+ position: relative;
27
+ visibility: hidden;
28
+ overflow: hidden;
29
+ opacity: 0;
30
+ z-index: 3;
31
+ margin: 0;
32
+ border: solid 0 transparent;
33
+ }
34
+
35
+ .foogallery .fg-item.fg-loading,
36
+ .foogallery .fg-item.fg-error {
37
+ background: no-repeat center;
38
+ }
39
+
40
+ .foogallery .fg-item.fg-error {
41
+ background-image: url('../img/image.png');
42
+ }
43
+
44
+ /* @2x Images (Pixel Ratio of 1.25+) */
45
+ @media only screen and (-o-min-device-pixel-ratio: 5/4),
46
+ only screen and (-webkit-min-device-pixel-ratio: 1.25),
47
+ only screen and (min-device-pixel-ratio: 1.25),
48
+ only screen and (min-resolution: 1.25dppx) {
49
+ .foogallery .fg-item.fg-error {
50
+ background-image: url('../img/image@2x.png');
51
+ }
52
+ }
53
+
54
+ /* @3x Images (Pixel Ratio of 2.25+) */
55
+ @media only screen and (-o-min-device-pixel-ratio: 9/4),
56
+ only screen and (-webkit-min-device-pixel-ratio: 2.25),
57
+ only screen and (min-device-pixel-ratio: 2.25),
58
+ only screen and (min-resolution: 2.25dppx) {
59
+ .foogallery .fg-item.fg-error {
60
+ background-image: url('../img/image@3x.png');
61
+ }
62
+ }
63
+
64
+ .foogallery .fg-item.fg-loaded {
65
+ z-index: 4;
66
+ }
67
+ .foogallery .fg-loaded .fg-item-inner {
68
+ visibility: visible;
69
+ opacity: 1;
70
+ z-index: 5;
71
+ }
72
+ .foogallery .fg-error .fg-item-inner {
73
+ pointer-events: none;
74
+ cursor: default;
75
+ }
76
+ .foogallery .fg-thumb {
77
+ display: block;
78
+ position: relative;
79
+ border: none;
80
+ outline: 0;
81
+ text-decoration: none;
82
+ z-index: 4;
83
+ }
84
+ .foogallery .fg-image {
85
+ display: block;
86
+ position: relative;
87
+ border: none;
88
+ outline: 0;
89
+ text-decoration: none;
90
+ z-index: 5;
91
+ max-width: none;
92
+ height: auto;
93
+ margin: 0;
94
+ }
95
+ .foogallery .fg-loaded .fg-thumb {
96
+ z-index: 6;
97
+ }
98
+ .foogallery .fg-loaded .fg-image {
99
+ z-index: 7;
100
+ }
101
+
102
+
103
+ /* Item Style */
104
+ .foogallery.fg-light .fg-item-inner {
105
+ background-color: #FFF;
106
+ color: #333;
107
+ border-color: #FFF;
108
+ }
109
+ .foogallery.fg-dark .fg-item-inner {
110
+ background-color: #333;
111
+ color: #FFF;
112
+ border-color: #333;
113
+ }
114
+ /* Idle / Loading / Error Style */
115
+ .foogallery.fg-light .fg-item.fg-idle,
116
+ .foogallery.fg-light .fg-item.fg-loading,
117
+ .foogallery.fg-light .fg-item.fg-error {
118
+ background-color: #eee;
119
+ box-shadow: inset 0 0 0 1px #ddd;
120
+ }
121
+ .foogallery.fg-dark .fg-item.fg-idle,
122
+ .foogallery.fg-dark .fg-item.fg-loading,
123
+ .foogallery.fg-dark .fg-item.fg-error {
124
+ background-color: #444;
125
+ box-shadow: inset 0 0 0 1px #333;
126
+ }
127
+ /* Border Size */
128
+ .foogallery.fg-border-thin .fg-item-inner {
129
+ border-width: 4px;
130
+ }
131
+ .foogallery.fg-border-medium .fg-item-inner {
132
+ border-width: 10px;
133
+ }
134
+ .foogallery.fg-border-thick .fg-item-inner {
135
+ border-width: 16px;
136
+ }
137
+ /* Drop Shadows */
138
+ .foogallery.fg-light.fg-shadow-outline .fg-item-inner {
139
+ box-shadow: 0 0 0 1px #ddd;
140
+ }
141
+ .foogallery.fg-dark.fg-shadow-outline .fg-item-inner {
142
+ box-shadow: 0 0 0 1px #222;
143
+ }
144
+ .foogallery.fg-light.fg-shadow-small .fg-item-inner,
145
+ .foogallery.fg-dark.fg-shadow-small .fg-item-inner {
146
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
147
+ }
148
+ .foogallery.fg-light.fg-shadow-medium .fg-item-inner,
149
+ .foogallery.fg-dark.fg-shadow-medium .fg-item-inner {
150
+ box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
151
+ }
152
+ .foogallery.fg-light.fg-shadow-large .fg-item-inner,
153
+ .foogallery.fg-dark.fg-shadow-large .fg-item-inner {
154
+ box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
155
+ }
156
+ /* Inset Shadows */
157
+ .foogallery.fg-shadow-inset-small .fg-thumb:after,
158
+ .foogallery.fg-shadow-inset-medium .fg-thumb:after,
159
+ .foogallery.fg-shadow-inset-large .fg-thumb:after {
160
+ display: block;
161
+ content: "";
162
+ position: absolute;
163
+ top: 0;
164
+ left: 0;
165
+ right: 0;
166
+ bottom: 0;
167
+ z-index: 7;
168
+ }
169
+ .foogallery.fg-light.fg-shadow-inset-small .fg-thumb:after,
170
+ .foogallery.fg-dark.fg-shadow-inset-small .fg-thumb:after {
171
+ box-shadow: inset 0 1px 4px 0 rgba(0,0,0,0.3);
172
+ }
173
+ .foogallery.fg-light.fg-shadow-inset-medium .fg-thumb:after,
174
+ .foogallery.fg-dark.fg-shadow-inset-medium .fg-thumb:after {
175
+ box-shadow: inset 0 1px 10px 0 rgba(0,0,0,0.3);
176
+ }
177
+ .foogallery.fg-light.fg-shadow-inset-large .fg-thumb:after,
178
+ .foogallery.fg-dark.fg-shadow-inset-large .fg-thumb:after {
179
+ box-shadow: inset 0 1px 16px 0 rgba(0,0,0,0.3);
180
+ }
181
+
182
+ .foogallery.fg-round-full.fg-shadow-inset-small .fg-thumb:after,
183
+ .foogallery.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,
184
+ .foogallery.fg-round-full.fg-shadow-inset-large .fg-thumb:after {
185
+ border-radius: 50%;
186
+ }
187
+ /* Rounded Corners */
188
+ .foogallery.fg-round-small .fg-item,
189
+ .foogallery.fg-round-small .fg-item-inner {
190
+ border-radius: 5px;
191
+ }
192
+ .foogallery.fg-round-medium .fg-item,
193
+ .foogallery.fg-round-medium .fg-item-inner {
194
+ border-radius: 10px;
195
+ }
196
+ .foogallery.fg-round-large .fg-item,
197
+ .foogallery.fg-round-large .fg-item-inner {
198
+ border-radius: 15px;
199
+ }
200
+ .foogallery.fg-round-full .fg-item,
201
+ .foogallery.fg-round-full .fg-item-inner {
202
+ border-radius: 50%;
203
+ }
204
+ /* Loader Styles */
205
+ .foogallery .fg-loader {
206
+ position: absolute;
207
+ top: 50%;
208
+ left: 50%;
209
+ transform: translateX(-50%) translateY(-50%);
210
+ width: 1em;
211
+ height: 1em;
212
+ font-size: 5px;
213
+ visibility: hidden;
214
+ opacity: 0;
215
+ }
216
+
217
+ .foogallery .fg-loading .fg-loader {
218
+ visibility: visible;
219
+ opacity: 1;
220
+ }
221
+ .fg-loading-default .fg-loader {
222
+ border-radius: 50%;
223
+ text-indent: -9999em;
224
+ -webkit-animation: loading-default 1.1s infinite ease;
225
+ animation: loading-default 1.1s infinite ease;
226
+ }
227
+
228
+ @-webkit-keyframes loading-default {
229
+ 0%,
230
+ 100% {
231
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 1),
232
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
233
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
234
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
235
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
236
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
237
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.5),
238
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7);
239
+ }
240
+ 12.5% {
241
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.7),
242
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 1), 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
243
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
244
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
245
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
246
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
247
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5);
248
+ }
249
+ 25% {
250
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.5),
251
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7),
252
+ 2.5em 0 0 0 rgba(130, 130, 130, 1), 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
253
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
254
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
255
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
256
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
257
+ }
258
+ 37.5% {
259
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
260
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5),
261
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.7),
262
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 1), 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
263
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
264
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
265
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
266
+ }
267
+ 50% {
268
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
269
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
270
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.5),
271
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.7),
272
+ 0 2.5em 0 0 rgba(130, 130, 130, 1), -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
273
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
274
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
275
+ }
276
+ 62.5% {
277
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
278
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
279
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
280
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.5),
281
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.7),
282
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 1), -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
283
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
284
+ }
285
+ 75% {
286
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
287
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
288
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
289
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
290
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.5),
291
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.7),
292
+ -2.6em 0 0 0 rgba(130, 130, 130, 1), -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
293
+ }
294
+ 87.5% {
295
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
296
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
297
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
298
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
299
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
300
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.5),
301
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.7),
302
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 1);
303
+ }
304
+ }
305
+
306
+ @keyframes loading-default {
307
+ 0%,
308
+ 100% {
309
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 1),
310
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
311
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
312
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
313
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
314
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
315
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.5),
316
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7);
317
+ }
318
+ 12.5% {
319
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.7),
320
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 1), 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
321
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
322
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
323
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
324
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
325
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5);
326
+ }
327
+ 25% {
328
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.5),
329
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.7),
330
+ 2.5em 0 0 0 rgba(130, 130, 130, 1), 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
331
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
332
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
333
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
334
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
335
+ }
336
+ 37.5% {
337
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
338
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.5),
339
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.7),
340
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 1), 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
341
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
342
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
343
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
344
+ }
345
+ 50% {
346
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
347
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
348
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.5),
349
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.7),
350
+ 0 2.5em 0 0 rgba(130, 130, 130, 1), -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.2),
351
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
352
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
353
+ }
354
+ 62.5% {
355
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
356
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
357
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
358
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.5),
359
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.7),
360
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 1), -2.6em 0 0 0 rgba(130, 130, 130, 0.2),
361
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
362
+ }
363
+ 75% {
364
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
365
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
366
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
367
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
368
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.5),
369
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.7),
370
+ -2.6em 0 0 0 rgba(130, 130, 130, 1), -1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2);
371
+ }
372
+ 87.5% {
373
+ box-shadow: 0 -2.6em 0 0 rgba(130, 130, 130, 0.2),
374
+ 1.8em -1.8em 0 0 rgba(130, 130, 130, 0.2),
375
+ 2.5em 0 0 0 rgba(130, 130, 130, 0.2),
376
+ 1.75em 1.75em 0 0 rgba(130, 130, 130, 0.2),
377
+ 0 2.5em 0 0 rgba(130, 130, 130, 0.2),
378
+ -1.8em 1.8em 0 0 rgba(130, 130, 130, 0.5),
379
+ -2.6em 0 0 0 rgba(130, 130, 130, 0.7),
380
+ -1.8em -1.8em 0 0 rgba(130, 130, 130, 1);
381
+ }
382
+ }
383
+ .fg-loading-bars .fg-loader,
384
+ .fg-loading-bars .fg-loader:before,
385
+ .fg-loading-bars .fg-loader:after {
386
+ background: rgba(130, 130, 130, 1);
387
+ -webkit-animation: loading-bars 1s infinite ease-in-out;
388
+ animation: loading-bars 1s infinite ease-in-out;
389
+ width: 1em;
390
+ height: 4em;
391
+ }
392
+ .fg-loading-bars .fg-loader {
393
+ color: rgba(130, 130, 130, 1);
394
+ text-indent: -9999em;
395
+ font-size: 4px;
396
+ -webkit-animation-delay: -0.16s;
397
+ animation-delay: -0.16s;
398
+ }
399
+ .fg-loading-bars .fg-loader:before,
400
+ .fg-loading-bars .fg-loader:after {
401
+ position: absolute;
402
+ top: 0;
403
+ content: '';
404
+ }
405
+ .fg-loading-bars .fg-loader:before {
406
+ left: -1.5em;
407
+ -webkit-animation-delay: -0.32s;
408
+ animation-delay: -0.32s;
409
+ }
410
+ .fg-loading-bars .fg-loader:after {
411
+ left: 1.5em;
412
+ }
413
+ @-webkit-keyframes loading-bars {
414
+ 0%,
415
+ 80%,
416
+ 100% {
417
+ box-shadow: 0 0;
418
+ height: 4em;
419
+ }
420
+ 40% {
421
+ box-shadow: 0 -2em;
422
+ height: 5em;
423
+ }
424
+ }
425
+ @keyframes loading-bars {
426
+ 0%,
427
+ 80%,
428
+ 100% {
429
+ box-shadow: 0 0;
430
+ height: 4em;
431
+ }
432
+ 40% {
433
+ box-shadow: 0 -2em;
434
+ height: 5em;
435
+ }
436
+ }
437
+ .fg-loading-trail .fg-loader {
438
+ color: #828282;
439
+ font-size: 20px;
440
+ text-indent: -9999em;
441
+ overflow: hidden;
442
+ border-radius: 50%;
443
+ -webkit-animation: loading-trail-1 1.7s infinite ease, loading-trail-2 1.7s infinite ease;
444
+ animation: loading-trail-1 1.7s infinite ease, loading-trail-2 1.7s infinite ease;
445
+ }
446
+ @-webkit-keyframes loading-trail-1 {
447
+ 0% {
448
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
449
+ }
450
+ 5%,
451
+ 95% {
452
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
453
+ }
454
+ 10%,
455
+ 59% {
456
+ box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
457
+ }
458
+ 20% {
459
+ box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
460
+ }
461
+ 38% {
462
+ box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
463
+ }
464
+ 100% {
465
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
466
+ }
467
+ }
468
+ @keyframes loading-trail-1 {
469
+ 0% {
470
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
471
+ }
472
+ 5%,
473
+ 95% {
474
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
475
+ }
476
+ 10%,
477
+ 59% {
478
+ box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
479
+ }
480
+ 20% {
481
+ box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
482
+ }
483
+ 38% {
484
+ box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
485
+ }
486
+ 100% {
487
+ box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
488
+ }
489
+ }
490
+ @-webkit-keyframes loading-trail-2 {
491
+ 0% {
492
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
493
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
494
+ }
495
+ 100% {
496
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
497
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
498
+ }
499
+ }
500
+ @keyframes loading-trail-2 {
501
+ 0% {
502
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
503
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
504
+ }
505
+ 100% {
506
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
507
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
508
+ }
509
+ }
510
+ .fg-loading-pulse .fg-loader,
511
+ .fg-loading-pulse .fg-loader:before,
512
+ .fg-loading-pulse .fg-loader:after {
513
+ border-radius: 50%;
514
+ width: 2.5em;
515
+ height: 2.5em;
516
+ -webkit-animation-fill-mode: both;
517
+ animation-fill-mode: both;
518
+ -webkit-animation: loading-pulse 1.8s infinite ease-in-out;
519
+ animation: loading-pulse 1.8s infinite ease-in-out;
520
+ }
521
+ .fg-loading-pulse .fg-loader {
522
+ color: #828282;
523
+ font-size: 4px;
524
+ text-indent: -9999em;
525
+ transform: translateX(-50%) translateY(-150%);
526
+ -webkit-animation-delay: -0.16s;
527
+ animation-delay: -0.16s;
528
+ }
529
+ .fg-loading-pulse .fg-loader:before,
530
+ .fg-loading-pulse .fg-loader:after {
531
+ content: '';
532
+ position: absolute;
533
+ top: 0;
534
+ }
535
+ .fg-loading-pulse .fg-loader:before {
536
+ left: -3.5em;
537
+ -webkit-animation-delay: -0.32s;
538
+ animation-delay: -0.32s;
539
+ }
540
+ .fg-loading-pulse .fg-loader:after {
541
+ left: 3.5em;
542
+ }
543
+ @-webkit-keyframes loading-pulse {
544
+ 0%,
545
+ 80%,
546
+ 100% {
547
+ box-shadow: 0 2.5em 0 -1.3em;
548
+ }
549
+ 40% {
550
+ box-shadow: 0 2.5em 0 0;
551
+ }
552
+ }
553
+ @keyframes loading-pulse {
554
+ 0%,
555
+ 80%,
556
+ 100% {
557
+ box-shadow: 0 2.5em 0 -1.3em;
558
+ }
559
+ 40% {
560
+ box-shadow: 0 2.5em 0 0;
561
+ }
562
+ }
563
+ .fg-loading-dots .fg-loader {
564
+ color: #828282;
565
+ font-size: 5px;
566
+ border-radius: 50%;
567
+ text-indent: -9999em;
568
+ -webkit-animation: loading-dots 1.3s infinite linear;
569
+ animation: loading-dots 1.3s infinite linear;
570
+ }
571
+ @-webkit-keyframes loading-dots {
572
+ 0%,
573
+ 100% {
574
+ box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
575
+ }
576
+ 12.5% {
577
+ box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
578
+ }
579
+ 25% {
580
+ box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
581
+ }
582
+ 37.5% {
583
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
584
+ }
585
+ 50% {
586
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
587
+ }
588
+ 62.5% {
589
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
590
+ }
591
+ 75% {
592
+ box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
593
+ }
594
+ 87.5% {
595
+ box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
596
+ }
597
+ }
598
+ @keyframes loading-dots {
599
+ 0%,
600
+ 100% {
601
+ box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
602
+ }
603
+ 12.5% {
604
+ box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
605
+ }
606
+ 25% {
607
+ box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em;
608
+ }
609
+ 37.5% {
610
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em;
611
+ }
612
+ 50% {
613
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em;
614
+ }
615
+ 62.5% {
616
+ box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em;
617
+ }
618
+ 75% {
619
+ box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0;
620
+ }
621
+ 87.5% {
622
+ box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
623
+ }
624
+ }
625
+ .fg-loading-partial .fg-loader,
626
+ .fg-loading-partial .fg-loader:after {
627
+ border-radius: 50%;
628
+ width: 10em;
629
+ height: 10em;
630
+ }
631
+ .fg-loading-partial .fg-loader {
632
+ font-size: 4px;
633
+ text-indent: -9999em;
634
+ border-top: 1.1em solid rgba(130,130,130, 0.2);
635
+ border-right: 1.1em solid rgba(130,130,130, 0.2);
636
+ border-bottom: 1.1em solid rgba(130,130,130, 0.2);
637
+ border-left: 1.1em solid #828282;
638
+ -webkit-animation: loading-partial 1.1s infinite linear;
639
+ animation: loading-partial 1.1s infinite linear;
640
+ }
641
+ @-webkit-keyframes loading-partial {
642
+ 0% {
643
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
644
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
645
+ }
646
+ 100% {
647
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
648
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
649
+ }
650
+ }
651
+ @keyframes loading-partial {
652
+ 0% {
653
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(0deg);
654
+ transform: translateX(-50%) translateY(-50%) rotate(0deg);
655
+ }
656
+ 100% {
657
+ -webkit-transform: translateX(-50%) translateY(-50%) rotate(360deg);
658
+ transform: translateX(-50%) translateY(-50%) rotate(360deg);
659
+ }
660
+ }
661
+ /* Loaded Effects */
662
+ .foogallery.fg-loaded-fade-in .fg-item,
663
+ .foogallery.fg-loaded-slide-up .fg-item,
664
+ .foogallery.fg-loaded-slide-down .fg-item,
665
+ .foogallery.fg-loaded-slide-left .fg-item,
666
+ .foogallery.fg-loaded-slide-right .fg-item,
667
+ .foogallery.fg-loaded-scale-up .fg-item,
668
+ .foogallery.fg-loaded-swing-down .fg-item,
669
+ .foogallery.fg-loaded-drop .fg-item,
670
+ .foogallery.fg-loaded-fly .fg-item,
671
+ .foogallery.fg-loaded-flip .fg-item {
672
+ transition-timing-function: ease;
673
+ transition-duration: 650ms;
674
+ transition-property: background-color, transform;
675
+ }
676
+ .foogallery.fg-loaded-fade-in .fg-item-inner,
677
+ .foogallery.fg-loaded-slide-up .fg-item-inner,
678
+ .foogallery.fg-loaded-slide-down .fg-item-inner,
679
+ .foogallery.fg-loaded-slide-left .fg-item-inner,
680
+ .foogallery.fg-loaded-slide-right .fg-item-inner,
681
+ .foogallery.fg-loaded-scale-up .fg-item-inner,
682
+ .foogallery.fg-loaded-swing-down .fg-item-inner,
683
+ .foogallery.fg-loaded-drop .fg-item-inner,
684
+ .foogallery.fg-loaded-fly .fg-item-inner,
685
+ .foogallery.fg-loaded-flip .fg-item-inner {
686
+ transition-timing-function: ease;
687
+ transition-duration: 650ms;
688
+ }
689
+ /* Only apply the perspective once loaded otherwise transitions could take place behind other items*/
690
+ .foogallery.fg-loaded-swing-down .fg-item.fg-loaded,
691
+ .foogallery.fg-loaded-drop .fg-item.fg-loaded,
692
+ .foogallery.fg-loaded-fly .fg-item.fg-loaded,
693
+ .foogallery.fg-loaded-flip .fg-item.fg-loaded {
694
+ perspective: 1300px;
695
+ }
696
+ /* Fade In */
697
+ .foogallery.fg-loaded-fade-in .fg-item-inner {
698
+ transition-property: visibility, opacity;
699
+ }
700
+ /* Caption Styles */
701
+ .foogallery .fg-caption {
702
+ visibility: hidden;
703
+ opacity: 0;
704
+ background-color: rgba(0,0,0,0.6);
705
+ color: #fff;
706
+ position: absolute;
707
+ z-index: 8;
708
+ width: 100%;
709
+ max-height: 100%;
710
+ overflow: hidden;
711
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
712
+ font-size: 13px;
713
+ font-weight: 400;
714
+ line-height: 1.3;
715
+ border: none;
716
+ text-align: center;
717
+ cursor: pointer;
718
+ }
719
+ .foogallery .fg-caption a {
720
+ text-decoration: none;
721
+ color: #fff;
722
+ border-bottom: 1px solid #FFF;
723
+ }
724
+ .foogallery .fg-caption a:hover {
725
+ border-bottom: none;
726
+ }
727
+
728
+ .foogallery .fg-caption-title {
729
+ white-space: nowrap;
730
+ overflow: hidden;
731
+ text-overflow: ellipsis;
732
+ font-size: 16px;
733
+ font-weight: 400;
734
+ padding: 5px;
735
+ }
736
+ .foogallery .fg-caption-desc {
737
+ padding: 5px;
738
+ }
739
+ .foogallery .fg-caption-title+.fg-caption-desc {
740
+ padding-top: 0;
741
+ }
742
+
743
+ /* Always */
744
+ .foogallery.fg-caption-always .fg-caption .fg-caption-inner:before {
745
+ display: none;
746
+ }
747
+ .foogallery.fg-caption-always .fg-item.fg-loaded .fg-caption {
748
+ left: 0;
749
+ bottom: 0;
750
+ transition-timing-function: ease;
751
+ transition-duration: 300ms;
752
+ transition-property: visibility, opacity;
753
+ visibility: visible;
754
+ opacity: 1;
755
+ text-align: left;
756
+ }
757
+
758
+ /* On Hover */
759
+ .foogallery.fg-caption-hover .fg-caption .fg-caption-inner {
760
+ width: 100%;
761
+ max-height: 100%;
762
+ position: absolute;
763
+ top: 50%;
764
+ left: 0;
765
+ transform: translateY(-50%);
766
+ }
767
+ .foogallery.fg-caption-hover .fg-item.fg-loaded .fg-thumb:before {
768
+ display: none;
769
+ }
770
+ /* Icon & Overlay */
771
+ .foogallery.fg-hover-zoom .fg-thumb:before,
772
+ .foogallery.fg-hover-zoom2 .fg-thumb:before,
773
+ .foogallery.fg-hover-zoom3 .fg-thumb:before,
774
+ .foogallery.fg-hover-plus .fg-thumb:before,
775
+ .foogallery.fg-hover-circle-plus .fg-thumb:before,
776
+ .foogallery.fg-hover-eye .fg-thumb:before,
777
+ .foogallery.fg-hover-external .fg-thumb:before,
778
+ .foogallery.fg-hover-tint .fg-thumb:before {
779
+ content: "";
780
+ display: block;
781
+ position: absolute;
782
+ visibility: hidden;
783
+ opacity: 0;
784
+ top: 0;
785
+ bottom: 0;
786
+ left: 0;
787
+ right: 0;
788
+ z-index: 8;
789
+ background: rgba(0,0,0,0.5) no-repeat center center;
790
+ background-size: 32px 32px;
791
+ }
792
+
793
+ .foogallery.fg-hover-zoom .fg-item-inner:hover .fg-thumb:before,
794
+ .foogallery.fg-hover-zoom2 .fg-item-inner:hover .fg-thumb:before,
795
+ .foogallery.fg-hover-zoom3 .fg-item-inner:hover .fg-thumb:before,
796
+ .foogallery.fg-hover-plus .fg-item-inner:hover .fg-thumb:before,
797
+ .foogallery.fg-hover-circle-plus .fg-item-inner:hover .fg-thumb:before,
798
+ .foogallery.fg-hover-eye .fg-item-inner:hover .fg-thumb:before,
799
+ .foogallery.fg-hover-external .fg-item-inner:hover .fg-thumb:before,
800
+ .foogallery.fg-hover-tint .fg-item-inner:hover .fg-thumb:before,
801
+ .foogallery.fg-hover-zoom .fg-thumb:focus:before,
802
+ .foogallery.fg-hover-zoom2 .fg-thumb:focus:before,
803
+ .foogallery.fg-hover-zoom3 .fg-thumb:focus:before,
804
+ .foogallery.fg-hover-plus .fg-thumb:focus:before,
805
+ .foogallery.fg-hover-circle-plus .fg-thumb:focus:before,
806
+ .foogallery.fg-hover-eye .fg-thumb:focus:before,
807
+ .foogallery.fg-hover-external .fg-thumb:focus:before,
808
+ .foogallery.fg-hover-tint .fg-thumb:focus:before {
809
+ visibility: visible;
810
+ opacity: 1;
811
+ }
812
+
813
+ /* Support captions showing the icon */
814
+ .foogallery.fg-hover-zoom .fg-caption-inner:before,
815
+ .foogallery.fg-hover-zoom2 .fg-caption-inner:before,
816
+ .foogallery.fg-hover-zoom3 .fg-caption-inner:before,
817
+ .foogallery.fg-hover-plus .fg-caption-inner:before,
818
+ .foogallery.fg-hover-circle-plus .fg-caption-inner:before,
819
+ .foogallery.fg-hover-eye .fg-caption-inner:before,
820
+ .foogallery.fg-hover-external .fg-caption-inner:before,
821
+ .foogallery.fg-hover-tint .fg-caption-inner:before {
822
+ content: "";
823
+ display: inline-block;
824
+ position: relative;
825
+ width: 32px;
826
+ height: 32px;
827
+ margin: 10px 0 5px 0;
828
+ background: transparent no-repeat center center;
829
+ background-size: 32px 32px;
830
+ vertical-align: middle;
831
+ }
832
+
833
+
834
+ .foogallery.fg-hover-zoom .fg-thumb:before,
835
+ .foogallery.fg-hover-zoom .fg-caption-inner:before {
836
+ background-image: url('../img/zoom.png');
837
+ }
838
+
839
+ .foogallery.fg-hover-zoom2 .fg-thumb:before,
840
+ .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
841
+ background-image: url('../img/zoom2.png');
842
+ }
843
+
844
+ .foogallery.fg-hover-zoom3 .fg-thumb:before,
845
+ .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
846
+ background-image: url('../img/zoom3.png');
847
+ }
848
+
849
+ .foogallery.fg-hover-plus .fg-thumb:before,
850
+ .foogallery.fg-hover-plus .fg-caption-inner:before {
851
+ background-image: url('../img/plus.png');
852
+ }
853
+
854
+ .foogallery.fg-hover-circle-plus .fg-thumb:before,
855
+ .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
856
+ background-image: url('../img/circle-plus.png');
857
+ }
858
+
859
+ .foogallery.fg-hover-eye .fg-thumb:before,
860
+ .foogallery.fg-hover-eye .fg-caption-inner:before {
861
+ background-image: url('../img/eye.png');
862
+ }
863
+
864
+ .foogallery.fg-hover-external .fg-thumb:before,
865
+ .foogallery.fg-hover-external .fg-caption-inner:before {
866
+ background-image: url('../img/external.png');
867
+ }
868
+
869
+ /* @2x Images (Pixel Ratio of 1.25+) */
870
+ @media only screen and (-o-min-device-pixel-ratio: 5/4),
871
+ only screen and (-webkit-min-device-pixel-ratio: 1.25),
872
+ only screen and (min-device-pixel-ratio: 1.25),
873
+ only screen and (min-resolution: 1.25dppx) {
874
+
875
+ .foogallery.fg-hover-zoom .fg-thumb:before,
876
+ .foogallery.fg-hover-zoom .fg-caption-inner:before {
877
+ background-image: url('../img/zoom@2x.png');
878
+ }
879
+
880
+ .foogallery.fg-hover-zoom2 .fg-thumb:before,
881
+ .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
882
+ background-image: url('../img/zoom2@2x.png');
883
+ }
884
+
885
+ .foogallery.fg-hover-zoom3 .fg-thumb:before,
886
+ .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
887
+ background-image: url('../img/zoom3@2x.png');
888
+ }
889
+
890
+ .foogallery.fg-hover-plus .fg-thumb:before,
891
+ .foogallery.fg-hover-plus .fg-caption-inner:before {
892
+ background-image: url('../img/plus@2x.png');
893
+ }
894
+
895
+ .foogallery.fg-hover-circle-plus .fg-thumb:before,
896
+ .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
897
+ background-image: url('../img/circle-plus@2x.png');
898
+ }
899
+
900
+ .foogallery.fg-hover-eye .fg-thumb:before,
901
+ .foogallery.fg-hover-eye .fg-caption-inner:before {
902
+ background-image: url('../img/eye@2x.png');
903
+ }
904
+
905
+ .foogallery.fg-hover-external .fg-thumb:before,
906
+ .foogallery.fg-hover-external .fg-caption-inner:before {
907
+ background-image: url('../img/external@2x.png');
908
+ }
909
+
910
+ }
911
+
912
+ /* @3x Images (Pixel Ratio of 2.25+) */
913
+ @media only screen and (-o-min-device-pixel-ratio: 9/4),
914
+ only screen and (-webkit-min-device-pixel-ratio: 2.25),
915
+ only screen and (min-device-pixel-ratio: 2.25),
916
+ only screen and (min-resolution: 2.25dppx) {
917
+
918
+ .foogallery.fg-hover-zoom .fg-thumb:before,
919
+ .foogallery.fg-hover-zoom .fg-caption-inner:before {
920
+ background-image: url('../img/zoom@3x.png');
921
+ }
922
+
923
+ .foogallery.fg-hover-zoom2 .fg-thumb:before,
924
+ .foogallery.fg-hover-zoom2 .fg-caption-inner:before {
925
+ background-image: url('../img/zoom2@3x.png');
926
+ }
927
+
928
+ .foogallery.fg-hover-zoom3 .fg-thumb:before,
929
+ .foogallery.fg-hover-zoom3 .fg-caption-inner:before {
930
+ background-image: url('../img/zoom3@3x.png');
931
+ }
932
+
933
+ .foogallery.fg-hover-plus .fg-thumb:before,
934
+ .foogallery.fg-hover-plus .fg-caption-inner:before {
935
+ background-image: url('../img/plus@3x.png');
936
+ }
937
+
938
+ .foogallery.fg-hover-circle-plus .fg-thumb:before,
939
+ .foogallery.fg-hover-circle-plus .fg-caption-inner:before {
940
+ background-image: url('../img/circle-plus@3x.png');
941
+ }
942
+
943
+ .foogallery.fg-hover-eye .fg-thumb:before,
944
+ .foogallery.fg-hover-eye .fg-caption-inner:before {
945
+ background-image: url('../img/eye@3x.png');
946
+ }
947
+
948
+ .foogallery.fg-hover-external .fg-thumb:before,
949
+ .foogallery.fg-hover-external .fg-caption-inner:before {
950
+ background-image: url('../img/external@3x.png');
951
+ }
952
+
953
+ }
954
+ /* Transitions */
955
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-caption,
956
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-caption,
957
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-caption,
958
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-caption,
959
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-caption,
960
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-caption,
961
+ .foogallery.fg-caption-hover.fg-hover-push .fg-caption,
962
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-caption,
963
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption,
964
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-caption,
965
+ .foogallery.fg-hover-instant .fg-thumb:before,
966
+ .foogallery.fg-hover-fade .fg-thumb:before,
967
+ .foogallery.fg-hover-slide-up .fg-thumb:before,
968
+ .foogallery.fg-hover-slide-down .fg-thumb:before,
969
+ .foogallery.fg-hover-slide-left .fg-thumb:before,
970
+ .foogallery.fg-hover-slide-right .fg-thumb:before,
971
+ .foogallery.fg-hover-push .fg-thumb,
972
+ .foogallery.fg-hover-colorize .fg-thumb:before,
973
+ .foogallery.fg-hover-grayscale .fg-thumb:before,
974
+ .foogallery.fg-hover-scale .fg-item,
975
+ .foogallery.fg-hover-scale .fg-thumb:before,
976
+ .foogallery.fg-hover-colorize .fg-image,
977
+ .foogallery.fg-hover-grayscale .fg-image {
978
+ transition-timing-function: ease;
979
+ transition-duration: 300ms;
980
+ }
981
+ /* Colorize */
982
+ .foogallery.fg-hover-colorize .fg-image {
983
+ /* Firefox 10+, Firefox on Android */
984
+ filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'saturate\' values=\'0\'/></filter></svg>#grayscale");
985
+ /* IE 6-9 */
986
+ filter: gray;
987
+ /* Chrome 19+, Safari 6+, Safari 6+ iOS */
988
+ -webkit-filter: grayscale(100%);
989
+ -webkit-transition-property: -webkit-filter;
990
+ transition-property: filter;
991
+ }
992
+ .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image {
993
+ -webkit-filter: none;
994
+ filter: none;
995
+ }
996
+ .foogallery.fg-hover-colorize .fg-thumb:before,
997
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-caption {
998
+ display: block;
999
+ left: 0;
1000
+ top: 0;
1001
+ bottom: 0;
1002
+ transition-property: visibility, opacity;
1003
+ }
1004
+ .foogallery.fg-hover-colorize .fg-item-inner:hover .fg-thumb:before,
1005
+ .foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:hover .fg-caption {
1006
+ visibility: visible;
1007
+ opacity: 1;
1008
+ }
1009
+ /* Fade */
1010
+ .foogallery.fg-hover-fade .fg-loaded .fg-thumb:before,
1011
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption {
1012
+ display: block;
1013
+ left: 0;
1014
+ top: 0;
1015
+ bottom: 0;
1016
+ transition-property: visibility, opacity;
1017
+ }
1018
+ .foogallery.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1019
+ .foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-caption {
1020
+ visibility: visible;
1021
+ opacity: 1;
1022
+ }
1023
+ /* Grayscale */
1024
+ .foogallery.fg-hover-grayscale .fg-image {
1025
+ -webkit-filter: none;
1026
+ filter: none;
1027
+ -webkit-transition-property: -webkit-filter;
1028
+ transition-property: filter;
1029
+ }
1030
+ .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image {
1031
+ /* For Webkit browsers */
1032
+ -webkit-filter: grayscale(1);
1033
+ -webkit-filter: grayscale(100%);
1034
+ /* Standard */
1035
+ filter: grayscale(100%);
1036
+ /* For IE 6 - 9 */
1037
+ filter: gray;
1038
+ opacity: 1;
1039
+ }
1040
+ .foogallery.fg-hover-grayscale .fg-thumb:before,
1041
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption {
1042
+ display: block;
1043
+ left: 0;
1044
+ top: 0;
1045
+ bottom: 0;
1046
+ transition-property: visibility, opacity;
1047
+ }
1048
+ .foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-thumb:before,
1049
+ .foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:hover .fg-caption {
1050
+ visibility: visible;
1051
+ opacity: 1;
1052
+ }
1053
+ /* Instant */
1054
+ .foogallery.fg-hover-instant .fg-loaded .fg-thumb:before,
1055
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption {
1056
+ display: block;
1057
+ left: 0;
1058
+ top: 0;
1059
+ bottom: 0;
1060
+ transition-property: none;
1061
+ }
1062
+ .foogallery.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1063
+ .foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-caption {
1064
+ visibility: visible;
1065
+ opacity: 1;
1066
+ }
1067
+ /* Push */
1068
+ .foogallery.fg-hover-push .fg-loaded .fg-thumb:before,
1069
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1070
+ display: block;
1071
+ left: 0;
1072
+ top: 0;
1073
+ bottom: 0;
1074
+ transform: translateX(100%);
1075
+ visibility: visible;
1076
+ opacity: 1;
1077
+ }
1078
+ .foogallery.fg-hover-push .fg-loaded .fg-thumb,
1079
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption {
1080
+ transition-property: transform;
1081
+ }
1082
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-caption {
1083
+ transform: translateY(0);
1084
+ }
1085
+ .foogallery.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,
1086
+ .foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb {
1087
+ transform: translateX(-100%);
1088
+ }
1089
+ /* Scale */
1090
+ .foogallery.fg-hover-scale .fg-item {
1091
+ transition-property: transform;
1092
+ z-index: 4;
1093
+ }
1094
+
1095
+ .foogallery.fg-hover-scale .fg-item:hover {
1096
+ transform: scale(1.048);
1097
+ z-index: 10;
1098
+ }
1099
+ .foogallery.fg-hover-scale .fg-thumb:before,
1100
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-caption {
1101
+ display: block;
1102
+ left: 0;
1103
+ top: 0;
1104
+ bottom: 0;
1105
+ transition-property: visibility, opacity;
1106
+ }
1107
+ .foogallery.fg-hover-scale .fg-item-inner:hover .fg-thumb:before,
1108
+ .foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:hover .fg-caption {
1109
+ visibility: visible;
1110
+ opacity: 1;
1111
+ }
1112
+ /* Slide */
1113
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before,
1114
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,
1115
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before,
1116
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,
1117
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before,
1118
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,
1119
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before,
1120
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1121
+ display: block;
1122
+ left: 0;
1123
+ top: 0;
1124
+ bottom: 0;
1125
+ transition-property: transform;
1126
+ visibility: visible;
1127
+ opacity: 1;
1128
+ }
1129
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1130
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-caption,
1131
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1132
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-caption,
1133
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1134
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-caption,
1135
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-thumb:before,
1136
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-caption {
1137
+ transform: translateY(0) translateX(0);
1138
+ }
1139
+
1140
+
1141
+ /* Slide Up */
1142
+ .foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before,
1143
+ .foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption {
1144
+ transform: translateY(100%);
1145
+ }
1146
+
1147
+ /* Slide Down */
1148
+ .foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before,
1149
+ .foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption {
1150
+ transform: translateY(-100%);
1151
+ }
1152
+
1153
+ /* Slide Left */
1154
+ .foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before,
1155
+ .foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption {
1156
+ transform: translateX(100%);
1157
+ }
1158
+
1159
+ /* Slide Right */
1160
+ .foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before,
1161
+ .foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption {
1162
+ transform: translateX(-100%);
1163
+ }
1164
+ .fg-paging-container, .fg-paging-container *, .fg-paging-container *:before, .fg-paging-container *:after {
1165
+ -webkit-box-sizing: border-box;
1166
+ -moz-box-sizing: border-box;
1167
+ box-sizing: border-box;
1168
+ }
1169
+ .fg-paging-container {
1170
+ display: block;
1171
+ padding: 15px;
1172
+ text-align: center;
1173
+ font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1174
+ -webkit-user-select: none;
1175
+ -moz-user-select: none;
1176
+ -ms-user-select: none;
1177
+ user-select: none;
1178
+ }
1179
+ /* Utility */
1180
+ .fg-sr-only {
1181
+ position: absolute;
1182
+ width: 1px;
1183
+ height: 1px;
1184
+ padding: 0;
1185
+ margin: -1px;
1186
+ overflow: hidden;
1187
+ clip: rect(0,0,0,0);
1188
+ border: 0;
1189
+ }
1190
+ .fg-paging-container .fg-dots,
1191
+ .fg-paging-container .fg-dot-item {
1192
+ display: inline-block;
1193
+ margin: 0;
1194
+ padding: 0;
1195
+ outline: none;
1196
+ list-style: none;
1197
+ }
1198
+ .fg-paging-container .fg-dot-item .fg-dot-link {
1199
+ display: inline-block;
1200
+ margin: 3px;
1201
+ font-weight: 400;
1202
+ line-height: 1.42857143;
1203
+ text-align: center;
1204
+ white-space: nowrap;
1205
+ vertical-align: middle;
1206
+ cursor: pointer;
1207
+ user-select: none;
1208
+ background-image: none;
1209
+ text-decoration: none;
1210
+ border: 1px solid transparent;
1211
+ position: relative;
1212
+ border-radius: 50%;
1213
+ padding: 0;
1214
+ font-size: 0;
1215
+ outline: none;
1216
+ color: transparent;
1217
+ box-shadow: none;
1218
+ }
1219
+ .fg-paging-container .fg-dot-item .fg-dot-link:before {
1220
+ content: "";
1221
+ background-color: transparent;
1222
+ border: 1px solid transparent;
1223
+ display: block;
1224
+ border-radius: 50%;
1225
+ width: 9px;
1226
+ height: 9px;
1227
+ padding: 0;
1228
+ margin: 2px;
1229
+ }
1230
+ .fg-paging-container .fg-dot-item .fg-dot-link:active,
1231
+ .fg-paging-container .fg-dot-item .fg-dot-link:hover,
1232
+ .fg-paging-container .fg-dot-item .fg-dot-link:focus {
1233
+ text-decoration: none;
1234
+ box-shadow: none;
1235
+ outline: none;
1236
+ }
1237
+ .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,
1238
+ .fg-paging-container .fg-dot-item.fg-selected .fg-dot-link {
1239
+ cursor: not-allowed;
1240
+ pointer-events: none;
1241
+ }
1242
+ .fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link {
1243
+ cursor: not-allowed;
1244
+ pointer-events: none;
1245
+ outline: none;
1246
+ }
1247
+
1248
+ /* Light - Dots */
1249
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link,
1250
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before {
1251
+ transition-timing-function: ease-out;
1252
+ transition-duration: 0.3s;
1253
+ transition-property: color, border-color, background-color;
1254
+ }
1255
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link {
1256
+ background-color: #eee;
1257
+ border-color: #9e9e9e;
1258
+ }
1259
+ .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link {
1260
+ border-color: #8a8a8a;
1261
+ }
1262
+ .fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before,
1263
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,
1264
+ .fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before {
1265
+ background-color: #666;
1266
+ border-color: #8a8a8a;
1267
+ }
1268
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,
1269
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover,
1270
+ .fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus {
1271
+ background-color: #eee;
1272
+ border-color: #9e9e9e;
1273
+ opacity: 0.5;
1274
+ }
1275
+
1276
+ /* Dark - Dots */
1277
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,
1278
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before {
1279
+ transition-timing-function: ease-out;
1280
+ transition-duration: 0.3s;
1281
+ transition-property: color, border-color, background-color;
1282
+ }
1283
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link {
1284
+ background-color: #666;
1285
+ border-color: #333;
1286
+ }
1287
+ .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link {
1288
+ border-color: #444;
1289
+ }
1290
+ .fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before,
1291
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,
1292
+ .fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before {
1293
+ background-color: #333;
1294
+ border-color: #444;
1295
+ }
1296
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,
1297
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover,
1298
+ .fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus {
1299
+ background-color: #666;
1300
+ border-color: #333;
1301
+ opacity: 0.5;
1302
+ }
1303
+ /* Base styles */
1304
+ .fg-default:after {
1305
+ content: '';
1306
+ display: block;
1307
+ clear: both;
1308
+ }
1309
+
1310
+ .fg-default .fg-item,
1311
+ .fg-default .fg-item-inner,
1312
+ .fg-default .fg-thumb {
1313
+ display: inline-block;
1314
+ vertical-align: top;
1315
+ max-width: 100%;
1316
+ }
1317
+
1318
+ .fg-default .fg-image {
1319
+ border-radius: 0;
1320
+ display: block;
1321
+ max-width: 100%;
1322
+ height: auto;
1323
+ margin: 0;
1324
+ padding: 0;
1325
+ }
1326
+
1327
+ /* Horizontal alignment */
1328
+ .fg-default .fg-image {
1329
+ vertical-align: top;
1330
+ }
1331
+
1332
+ .fg-default.fg-left {
1333
+ text-align: left;
1334
+ }
1335
+
1336
+ .fg-default.fg-center {
1337
+ text-align: center;
1338
+ }
1339
+
1340
+ .fg-default.fg-right {
1341
+ text-align: right;
1342
+ }
1343
+
1344
+ /* Gutter widths */
1345
+ .fg-default.fg-gutter-5 {
1346
+ padding-left: 5px;
1347
+ margin-bottom: -5px;
1348
+ }
1349
+ .fg-default.fg-gutter-5 .fg-item {
1350
+ margin-right: 5px;
1351
+ margin-bottom: 5px;
1352
+ }
1353
+
1354
+ .fg-default.fg-gutter-10 {
1355
+ padding-left: 10px;
1356
+ margin-bottom: -10px;
1357
+ }
1358
+ .fg-default.fg-gutter-10 .fg-item {
1359
+ margin-right: 10px;
1360
+ margin-bottom: 10px;
1361
+ }
1362
+
1363
+ .fg-default.fg-gutter-15 {
1364
+ padding-left: 15px;
1365
+ margin-bottom: -15px;
1366
+ }
1367
+ .fg-default.fg-gutter-15 .fg-item {
1368
+ margin-right: 15px;
1369
+ margin-bottom: 15px;
1370
+ }
1371
+
1372
+ .fg-default.fg-gutter-20 {
1373
+ padding-left: 20px;
1374
+ margin-bottom: -20px;
1375
+ }
1376
+ .fg-default.fg-gutter-20 .fg-item {
1377
+ margin-right: 20px;
1378
+ margin-bottom: 20px;
1379
+ }
1380
+
1381
+ .fg-default.fg-gutter-25 {
1382
+ padding-left: 25px;
1383
+ margin-bottom: -25px;
1384
+ }
1385
+ .fg-default.fg-gutter-25 .fg-item {
1386
+ margin-right: 25px;
1387
+ margin-bottom: 25px;
1388
+ }
1389
+ /* Base styles */
1390
+ .fg-masonry * {
1391
+ -webkit-box-sizing: border-box;
1392
+ -moz-box-sizing: border-box;
1393
+ box-sizing: border-box;
1394
+ }
1395
+ .foogallery.fg-masonry.fg-center {
1396
+ margin: 0 auto;
1397
+ }
1398
+ .fg-masonry .fg-thumb {
1399
+ display: block;
1400
+ }
1401
+ .fg-masonry.fg-masonry-fixed .fg-thumb {
1402
+ display: inline-block;
1403
+ }
1404
+ .fg-masonry.fg-masonry-fixed .fg-image {
1405
+ max-width: 100%;
1406
+ }
1407
+
1408
+ .fg-masonry .fg-column-width {
1409
+ display: inline-block;
1410
+ visibility: hidden;
1411
+ height: 0;
1412
+ border: solid 0 transparent;
1413
+ }
1414
+
1415
+ .fg-masonry.fg-masonry-5col .fg-image,
1416
+ .fg-masonry.fg-masonry-4col .fg-image,
1417
+ .fg-masonry.fg-masonry-3col .fg-image,
1418
+ .fg-masonry.fg-masonry-2col .fg-image {
1419
+ width: 100%;
1420
+ height: auto;
1421
+ max-width: 100%;
1422
+ }
1423
+
1424
+ .fg-masonry .fg-item {
1425
+ line-height: 0;
1426
+ font-size: 0;
1427
+ }
1428
+
1429
+ /* 2 column layouts */
1430
+ /* 2 column layout - normal gutter */
1431
+ .fg-masonry.fg-masonry-2col .fg-item { margin-bottom: 1%; width: 49%; }
1432
+ .fg-masonry.fg-masonry-2col .fg-column-width { width: 49%; }
1433
+ .fg-masonry.fg-masonry-2col .fg-gutter-width { width: 1%; }
1434
+
1435
+ /* 2 column layout - no gutter */
1436
+ .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
1437
+ .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width { width: 50%; }
1438
+ .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width { width: 0; }
1439
+
1440
+ /* 2 column layout - large gutter */
1441
+ .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 47%; }
1442
+ .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width { width: 47%; }
1443
+ .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width { width: 3%; }
1444
+
1445
+ /* 3 column layouts */
1446
+ /* 3 column layout - normal gutter */
1447
+ .fg-masonry.fg-masonry-3col .fg-item { margin-bottom: 1%; width: 32%; }
1448
+ .fg-masonry.fg-masonry-3col .fg-column-width { width: 32%; }
1449
+ .fg-masonry.fg-masonry-3col .fg-gutter-width { width: 1%; }
1450
+
1451
+ /* 3 column layout - no gutter */
1452
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item { margin-bottom: 0; width: 33%; }
1453
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width { width: 33%; }
1454
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width { width: 0; }
1455
+
1456
+ /* 3 column layout - large gutter */
1457
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 30%; }
1458
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width { width: 30%; }
1459
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width { width: 3%; }
1460
+
1461
+ /* 4 column layouts */
1462
+ /* 4 column layout - normal gutter */
1463
+ .fg-masonry.fg-masonry-4col .fg-item { margin-bottom: 1%; width: 24%; }
1464
+ .fg-masonry.fg-masonry-4col .fg-column-width { width: 24%; }
1465
+ .fg-masonry.fg-masonry-4col .fg-gutter-width { width: 1%; }
1466
+
1467
+ /* 4 column layout - no gutter */
1468
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item { margin-bottom: 0; width: 25%; }
1469
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width { width: 25%; }
1470
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width { width: 0; }
1471
+
1472
+ /* 4 column layout - large gutter */
1473
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 22%; }
1474
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width { width: 22%; }
1475
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width { width: 3%; }
1476
+
1477
+ /* 5 column layouts */
1478
+ /* 5 column layout - normal gutter */
1479
+ .fg-masonry.fg-masonry-5col .fg-item { margin-bottom: 1%; width: 19%; }
1480
+ .fg-masonry.fg-masonry-5col .fg-column-width { width: 19%; }
1481
+ .fg-masonry.fg-masonry-5col .fg-gutter-width { width: 1%; }
1482
+
1483
+ /* 5 column layout - no gutter */
1484
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item { margin-bottom: 0; width: 20%; }
1485
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width { width: 20%; }
1486
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width { width: 0; }
1487
+
1488
+ /* 5 column layout - large gutter */
1489
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 17%; }
1490
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width { width: 17%; }
1491
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width { width: 3%; }
1492
+
1493
+ /* Force 3 column layout < 720px */
1494
+ @media screen and (max-width: 720px) {
1495
+ /* default gutter */
1496
+ .fg-masonry.fg-masonry-5col .fg-item,
1497
+ .fg-masonry.fg-masonry-4col .fg-item { margin-bottom: 1%; width: 32%; }
1498
+ .fg-masonry.fg-masonry-5col .fg-column-width,
1499
+ .fg-masonry.fg-masonry-4col .fg-column-width { width: 32%; }
1500
+ .fg-masonry.fg-masonry-5col .fg-gutter-width,
1501
+ .fg-masonry.fg-masonry-4col .fg-gutter-width { width: 1%; }
1502
+
1503
+ /* no gutter */
1504
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item,
1505
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item { margin-bottom: 0; width: 33%; }
1506
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width,
1507
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width { width: 33%; }
1508
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width,
1509
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width { width: 0; }
1510
+
1511
+ /* large gutter */
1512
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item,
1513
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 30%; }
1514
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width,
1515
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width { width: 30%; }
1516
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width,
1517
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width { width: 3%; }
1518
+
1519
+ }
1520
+
1521
+ /* Force 2 column layout < 480px */
1522
+ @media screen and (max-width: 480px) {
1523
+ /* default gutter */
1524
+ .fg-masonry.fg-masonry-5col .fg-item,
1525
+ .fg-masonry.fg-masonry-4col .fg-item,
1526
+ .fg-masonry.fg-masonry-3col .fg-item { margin-bottom: 1%; width: 49%; }
1527
+ .fg-masonry.fg-masonry-5col .fg-column-width,
1528
+ .fg-masonry.fg-masonry-4col .fg-column-width,
1529
+ .fg-masonry.fg-masonry-3col .fg-column-width { width: 49%; }
1530
+ .fg-masonry.fg-masonry-5col .fg-gutter-width,
1531
+ .fg-masonry.fg-masonry-4col .fg-gutter-width,
1532
+ .fg-masonry.fg-masonry-3col .fg-gutter-width { width: 1%; }
1533
+
1534
+ /* no gutter */
1535
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item,
1536
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,
1537
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item { margin-bottom: 0; width: 50%; }
1538
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width,
1539
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,
1540
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width { width: 50%; }
1541
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width,
1542
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,
1543
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width { width: 0; }
1544
+
1545
+ /* large gutter */
1546
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item,
1547
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,
1548
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 47%; }
1549
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width,
1550
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,
1551
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width { width: 47%; }
1552
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width,
1553
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,
1554
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width { width: 3%; }
1555
+ }
1556
+
1557
+ /* Force 1 column layout < 320px */
1558
+ @media screen and (max-width: 320px) {
1559
+ /* default gutter */
1560
+ .fg-masonry.fg-masonry-5col .fg-item,
1561
+ .fg-masonry.fg-masonry-4col .fg-item,
1562
+ .fg-masonry.fg-masonry-3col .fg-item,
1563
+ .fg-masonry.fg-masonry-2col .fg-item { margin-bottom: 1%; width: 100%; }
1564
+ .fg-masonry.fg-masonry-5col .fg-column-width,
1565
+ .fg-masonry.fg-masonry-4col .fg-column-width,
1566
+ .fg-masonry.fg-masonry-3col .fg-column-width,
1567
+ .fg-masonry.fg-masonry-2col .fg-column-width { width: 100%; }
1568
+ .fg-masonry.fg-masonry-5col .fg-gutter-width,
1569
+ .fg-masonry.fg-masonry-4col .fg-gutter-width,
1570
+ .fg-masonry.fg-masonry-3col .fg-gutter-width,
1571
+ .fg-masonry.fg-masonry-2col .fg-gutter-width { width: 0; }
1572
+
1573
+ /* no gutter */
1574
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item,
1575
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,
1576
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item,
1577
+ .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item { margin-bottom: 0; width: 100%; }
1578
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width,
1579
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,
1580
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width,
1581
+ .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width { width: 100%; }
1582
+ .fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width,
1583
+ .fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,
1584
+ .fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width,
1585
+ .fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width { width: 0; }
1586
+
1587
+ /* large gutter */
1588
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item,
1589
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,
1590
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item,
1591
+ .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item { margin-bottom: 3%; width: 100%; }
1592
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width,
1593
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,
1594
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width,
1595
+ .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width { width: 100%; }
1596
+ .fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width,
1597
+ .fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,
1598
+ .fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width,
1599
+ .fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width { width: 0; }
1600
+ }
1601
+
1602
+ /* Border Styles - We must apply width changing border styles to the fg-column-width element so that the plugin can correctly determine the item widths. */
1603
+ .foogallery.fg-border-thin .fg-column-width {
1604
+ border-width: 5px;
1605
+ }
1606
+ .foogallery.fg-border-medium .fg-column-width {
1607
+ border-width: 10px;
1608
+ }
1609
+ .foogallery.fg-border-thick .fg-column-width {
1610
+ border-width: 15px;
1611
+ }
1612
+
1613
+ /* Captions Bottom */
1614
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption {
1615
+ visibility: visible;
1616
+ opacity: 1;
1617
+ font-size: 13px;
1618
+ position: relative;
1619
+ display: block;
1620
+ top: auto;
1621
+ bottom: auto;
1622
+ left: auto;
1623
+ right: auto;
1624
+ width: auto;
1625
+ height: auto;
1626
+ text-transform: none;
1627
+ transform: none;
1628
+ transition: none;
1629
+ background-color: transparent;
1630
+ border-style: solid;
1631
+ border-color: transparent;
1632
+ }
1633
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner:hover .fg-caption {
1634
+ transform: none;
1635
+ transition: none;
1636
+ }
1637
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner {
1638
+ display: block;
1639
+ position: relative;
1640
+ max-height: none;
1641
+ top: auto;
1642
+ bottom: auto;
1643
+ left: auto;
1644
+ right: auto;
1645
+ width: auto;
1646
+ height: auto;
1647
+ border: none;
1648
+ transform: none;
1649
+ transition: none;
1650
+ }
1651
+ .foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner:before {
1652
+ display: none;
1653
+ }
1654
+ .foogallery.fg-masonry.fg-captions-bottom.fg-caption-hover .fg-item-inner .fg-thumb:before {
1655
+ display: block;
1656
+ }
1657
+ .foogallery.fg-masonry.fg-captions-bottom.fg-caption-always .fg-item-inner:hover .fg-caption {
1658
+ visibility: visible;
1659
+ opacity: 1;
1660
+ }
1661
+
1662
+ .fg-masonry.fg-captions-bottom .fg-caption-title,
1663
+ .fg-masonry.fg-captions-bottom .fg-caption-desc {
1664
+ text-align: left;
1665
+ }
1666
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption,
1667
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption {
1668
+ color: #828282;
1669
+ }
1670
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption a,
1671
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption a {
1672
+ color: #828282;
1673
+ border-bottom: 1px solid #828282;
1674
+ }
1675
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption a:hover,
1676
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption a:hover {
1677
+ border-bottom: none;
1678
+ }
1679
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title,
1680
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a {
1681
+ color: #222;
1682
+ }
1683
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title,
1684
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a {
1685
+ color: #FFF;
1686
+ }
1687
+ .fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a {
1688
+ border-bottom: 1px solid #222;
1689
+ }
1690
+ .fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a {
1691
+ border-bottom: 1px solid #FFF;
1692
+ }
1693
+
1694
+ /* Handle Border Sizing for Captions Below */
1695
+ .fg-masonry.fg-captions-bottom .fg-caption {
1696
+ border-width: 10px;
1697
+ }
1698
+ .fg-masonry.fg-captions-bottom .fg-caption-title+.fg-caption-desc {
1699
+ margin-top: 5px;
1700
+ }
1701
+ .fg-masonry.fg-captions-bottom.fg-border-thin .fg-caption {
1702
+ border-width: 10px 5px 5px 5px;
1703
+ }
1704
+ .fg-masonry.fg-captions-bottom.fg-border-medium .fg-caption {
1705
+ border-width: 10px 0 0 0;
1706
+ }
1707
+ .fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption {
1708
+ border-width: 15px 0 0 0;
1709
+ }
1710
+ .fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption-title+.fg-caption-desc {
1711
+ margin-top: 10px;
1712
+ }
1713
+ /* Base Styles */
1714
+ .fg-justified {
1715
+ box-sizing: border-box;
1716
+ position: relative;
1717
+ }
1718
+ .foogallery.fg-justified .fg-item,
1719
+ .foogallery.fg-justified .fg-item-inner,
1720
+ .foogallery.fg-justified .fg-thumb,
1721
+ .foogallery.fg-justified .fg-image {
1722
+ box-sizing: border-box;
1723
+ display: block;
1724
+ margin: 0;
1725
+ padding: 0;
1726
+ }
1727
+ .fg-justified .fg-item {
1728
+ visibility: visible;
1729
+ position: absolute;
1730
+ }
1731
+ .fg-justified .fg-item-inner {
1732
+ position: relative;
1733
+ width: 100%;
1734
+ height: 100%;
1735
+ }
1736
+ .fg-justified .fg-thumb {
1737
+ position: relative;
1738
+ overflow: hidden;
1739
+ }
1740
+ .fg-justified .fg-image {
1741
+ z-index: 1;
1742
+ }
1743
+ .fg-justified .fg-item.fg-positioned .fg-thumb {
1744
+ width: 100%;
1745
+ height: 100%;
1746
+ }
1747
+ .fg-justified .fg-item.fg-positioned .fg-image {
1748
+ width: 100%;
1749
+ height: auto;
1750
+ min-height: 100%;
1751
+ }
1752
+ /* Base Styles */
1753
+ .fg-simple_portfolio {
1754
+ box-sizing: border-box;
1755
+ position: relative;
1756
+ font-size: 16px;
1757
+ margin: 0 auto;
1758
+ padding: 0;
1759
+ /* The foogallery-portfolio container must have a width set and it is recommended to make the min-width the same as the item width. */
1760
+ width: 100%;
1761
+ }
1762
+ .fg-simple_portfolio .fg-item {
1763
+ position: absolute;
1764
+ display: inline-block;
1765
+ margin: 0;
1766
+ padding: 0;
1767
+ outline: none;
1768
+ }
1769
+ .fg-simple_portfolio .fg-item-inner,
1770
+ .fg-simple_portfolio .fg-thumb,
1771
+ .fg-simple_portfolio .fg-image {
1772
+ display: block;
1773
+ margin: 0;
1774
+ padding: 0;
1775
+ outline: none;
1776
+ }
1777
+ .fg-simple_portfolio .fg-item-inner {
1778
+ position: relative;
1779
+ width: 100%;
1780
+ height: 100%;
1781
+ }
1782
+ .fg-simple_portfolio .fg-thumb {
1783
+ box-sizing: border-box;
1784
+ display: block;
1785
+ margin: 0;
1786
+ padding: 0;
1787
+ border: none;
1788
+ outline: none;
1789
+ position: relative;
1790
+ overflow: hidden;
1791
+ }
1792
+ .fg-simple_portfolio .fg-item.fg-positioned .fg-image {
1793
+ width: 100%;
1794
+ height: auto;
1795
+ }
1796
+ .fg-simple_portfolio .fg-image {
1797
+ z-index: 1;
1798
+ }
1799
+
1800
+ .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption {
1801
+ visibility: visible;
1802
+ opacity: 1;
1803
+ font-size: 13px;
1804
+ position: relative;
1805
+ display: block;
1806
+ top: auto;
1807
+ bottom: auto;
1808
+ left: auto;
1809
+ right: auto;
1810
+ width: auto;
1811
+ height: auto;
1812
+ text-transform: none;
1813
+ transform: none;
1814
+ transition: none;
1815
+ background-color: transparent;
1816
+ border-style: solid;
1817
+ border-color: transparent;
1818
+ }
1819
+ .foogallery.fg-simple_portfolio .fg-item-inner:hover .fg-caption {
1820
+ transform: none;
1821
+ transition: none;
1822
+ }
1823
+ .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner {
1824
+ display: block;
1825
+ top: auto;
1826
+ bottom: auto;
1827
+ left: auto;
1828
+ right: auto;
1829
+ width: auto;
1830
+ height: auto;
1831
+ border: none;
1832
+ transform: none;
1833
+ transition: none;
1834
+ }
1835
+ .foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner:before {
1836
+ display: none;
1837
+ }
1838
+ .foogallery.fg-simple_portfolio.fg-caption-hover .fg-item-inner .fg-thumb:before {
1839
+ display: block;
1840
+ }
1841
+ .foogallery.fg-simple_portfolio.fg-caption-always .fg-item-inner:hover .fg-caption {
1842
+ visibility: visible;
1843
+ opacity: 1;
1844
+ }
1845
+
1846
+ .fg-simple_portfolio .fg-caption-title {
1847
+ text-align: left;
1848
+ }
1849
+ .fg-simple_portfolio .fg-caption-desc {
1850
+ text-align: justify;
1851
+ }
1852
+ .fg-simple_portfolio.fg-light .fg-caption,
1853
+ .fg-simple_portfolio.fg-dark .fg-caption {
1854
+ color: #828282;
1855
+ }
1856
+ .fg-simple_portfolio.fg-light .fg-caption a,
1857
+ .fg-simple_portfolio.fg-dark .fg-caption a {
1858
+ color: #828282;
1859
+ border-bottom: 1px solid #828282;
1860
+ }
1861
+ .fg-simple_portfolio.fg-light .fg-caption a:hover,
1862
+ .fg-simple_portfolio.fg-dark .fg-caption a:hover {
1863
+ border-bottom: none;
1864
+ }
1865
+ .fg-simple_portfolio.fg-light .fg-caption-title,
1866
+ .fg-simple_portfolio.fg-light .fg-caption-title a {
1867
+ color: #222;
1868
+ }
1869
+ .fg-simple_portfolio.fg-dark .fg-caption-title,
1870
+ .fg-simple_portfolio.fg-dark .fg-caption-title a {
1871
+ color: #FFF;
1872
+ }
1873
+ .fg-simple_portfolio.fg-light .fg-caption-title a {
1874
+ border-bottom: 1px solid #222;
1875
+ }
1876
+ .fg-simple_portfolio.fg-dark .fg-caption-title a {
1877
+ border-bottom: 1px solid #FFF;
1878
+ }
1879
+
1880
+ .fg-simple_portfolio.fg-captions-top .fg-item.fg-positioned .fg-thumb {
1881
+ position: absolute;
1882
+ bottom: 0;
1883
+ left: 0;
1884
+ }
1885
+
1886
+ /* Handle Border Sizing */
1887
+ .fg-simple_portfolio .fg-caption {
1888
+ border-width: 10px;
1889
+ }
1890
+ .fg-simple_portfolio .fg-caption-title+.fg-caption-desc {
1891
+ margin-top: 5px;
1892
+ }
1893
+ .fg-simple_portfolio.fg-border-thin .fg-caption {
1894
+ border-width: 10px 5px 5px 5px;
1895
+ }
1896
+ .fg-simple_portfolio.fg-captions-top.fg-border-thin .fg-caption {
1897
+ border-width: 5px 5px 10px 5px;
1898
+ }
1899
+ .fg-simple_portfolio.fg-border-medium .fg-caption {
1900
+ border-width: 10px 0 0 0;
1901
+ }
1902
+ .fg-simple_portfolio.fg-captions-top.fg-border-medium .fg-caption {
1903
+ border-width: 0 0 10px 0;
1904
+ }
1905
+ .fg-simple_portfolio.fg-border-thick .fg-caption {
1906
+ border-width: 15px 0 0 0;
1907
+ }
1908
+ .fg-simple_portfolio.fg-captions-top.fg-border-thick .fg-caption {
1909
+ border-width: 0 0 15px 0;
1910
+ }
1911
+ .fg-simple_portfolio.fg-border-thick .fg-caption-title+.fg-caption-desc {
1912
+ margin-top: 10px;
1913
+ }
1914
+ /* Polaroid */
1915
+ .foogallery.fg-preset.fg-polaroid .fg-item {
1916
+ -webkit-backface-visibility: hidden;
1917
+ backface-visibility: hidden;
1918
+ -webkit-transition: -webkit-transform 0.35s, background-color 0.65s;
1919
+ transition: transform 0.35s, background-color 0.65s;
1920
+ }
1921
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n+1) {
1922
+ -webkit-transform: rotate(3deg);
1923
+ transform: rotate(3deg);
1924
+ }
1925
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n) {
1926
+ -webkit-transform: rotate(-3deg);
1927
+ transform: rotate(-3deg);
1928
+ }
1929
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(3n) {
1930
+ -webkit-transform: rotate(1deg);
1931
+ transform: rotate(1deg);
1932
+ }
1933
+ .foogallery.fg-preset.fg-polaroid .fg-item:nth-child(5n) {
1934
+ -webkit-transform: rotate(-2deg);
1935
+ transform: rotate(-2deg);
1936
+ }
1937
+
1938
+ .foogallery.fg-preset.fg-polaroid .fg-item:hover {
1939
+ -webkit-transform: rotate(0);
1940
+ transform: rotate(0);
1941
+ }
1942
+
1943
+ .foogallery.fg-preset.fg-polaroid .fg-caption {
1944
+ position: relative;
1945
+ width: auto;
1946
+ font-family: "Segoe Print Regular",-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
1947
+ }
1948
+
1949
+ .foogallery.fg-preset.fg-polaroid .fg-caption-inner,
1950
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title {
1951
+ position: relative;
1952
+ width: auto;
1953
+ }
1954
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title {
1955
+ text-align: center;
1956
+ }
1957
+ .foogallery.fg-preset.fg-polaroid .fg-caption-desc {
1958
+ display: none;
1959
+ }
1960
+
1961
+ /* Themes */
1962
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title,
1963
+ .foogallery.fg-light.fg-preset.fg-polaroid .fg-caption-title {
1964
+ color: #333;
1965
+ }
1966
+ .foogallery.fg-dark.fg-preset.fg-polaroid .fg-caption-title {
1967
+ color: #FFF;
1968
+ }
1969
+
1970
+ /* Handle Border Sizing */
1971
+ .foogallery.fg-preset.fg-polaroid .fg-caption {
1972
+ border-style: solid;
1973
+ border-color: transparent;
1974
+ border-width: 10px;
1975
+ }
1976
+ .foogallery.fg-preset.fg-polaroid .fg-caption-title+.fg-caption-desc {
1977
+ margin-top: 5px;
1978
+ }
1979
+ .foogallery.fg-preset.fg-polaroid.fg-border-thin .fg-caption {
1980
+ border-width: 10px 5px 5px 5px;
1981
+ }
1982
+ .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thin .fg-caption {
1983
+ border-width: 5px 5px 10px 5px;
1984
+ }
1985
+ .foogallery.fg-preset.fg-polaroid.fg-border-medium .fg-caption {
1986
+ border-width: 10px 0 0 0;
1987
+ }
1988
+ .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-medium .fg-caption {
1989
+ border-width: 0 0 10px 0;
1990
+ }
1991
+ .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption {
1992
+ border-width: 15px 0 0 0;
1993
+ }
1994
+ .foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thick .fg-caption {
1995
+ border-width: 0 0 15px 0;
1996
+ }
1997
+ .foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption-title+.fg-caption-desc {
1998
+ margin-top: 10px;
1999
+ }
2000
+ /* Base styles */
2001
+ .fg-image-viewer {
2002
+ display: block;
2003
+ font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;
2004
+ }
2005
+ .fg-image-viewer.fg-left {
2006
+ text-align: left;
2007
+ }
2008
+
2009
+ .fg-image-viewer.fg-center {
2010
+ text-align: center;
2011
+ }
2012
+ .fg-image-viewer.fg-right {
2013
+ text-align: right;
2014
+ }
2015
+
2016
+ .fiv-inner {
2017
+ position: relative;
2018
+ display: inline-block;
2019
+ max-width: 100%;
2020
+ overflow: hidden;
2021
+ z-index: 6;
2022
+ }
2023
+ .fiv-inner .fiv-inner-container {
2024
+ position: relative;
2025
+ overflow: hidden;
2026
+ max-width: 100%;
2027
+ border-style: solid;
2028
+ border-width: 0;
2029
+ border-bottom-width: 4px;
2030
+ z-index: 5;
2031
+ }
2032
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb,
2033
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:hover,
2034
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:active,
2035
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:visited {
2036
+ position: relative;
2037
+ display: block;
2038
+ border: none;
2039
+ outline: none;
2040
+ text-decoration: none;
2041
+ box-shadow: none;
2042
+ max-width: 100%;
2043
+ }
2044
+
2045
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item {
2046
+ position: relative;
2047
+ visibility: visible;
2048
+ opacity: 1;
2049
+ border: none;
2050
+ outline: none;
2051
+ text-decoration: none;
2052
+ box-shadow: none;
2053
+ max-width: 100%;
2054
+ }
2055
+ .fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb img {
2056
+ display: block;
2057
+ max-width: 100%;
2058
+ height: auto;
2059
+ border: none;
2060
+ outline: none;
2061
+ text-decoration: none;
2062
+ }
2063
+
2064
+ .fg-image-viewer .fiv-inner .fiv-ctrls {
2065
+ display: block;
2066
+ text-align: center;
2067
+ font-size: 14px;
2068
+ border-style: solid;
2069
+ line-height: 34px;
2070
+ }
2071
+ .fg-image-viewer .fiv-inner .fiv-ctrls:after {
2072
+ content: '';
2073
+ display: block;
2074
+ clear: both;
2075
+ }
2076
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count {
2077
+ display: inline-block;
2078
+ font-weight: normal;
2079
+ margin: 0;
2080
+ }
2081
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,
2082
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2083
+ cursor: pointer;
2084
+ -webkit-user-select: none;
2085
+ -moz-user-select: none;
2086
+ -ms-user-select: none;
2087
+ user-select: none;
2088
+ border: none;
2089
+ min-width: 80px;
2090
+ position: relative;
2091
+ overflow: hidden;
2092
+ transition: background-color .3s;
2093
+ }
2094
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before,
2095
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2096
+ display: block;
2097
+ position: absolute;
2098
+ font-size: 24px;
2099
+ line-height: 30px;
2100
+ top:0;
2101
+ left:0;
2102
+ width: 100%;
2103
+ transform: translateY(0);
2104
+ transition: transform .3s;
2105
+ }
2106
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover:before,
2107
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover:before {
2108
+ transform: translateY(-100%);
2109
+ }
2110
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev span,
2111
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next span {
2112
+ display: block;
2113
+ width: 100%;
2114
+ transform: translateY(100%);
2115
+ transition: transform .3s;
2116
+ }
2117
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover span,
2118
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover span {
2119
+ transform: translateY(0);
2120
+ }
2121
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev {
2122
+ float: left;
2123
+ }
2124
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before {
2125
+ content: '\2190';
2126
+ }
2127
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {
2128
+ float: right;
2129
+ }
2130
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before {
2131
+ content: '\2192';
2132
+ }
2133
+ .fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count span {
2134
+ margin: 0 4px;
2135
+ }
2136
+
2137
+ /*!* Theme - Default (Light) *!*/
2138
+ /*.fg-image-viewer .fiv-inner,*/
2139
+ /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,*/
2140
+ /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {*/
2141
+ /*background-color: #FFFFFF;*/
2142
+ /*color: #1b1b1b;*/
2143
+ /*}*/
2144
+ /*.fg-image-viewer .fiv-inner,*/
2145
+ /*.fg-image-viewer .fiv-inner .fiv-inner-container,*/
2146
+ /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev,*/
2147
+ /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next {*/
2148
+ /*border-color: #e6e6e6;*/
2149
+ /*}*/
2150
+ /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover,*/
2151
+ /*.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover {*/
2152
+ /*background-color: #F2F2F2;*/
2153
+ /*}*/
2154
+
2155
+ /*!* Theme - Dark *!*/
2156
+ /*.fg-image-viewer.fiv-dark .fiv-inner,*/
2157
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-prev,*/
2158
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-next {*/
2159
+ /*background-color: #151515;*/
2160
+ /*color: #FFFFFF;*/
2161
+ /*}*/
2162
+ /*.fg-image-viewer.fiv-dark .fiv-inner,*/
2163
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-inner-container,*/
2164
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-prev,*/
2165
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-next {*/
2166
+ /*border-color: #2E2E2E;*/
2167
+ /*}*/
2168
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-prev:hover,*/
2169
+ /*.fg-image-viewer.fiv-dark .fiv-inner .fiv-ctrls .fiv-next:hover {*/
2170
+ /*background-color: #000000;*/
2171
+ /*}*/
2172
+
2173
+ /* Captions */
2174
+
2175
+ .foogallery.fg-image-viewer.fg-caption-always .fg-item-inner .fg-caption {
2176
+ padding: 0;
2177
+ border: none;
2178
+ background: #000; /* Old browsers */
2179
+ background: -moz-linear-gradient(left, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.8) 60%, rgba(0,0,0,0) 100%); /* FF3.6-15 */
2180
+ background: -webkit-linear-gradient(left, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.8) 60%,rgba(0,0,0,0) 100%); /* Chrome10-25,Safari5.1-6 */
2181
+ background: linear-gradient(to right, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.8) 60%,rgba(0,0,0,0) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
2182
+ }
2183
+ .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title {
2184
+ padding: 10px 10px 10px 10px;
2185
+ }
2186
+ .foogallery.fg-image-viewer.fg-caption-always .fg-caption-desc {
2187
+ padding: 10px 10px 10px 10px;
2188
+ }
2189
+ .foogallery.fg-image-viewer.fg-caption-always .fg-caption-title+.fg-caption-desc {
2190
+ padding: 0 10px 10px 10px;
2191
+ }
2192
+
2193
+ /* Theme - Default (Light) */
2194
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls,
2195
+ .fg-image-viewer.fg-light .fiv-inner .fiv-inner-container,
2196
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-count,
2197
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev,
2198
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next {
2199
+ background-color: #FFF;
2200
+ color: #333;
2201
+ border-color: #FFF;
2202
+ }
2203
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev:hover,
2204
+ .fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next:hover {
2205
+ background-color: #F2F2F2;
2206
+ }
2207
+ .fg-image-viewer.fg-light .fiv-prev,
2208
+ .fg-image-viewer.fg-light .fiv-next {
2209
+ box-shadow: inset 0 0 0 1px #ddd;
2210
+ }
2211
+
2212
+ /* Theme - Dark */
2213
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls,
2214
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-inner-container,
2215
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-count,
2216
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev,
2217
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next {
2218
+ background-color: #333;
2219
+ color: #FFF;
2220
+ border-color: #333;
2221
+ }
2222
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev:hover,
2223
+ .fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next:hover {
2224
+ background-color: #444;
2225
+ }
2226
+ .fg-image-viewer.fg-dark .fiv-prev,
2227
+ .fg-image-viewer.fg-dark .fiv-next {
2228
+ box-shadow: inset 0 0 0 1px #222;
2229
+ }
2230
+
2231
+ /* Border Size */
2232
+ .foogallery.fg-image-viewer.fg-border-thin .fg-item-inner,
2233
+ .foogallery.fg-image-viewer.fg-border-medium .fg-item-inner,
2234
+ .foogallery.fg-image-viewer.fg-border-thick .fg-item-inner {
2235
+ border-width: 0;
2236
+ }
2237
+ .foogallery.fg-image-viewer .fiv-ctrls,
2238
+ .foogallery.fg-image-viewer.fg-border-thin .fiv-inner-container {
2239
+ border-width: 4px;
2240
+ }
2241
+ .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
2242
+ .foogallery.fg-image-viewer.fg-border-medium .fiv-inner-container {
2243
+ border-width: 10px;
2244
+ }
2245
+ .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,
2246
+ .foogallery.fg-image-viewer.fg-border-thick .fiv-inner-container {
2247
+ border-width: 16px;
2248
+ }
2249
+ .foogallery.fg-image-viewer .fiv-ctrls,
2250
+ .foogallery.fg-image-viewer.fg-border-thin .fiv-ctrls,
2251
+ .foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,
2252
+ .foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls {
2253
+ border-top-width: 1px;
2254
+ }
2255
+
2256
+ /* Rounded Corners */
2257
+ .foogallery.fg-image-viewer.fg-round-small .fg-item,
2258
+ .foogallery.fg-image-viewer.fg-round-small .fg-item-inner,
2259
+ .foogallery.fg-image-viewer.fg-round-small .fiv-inner {
2260
+ border-radius: 5px;
2261
+ }
2262
+ .foogallery.fg-image-viewer.fg-round-small .fg-item,
2263
+ .foogallery.fg-image-viewer.fg-round-small .fg-item-inner {
2264
+ border-bottom-left-radius: 0;
2265
+ border-bottom-right-radius: 0;
2266
+ }
2267
+ .foogallery.fg-image-viewer.fg-round-small .fiv-prev,
2268
+ .foogallery.fg-image-viewer.fg-round-small .fiv-next {
2269
+ border-radius: 3px;
2270
+ }
2271
+
2272
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item,
2273
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item-inner,
2274
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-prev,
2275
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-next,
2276
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item,
2277
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item-inner,
2278
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-prev,
2279
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-next,
2280
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item,
2281
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item-inner,
2282
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-prev,
2283
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-next {
2284
+ border-radius: 3px;
2285
+ }
2286
+
2287
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item,
2288
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner,
2289
+ .foogallery.fg-image-viewer.fg-round-medium .fiv-inner {
2290
+ border-radius: 10px;
2291
+ }
2292
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item,
2293
+ .foogallery.fg-image-viewer.fg-round-medium .fg-item-inner {
2294
+ border-bottom-left-radius: 0;
2295
+ border-bottom-right-radius: 0;
2296
+ }
2297
+ .foogallery.fg-image-viewer.fg-round-medium .fiv-prev,
2298
+ .foogallery.fg-image-viewer.fg-round-medium .fiv-next {
2299
+ border-radius: 5px;
2300
+ }
2301
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item,
2302
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item-inner,
2303
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-prev,
2304
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-next {
2305
+ border-radius: 5px;
2306
+ }
2307
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item,
2308
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item-inner,
2309
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-prev,
2310
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-next,
2311
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item,
2312
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item-inner,
2313
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-prev,
2314
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-next {
2315
+ border-radius: 3px;
2316
+ }
2317
+
2318
+ .foogallery.fg-image-viewer.fg-round-large .fg-item,
2319
+ .foogallery.fg-image-viewer.fg-round-large .fg-item-inner,
2320
+ .foogallery.fg-image-viewer.fg-round-large .fiv-inner {
2321
+ border-radius: 15px;
2322
+ }
2323
+ .foogallery.fg-image-viewer.fg-round-large .fg-item,
2324
+ .foogallery.fg-image-viewer.fg-round-large .fg-item-inner {
2325
+ border-bottom-left-radius: 0;
2326
+ border-bottom-right-radius: 0;
2327
+ }
2328
+ .foogallery.fg-image-viewer.fg-round-large .fiv-prev,
2329
+ .foogallery.fg-image-viewer.fg-round-large .fiv-next {
2330
+ border-radius: 11px;
2331
+ }
2332
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item,
2333
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item-inner,
2334
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-prev,
2335
+ .foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-next {
2336
+ border-radius: 11px;
2337
+ }
2338
+
2339
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item,
2340
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item-inner,
2341
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-prev,
2342
+ .foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-next {
2343
+ border-radius: 5px;
2344
+ }
2345
+
2346
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item,
2347
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item-inner,
2348
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-prev,
2349
+ .foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-next {
2350
+ border-radius: 3px;
2351
+ }
2352
+
2353
+ .foogallery.fg-image-viewer.fg-round-full .fiv-inner,
2354
+ .foogallery.fg-image-viewer.fg-round-full .fiv-prev,
2355
+ .foogallery.fg-image-viewer.fg-round-full .fiv-next {
2356
+ border-radius: 50%;
2357
+ }
2358
+
2359
+ /* Drop Shadows */
2360
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fg-item-inner,
2361
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fg-item-inner,
2362
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fg-item-inner,
2363
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fg-item-inner,
2364
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fg-item-inner,
2365
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fg-item-inner,
2366
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fg-item-inner,
2367
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fg-item-inner {
2368
+ box-shadow: none;
2369
+ }
2370
+
2371
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fiv-inner {
2372
+ box-shadow: 0 0 0 1px #ddd;
2373
+ }
2374
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fiv-inner {
2375
+ box-shadow: 0 0 0 1px #222;
2376
+ }
2377
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-small .fiv-inner,
2378
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fiv-inner {
2379
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
2380
+ }
2381
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fiv-inner,
2382
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fiv-inner {
2383
+ box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.5);
2384
+ }
2385
+ .foogallery.fg-image-viewer.fg-light.fg-shadow-large .fiv-inner,
2386
+ .foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fiv-inner {
2387
+ box-shadow: 0 1px 16px 0 rgba(0, 0, 0, 0.5);
2388
+ }
2389
+ .foogallery.fg-thumbnail,
2390
+ .foogallery.fg-thumbnail.fg-center {
2391
+ text-align: center;
2392
+ }
2393
+ .foogallery.fg-thumbnail.fg-left {
2394
+ float: left;
2395
+ }
2396
+ .foogallery.fg-thumbnail.fg-right {
2397
+ float: right;
2398
+ }
2399
+
2400
+ .foogallery.fg-thumbnail .fg-item {
2401
+ display: inline-block;
2402
+ vertical-align: top;
2403
+ max-width: 100%;
2404
+ }
2405
+ .foogallery.fg-thumbnail .fg-image {
2406
+ max-width: 100%;
2407
+ }
2408
+ .foogallery.fg-thumbnail .fg-st-hidden {
2409
+ display: none;
2410
  }
extensions/default-templates/shared/css/foogallery.min.css CHANGED
@@ -1 +1 @@
1
- .foogallery,.foogallery *{box-sizing:border-box}.foogallery{display:block;z-index:1;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;position:relative;line-height:0;font-size:0;width:100%;max-width:100%}.foogallery .fg-item{display:inline-block;position:relative;background-color:transparent;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.foogallery .fg-item-inner{display:block;position:relative;visibility:hidden;overflow:hidden;opacity:0;z-index:3;margin:0;border:solid 0 transparent}.foogallery .fg-item.fg-error,.foogallery .fg-item.fg-loading{background:no-repeat center}.foogallery .fg-item.fg-error{background-image:url(../img/image.png)}@media only screen and (-o-min-device-pixel-ratio:5/4),only screen and (-webkit-min-device-pixel-ratio:1.25),only screen and (min-device-pixel-ratio:1.25),only screen and (min-resolution:1.25dppx){.foogallery .fg-item.fg-error{background-image:url(../img/image@2x.png)}}@media only screen and (-o-min-device-pixel-ratio:9/4),only screen and (-webkit-min-device-pixel-ratio:2.25),only screen and (min-device-pixel-ratio:2.25),only screen and (min-resolution:2.25dppx){.foogallery .fg-item.fg-error{background-image:url(../img/image@3x.png)}}.foogallery .fg-item.fg-loaded{z-index:4}.foogallery .fg-loaded .fg-item-inner{visibility:visible;opacity:1;z-index:5}.foogallery .fg-error .fg-item-inner{pointer-events:none;cursor:default}.foogallery .fg-thumb{display:block;position:relative;border:none;outline:0;text-decoration:none;z-index:4}.foogallery .fg-image{display:block;position:relative;border:none;outline:0;text-decoration:none;z-index:5;max-width:none;height:auto;margin:0}.foogallery .fg-loaded .fg-thumb{z-index:6}.foogallery .fg-loaded .fg-image{z-index:7}.foogallery.fg-light .fg-item-inner{background-color:#fff;color:#333;border-color:#fff}.foogallery.fg-dark .fg-item-inner{background-color:#333;color:#fff;border-color:#333}.foogallery.fg-light .fg-item.fg-error,.foogallery.fg-light .fg-item.fg-idle,.foogallery.fg-light .fg-item.fg-loading{background-color:#eee;box-shadow:inset 0 0 0 1px #ddd}.foogallery.fg-dark .fg-item.fg-error,.foogallery.fg-dark .fg-item.fg-idle,.foogallery.fg-dark .fg-item.fg-loading{background-color:#444;box-shadow:inset 0 0 0 1px #333}.foogallery.fg-border-thin .fg-item-inner{border-width:4px}.foogallery.fg-border-medium .fg-item-inner{border-width:10px}.foogallery.fg-border-thick .fg-item-inner{border-width:16px}.foogallery.fg-light.fg-shadow-outline .fg-item-inner{box-shadow:0 0 0 1px #ddd}.foogallery.fg-dark.fg-shadow-outline .fg-item-inner{box-shadow:0 0 0 1px #222}.foogallery.fg-dark.fg-shadow-small .fg-item-inner,.foogallery.fg-light.fg-shadow-small .fg-item-inner{box-shadow:0 1px 4px 0 rgba(0,0,0,.5)}.foogallery.fg-dark.fg-shadow-medium .fg-item-inner,.foogallery.fg-light.fg-shadow-medium .fg-item-inner{box-shadow:0 1px 10px 0 rgba(0,0,0,.5)}.foogallery.fg-dark.fg-shadow-large .fg-item-inner,.foogallery.fg-light.fg-shadow-large .fg-item-inner{box-shadow:0 1px 16px 0 rgba(0,0,0,.5)}.foogallery.fg-shadow-inset-large .fg-thumb:after,.foogallery.fg-shadow-inset-medium .fg-thumb:after,.foogallery.fg-shadow-inset-small .fg-thumb:after{display:block;content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:7}.foogallery.fg-dark.fg-shadow-inset-small .fg-thumb:after,.foogallery.fg-light.fg-shadow-inset-small .fg-thumb:after{box-shadow:inset 0 1px 4px 0 rgba(0,0,0,.3)}.foogallery.fg-dark.fg-shadow-inset-medium .fg-thumb:after,.foogallery.fg-light.fg-shadow-inset-medium .fg-thumb:after{box-shadow:inset 0 1px 10px 0 rgba(0,0,0,.3)}.foogallery.fg-dark.fg-shadow-inset-large .fg-thumb:after,.foogallery.fg-light.fg-shadow-inset-large .fg-thumb:after{box-shadow:inset 0 1px 16px 0 rgba(0,0,0,.3)}.foogallery.fg-round-full.fg-shadow-inset-large .fg-thumb:after,.foogallery.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,.foogallery.fg-round-full.fg-shadow-inset-small .fg-thumb:after{border-radius:50%}.foogallery.fg-round-small .fg-item,.foogallery.fg-round-small .fg-item-inner{border-radius:5px}.foogallery.fg-round-medium .fg-item,.foogallery.fg-round-medium .fg-item-inner{border-radius:10px}.foogallery.fg-round-large .fg-item,.foogallery.fg-round-large .fg-item-inner{border-radius:15px}.foogallery.fg-round-full .fg-item,.foogallery.fg-round-full .fg-item-inner{border-radius:50%}.foogallery .fg-loader{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);width:1em;height:1em;font-size:5px;visibility:hidden;opacity:0}.foogallery .fg-loading .fg-loader{visibility:visible;opacity:1}.fg-loading-default .fg-loader{border-radius:50%;text-indent:-9999em;-webkit-animation:loading-default 1.1s infinite ease;animation:loading-default 1.1s infinite ease}@-webkit-keyframes loading-default{0%,100%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,1),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.5),-1.8em -1.8em 0 0 rgba(130,130,130,.7)}12.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.7),1.8em -1.8em 0 0 rgba(130,130,130,1),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.5)}25%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.5),1.8em -1.8em 0 0 rgba(130,130,130,.7),2.5em 0 0 0 rgba(130,130,130,1),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}37.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.5),2.5em 0 0 0 rgba(130,130,130,.7),1.75em 1.75em 0 0 rgba(130,130,130,1),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}50%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.5),1.75em 1.75em 0 0 rgba(130,130,130,.7),0 2.5em 0 0 rgba(130,130,130,1),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}62.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.5),0 2.5em 0 0 rgba(130,130,130,.7),-1.8em 1.8em 0 0 rgba(130,130,130,1),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}75%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.5),-1.8em 1.8em 0 0 rgba(130,130,130,.7),-2.6em 0 0 0 rgba(130,130,130,1),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}87.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.5),-2.6em 0 0 0 rgba(130,130,130,.7),-1.8em -1.8em 0 0 rgba(130,130,130,1)}}@keyframes loading-default{0%,100%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,1),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.5),-1.8em -1.8em 0 0 rgba(130,130,130,.7)}12.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.7),1.8em -1.8em 0 0 rgba(130,130,130,1),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.5)}25%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.5),1.8em -1.8em 0 0 rgba(130,130,130,.7),2.5em 0 0 0 rgba(130,130,130,1),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}37.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.5),2.5em 0 0 0 rgba(130,130,130,.7),1.75em 1.75em 0 0 rgba(130,130,130,1),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}50%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.5),1.75em 1.75em 0 0 rgba(130,130,130,.7),0 2.5em 0 0 rgba(130,130,130,1),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}62.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.5),0 2.5em 0 0 rgba(130,130,130,.7),-1.8em 1.8em 0 0 rgba(130,130,130,1),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}75%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.5),-1.8em 1.8em 0 0 rgba(130,130,130,.7),-2.6em 0 0 0 rgba(130,130,130,1),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}87.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.5),-2.6em 0 0 0 rgba(130,130,130,.7),-1.8em -1.8em 0 0 rgba(130,130,130,1)}}.fg-loading-bars .fg-loader,.fg-loading-bars .fg-loader:after,.fg-loading-bars .fg-loader:before{background:rgba(130,130,130,1);-webkit-animation:loading-bars 1s infinite ease-in-out;animation:loading-bars 1s infinite ease-in-out;width:1em;height:4em}.fg-loading-bars .fg-loader{color:rgba(130,130,130,1);text-indent:-9999em;font-size:4px;-webkit-animation-delay:-.16s;animation-delay:-.16s}.fg-loading-bars .fg-loader:after,.fg-loading-bars .fg-loader:before{position:absolute;top:0;content:''}.fg-loading-bars .fg-loader:before{left:-1.5em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.fg-loading-bars .fg-loader:after{left:1.5em}@-webkit-keyframes loading-bars{0%,100%,80%{box-shadow:0 0;height:4em}40%{box-shadow:0 -2em;height:5em}}@keyframes loading-bars{0%,100%,80%{box-shadow:0 0;height:4em}40%{box-shadow:0 -2em;height:5em}}.fg-loading-trail .fg-loader{color:#828282;font-size:20px;text-indent:-9999em;overflow:hidden;border-radius:50%;-webkit-animation:loading-trail-1 1.7s infinite ease,loading-trail-2 1.7s infinite ease;animation:loading-trail-1 1.7s infinite ease,loading-trail-2 1.7s infinite ease}@-webkit-keyframes loading-trail-1{0%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}5%,95%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}10%,59%{box-shadow:0 -.83em 0 -.4em,-.087em -.825em 0 -.42em,-.173em -.812em 0 -.44em,-.256em -.789em 0 -.46em,-.297em -.775em 0 -.477em}20%{box-shadow:0 -.83em 0 -.4em,-.338em -.758em 0 -.42em,-.555em -.617em 0 -.44em,-.671em -.488em 0 -.46em,-.749em -.34em 0 -.477em}38%{box-shadow:0 -.83em 0 -.4em,-.377em -.74em 0 -.42em,-.645em -.522em 0 -.44em,-.775em -.297em 0 -.46em,-.82em -.09em 0 -.477em}100%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}}@keyframes loading-trail-1{0%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}5%,95%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}10%,59%{box-shadow:0 -.83em 0 -.4em,-.087em -.825em 0 -.42em,-.173em -.812em 0 -.44em,-.256em -.789em 0 -.46em,-.297em -.775em 0 -.477em}20%{box-shadow:0 -.83em 0 -.4em,-.338em -.758em 0 -.42em,-.555em -.617em 0 -.44em,-.671em -.488em 0 -.46em,-.749em -.34em 0 -.477em}38%{box-shadow:0 -.83em 0 -.4em,-.377em -.74em 0 -.42em,-.645em -.522em 0 -.44em,-.775em -.297em 0 -.46em,-.82em -.09em 0 -.477em}100%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}}@-webkit-keyframes loading-trail-2{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}@keyframes loading-trail-2{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}.fg-loading-pulse .fg-loader,.fg-loading-pulse .fg-loader:after,.fg-loading-pulse .fg-loader:before{border-radius:50%;width:2.5em;height:2.5em;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:loading-pulse 1.8s infinite ease-in-out;animation:loading-pulse 1.8s infinite ease-in-out}.fg-loading-pulse .fg-loader{color:#828282;font-size:4px;text-indent:-9999em;transform:translateX(-50%) translateY(-150%);-webkit-animation-delay:-.16s;animation-delay:-.16s}.fg-loading-pulse .fg-loader:after,.fg-loading-pulse .fg-loader:before{content:'';position:absolute;top:0}.fg-loading-pulse .fg-loader:before{left:-3.5em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.fg-loading-pulse .fg-loader:after{left:3.5em}@-webkit-keyframes loading-pulse{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes loading-pulse{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}.fg-loading-dots .fg-loader{color:#828282;font-size:5px;border-radius:50%;text-indent:-9999em;-webkit-animation:loading-dots 1.3s infinite linear;animation:loading-dots 1.3s infinite linear}@-webkit-keyframes loading-dots{0%,100%{box-shadow:0 -3em 0 .2em,2em -2em 0 0,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 0}12.5%{box-shadow:0 -3em 0 0,2em -2em 0 .2em,3em 0 0 0,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}25%{box-shadow:0 -3em 0 -.5em,2em -2em 0 0,3em 0 0 .2em,2em 2em 0 0,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}37.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 0,2em 2em 0 .2em,0 3em 0 0,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}50%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 0,0 3em 0 .2em,-2em 2em 0 0,-3em 0 0 -1em,-2em -2em 0 -1em}62.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 0,-2em 2em 0 .2em,-3em 0 0 0,-2em -2em 0 -1em}75%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 .2em,-2em -2em 0 0}87.5%{box-shadow:0 -3em 0 0,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 0,-2em -2em 0 .2em}}@keyframes loading-dots{0%,100%{box-shadow:0 -3em 0 .2em,2em -2em 0 0,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 0}12.5%{box-shadow:0 -3em 0 0,2em -2em 0 .2em,3em 0 0 0,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}25%{box-shadow:0 -3em 0 -.5em,2em -2em 0 0,3em 0 0 .2em,2em 2em 0 0,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}37.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 0,2em 2em 0 .2em,0 3em 0 0,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}50%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 0,0 3em 0 .2em,-2em 2em 0 0,-3em 0 0 -1em,-2em -2em 0 -1em}62.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 0,-2em 2em 0 .2em,-3em 0 0 0,-2em -2em 0 -1em}75%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 .2em,-2em -2em 0 0}87.5%{box-shadow:0 -3em 0 0,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 0,-2em -2em 0 .2em}}.fg-loading-partial .fg-loader,.fg-loading-partial .fg-loader:after{border-radius:50%;width:10em;height:10em}.fg-loading-partial .fg-loader{font-size:4px;text-indent:-9999em;border-top:1.1em solid rgba(130,130,130,.2);border-right:1.1em solid rgba(130,130,130,.2);border-bottom:1.1em solid rgba(130,130,130,.2);border-left:1.1em solid #828282;-webkit-animation:loading-partial 1.1s infinite linear;animation:loading-partial 1.1s infinite linear}@-webkit-keyframes loading-partial{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}@keyframes loading-partial{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}.foogallery.fg-loaded-drop .fg-item,.foogallery.fg-loaded-fade-in .fg-item,.foogallery.fg-loaded-flip .fg-item,.foogallery.fg-loaded-fly .fg-item,.foogallery.fg-loaded-scale-up .fg-item,.foogallery.fg-loaded-slide-down .fg-item,.foogallery.fg-loaded-slide-left .fg-item,.foogallery.fg-loaded-slide-right .fg-item,.foogallery.fg-loaded-slide-up .fg-item,.foogallery.fg-loaded-swing-down .fg-item{transition-timing-function:ease;transition-duration:650ms;transition-property:background-color,transform}.foogallery.fg-loaded-drop .fg-item-inner,.foogallery.fg-loaded-fade-in .fg-item-inner,.foogallery.fg-loaded-flip .fg-item-inner,.foogallery.fg-loaded-fly .fg-item-inner,.foogallery.fg-loaded-scale-up .fg-item-inner,.foogallery.fg-loaded-slide-down .fg-item-inner,.foogallery.fg-loaded-slide-left .fg-item-inner,.foogallery.fg-loaded-slide-right .fg-item-inner,.foogallery.fg-loaded-slide-up .fg-item-inner,.foogallery.fg-loaded-swing-down .fg-item-inner{transition-timing-function:ease;transition-duration:650ms}.foogallery.fg-loaded-drop .fg-item.fg-loaded,.foogallery.fg-loaded-flip .fg-item.fg-loaded,.foogallery.fg-loaded-fly .fg-item.fg-loaded,.foogallery.fg-loaded-swing-down .fg-item.fg-loaded{perspective:1300px}.foogallery.fg-loaded-fade-in .fg-item-inner{transition-property:visibility,opacity}.foogallery .fg-caption{visibility:hidden;opacity:0;background-color:rgba(0,0,0,.6);color:#fff;position:absolute;z-index:8;width:100%;max-height:100%;overflow:hidden;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:13px;font-weight:400;line-height:1.3;border:none;text-align:center;cursor:pointer}.foogallery .fg-caption a{text-decoration:none;color:#fff;border-bottom:1px solid #fff}.foogallery .fg-caption a:hover{border-bottom:none}.foogallery .fg-caption-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px;font-weight:400;padding:5px}.foogallery .fg-caption-desc{padding:5px}.foogallery .fg-caption-title+.fg-caption-desc{padding-top:0}.foogallery.fg-caption-always .fg-caption .fg-caption-inner:before{display:none}.foogallery.fg-caption-always .fg-item.fg-loaded .fg-caption{left:0;bottom:0;transition-timing-function:ease;transition-duration:.3s;transition-property:visibility,opacity;visibility:visible;opacity:1;text-align:left}.foogallery.fg-caption-hover .fg-caption .fg-caption-inner{width:100%;max-height:100%;position:absolute;top:50%;left:0;transform:translateY(-50%)}.foogallery.fg-caption-hover .fg-item.fg-loaded .fg-thumb:before{display:none}.foogallery.fg-hover-circle-plus .fg-thumb:before,.foogallery.fg-hover-external .fg-thumb:before,.foogallery.fg-hover-eye .fg-thumb:before,.foogallery.fg-hover-plus .fg-thumb:before,.foogallery.fg-hover-tint .fg-thumb:before,.foogallery.fg-hover-zoom .fg-thumb:before,.foogallery.fg-hover-zoom2 .fg-thumb:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{content:"";display:block;position:absolute;visibility:hidden;opacity:0;top:0;bottom:0;left:0;right:0;z-index:8;background:rgba(0,0,0,.5) no-repeat center center;background-size:32px 32px}.foogallery.fg-hover-circle-plus .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-circle-plus .fg-thumb:focus:before,.foogallery.fg-hover-external .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-external .fg-thumb:focus:before,.foogallery.fg-hover-eye .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-eye .fg-thumb:focus:before,.foogallery.fg-hover-plus .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-plus .fg-thumb:focus:before,.foogallery.fg-hover-tint .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-tint .fg-thumb:focus:before,.foogallery.fg-hover-zoom .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-zoom .fg-thumb:focus:before,.foogallery.fg-hover-zoom2 .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-zoom2 .fg-thumb:focus:before,.foogallery.fg-hover-zoom3 .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-zoom3 .fg-thumb:focus:before{visibility:visible;opacity:1}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-tint .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-caption-inner:before{content:"";display:inline-block;position:relative;width:32px;height:32px;margin:10px 0 5px 0;background:transparent no-repeat center center;background-size:32px 32px;vertical-align:middle}.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-thumb:before{background-image:url(../img/zoom.png)}.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-thumb:before{background-image:url(../img/zoom2.png)}.foogallery.fg-hover-zoom3 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{background-image:url(../img/zoom3.png)}.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-thumb:before{background-image:url(../img/plus.png)}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-circle-plus .fg-thumb:before{background-image:url(../img/circle-plus.png)}.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-thumb:before{background-image:url(../img/eye.png)}.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-external .fg-thumb:before{background-image:url(../img/external.png)}@media only screen and (-o-min-device-pixel-ratio:5/4),only screen and (-webkit-min-device-pixel-ratio:1.25),only screen and (min-device-pixel-ratio:1.25),only screen and (min-resolution:1.25dppx){.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-thumb:before{background-image:url(../img/zoom@2x.png)}.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-thumb:before{background-image:url(../img/zoom2@2x.png)}.foogallery.fg-hover-zoom3 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{background-image:url(../img/zoom3@2x.png)}.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-thumb:before{background-image:url(../img/plus@2x.png)}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-circle-plus .fg-thumb:before{background-image:url(../img/circle-plus@2x.png)}.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-thumb:before{background-image:url(../img/eye@2x.png)}.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-external .fg-thumb:before{background-image:url(../img/external@2x.png)}}@media only screen and (-o-min-device-pixel-ratio:9/4),only screen and (-webkit-min-device-pixel-ratio:2.25),only screen and (min-device-pixel-ratio:2.25),only screen and (min-resolution:2.25dppx){.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-thumb:before{background-image:url(../img/zoom@3x.png)}.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-thumb:before{background-image:url(../img/zoom2@3x.png)}.foogallery.fg-hover-zoom3 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{background-image:url(../img/zoom3@3x.png)}.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-thumb:before{background-image:url(../img/plus@3x.png)}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-circle-plus .fg-thumb:before{background-image:url(../img/circle-plus@3x.png)}.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-thumb:before{background-image:url(../img/eye@3x.png)}.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-external .fg-thumb:before{background-image:url(../img/external@3x.png)}}.foogallery.fg-caption-hover.fg-hover-colorize .fg-caption,.foogallery.fg-caption-hover.fg-hover-fade .fg-caption,.foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption,.foogallery.fg-caption-hover.fg-hover-instant .fg-caption,.foogallery.fg-caption-hover.fg-hover-push .fg-caption,.foogallery.fg-caption-hover.fg-hover-scale .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-down .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-left .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-right .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-up .fg-caption,.foogallery.fg-hover-colorize .fg-image,.foogallery.fg-hover-colorize .fg-thumb:before,.foogallery.fg-hover-fade .fg-thumb:before,.foogallery.fg-hover-grayscale .fg-image,.foogallery.fg-hover-grayscale .fg-thumb:before,.foogallery.fg-hover-instant .fg-thumb:before,.foogallery.fg-hover-push .fg-thumb,.foogallery.fg-hover-scale .fg-item,.foogallery.fg-hover-scale .fg-thumb:before,.foogallery.fg-hover-slide-down .fg-thumb:before,.foogallery.fg-hover-slide-left .fg-thumb:before,.foogallery.fg-hover-slide-right .fg-thumb:before,.foogallery.fg-hover-slide-up .fg-thumb:before{transition-timing-function:ease;transition-duration:.3s}.foogallery.fg-hover-colorize .fg-image{filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'saturate\' values=\'0\'/></filter></svg>#grayscale");filter:gray;-webkit-filter:grayscale(100%);-webkit-transition-property:-webkit-filter;transition-property:filter}.foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image{-webkit-filter:none;filter:none}.foogallery.fg-caption-hover.fg-hover-colorize .fg-caption,.foogallery.fg-hover-colorize .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-colorize .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption,.foogallery.fg-hover-fade .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-hover-grayscale .fg-image{-webkit-filter:none;filter:none;-webkit-transition-property:-webkit-filter;transition-property:filter}.foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image{-webkit-filter:grayscale(1);-webkit-filter:grayscale(100%);filter:grayscale(100%);filter:gray;opacity:1}.foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption,.foogallery.fg-hover-grayscale .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption,.foogallery.fg-hover-instant .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:none}.foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption,.foogallery.fg-hover-push .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transform:translateX(100%);visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption,.foogallery.fg-hover-push .fg-loaded .fg-thumb{transition-property:transform}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-caption{transform:translateY(0)}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,.foogallery.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb{transform:translateX(-100%)}.foogallery.fg-hover-scale .fg-item{transition-property:transform;z-index:4}.foogallery.fg-hover-scale .fg-item:hover{transform:scale(1.048);z-index:10}.foogallery.fg-caption-hover.fg-hover-scale .fg-caption,.foogallery.fg-hover-scale .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-scale .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,.foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before,.foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before,.foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before,.foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:transform;visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-thumb:before{transform:translateY(0) translateX(0)}.foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,.foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before{transform:translateY(100%)}.foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,.foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before{transform:translateY(-100%)}.foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,.foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before{transform:translateX(100%)}.foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption,.foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before{transform:translateX(-100%)}.fg-paging-container,.fg-paging-container *,.fg-paging-container :after,.fg-paging-container :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fg-paging-container{display:block;padding:15px;text-align:center;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fg-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.fg-paging-container .fg-dot-item,.fg-paging-container .fg-dots{display:inline-block;margin:0;padding:0;outline:0;list-style:none}.fg-paging-container .fg-dot-item .fg-dot-link{display:inline-block;margin:3px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;background-image:none;text-decoration:none;border:1px solid transparent;position:relative;border-radius:50%;padding:0;font-size:0;outline:0;color:transparent;box-shadow:none}.fg-paging-container .fg-dot-item .fg-dot-link:before{content:"";background-color:transparent;border:1px solid transparent;display:block;border-radius:50%;width:9px;height:9px;padding:0;margin:2px}.fg-paging-container .fg-dot-item .fg-dot-link:active,.fg-paging-container .fg-dot-item .fg-dot-link:focus,.fg-paging-container .fg-dot-item .fg-dot-link:hover{text-decoration:none;box-shadow:none;outline:0}.fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,.fg-paging-container .fg-dot-item.fg-selected .fg-dot-link{cursor:not-allowed;pointer-events:none}.fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link{cursor:not-allowed;pointer-events:none;outline:0}.fg-paging-container.fg-light .fg-dot-item .fg-dot-link,.fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before{transition-timing-function:ease-out;transition-duration:.3s;transition-property:color,border-color,background-color}.fg-paging-container.fg-light .fg-dot-item .fg-dot-link{background-color:#eee;border-color:#9e9e9e}.fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link{border-color:#8a8a8a}.fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before,.fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,.fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before{background-color:#666;border-color:#8a8a8a}.fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,.fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus,.fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover{background-color:#eee;border-color:#9e9e9e;opacity:.5}.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before{transition-timing-function:ease-out;transition-duration:.3s;transition-property:color,border-color,background-color}.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link{background-color:#666;border-color:#333}.fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link{border-color:#444}.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before,.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,.fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before{background-color:#333;border-color:#444}.fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,.fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus,.fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover{background-color:#666;border-color:#333;opacity:.5}.fg-default:after{content:'';display:block;clear:both}.fg-default .fg-item,.fg-default .fg-item-inner,.fg-default .fg-thumb{display:inline-block;vertical-align:top;max-width:100%}.fg-default .fg-image{border-radius:0;display:block;max-width:100%;height:auto;margin:0;padding:0}.fg-default .fg-image{vertical-align:top}.fg-default.fg-left{text-align:left}.fg-default.fg-center{text-align:center}.fg-default.fg-right{text-align:right}.fg-default.fg-gutter-5{padding-left:5px;margin-bottom:-5px}.fg-default.fg-gutter-5 .fg-item{margin-right:5px;margin-bottom:5px}.fg-default.fg-gutter-10{padding-left:10px;margin-bottom:-10px}.fg-default.fg-gutter-10 .fg-item{margin-right:10px;margin-bottom:10px}.fg-default.fg-gutter-15{padding-left:15px;margin-bottom:-15px}.fg-default.fg-gutter-15 .fg-item{margin-right:15px;margin-bottom:15px}.fg-default.fg-gutter-20{padding-left:20px;margin-bottom:-20px}.fg-default.fg-gutter-20 .fg-item{margin-right:20px;margin-bottom:20px}.fg-default.fg-gutter-25{padding-left:25px;margin-bottom:-25px}.fg-default.fg-gutter-25 .fg-item{margin-right:25px;margin-bottom:25px}.fg-masonry *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.foogallery.fg-masonry.fg-center{margin:0 auto}.fg-masonry .fg-thumb{display:block}.fg-masonry.fg-masonry-fixed .fg-thumb{display:inline-block}.fg-masonry.fg-masonry-fixed .fg-image{max-width:100%}.fg-masonry .fg-column-width{display:inline-block;visibility:hidden;height:0;border:solid 0 transparent}.fg-masonry.fg-masonry-fixed .fg-column-width{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fg-masonry.fg-masonry-2col .fg-image,.fg-masonry.fg-masonry-3col .fg-image,.fg-masonry.fg-masonry-4col .fg-image,.fg-masonry.fg-masonry-5col .fg-image{width:100%;height:auto;max-width:100%}.fg-masonry .fg-item{line-height:0;font-size:0}.fg-masonry.fg-masonry-2col .fg-item{margin-bottom:1%;width:49%}.fg-masonry.fg-masonry-2col .fg-column-width{width:49%}.fg-masonry.fg-masonry-2col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item{margin-bottom:0;width:50%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width{width:50%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item{margin-bottom:3%;width:47%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width{width:47%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width{width:3%}.fg-masonry.fg-masonry-3col .fg-item{margin-bottom:1%;width:32%}.fg-masonry.fg-masonry-3col .fg-column-width{width:32%}.fg-masonry.fg-masonry-3col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item{margin-bottom:0;width:33%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width{width:33%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item{margin-bottom:3%;width:30%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width{width:30%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width{width:3%}.fg-masonry.fg-masonry-4col .fg-item{margin-bottom:1%;width:24%}.fg-masonry.fg-masonry-4col .fg-column-width{width:24%}.fg-masonry.fg-masonry-4col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item{margin-bottom:0;width:25%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width{width:25%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item{margin-bottom:3%;width:22%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width{width:22%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width{width:3%}.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:19%}.fg-masonry.fg-masonry-5col .fg-column-width{width:19%}.fg-masonry.fg-masonry-5col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:20%}.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:20%}.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:17%}.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:17%}.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:3%}@media screen and (max-width:720px){.fg-masonry.fg-masonry-4col .fg-item,.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:32%}.fg-masonry.fg-masonry-4col .fg-column-width,.fg-masonry.fg-masonry-5col .fg-column-width{width:32%}.fg-masonry.fg-masonry-4col .fg-gutter-width,.fg-masonry.fg-masonry-5col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:33%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:33%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:30%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:30%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:3%}}@media screen and (max-width:480px){.fg-masonry.fg-masonry-3col .fg-item,.fg-masonry.fg-masonry-4col .fg-item,.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:49%}.fg-masonry.fg-masonry-3col .fg-column-width,.fg-masonry.fg-masonry-4col .fg-column-width,.fg-masonry.fg-masonry-5col .fg-column-width{width:49%}.fg-masonry.fg-masonry-3col .fg-gutter-width,.fg-masonry.fg-masonry-4col .fg-gutter-width,.fg-masonry.fg-masonry-5col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:50%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:50%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:47%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:47%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:3%}}@media screen and (max-width:320px){.fg-masonry.fg-masonry-2col .fg-item,.fg-masonry.fg-masonry-3col .fg-item,.fg-masonry.fg-masonry-4col .fg-item,.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:100%}.fg-masonry.fg-masonry-2col .fg-column-width,.fg-masonry.fg-masonry-3col .fg-column-width,.fg-masonry.fg-masonry-4col .fg-column-width,.fg-masonry.fg-masonry-5col .fg-column-width{width:100%}.fg-masonry.fg-masonry-2col .fg-gutter-width,.fg-masonry.fg-masonry-3col .fg-gutter-width,.fg-masonry.fg-masonry-4col .fg-gutter-width,.fg-masonry.fg-masonry-5col .fg-gutter-width{width:0}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:0}}.foogallery.fg-border-thin .fg-column-width{border-width:5px}.foogallery.fg-border-medium .fg-column-width{border-width:10px}.foogallery.fg-border-thick .fg-column-width{border-width:15px}.fg-justified{box-sizing:border-box;position:relative}.foogallery.fg-justified .fg-image,.foogallery.fg-justified .fg-item,.foogallery.fg-justified .fg-item-inner,.foogallery.fg-justified .fg-thumb{box-sizing:border-box;display:block;margin:0;padding:0}.fg-justified .fg-item{visibility:visible;position:absolute}.fg-justified .fg-item-inner{position:relative;width:100%;height:100%}.fg-justified .fg-thumb{position:relative;overflow:hidden}.fg-justified .fg-image{z-index:1}.fg-justified .fg-item.fg-positioned .fg-thumb{width:100%;height:100%}.fg-justified .fg-item.fg-positioned .fg-image{width:100%;height:auto;min-height:100%}.fg-simple_portfolio{box-sizing:border-box;position:relative;font-size:16px;margin:0 auto;padding:0;width:100%}.fg-simple_portfolio .fg-item{position:absolute;display:inline-block;margin:0;padding:0;outline:0}.fg-simple_portfolio .fg-image,.fg-simple_portfolio .fg-item-inner,.fg-simple_portfolio .fg-thumb{display:block;margin:0;padding:0;outline:0}.fg-simple_portfolio .fg-item-inner{position:relative;width:100%;height:100%}.fg-simple_portfolio .fg-thumb{box-sizing:border-box;display:block;margin:0;padding:0;border:none;outline:0;position:relative;overflow:hidden}.fg-simple_portfolio .fg-item.fg-positioned .fg-image{width:100%;height:auto}.fg-simple_portfolio .fg-image{z-index:1}.foogallery.fg-simple_portfolio .fg-item-inner .fg-caption{visibility:visible;opacity:1;font-size:13px;position:relative;display:block;top:auto;bottom:auto;left:auto;right:auto;width:auto;height:auto;text-transform:none;transform:none;transition:none;background-color:transparent;border-style:solid;border-color:transparent}.foogallery.fg-simple_portfolio .fg-item-inner:hover .fg-caption{transform:none;transition:none}.foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner{display:block;top:auto;bottom:auto;left:auto;right:auto;width:auto;height:auto;border:none;transform:none;transition:none}.foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner:before{display:none}.foogallery.fg-simple_portfolio.fg-caption-hover .fg-item-inner .fg-thumb:before{display:block}.foogallery.fg-simple_portfolio.fg-caption-always .fg-item-inner:hover .fg-caption{visibility:visible;opacity:1}.fg-simple_portfolio .fg-caption-title{text-align:left}.fg-simple_portfolio .fg-caption-desc{text-align:justify}.fg-simple_portfolio.fg-dark .fg-caption,.fg-simple_portfolio.fg-light .fg-caption{color:#828282}.fg-simple_portfolio.fg-dark .fg-caption a,.fg-simple_portfolio.fg-light .fg-caption a{color:#828282;border-bottom:1px solid #828282}.fg-simple_portfolio.fg-dark .fg-caption a:hover,.fg-simple_portfolio.fg-light .fg-caption a:hover{border-bottom:none}.fg-simple_portfolio.fg-light .fg-caption-title,.fg-simple_portfolio.fg-light .fg-caption-title a{color:#222}.fg-simple_portfolio.fg-dark .fg-caption-title,.fg-simple_portfolio.fg-dark .fg-caption-title a{color:#fff}.fg-simple_portfolio.fg-light .fg-caption-title a{border-bottom:1px solid #222}.fg-simple_portfolio.fg-dark .fg-caption-title a{border-bottom:1px solid #fff}.fg-simple_portfolio.fg-captions-top .fg-item.fg-positioned .fg-thumb{position:absolute;bottom:0;left:0}.fg-simple_portfolio .fg-caption{border-width:10px}.fg-simple_portfolio .fg-caption-title+.fg-caption-desc{margin-top:5px}.fg-simple_portfolio.fg-border-thin .fg-caption{border-width:10px 5px 5px 5px}.fg-simple_portfolio.fg-captions-top.fg-border-thin .fg-caption{border-width:5px 5px 10px 5px}.fg-simple_portfolio.fg-border-medium .fg-caption{border-width:10px 0 0 0}.fg-simple_portfolio.fg-captions-top.fg-border-medium .fg-caption{border-width:0 0 10px 0}.fg-simple_portfolio.fg-border-thick .fg-caption{border-width:15px 0 0 0}.fg-simple_portfolio.fg-captions-top.fg-border-thick .fg-caption{border-width:0 0 15px 0}.fg-simple_portfolio.fg-border-thick .fg-caption-title+.fg-caption-desc{margin-top:10px}.foogallery.fg-preset.fg-polaroid .fg-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .35s,background-color .65s;transition:transform .35s,background-color .65s}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n+1){-webkit-transform:rotate(3deg);transform:rotate(3deg)}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n){-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(3n){-webkit-transform:rotate(1deg);transform:rotate(1deg)}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(5n){-webkit-transform:rotate(-2deg);transform:rotate(-2deg)}.foogallery.fg-preset.fg-polaroid .fg-item:hover{-webkit-transform:rotate(0);transform:rotate(0)}.foogallery.fg-preset.fg-polaroid .fg-caption{position:relative;width:auto;font-family:"Segoe Print Regular",-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}.foogallery.fg-preset.fg-polaroid .fg-caption-inner,.foogallery.fg-preset.fg-polaroid .fg-caption-title{position:relative;width:auto}.foogallery.fg-preset.fg-polaroid .fg-caption-title{text-align:center}.foogallery.fg-preset.fg-polaroid .fg-caption-desc{display:none}.foogallery.fg-light.fg-preset.fg-polaroid .fg-caption-title,.foogallery.fg-preset.fg-polaroid .fg-caption-title{color:#333}.foogallery.fg-dark.fg-preset.fg-polaroid .fg-caption-title{color:#fff}.foogallery.fg-preset.fg-polaroid .fg-caption{border-style:solid;border-color:transparent;border-width:10px}.foogallery.fg-preset.fg-polaroid .fg-caption-title+.fg-caption-desc{margin-top:5px}.foogallery.fg-preset.fg-polaroid.fg-border-thin .fg-caption{border-width:10px 5px 5px 5px}.foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thin .fg-caption{border-width:5px 5px 10px 5px}.foogallery.fg-preset.fg-polaroid.fg-border-medium .fg-caption{border-width:10px 0 0 0}.foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-medium .fg-caption{border-width:0 0 10px 0}.foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption{border-width:15px 0 0 0}.foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thick .fg-caption{border-width:0 0 15px 0}.foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption-title+.fg-caption-desc{margin-top:10px}.fg-image-viewer{display:block;font-family:'Open Sans','Helvetica Neue',Arial,sans-serif}.fg-image-viewer.fg-left{text-align:left}.fg-image-viewer.fg-center{text-align:center}.fg-image-viewer.fg-right{text-align:right}.fiv-inner{position:relative;display:inline-block;max-width:100%;overflow:hidden;z-index:6}.fiv-inner .fiv-inner-container{position:relative;overflow:hidden;max-width:100%;border-style:solid;border-width:0;border-bottom-width:4px;z-index:5}.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb,.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:active,.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:hover,.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:visited{position:relative;display:block;border:none;outline:0;text-decoration:none;box-shadow:none;max-width:100%}.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item{position:relative;visibility:visible;opacity:1;border:none;outline:0;text-decoration:none;box-shadow:none;max-width:100%}.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb img{display:block;max-width:100%;height:auto;border:none;outline:0;text-decoration:none}.fg-image-viewer .fiv-inner .fiv-ctrls{display:block;text-align:center;font-size:14px;border-style:solid;line-height:34px}.fg-image-viewer .fiv-inner .fiv-ctrls:after{content:'';display:block;clear:both}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count{display:inline-block;font-weight:400;margin:0}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:none;min-width:80px;position:relative;overflow:hidden;transition:background-color .3s}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before{display:block;position:absolute;font-size:24px;line-height:30px;top:0;left:0;width:100%;transform:translateY(0);transition:transform .3s}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover:before,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover:before{transform:translateY(-100%)}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next span,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev span{display:block;width:100%;transform:translateY(100%);transition:transform .3s}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover span,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover span{transform:translateY(0)}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev{float:left}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before{content:'\2190'}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next{float:right}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before{content:'\2192'}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count span{margin:0 4px}/*!* Theme - Default (Light) *!*//*!* Theme - Dark *!*/.foogallery.fg-image-viewer.fg-caption-always .fg-item-inner .fg-caption{padding:0;border:none;background:#000;background:-moz-linear-gradient(left,rgba(0,0,0,.8) 0,rgba(0,0,0,.8) 60%,rgba(0,0,0,0) 100%);background:-webkit-linear-gradient(left,rgba(0,0,0,.8) 0,rgba(0,0,0,.8) 60%,rgba(0,0,0,0) 100%);background:linear-gradient(to right,rgba(0,0,0,.8) 0,rgba(0,0,0,.8) 60%,rgba(0,0,0,0) 100%)}.foogallery.fg-image-viewer.fg-caption-always .fg-caption-title{padding:10px 10px 10px 10px}.foogallery.fg-image-viewer.fg-caption-always .fg-caption-desc{padding:10px 10px 10px 10px}.foogallery.fg-image-viewer.fg-caption-always .fg-caption-title+.fg-caption-desc{padding:0 10px 10px 10px}.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-count,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev,.fg-image-viewer.fg-light .fiv-inner .fiv-inner-container{background-color:#fff;color:#333;border-color:#fff}.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next:hover,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev:hover{background-color:#f2f2f2}.fg-image-viewer.fg-light .fiv-next,.fg-image-viewer.fg-light .fiv-prev{box-shadow:inset 0 0 0 1px #ddd}.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-count,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev,.fg-image-viewer.fg-dark .fiv-inner .fiv-inner-container{background-color:#333;color:#fff;border-color:#333}.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next:hover,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev:hover{background-color:#444}.fg-image-viewer.fg-dark .fiv-next,.fg-image-viewer.fg-dark .fiv-prev{box-shadow:inset 0 0 0 1px #222}.foogallery.fg-image-viewer.fg-border-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin .fg-item-inner{border-width:0}.foogallery.fg-image-viewer .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thin .fiv-inner-container{border-width:4px}.foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-medium .fiv-inner-container{border-width:10px}.foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thick .fiv-inner-container{border-width:16px}.foogallery.fg-image-viewer .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thin .fiv-ctrls{border-top-width:1px}.foogallery.fg-image-viewer.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-round-small .fiv-inner{border-radius:5px}.foogallery.fg-image-viewer.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-round-small .fg-item-inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.foogallery.fg-image-viewer.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-round-small .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-prev,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-prev,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-round-medium .fiv-inner{border-radius:10px}.foogallery.fg-image-viewer.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-round-medium .fg-item-inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.foogallery.fg-image-viewer.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-round-medium .fiv-prev{border-radius:5px}.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-prev{border-radius:5px}.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-prev,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-round-large .fiv-inner{border-radius:15px}.foogallery.fg-image-viewer.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-round-large .fg-item-inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.foogallery.fg-image-viewer.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-round-large .fiv-prev{border-radius:11px}.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-prev{border-radius:11px}.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-prev{border-radius:5px}.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-round-full .fiv-inner,.foogallery.fg-image-viewer.fg-round-full .fiv-next,.foogallery.fg-image-viewer.fg-round-full .fiv-prev{border-radius:50%}.foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fg-item-inner,.foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fg-item-inner,.foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-large .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-small .fg-item-inner{box-shadow:none}.foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fiv-inner{box-shadow:0 0 0 1px #ddd}.foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fiv-inner{box-shadow:0 0 0 1px #222}.foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fiv-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-small .fiv-inner{box-shadow:0 1px 4px 0 rgba(0,0,0,.5)}.foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fiv-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fiv-inner{box-shadow:0 1px 10px 0 rgba(0,0,0,.5)}.foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fiv-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-large .fiv-inner{box-shadow:0 1px 16px 0 rgba(0,0,0,.5)}.foogallery.fg-thumbnail,.foogallery.fg-thumbnail.fg-center{text-align:center}.foogallery.fg-thumbnail.fg-left{float:left}.foogallery.fg-thumbnail.fg-right{float:right}.foogallery.fg-thumbnail .fg-item{display:inline-block;vertical-align:top;max-width:100%}.foogallery.fg-thumbnail .fg-image{max-width:100%}.foogallery.fg-thumbnail .fg-st-hidden{display:none}
1
+ .foogallery,.foogallery *{box-sizing:border-box}.foogallery{display:block;z-index:1;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;position:relative;line-height:0;font-size:0;width:100%;max-width:100%}.foogallery .fg-item{display:inline-block;position:relative;background-color:transparent;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.foogallery .fg-item-inner{display:block;position:relative;visibility:hidden;overflow:hidden;opacity:0;z-index:3;margin:0;border:solid 0 transparent}.foogallery .fg-item.fg-error,.foogallery .fg-item.fg-loading{background:no-repeat center}.foogallery .fg-item.fg-error{background-image:url(../img/image.png)}@media only screen and (-o-min-device-pixel-ratio:5/4),only screen and (-webkit-min-device-pixel-ratio:1.25),only screen and (min-device-pixel-ratio:1.25),only screen and (min-resolution:1.25dppx){.foogallery .fg-item.fg-error{background-image:url(../img/image@2x.png)}}@media only screen and (-o-min-device-pixel-ratio:9/4),only screen and (-webkit-min-device-pixel-ratio:2.25),only screen and (min-device-pixel-ratio:2.25),only screen and (min-resolution:2.25dppx){.foogallery .fg-item.fg-error{background-image:url(../img/image@3x.png)}}.foogallery .fg-item.fg-loaded{z-index:4}.foogallery .fg-loaded .fg-item-inner{visibility:visible;opacity:1;z-index:5}.foogallery .fg-error .fg-item-inner{pointer-events:none;cursor:default}.foogallery .fg-thumb{display:block;position:relative;border:none;outline:0;text-decoration:none;z-index:4}.foogallery .fg-image{display:block;position:relative;border:none;outline:0;text-decoration:none;z-index:5;max-width:none;height:auto;margin:0}.foogallery .fg-loaded .fg-thumb{z-index:6}.foogallery .fg-loaded .fg-image{z-index:7}.foogallery.fg-light .fg-item-inner{background-color:#fff;color:#333;border-color:#fff}.foogallery.fg-dark .fg-item-inner{background-color:#333;color:#fff;border-color:#333}.foogallery.fg-light .fg-item.fg-error,.foogallery.fg-light .fg-item.fg-idle,.foogallery.fg-light .fg-item.fg-loading{background-color:#eee;box-shadow:inset 0 0 0 1px #ddd}.foogallery.fg-dark .fg-item.fg-error,.foogallery.fg-dark .fg-item.fg-idle,.foogallery.fg-dark .fg-item.fg-loading{background-color:#444;box-shadow:inset 0 0 0 1px #333}.foogallery.fg-border-thin .fg-item-inner{border-width:4px}.foogallery.fg-border-medium .fg-item-inner{border-width:10px}.foogallery.fg-border-thick .fg-item-inner{border-width:16px}.foogallery.fg-light.fg-shadow-outline .fg-item-inner{box-shadow:0 0 0 1px #ddd}.foogallery.fg-dark.fg-shadow-outline .fg-item-inner{box-shadow:0 0 0 1px #222}.foogallery.fg-dark.fg-shadow-small .fg-item-inner,.foogallery.fg-light.fg-shadow-small .fg-item-inner{box-shadow:0 1px 4px 0 rgba(0,0,0,.5)}.foogallery.fg-dark.fg-shadow-medium .fg-item-inner,.foogallery.fg-light.fg-shadow-medium .fg-item-inner{box-shadow:0 1px 10px 0 rgba(0,0,0,.5)}.foogallery.fg-dark.fg-shadow-large .fg-item-inner,.foogallery.fg-light.fg-shadow-large .fg-item-inner{box-shadow:0 1px 16px 0 rgba(0,0,0,.5)}.foogallery.fg-shadow-inset-large .fg-thumb:after,.foogallery.fg-shadow-inset-medium .fg-thumb:after,.foogallery.fg-shadow-inset-small .fg-thumb:after{display:block;content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:7}.foogallery.fg-dark.fg-shadow-inset-small .fg-thumb:after,.foogallery.fg-light.fg-shadow-inset-small .fg-thumb:after{box-shadow:inset 0 1px 4px 0 rgba(0,0,0,.3)}.foogallery.fg-dark.fg-shadow-inset-medium .fg-thumb:after,.foogallery.fg-light.fg-shadow-inset-medium .fg-thumb:after{box-shadow:inset 0 1px 10px 0 rgba(0,0,0,.3)}.foogallery.fg-dark.fg-shadow-inset-large .fg-thumb:after,.foogallery.fg-light.fg-shadow-inset-large .fg-thumb:after{box-shadow:inset 0 1px 16px 0 rgba(0,0,0,.3)}.foogallery.fg-round-full.fg-shadow-inset-large .fg-thumb:after,.foogallery.fg-round-full.fg-shadow-inset-medium .fg-thumb:after,.foogallery.fg-round-full.fg-shadow-inset-small .fg-thumb:after{border-radius:50%}.foogallery.fg-round-small .fg-item,.foogallery.fg-round-small .fg-item-inner{border-radius:5px}.foogallery.fg-round-medium .fg-item,.foogallery.fg-round-medium .fg-item-inner{border-radius:10px}.foogallery.fg-round-large .fg-item,.foogallery.fg-round-large .fg-item-inner{border-radius:15px}.foogallery.fg-round-full .fg-item,.foogallery.fg-round-full .fg-item-inner{border-radius:50%}.foogallery .fg-loader{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);width:1em;height:1em;font-size:5px;visibility:hidden;opacity:0}.foogallery .fg-loading .fg-loader{visibility:visible;opacity:1}.fg-loading-default .fg-loader{border-radius:50%;text-indent:-9999em;-webkit-animation:loading-default 1.1s infinite ease;animation:loading-default 1.1s infinite ease}@-webkit-keyframes loading-default{0%,100%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,1),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.5),-1.8em -1.8em 0 0 rgba(130,130,130,.7)}12.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.7),1.8em -1.8em 0 0 rgba(130,130,130,1),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.5)}25%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.5),1.8em -1.8em 0 0 rgba(130,130,130,.7),2.5em 0 0 0 rgba(130,130,130,1),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}37.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.5),2.5em 0 0 0 rgba(130,130,130,.7),1.75em 1.75em 0 0 rgba(130,130,130,1),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}50%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.5),1.75em 1.75em 0 0 rgba(130,130,130,.7),0 2.5em 0 0 rgba(130,130,130,1),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}62.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.5),0 2.5em 0 0 rgba(130,130,130,.7),-1.8em 1.8em 0 0 rgba(130,130,130,1),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}75%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.5),-1.8em 1.8em 0 0 rgba(130,130,130,.7),-2.6em 0 0 0 rgba(130,130,130,1),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}87.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.5),-2.6em 0 0 0 rgba(130,130,130,.7),-1.8em -1.8em 0 0 rgba(130,130,130,1)}}@keyframes loading-default{0%,100%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,1),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.5),-1.8em -1.8em 0 0 rgba(130,130,130,.7)}12.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.7),1.8em -1.8em 0 0 rgba(130,130,130,1),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.5)}25%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.5),1.8em -1.8em 0 0 rgba(130,130,130,.7),2.5em 0 0 0 rgba(130,130,130,1),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}37.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.5),2.5em 0 0 0 rgba(130,130,130,.7),1.75em 1.75em 0 0 rgba(130,130,130,1),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}50%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.5),1.75em 1.75em 0 0 rgba(130,130,130,.7),0 2.5em 0 0 rgba(130,130,130,1),-1.8em 1.8em 0 0 rgba(130,130,130,.2),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}62.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.5),0 2.5em 0 0 rgba(130,130,130,.7),-1.8em 1.8em 0 0 rgba(130,130,130,1),-2.6em 0 0 0 rgba(130,130,130,.2),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}75%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.5),-1.8em 1.8em 0 0 rgba(130,130,130,.7),-2.6em 0 0 0 rgba(130,130,130,1),-1.8em -1.8em 0 0 rgba(130,130,130,.2)}87.5%{box-shadow:0 -2.6em 0 0 rgba(130,130,130,.2),1.8em -1.8em 0 0 rgba(130,130,130,.2),2.5em 0 0 0 rgba(130,130,130,.2),1.75em 1.75em 0 0 rgba(130,130,130,.2),0 2.5em 0 0 rgba(130,130,130,.2),-1.8em 1.8em 0 0 rgba(130,130,130,.5),-2.6em 0 0 0 rgba(130,130,130,.7),-1.8em -1.8em 0 0 rgba(130,130,130,1)}}.fg-loading-bars .fg-loader,.fg-loading-bars .fg-loader:after,.fg-loading-bars .fg-loader:before{background:rgba(130,130,130,1);-webkit-animation:loading-bars 1s infinite ease-in-out;animation:loading-bars 1s infinite ease-in-out;width:1em;height:4em}.fg-loading-bars .fg-loader{color:rgba(130,130,130,1);text-indent:-9999em;font-size:4px;-webkit-animation-delay:-.16s;animation-delay:-.16s}.fg-loading-bars .fg-loader:after,.fg-loading-bars .fg-loader:before{position:absolute;top:0;content:''}.fg-loading-bars .fg-loader:before{left:-1.5em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.fg-loading-bars .fg-loader:after{left:1.5em}@-webkit-keyframes loading-bars{0%,100%,80%{box-shadow:0 0;height:4em}40%{box-shadow:0 -2em;height:5em}}@keyframes loading-bars{0%,100%,80%{box-shadow:0 0;height:4em}40%{box-shadow:0 -2em;height:5em}}.fg-loading-trail .fg-loader{color:#828282;font-size:20px;text-indent:-9999em;overflow:hidden;border-radius:50%;-webkit-animation:loading-trail-1 1.7s infinite ease,loading-trail-2 1.7s infinite ease;animation:loading-trail-1 1.7s infinite ease,loading-trail-2 1.7s infinite ease}@-webkit-keyframes loading-trail-1{0%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}5%,95%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}10%,59%{box-shadow:0 -.83em 0 -.4em,-.087em -.825em 0 -.42em,-.173em -.812em 0 -.44em,-.256em -.789em 0 -.46em,-.297em -.775em 0 -.477em}20%{box-shadow:0 -.83em 0 -.4em,-.338em -.758em 0 -.42em,-.555em -.617em 0 -.44em,-.671em -.488em 0 -.46em,-.749em -.34em 0 -.477em}38%{box-shadow:0 -.83em 0 -.4em,-.377em -.74em 0 -.42em,-.645em -.522em 0 -.44em,-.775em -.297em 0 -.46em,-.82em -.09em 0 -.477em}100%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}}@keyframes loading-trail-1{0%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}5%,95%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}10%,59%{box-shadow:0 -.83em 0 -.4em,-.087em -.825em 0 -.42em,-.173em -.812em 0 -.44em,-.256em -.789em 0 -.46em,-.297em -.775em 0 -.477em}20%{box-shadow:0 -.83em 0 -.4em,-.338em -.758em 0 -.42em,-.555em -.617em 0 -.44em,-.671em -.488em 0 -.46em,-.749em -.34em 0 -.477em}38%{box-shadow:0 -.83em 0 -.4em,-.377em -.74em 0 -.42em,-.645em -.522em 0 -.44em,-.775em -.297em 0 -.46em,-.82em -.09em 0 -.477em}100%{box-shadow:0 -.83em 0 -.4em,0 -.83em 0 -.42em,0 -.83em 0 -.44em,0 -.83em 0 -.46em,0 -.83em 0 -.477em}}@-webkit-keyframes loading-trail-2{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}@keyframes loading-trail-2{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}.fg-loading-pulse .fg-loader,.fg-loading-pulse .fg-loader:after,.fg-loading-pulse .fg-loader:before{border-radius:50%;width:2.5em;height:2.5em;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:loading-pulse 1.8s infinite ease-in-out;animation:loading-pulse 1.8s infinite ease-in-out}.fg-loading-pulse .fg-loader{color:#828282;font-size:4px;text-indent:-9999em;transform:translateX(-50%) translateY(-150%);-webkit-animation-delay:-.16s;animation-delay:-.16s}.fg-loading-pulse .fg-loader:after,.fg-loading-pulse .fg-loader:before{content:'';position:absolute;top:0}.fg-loading-pulse .fg-loader:before{left:-3.5em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.fg-loading-pulse .fg-loader:after{left:3.5em}@-webkit-keyframes loading-pulse{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes loading-pulse{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}.fg-loading-dots .fg-loader{color:#828282;font-size:5px;border-radius:50%;text-indent:-9999em;-webkit-animation:loading-dots 1.3s infinite linear;animation:loading-dots 1.3s infinite linear}@-webkit-keyframes loading-dots{0%,100%{box-shadow:0 -3em 0 .2em,2em -2em 0 0,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 0}12.5%{box-shadow:0 -3em 0 0,2em -2em 0 .2em,3em 0 0 0,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}25%{box-shadow:0 -3em 0 -.5em,2em -2em 0 0,3em 0 0 .2em,2em 2em 0 0,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}37.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 0,2em 2em 0 .2em,0 3em 0 0,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}50%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 0,0 3em 0 .2em,-2em 2em 0 0,-3em 0 0 -1em,-2em -2em 0 -1em}62.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 0,-2em 2em 0 .2em,-3em 0 0 0,-2em -2em 0 -1em}75%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 .2em,-2em -2em 0 0}87.5%{box-shadow:0 -3em 0 0,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 0,-2em -2em 0 .2em}}@keyframes loading-dots{0%,100%{box-shadow:0 -3em 0 .2em,2em -2em 0 0,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 0}12.5%{box-shadow:0 -3em 0 0,2em -2em 0 .2em,3em 0 0 0,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}25%{box-shadow:0 -3em 0 -.5em,2em -2em 0 0,3em 0 0 .2em,2em 2em 0 0,0 3em 0 -1em,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}37.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 0,2em 2em 0 .2em,0 3em 0 0,-2em 2em 0 -1em,-3em 0 0 -1em,-2em -2em 0 -1em}50%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 0,0 3em 0 .2em,-2em 2em 0 0,-3em 0 0 -1em,-2em -2em 0 -1em}62.5%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 0,-2em 2em 0 .2em,-3em 0 0 0,-2em -2em 0 -1em}75%{box-shadow:0 -3em 0 -1em,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 .2em,-2em -2em 0 0}87.5%{box-shadow:0 -3em 0 0,2em -2em 0 -1em,3em 0 0 -1em,2em 2em 0 -1em,0 3em 0 -1em,-2em 2em 0 0,-3em 0 0 0,-2em -2em 0 .2em}}.fg-loading-partial .fg-loader,.fg-loading-partial .fg-loader:after{border-radius:50%;width:10em;height:10em}.fg-loading-partial .fg-loader{font-size:4px;text-indent:-9999em;border-top:1.1em solid rgba(130,130,130,.2);border-right:1.1em solid rgba(130,130,130,.2);border-bottom:1.1em solid rgba(130,130,130,.2);border-left:1.1em solid #828282;-webkit-animation:loading-partial 1.1s infinite linear;animation:loading-partial 1.1s infinite linear}@-webkit-keyframes loading-partial{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}@keyframes loading-partial{0%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(0);transform:translateX(-50%) translateY(-50%) rotate(0)}100%{-webkit-transform:translateX(-50%) translateY(-50%) rotate(360deg);transform:translateX(-50%) translateY(-50%) rotate(360deg)}}.foogallery.fg-loaded-drop .fg-item,.foogallery.fg-loaded-fade-in .fg-item,.foogallery.fg-loaded-flip .fg-item,.foogallery.fg-loaded-fly .fg-item,.foogallery.fg-loaded-scale-up .fg-item,.foogallery.fg-loaded-slide-down .fg-item,.foogallery.fg-loaded-slide-left .fg-item,.foogallery.fg-loaded-slide-right .fg-item,.foogallery.fg-loaded-slide-up .fg-item,.foogallery.fg-loaded-swing-down .fg-item{transition-timing-function:ease;transition-duration:650ms;transition-property:background-color,transform}.foogallery.fg-loaded-drop .fg-item-inner,.foogallery.fg-loaded-fade-in .fg-item-inner,.foogallery.fg-loaded-flip .fg-item-inner,.foogallery.fg-loaded-fly .fg-item-inner,.foogallery.fg-loaded-scale-up .fg-item-inner,.foogallery.fg-loaded-slide-down .fg-item-inner,.foogallery.fg-loaded-slide-left .fg-item-inner,.foogallery.fg-loaded-slide-right .fg-item-inner,.foogallery.fg-loaded-slide-up .fg-item-inner,.foogallery.fg-loaded-swing-down .fg-item-inner{transition-timing-function:ease;transition-duration:650ms}.foogallery.fg-loaded-drop .fg-item.fg-loaded,.foogallery.fg-loaded-flip .fg-item.fg-loaded,.foogallery.fg-loaded-fly .fg-item.fg-loaded,.foogallery.fg-loaded-swing-down .fg-item.fg-loaded{perspective:1300px}.foogallery.fg-loaded-fade-in .fg-item-inner{transition-property:visibility,opacity}.foogallery .fg-caption{visibility:hidden;opacity:0;background-color:rgba(0,0,0,.6);color:#fff;position:absolute;z-index:8;width:100%;max-height:100%;overflow:hidden;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:13px;font-weight:400;line-height:1.3;border:none;text-align:center;cursor:pointer}.foogallery .fg-caption a{text-decoration:none;color:#fff;border-bottom:1px solid #fff}.foogallery .fg-caption a:hover{border-bottom:none}.foogallery .fg-caption-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px;font-weight:400;padding:5px}.foogallery .fg-caption-desc{padding:5px}.foogallery .fg-caption-title+.fg-caption-desc{padding-top:0}.foogallery.fg-caption-always .fg-caption .fg-caption-inner:before{display:none}.foogallery.fg-caption-always .fg-item.fg-loaded .fg-caption{left:0;bottom:0;transition-timing-function:ease;transition-duration:.3s;transition-property:visibility,opacity;visibility:visible;opacity:1;text-align:left}.foogallery.fg-caption-hover .fg-caption .fg-caption-inner{width:100%;max-height:100%;position:absolute;top:50%;left:0;transform:translateY(-50%)}.foogallery.fg-caption-hover .fg-item.fg-loaded .fg-thumb:before{display:none}.foogallery.fg-hover-circle-plus .fg-thumb:before,.foogallery.fg-hover-external .fg-thumb:before,.foogallery.fg-hover-eye .fg-thumb:before,.foogallery.fg-hover-plus .fg-thumb:before,.foogallery.fg-hover-tint .fg-thumb:before,.foogallery.fg-hover-zoom .fg-thumb:before,.foogallery.fg-hover-zoom2 .fg-thumb:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{content:"";display:block;position:absolute;visibility:hidden;opacity:0;top:0;bottom:0;left:0;right:0;z-index:8;background:rgba(0,0,0,.5) no-repeat center center;background-size:32px 32px}.foogallery.fg-hover-circle-plus .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-circle-plus .fg-thumb:focus:before,.foogallery.fg-hover-external .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-external .fg-thumb:focus:before,.foogallery.fg-hover-eye .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-eye .fg-thumb:focus:before,.foogallery.fg-hover-plus .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-plus .fg-thumb:focus:before,.foogallery.fg-hover-tint .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-tint .fg-thumb:focus:before,.foogallery.fg-hover-zoom .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-zoom .fg-thumb:focus:before,.foogallery.fg-hover-zoom2 .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-zoom2 .fg-thumb:focus:before,.foogallery.fg-hover-zoom3 .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-zoom3 .fg-thumb:focus:before{visibility:visible;opacity:1}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-tint .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-caption-inner:before{content:"";display:inline-block;position:relative;width:32px;height:32px;margin:10px 0 5px 0;background:transparent no-repeat center center;background-size:32px 32px;vertical-align:middle}.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-thumb:before{background-image:url(../img/zoom.png)}.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-thumb:before{background-image:url(../img/zoom2.png)}.foogallery.fg-hover-zoom3 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{background-image:url(../img/zoom3.png)}.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-thumb:before{background-image:url(../img/plus.png)}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-circle-plus .fg-thumb:before{background-image:url(../img/circle-plus.png)}.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-thumb:before{background-image:url(../img/eye.png)}.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-external .fg-thumb:before{background-image:url(../img/external.png)}@media only screen and (-o-min-device-pixel-ratio:5/4),only screen and (-webkit-min-device-pixel-ratio:1.25),only screen and (min-device-pixel-ratio:1.25),only screen and (min-resolution:1.25dppx){.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-thumb:before{background-image:url(../img/zoom@2x.png)}.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-thumb:before{background-image:url(../img/zoom2@2x.png)}.foogallery.fg-hover-zoom3 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{background-image:url(../img/zoom3@2x.png)}.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-thumb:before{background-image:url(../img/plus@2x.png)}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-circle-plus .fg-thumb:before{background-image:url(../img/circle-plus@2x.png)}.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-thumb:before{background-image:url(../img/eye@2x.png)}.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-external .fg-thumb:before{background-image:url(../img/external@2x.png)}}@media only screen and (-o-min-device-pixel-ratio:9/4),only screen and (-webkit-min-device-pixel-ratio:2.25),only screen and (min-device-pixel-ratio:2.25),only screen and (min-resolution:2.25dppx){.foogallery.fg-hover-zoom .fg-caption-inner:before,.foogallery.fg-hover-zoom .fg-thumb:before{background-image:url(../img/zoom@3x.png)}.foogallery.fg-hover-zoom2 .fg-caption-inner:before,.foogallery.fg-hover-zoom2 .fg-thumb:before{background-image:url(../img/zoom2@3x.png)}.foogallery.fg-hover-zoom3 .fg-caption-inner:before,.foogallery.fg-hover-zoom3 .fg-thumb:before{background-image:url(../img/zoom3@3x.png)}.foogallery.fg-hover-plus .fg-caption-inner:before,.foogallery.fg-hover-plus .fg-thumb:before{background-image:url(../img/plus@3x.png)}.foogallery.fg-hover-circle-plus .fg-caption-inner:before,.foogallery.fg-hover-circle-plus .fg-thumb:before{background-image:url(../img/circle-plus@3x.png)}.foogallery.fg-hover-eye .fg-caption-inner:before,.foogallery.fg-hover-eye .fg-thumb:before{background-image:url(../img/eye@3x.png)}.foogallery.fg-hover-external .fg-caption-inner:before,.foogallery.fg-hover-external .fg-thumb:before{background-image:url(../img/external@3x.png)}}.foogallery.fg-caption-hover.fg-hover-colorize .fg-caption,.foogallery.fg-caption-hover.fg-hover-fade .fg-caption,.foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption,.foogallery.fg-caption-hover.fg-hover-instant .fg-caption,.foogallery.fg-caption-hover.fg-hover-push .fg-caption,.foogallery.fg-caption-hover.fg-hover-scale .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-down .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-left .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-right .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-up .fg-caption,.foogallery.fg-hover-colorize .fg-image,.foogallery.fg-hover-colorize .fg-thumb:before,.foogallery.fg-hover-fade .fg-thumb:before,.foogallery.fg-hover-grayscale .fg-image,.foogallery.fg-hover-grayscale .fg-thumb:before,.foogallery.fg-hover-instant .fg-thumb:before,.foogallery.fg-hover-push .fg-thumb,.foogallery.fg-hover-scale .fg-item,.foogallery.fg-hover-scale .fg-thumb:before,.foogallery.fg-hover-slide-down .fg-thumb:before,.foogallery.fg-hover-slide-left .fg-thumb:before,.foogallery.fg-hover-slide-right .fg-thumb:before,.foogallery.fg-hover-slide-up .fg-thumb:before{transition-timing-function:ease;transition-duration:.3s}.foogallery.fg-hover-colorize .fg-image{filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'saturate\' values=\'0\'/></filter></svg>#grayscale");filter:gray;-webkit-filter:grayscale(100%);-webkit-transition-property:-webkit-filter;transition-property:filter}.foogallery.fg-hover-colorize .fg-item-inner:hover .fg-image{-webkit-filter:none;filter:none}.foogallery.fg-caption-hover.fg-hover-colorize .fg-caption,.foogallery.fg-hover-colorize .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-colorize .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-colorize .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-caption,.foogallery.fg-hover-fade .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-fade .fg-loaded .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-hover-grayscale .fg-image{-webkit-filter:none;filter:none;-webkit-transition-property:-webkit-filter;transition-property:filter}.foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-image{-webkit-filter:grayscale(1);-webkit-filter:grayscale(100%);filter:grayscale(100%);filter:gray;opacity:1}.foogallery.fg-caption-hover.fg-hover-grayscale .fg-caption,.foogallery.fg-hover-grayscale .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-grayscale .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-grayscale .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-caption,.foogallery.fg-hover-instant .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:none}.foogallery.fg-caption-hover.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-instant .fg-loaded .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption,.foogallery.fg-hover-push .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transform:translateX(100%);visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-caption,.foogallery.fg-hover-push .fg-loaded .fg-thumb{transition-property:transform}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-caption{transform:translateY(0)}.foogallery.fg-caption-hover.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb,.foogallery.fg-hover-push .fg-loaded .fg-item-inner:hover .fg-thumb{transform:translateX(-100%)}.foogallery.fg-hover-scale .fg-item{transition-property:transform;z-index:4}.foogallery.fg-hover-scale .fg-item:hover{transform:scale(1.048);z-index:10}.foogallery.fg-caption-hover.fg-hover-scale .fg-caption,.foogallery.fg-hover-scale .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:visibility,opacity}.foogallery.fg-caption-hover.fg-hover-scale .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-scale .fg-item-inner:hover .fg-thumb:before{visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,.foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before,.foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before,.foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before,.foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before{display:block;left:0;top:0;bottom:0;transition-property:transform;visibility:visible;opacity:1}.foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-caption,.foogallery.fg-hover-slide-down .fg-loaded .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-slide-left .fg-loaded .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-slide-right .fg-loaded .fg-item-inner:hover .fg-thumb:before,.foogallery.fg-hover-slide-up .fg-loaded .fg-item-inner:hover .fg-thumb:before{transform:translateY(0) translateX(0)}.foogallery.fg-caption-hover.fg-hover-slide-up .fg-loaded .fg-caption,.foogallery.fg-hover-slide-up .fg-loaded .fg-thumb:before{transform:translateY(100%)}.foogallery.fg-caption-hover.fg-hover-slide-down .fg-loaded .fg-caption,.foogallery.fg-hover-slide-down .fg-loaded .fg-thumb:before{transform:translateY(-100%)}.foogallery.fg-caption-hover.fg-hover-slide-left .fg-loaded .fg-caption,.foogallery.fg-hover-slide-left .fg-loaded .fg-thumb:before{transform:translateX(100%)}.foogallery.fg-caption-hover.fg-hover-slide-right .fg-loaded .fg-caption,.foogallery.fg-hover-slide-right .fg-loaded .fg-thumb:before{transform:translateX(-100%)}.fg-paging-container,.fg-paging-container *,.fg-paging-container :after,.fg-paging-container :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fg-paging-container{display:block;padding:15px;text-align:center;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fg-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.fg-paging-container .fg-dot-item,.fg-paging-container .fg-dots{display:inline-block;margin:0;padding:0;outline:0;list-style:none}.fg-paging-container .fg-dot-item .fg-dot-link{display:inline-block;margin:3px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;background-image:none;text-decoration:none;border:1px solid transparent;position:relative;border-radius:50%;padding:0;font-size:0;outline:0;color:transparent;box-shadow:none}.fg-paging-container .fg-dot-item .fg-dot-link:before{content:"";background-color:transparent;border:1px solid transparent;display:block;border-radius:50%;width:9px;height:9px;padding:0;margin:2px}.fg-paging-container .fg-dot-item .fg-dot-link:active,.fg-paging-container .fg-dot-item .fg-dot-link:focus,.fg-paging-container .fg-dot-item .fg-dot-link:hover{text-decoration:none;box-shadow:none;outline:0}.fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link,.fg-paging-container .fg-dot-item.fg-selected .fg-dot-link{cursor:not-allowed;pointer-events:none}.fg-paging-container .fg-dot-item.fg-disabled .fg-dot-link{cursor:not-allowed;pointer-events:none;outline:0}.fg-paging-container.fg-light .fg-dot-item .fg-dot-link,.fg-paging-container.fg-light .fg-dot-item .fg-dot-link:before{transition-timing-function:ease-out;transition-duration:.3s;transition-property:color,border-color,background-color}.fg-paging-container.fg-light .fg-dot-item .fg-dot-link{background-color:#eee;border-color:#9e9e9e}.fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link{border-color:#8a8a8a}.fg-paging-container.fg-light .fg-dot-item .fg-dot-link:focus:before,.fg-paging-container.fg-light .fg-dot-item .fg-dot-link:hover:before,.fg-paging-container.fg-light .fg-dot-item.fg-selected .fg-dot-link:before{background-color:#666;border-color:#8a8a8a}.fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link,.fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:focus,.fg-paging-container.fg-light .fg-dot-item.fg-disabled .fg-dot-link:hover{background-color:#eee;border-color:#9e9e9e;opacity:.5}.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link,.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:before{transition-timing-function:ease-out;transition-duration:.3s;transition-property:color,border-color,background-color}.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link{background-color:#666;border-color:#333}.fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link{border-color:#444}.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:focus:before,.fg-paging-container.fg-dark .fg-dot-item .fg-dot-link:hover:before,.fg-paging-container.fg-dark .fg-dot-item.fg-selected .fg-dot-link:before{background-color:#333;border-color:#444}.fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link,.fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:focus,.fg-paging-container.fg-dark .fg-dot-item.fg-disabled .fg-dot-link:hover{background-color:#666;border-color:#333;opacity:.5}.fg-default:after{content:'';display:block;clear:both}.fg-default .fg-item,.fg-default .fg-item-inner,.fg-default .fg-thumb{display:inline-block;vertical-align:top;max-width:100%}.fg-default .fg-image{border-radius:0;display:block;max-width:100%;height:auto;margin:0;padding:0}.fg-default .fg-image{vertical-align:top}.fg-default.fg-left{text-align:left}.fg-default.fg-center{text-align:center}.fg-default.fg-right{text-align:right}.fg-default.fg-gutter-5{padding-left:5px;margin-bottom:-5px}.fg-default.fg-gutter-5 .fg-item{margin-right:5px;margin-bottom:5px}.fg-default.fg-gutter-10{padding-left:10px;margin-bottom:-10px}.fg-default.fg-gutter-10 .fg-item{margin-right:10px;margin-bottom:10px}.fg-default.fg-gutter-15{padding-left:15px;margin-bottom:-15px}.fg-default.fg-gutter-15 .fg-item{margin-right:15px;margin-bottom:15px}.fg-default.fg-gutter-20{padding-left:20px;margin-bottom:-20px}.fg-default.fg-gutter-20 .fg-item{margin-right:20px;margin-bottom:20px}.fg-default.fg-gutter-25{padding-left:25px;margin-bottom:-25px}.fg-default.fg-gutter-25 .fg-item{margin-right:25px;margin-bottom:25px}.fg-masonry *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.foogallery.fg-masonry.fg-center{margin:0 auto}.fg-masonry .fg-thumb{display:block}.fg-masonry.fg-masonry-fixed .fg-thumb{display:inline-block}.fg-masonry.fg-masonry-fixed .fg-image{max-width:100%}.fg-masonry .fg-column-width{display:inline-block;visibility:hidden;height:0;border:solid 0 transparent}.fg-masonry.fg-masonry-2col .fg-image,.fg-masonry.fg-masonry-3col .fg-image,.fg-masonry.fg-masonry-4col .fg-image,.fg-masonry.fg-masonry-5col .fg-image{width:100%;height:auto;max-width:100%}.fg-masonry .fg-item{line-height:0;font-size:0}.fg-masonry.fg-masonry-2col .fg-item{margin-bottom:1%;width:49%}.fg-masonry.fg-masonry-2col .fg-column-width{width:49%}.fg-masonry.fg-masonry-2col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item{margin-bottom:0;width:50%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width{width:50%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item{margin-bottom:3%;width:47%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width{width:47%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width{width:3%}.fg-masonry.fg-masonry-3col .fg-item{margin-bottom:1%;width:32%}.fg-masonry.fg-masonry-3col .fg-column-width{width:32%}.fg-masonry.fg-masonry-3col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item{margin-bottom:0;width:33%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width{width:33%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item{margin-bottom:3%;width:30%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width{width:30%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width{width:3%}.fg-masonry.fg-masonry-4col .fg-item{margin-bottom:1%;width:24%}.fg-masonry.fg-masonry-4col .fg-column-width{width:24%}.fg-masonry.fg-masonry-4col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item{margin-bottom:0;width:25%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width{width:25%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item{margin-bottom:3%;width:22%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width{width:22%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width{width:3%}.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:19%}.fg-masonry.fg-masonry-5col .fg-column-width{width:19%}.fg-masonry.fg-masonry-5col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:20%}.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:20%}.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:17%}.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:17%}.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:3%}@media screen and (max-width:720px){.fg-masonry.fg-masonry-4col .fg-item,.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:32%}.fg-masonry.fg-masonry-4col .fg-column-width,.fg-masonry.fg-masonry-5col .fg-column-width{width:32%}.fg-masonry.fg-masonry-4col .fg-gutter-width,.fg-masonry.fg-masonry-5col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:33%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:33%}.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:30%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:30%}.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:3%}}@media screen and (max-width:480px){.fg-masonry.fg-masonry-3col .fg-item,.fg-masonry.fg-masonry-4col .fg-item,.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:49%}.fg-masonry.fg-masonry-3col .fg-column-width,.fg-masonry.fg-masonry-4col .fg-column-width,.fg-masonry.fg-masonry-5col .fg-column-width{width:49%}.fg-masonry.fg-masonry-3col .fg-gutter-width,.fg-masonry.fg-masonry-4col .fg-gutter-width,.fg-masonry.fg-masonry-5col .fg-gutter-width{width:1%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:50%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:50%}.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:47%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:47%}.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:3%}}@media screen and (max-width:320px){.fg-masonry.fg-masonry-2col .fg-item,.fg-masonry.fg-masonry-3col .fg-item,.fg-masonry.fg-masonry-4col .fg-item,.fg-masonry.fg-masonry-5col .fg-item{margin-bottom:1%;width:100%}.fg-masonry.fg-masonry-2col .fg-column-width,.fg-masonry.fg-masonry-3col .fg-column-width,.fg-masonry.fg-masonry-4col .fg-column-width,.fg-masonry.fg-masonry-5col .fg-column-width{width:100%}.fg-masonry.fg-masonry-2col .fg-gutter-width,.fg-masonry.fg-masonry-3col .fg-gutter-width,.fg-masonry.fg-masonry-4col .fg-gutter-width,.fg-masonry.fg-masonry-5col .fg-gutter-width{width:0}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-item{margin-bottom:0;width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-column-width{width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-3col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-none .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-none .fg-gutter-width{width:0}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-item,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-item{margin-bottom:3%;width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-column-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-column-width{width:100%}.fg-masonry.fg-masonry-2col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-3col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-4col.fg-gutter-large .fg-gutter-width,.fg-masonry.fg-masonry-5col.fg-gutter-large .fg-gutter-width{width:0}}.foogallery.fg-border-thin .fg-column-width{border-width:5px}.foogallery.fg-border-medium .fg-column-width{border-width:10px}.foogallery.fg-border-thick .fg-column-width{border-width:15px}.foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption{visibility:visible;opacity:1;font-size:13px;position:relative;display:block;top:auto;bottom:auto;left:auto;right:auto;width:auto;height:auto;text-transform:none;transform:none;transition:none;background-color:transparent;border-style:solid;border-color:transparent}.foogallery.fg-masonry.fg-captions-bottom .fg-item-inner:hover .fg-caption{transform:none;transition:none}.foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner{display:block;position:relative;max-height:none;top:auto;bottom:auto;left:auto;right:auto;width:auto;height:auto;border:none;transform:none;transition:none}.foogallery.fg-masonry.fg-captions-bottom .fg-item-inner .fg-caption-inner:before{display:none}.foogallery.fg-masonry.fg-captions-bottom.fg-caption-hover .fg-item-inner .fg-thumb:before{display:block}.foogallery.fg-masonry.fg-captions-bottom.fg-caption-always .fg-item-inner:hover .fg-caption{visibility:visible;opacity:1}.fg-masonry.fg-captions-bottom .fg-caption-desc,.fg-masonry.fg-captions-bottom .fg-caption-title{text-align:left}.fg-masonry.fg-captions-bottom.fg-dark .fg-caption,.fg-masonry.fg-captions-bottom.fg-light .fg-caption{color:#828282}.fg-masonry.fg-captions-bottom.fg-dark .fg-caption a,.fg-masonry.fg-captions-bottom.fg-light .fg-caption a{color:#828282;border-bottom:1px solid #828282}.fg-masonry.fg-captions-bottom.fg-dark .fg-caption a:hover,.fg-masonry.fg-captions-bottom.fg-light .fg-caption a:hover{border-bottom:none}.fg-masonry.fg-captions-bottom.fg-light .fg-caption-title,.fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a{color:#222}.fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title,.fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a{color:#fff}.fg-masonry.fg-captions-bottom.fg-light .fg-caption-title a{border-bottom:1px solid #222}.fg-masonry.fg-captions-bottom.fg-dark .fg-caption-title a{border-bottom:1px solid #fff}.fg-masonry.fg-captions-bottom .fg-caption{border-width:10px}.fg-masonry.fg-captions-bottom .fg-caption-title+.fg-caption-desc{margin-top:5px}.fg-masonry.fg-captions-bottom.fg-border-thin .fg-caption{border-width:10px 5px 5px 5px}.fg-masonry.fg-captions-bottom.fg-border-medium .fg-caption{border-width:10px 0 0 0}.fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption{border-width:15px 0 0 0}.fg-masonry.fg-captions-bottom.fg-border-thick .fg-caption-title+.fg-caption-desc{margin-top:10px}.fg-justified{box-sizing:border-box;position:relative}.foogallery.fg-justified .fg-image,.foogallery.fg-justified .fg-item,.foogallery.fg-justified .fg-item-inner,.foogallery.fg-justified .fg-thumb{box-sizing:border-box;display:block;margin:0;padding:0}.fg-justified .fg-item{visibility:visible;position:absolute}.fg-justified .fg-item-inner{position:relative;width:100%;height:100%}.fg-justified .fg-thumb{position:relative;overflow:hidden}.fg-justified .fg-image{z-index:1}.fg-justified .fg-item.fg-positioned .fg-thumb{width:100%;height:100%}.fg-justified .fg-item.fg-positioned .fg-image{width:100%;height:auto;min-height:100%}.fg-simple_portfolio{box-sizing:border-box;position:relative;font-size:16px;margin:0 auto;padding:0;width:100%}.fg-simple_portfolio .fg-item{position:absolute;display:inline-block;margin:0;padding:0;outline:0}.fg-simple_portfolio .fg-image,.fg-simple_portfolio .fg-item-inner,.fg-simple_portfolio .fg-thumb{display:block;margin:0;padding:0;outline:0}.fg-simple_portfolio .fg-item-inner{position:relative;width:100%;height:100%}.fg-simple_portfolio .fg-thumb{box-sizing:border-box;display:block;margin:0;padding:0;border:none;outline:0;position:relative;overflow:hidden}.fg-simple_portfolio .fg-item.fg-positioned .fg-image{width:100%;height:auto}.fg-simple_portfolio .fg-image{z-index:1}.foogallery.fg-simple_portfolio .fg-item-inner .fg-caption{visibility:visible;opacity:1;font-size:13px;position:relative;display:block;top:auto;bottom:auto;left:auto;right:auto;width:auto;height:auto;text-transform:none;transform:none;transition:none;background-color:transparent;border-style:solid;border-color:transparent}.foogallery.fg-simple_portfolio .fg-item-inner:hover .fg-caption{transform:none;transition:none}.foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner{display:block;top:auto;bottom:auto;left:auto;right:auto;width:auto;height:auto;border:none;transform:none;transition:none}.foogallery.fg-simple_portfolio .fg-item-inner .fg-caption-inner:before{display:none}.foogallery.fg-simple_portfolio.fg-caption-hover .fg-item-inner .fg-thumb:before{display:block}.foogallery.fg-simple_portfolio.fg-caption-always .fg-item-inner:hover .fg-caption{visibility:visible;opacity:1}.fg-simple_portfolio .fg-caption-title{text-align:left}.fg-simple_portfolio .fg-caption-desc{text-align:justify}.fg-simple_portfolio.fg-dark .fg-caption,.fg-simple_portfolio.fg-light .fg-caption{color:#828282}.fg-simple_portfolio.fg-dark .fg-caption a,.fg-simple_portfolio.fg-light .fg-caption a{color:#828282;border-bottom:1px solid #828282}.fg-simple_portfolio.fg-dark .fg-caption a:hover,.fg-simple_portfolio.fg-light .fg-caption a:hover{border-bottom:none}.fg-simple_portfolio.fg-light .fg-caption-title,.fg-simple_portfolio.fg-light .fg-caption-title a{color:#222}.fg-simple_portfolio.fg-dark .fg-caption-title,.fg-simple_portfolio.fg-dark .fg-caption-title a{color:#fff}.fg-simple_portfolio.fg-light .fg-caption-title a{border-bottom:1px solid #222}.fg-simple_portfolio.fg-dark .fg-caption-title a{border-bottom:1px solid #fff}.fg-simple_portfolio.fg-captions-top .fg-item.fg-positioned .fg-thumb{position:absolute;bottom:0;left:0}.fg-simple_portfolio .fg-caption{border-width:10px}.fg-simple_portfolio .fg-caption-title+.fg-caption-desc{margin-top:5px}.fg-simple_portfolio.fg-border-thin .fg-caption{border-width:10px 5px 5px 5px}.fg-simple_portfolio.fg-captions-top.fg-border-thin .fg-caption{border-width:5px 5px 10px 5px}.fg-simple_portfolio.fg-border-medium .fg-caption{border-width:10px 0 0 0}.fg-simple_portfolio.fg-captions-top.fg-border-medium .fg-caption{border-width:0 0 10px 0}.fg-simple_portfolio.fg-border-thick .fg-caption{border-width:15px 0 0 0}.fg-simple_portfolio.fg-captions-top.fg-border-thick .fg-caption{border-width:0 0 15px 0}.fg-simple_portfolio.fg-border-thick .fg-caption-title+.fg-caption-desc{margin-top:10px}.foogallery.fg-preset.fg-polaroid .fg-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .35s,background-color .65s;transition:transform .35s,background-color .65s}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n+1){-webkit-transform:rotate(3deg);transform:rotate(3deg)}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(2n){-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(3n){-webkit-transform:rotate(1deg);transform:rotate(1deg)}.foogallery.fg-preset.fg-polaroid .fg-item:nth-child(5n){-webkit-transform:rotate(-2deg);transform:rotate(-2deg)}.foogallery.fg-preset.fg-polaroid .fg-item:hover{-webkit-transform:rotate(0);transform:rotate(0)}.foogallery.fg-preset.fg-polaroid .fg-caption{position:relative;width:auto;font-family:"Segoe Print Regular",-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}.foogallery.fg-preset.fg-polaroid .fg-caption-inner,.foogallery.fg-preset.fg-polaroid .fg-caption-title{position:relative;width:auto}.foogallery.fg-preset.fg-polaroid .fg-caption-title{text-align:center}.foogallery.fg-preset.fg-polaroid .fg-caption-desc{display:none}.foogallery.fg-light.fg-preset.fg-polaroid .fg-caption-title,.foogallery.fg-preset.fg-polaroid .fg-caption-title{color:#333}.foogallery.fg-dark.fg-preset.fg-polaroid .fg-caption-title{color:#fff}.foogallery.fg-preset.fg-polaroid .fg-caption{border-style:solid;border-color:transparent;border-width:10px}.foogallery.fg-preset.fg-polaroid .fg-caption-title+.fg-caption-desc{margin-top:5px}.foogallery.fg-preset.fg-polaroid.fg-border-thin .fg-caption{border-width:10px 5px 5px 5px}.foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thin .fg-caption{border-width:5px 5px 10px 5px}.foogallery.fg-preset.fg-polaroid.fg-border-medium .fg-caption{border-width:10px 0 0 0}.foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-medium .fg-caption{border-width:0 0 10px 0}.foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption{border-width:15px 0 0 0}.foogallery.fg-preset.fg-polaroid.fg-captions-top.fg-border-thick .fg-caption{border-width:0 0 15px 0}.foogallery.fg-preset.fg-polaroid.fg-border-thick .fg-caption-title+.fg-caption-desc{margin-top:10px}.fg-image-viewer{display:block;font-family:'Open Sans','Helvetica Neue',Arial,sans-serif}.fg-image-viewer.fg-left{text-align:left}.fg-image-viewer.fg-center{text-align:center}.fg-image-viewer.fg-right{text-align:right}.fiv-inner{position:relative;display:inline-block;max-width:100%;overflow:hidden;z-index:6}.fiv-inner .fiv-inner-container{position:relative;overflow:hidden;max-width:100%;border-style:solid;border-width:0;border-bottom-width:4px;z-index:5}.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb,.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:active,.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:hover,.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb:visited{position:relative;display:block;border:none;outline:0;text-decoration:none;box-shadow:none;max-width:100%}.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item{position:relative;visibility:visible;opacity:1;border:none;outline:0;text-decoration:none;box-shadow:none;max-width:100%}.fg-image-viewer .fiv-inner .fiv-inner-container .fg-item .fg-thumb img{display:block;max-width:100%;height:auto;border:none;outline:0;text-decoration:none}.fg-image-viewer .fiv-inner .fiv-ctrls{display:block;text-align:center;font-size:14px;border-style:solid;line-height:34px}.fg-image-viewer .fiv-inner .fiv-ctrls:after{content:'';display:block;clear:both}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count{display:inline-block;font-weight:400;margin:0}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:none;min-width:80px;position:relative;overflow:hidden;transition:background-color .3s}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before{display:block;position:absolute;font-size:24px;line-height:30px;top:0;left:0;width:100%;transform:translateY(0);transition:transform .3s}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover:before,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover:before{transform:translateY(-100%)}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next span,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev span{display:block;width:100%;transform:translateY(100%);transition:transform .3s}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:hover span,.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:hover span{transform:translateY(0)}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev{float:left}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-prev:before{content:'\2190'}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next{float:right}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-next:before{content:'\2192'}.fg-image-viewer .fiv-inner .fiv-ctrls .fiv-count span{margin:0 4px}/*!* Theme - Default (Light) *!*//*!* Theme - Dark *!*/.foogallery.fg-image-viewer.fg-caption-always .fg-item-inner .fg-caption{padding:0;border:none;background:#000;background:-moz-linear-gradient(left,rgba(0,0,0,.8) 0,rgba(0,0,0,.8) 60%,rgba(0,0,0,0) 100%);background:-webkit-linear-gradient(left,rgba(0,0,0,.8) 0,rgba(0,0,0,.8) 60%,rgba(0,0,0,0) 100%);background:linear-gradient(to right,rgba(0,0,0,.8) 0,rgba(0,0,0,.8) 60%,rgba(0,0,0,0) 100%)}.foogallery.fg-image-viewer.fg-caption-always .fg-caption-title{padding:10px 10px 10px 10px}.foogallery.fg-image-viewer.fg-caption-always .fg-caption-desc{padding:10px 10px 10px 10px}.foogallery.fg-image-viewer.fg-caption-always .fg-caption-title+.fg-caption-desc{padding:0 10px 10px 10px}.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-count,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev,.fg-image-viewer.fg-light .fiv-inner .fiv-inner-container{background-color:#fff;color:#333;border-color:#fff}.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-next:hover,.fg-image-viewer.fg-light .fiv-inner .fiv-ctrls .fiv-prev:hover{background-color:#f2f2f2}.fg-image-viewer.fg-light .fiv-next,.fg-image-viewer.fg-light .fiv-prev{box-shadow:inset 0 0 0 1px #ddd}.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-count,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev,.fg-image-viewer.fg-dark .fiv-inner .fiv-inner-container{background-color:#333;color:#fff;border-color:#333}.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-next:hover,.fg-image-viewer.fg-dark .fiv-inner .fiv-ctrls .fiv-prev:hover{background-color:#444}.fg-image-viewer.fg-dark .fiv-next,.fg-image-viewer.fg-dark .fiv-prev{box-shadow:inset 0 0 0 1px #222}.foogallery.fg-image-viewer.fg-border-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin .fg-item-inner{border-width:0}.foogallery.fg-image-viewer .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thin .fiv-inner-container{border-width:4px}.foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-medium .fiv-inner-container{border-width:10px}.foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thick .fiv-inner-container{border-width:16px}.foogallery.fg-image-viewer .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-medium .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thick .fiv-ctrls,.foogallery.fg-image-viewer.fg-border-thin .fiv-ctrls{border-top-width:1px}.foogallery.fg-image-viewer.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-round-small .fiv-inner{border-radius:5px}.foogallery.fg-image-viewer.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-round-small .fg-item-inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.foogallery.fg-image-viewer.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-round-small .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-border-medium.fg-round-small .fiv-prev,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-border-thick.fg-round-small .fiv-prev,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-next,.foogallery.fg-image-viewer.fg-border-thin.fg-round-small .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-round-medium .fiv-inner{border-radius:10px}.foogallery.fg-image-viewer.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-round-medium .fg-item-inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.foogallery.fg-image-viewer.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-round-medium .fiv-prev{border-radius:5px}.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-border-thin.fg-round-medium .fiv-prev{border-radius:5px}.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-border-medium.fg-round-medium .fiv-prev,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-next,.foogallery.fg-image-viewer.fg-border-thick.fg-round-medium .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-round-large .fiv-inner{border-radius:15px}.foogallery.fg-image-viewer.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-round-large .fg-item-inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.foogallery.fg-image-viewer.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-round-large .fiv-prev{border-radius:11px}.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-border-thin.fg-round-large .fiv-prev{border-radius:11px}.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-border-medium.fg-round-large .fiv-prev{border-radius:5px}.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item,.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fg-item-inner,.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-next,.foogallery.fg-image-viewer.fg-border-thick.fg-round-large .fiv-prev{border-radius:3px}.foogallery.fg-image-viewer.fg-round-full .fiv-inner,.foogallery.fg-image-viewer.fg-round-full .fiv-next,.foogallery.fg-image-viewer.fg-round-full .fiv-prev{border-radius:50%}.foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fg-item-inner,.foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fg-item-inner,.foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-large .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fg-item-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-small .fg-item-inner{box-shadow:none}.foogallery.fg-image-viewer.fg-light.fg-shadow-outline .fiv-inner{box-shadow:0 0 0 1px #ddd}.foogallery.fg-image-viewer.fg-dark.fg-shadow-outline .fiv-inner{box-shadow:0 0 0 1px #222}.foogallery.fg-image-viewer.fg-dark.fg-shadow-small .fiv-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-small .fiv-inner{box-shadow:0 1px 4px 0 rgba(0,0,0,.5)}.foogallery.fg-image-viewer.fg-dark.fg-shadow-medium .fiv-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-medium .fiv-inner{box-shadow:0 1px 10px 0 rgba(0,0,0,.5)}.foogallery.fg-image-viewer.fg-dark.fg-shadow-large .fiv-inner,.foogallery.fg-image-viewer.fg-light.fg-shadow-large .fiv-inner{box-shadow:0 1px 16px 0 rgba(0,0,0,.5)}.foogallery.fg-thumbnail,.foogallery.fg-thumbnail.fg-center{text-align:center}.foogallery.fg-thumbnail.fg-left{float:left}.foogallery.fg-thumbnail.fg-right{float:right}.foogallery.fg-thumbnail .fg-item{display:inline-block;vertical-align:top;max-width:100%}.foogallery.fg-thumbnail .fg-image{max-width:100%}.foogallery.fg-thumbnail .fg-st-hidden{display:none}
extensions/default-templates/shared/js/foogallery.js CHANGED
@@ -1,7613 +1,7647 @@
1
- (function($, _){
2
-
3
- /**
4
- * @summary A reference to the jQuery object the plugin is registered with.
5
- * @memberof FooGallery
6
- * @name $
7
- * @type {jQuery}
8
- * @description This is used internally for all jQuery operations to help work around issues where multiple jQuery libraries have been included in a single page.
9
- * @example {@caption The following shows the issue when multiple jQuery's are included in a single page.}{@lang xml}
10
- * <script src="jquery-1.12.4.js"></script>
11
- * <script src="foogallery.js"></script>
12
- * <script src="jquery-2.2.4.js"></script>
13
- * <script>
14
- * jQuery(function($){
15
- * $(".selector").foogallery(); // => This would throw a TypeError: $(...).foogallery is not a function
16
- * });
17
- * </script>
18
- * @example {@caption The reason the above throws an error is that the `$.fn.foogallery` function is registered to the first instance of jQuery in the page however the instance used to create the ready callback and actually try to execute `$(...).foogallery()` is the second. To resolve this issue ideally you would remove the second instance of jQuery however you can use the `FooGallery.$` member to ensure you are always working with the instance of jQuery the plugin was registered with.}{@lang xml}
19
- * <script src="jquery-1.12.4.js"></script>
20
- * <script src="foogallery.js"></script>
21
- * <script src="jquery-2.2.4.js"></script>
22
- * <script>
23
- * FooGallery.$(function($){
24
- * $(".selector").foogallery(); // => It works!
25
- * });
26
- * </script>
27
- */
28
- _.$ = $;
29
-
30
- /**
31
- * @summary The jQuery plugin namespace.
32
- * @external "jQuery.fn"
33
- * @see {@link http://learn.jquery.com/plugins/basic-plugin-creation/|How to Create a Basic Plugin | jQuery Learning Center}
34
- */
35
- })(
36
- // dependencies
37
- jQuery,
38
- /**
39
- * @summary The core namespace for the plugin containing all its code.
40
- * @namespace FooGallery
41
- * @description This plugin houses all it's code within a single `FooGallery` global variable to prevent polluting the global namespace and to make accessing its various members simpler.
42
- * @example {@caption As this namespace is registered as a global on the `window` object, it can be accessed using the `window.` prefix.}
43
- * var fg = window.FooGallery;
44
- * @example {@caption Or without it.}
45
- * var fg = FooGallery;
46
- * @example {@caption When using this namespace I would recommend aliasing it to a short variable name such as `fg` or as used internally `_`.}
47
- * // alias the FooGallery namespace
48
- * var _ = FooGallery;
49
- * @example {@caption This is not required but lets us write less code and allows the alias to be minified by compressors like UglifyJS. How you choose to alias the namespace is up to you. You can use the simple `var` method as seen above or supply the namespace as a parameter when creating a new scope as seen below.}
50
- * // create a new scope to work in passing the namespace as a parameter
51
- * (function(_){
52
- *
53
- * // use `_.` to access members and methods
54
- *
55
- * })(FooGallery);
56
- */
57
- window.FooGallery = window.FooGallery || {}
58
- );
59
- /*!
60
- * FooGallery.utils - Contains common utility methods and classes used in our plugins.
61
- * @version 0.0.5
62
- * @link https://github.com/steveush/foo-utils#readme
63
- * @copyright Steve Usher 2017
64
- * @license Released under the GPL-3.0 license.
65
- */
66
- /**
67
- * @file This creates the global FooGallery.utils namespace ensuring it only registers itself if the namespace doesn't already exist or if the current version is lower than this one.
68
- */
69
- (function ($) {
70
-
71
- if (!$){
72
- console.warn('jQuery must be included in the page prior to the FooGallery.utils library.');
73
- return;
74
- }
75
-
76
- /**
77
- * @summary This namespace contains common utility methods and code shared between our plugins.
78
- * @namespace FooGallery.utils
79
- * @description This namespace relies on jQuery being included in the page prior to it being loaded.
80
- */
81
- var utils = {
82
- /**
83
- * @summary A reference to the jQuery object the library is registered with.
84
- * @memberof FooGallery.utils
85
- * @name $
86
- * @type {jQuery}
87
- * @description This is used internally for all jQuery operations to help work around issues where multiple jQuery libraries have been included in a single page.
88
- * @example {@caption The following shows the issue when multiple jQuery's are included in a single page.}{@lang html}
89
- * <script src="jquery-1.12.4.js"></script>
90
- * <script src="my-plugin.js"></script>
91
- * <script src="jquery-2.2.4.js"></script>
92
- * <script>
93
- * jQuery(function($){
94
- * $(".selector").myPlugin(); // => This would throw a TypeError: $(...).myPlugin is not a function
95
- * });
96
- * </script>
97
- * @example {@caption The reason the above throws an error is that the `$.fn.myPlugin` function is registered to the first instance of jQuery in the page however the instance used to create the ready callback and actually try to execute `$(...).myPlugin()` is the second. To resolve this issue ideally you would remove the second instance of jQuery however you can use the `FooGallery.utils.$` member to ensure you are always working with the instance of jQuery the library was registered with.}{@lang html}
98
- * <script src="jquery-1.12.4.js"></script>
99
- * <script src="my-plugin.js"></script>
100
- * <script src="jquery-2.2.4.js"></script>
101
- * <script>
102
- * FooGallery.utils.$(function($){
103
- * $(".selector").myPlugin(); // => It works!
104
- * });
105
- * </script>
106
- */
107
- $: $,
108
- /**
109
- * @summary The version of this library.
110
- * @memberof FooGallery.utils
111
- * @name version
112
- * @type {string}
113
- */
114
- version: '0.0.5',
115
- };
116
-
117
- /**
118
- * @summary Compares two version numbers.
119
- * @memberof FooGallery.utils
120
- * @function versionCompare
121
- * @param {string} version1 - The first version to use in the comparison.
122
- * @param {string} version2 - The second version to compare to the first.
123
- * @returns {number} `0` if the version are equal.
124
- * `-1` if `version1` is less than `version2`.
125
- * `1` if `version1` is greater than `version2`.
126
- * `NaN` if either of the supplied versions do not conform to MAJOR.MINOR.PATCH format.
127
- * @description This method will compare two version numbers that conform to the basic MAJOR.MINOR.PATCH format returning the result as a simple number. This method will handle short version string comparisons e.g. `1.0` versus `1.0.1`.
128
- * @example {@caption The following shows the results of comparing various version strings.}
129
- * console.log( FooGallery.utils.versionCompare( "0", "0" ) ); // => 0
130
- * console.log( FooGallery.utils.versionCompare( "0.0", "0" ) ); // => 0
131
- * console.log( FooGallery.utils.versionCompare( "0.0", "0.0.0" ) ); // => 0
132
- * console.log( FooGallery.utils.versionCompare( "0.1", "0.0.0" ) ); // => 1
133
- * console.log( FooGallery.utils.versionCompare( "0.1", "0.0.1" ) ); // => 1
134
- * console.log( FooGallery.utils.versionCompare( "1", "0.1" ) ); // => 1
135
- * console.log( FooGallery.utils.versionCompare( "1.10", "1.9" ) ); // => 1
136
- * console.log( FooGallery.utils.versionCompare( "1.9", "1.10" ) ); // => -1
137
- * console.log( FooGallery.utils.versionCompare( "1", "1.1" ) ); // => -1
138
- * console.log( FooGallery.utils.versionCompare( "1.0.9", "1.1" ) ); // => -1
139
- * @example {@caption If either of the supplied version strings does not match the MAJOR.MINOR.PATCH format then `NaN` is returned.}
140
- * console.log( FooGallery.utils.versionCompare( "not-a-version", "1.1" ) ); // => NaN
141
- * console.log( FooGallery.utils.versionCompare( "1.1", "not-a-version" ) ); // => NaN
142
- * console.log( FooGallery.utils.versionCompare( "not-a-version", "not-a-version" ) ); // => NaN
143
- */
144
- utils.versionCompare = function(version1, version2){
145
- // if either of the versions do not match the expected format return NaN
146
- if (!(/[\d.]/.test(version1) && /[\d.]/.test(version2))) return NaN;
147
-
148
- /**
149
- * @summary Splits and parses the given version string into a numeric array.
150
- * @param {string} version - The version string to split and parse.
151
- * @returns {Array.<number>}
152
- * @ignore
153
- */
154
- function split(version){
155
- var res = version.split('.');
156
- for(var i = 0, len = res.length; i < len; i++){
157
- res[i] = parseInt(res[i]);
158
- if (isNaN(res[i])) res[i] = 0;
159
- }
160
- return res;
161
- }
162
-
163
- // get the base numeric arrays for each version
164
- var v1parts = split(version1),
165
- v2parts = split(version2);
166
-
167
- // ensure both arrays are the same length by padding the shorter with 0
168
- while (v1parts.length < v2parts.length) v1parts.push(0);
169
- while (v2parts.length < v1parts.length) v2parts.push(0);
170
-
171
- // perform the actual comparison
172
- for (var i = 0; i < v1parts.length; ++i) {
173
- if (v2parts.length == i) return 1;
174
- if (v1parts[i] == v2parts[i]) continue;
175
- if (v1parts[i] > v2parts[i]) return 1;
176
- else return -1;
177
- }
178
- if (v1parts.length != v2parts.length) return -1;
179
- return 0;
180
- };
181
-
182
- function __exists(){
183
- try {
184
- return !!window.FooGallery.utils; // does the namespace already exist?
185
- } catch(err) {
186
- return false;
187
- }
188
- }
189
-
190
- if (__exists()){
191
- // if it already exists always log a warning as there may be version conflicts as the following code always ensures the latest version is loaded
192
- if (utils.versionCompare(utils.version, window.FooGallery.utils.version) > 0){
193
- // if it exists but it's an old version replace it
194
- console.warn("An older version of FooGallery.utils (" + window.FooGallery.utils.version + ") already exists in the page, version " + utils.version + " will override it.");
195
- window.FooGallery.utils = utils;
196
- } else {
197
- // otherwise its a newer version so do nothing
198
- console.warn("A newer version of FooGallery.utils (" + window.FooGallery.utils.version + ") already exists in the page, version " + utils.version + " will not register itself.");
199
- }
200
- } else {
201
- // if it doesn't exist register it
202
- window.FooGallery.utils = utils;
203
- }
204
-
205
- // at this point there will always be a FooGallery.utils namespace registered to the global scope.
206
-
207
- })(jQuery);
208
- (function ($, _){
209
- // only register methods if this version is the current version
210
- if (_.version !== '0.0.5') return;
211
-
212
- /**
213
- * @summary Contains common type checking utility methods.
214
- * @memberof FooGallery.utils
215
- * @namespace is
216
- */
217
- _.is = {};
218
-
219
- /**
220
- * @summary Checks if the `value` is an array.
221
- * @memberof FooGallery.utils.is
222
- * @function array
223
- * @param {*} value - The value to check.
224
- * @returns {boolean} `true` if the supplied `value` is an array.
225
- * @example {@run true}
226
- * // alias the FooGallery.utils.is namespace
227
- * var _is = FooGallery.utils.is;
228
- *
229
- * console.log( _is.array( [] ) ); // => true
230
- * console.log( _is.array( null ) ); // => false
231
- * console.log( _is.array( 123 ) ); // => false
232
- * console.log( _is.array( "" ) ); // => false
233
- */
234
- _.is.array = function (value) {
235
- return '[object Array]' === Object.prototype.toString.call(value);
236
- };
237
-
238
- /**
239
- * @summary Checks if the `value` is a boolean.
240
- * @memberof FooGallery.utils.is
241
- * @function boolean
242
- * @param {*} value - The value to check.
243
- * @returns {boolean} `true` if the supplied `value` is a boolean.
244
- * @example {@run true}
245
- * // alias the FooGallery.utils.is namespace
246
- * var _is = FooGallery.utils.is;
247
- *
248
- * console.log( _is.boolean( true ) ); // => true
249
- * console.log( _is.boolean( false ) ); // => true
250
- * console.log( _is.boolean( "true" ) ); // => false
251
- * console.log( _is.boolean( "false" ) ); // => false
252
- * console.log( _is.boolean( 1 ) ); // => false
253
- * console.log( _is.boolean( 0 ) ); // => false
254
- */
255
- _.is.boolean = function (value) {
256
- return '[object Boolean]' === Object.prototype.toString.call(value);
257
- };
258
-
259
- /**
260
- * @summary Checks if the `value` is an element.
261
- * @memberof FooGallery.utils.is
262
- * @function element
263
- * @param {*} value - The value to check.
264
- * @returns {boolean} `true` if the supplied `value` is an element.
265
- * @example {@run true}
266
- * // alias the FooGallery.utils.is namespace
267
- * var _is = FooGallery.utils.is,
268
- * // create an element to test
269
- * el = document.createElement("span");
270
- *
271
- * console.log( _is.element( el ) ); // => true
272
- * console.log( _is.element( $(el) ) ); // => false
273
- * console.log( _is.element( null ) ); // => false
274
- * console.log( _is.element( {} ) ); // => false
275
- */
276
- _.is.element = function (value) {
277
- return typeof HTMLElement === 'object'
278
- ? value instanceof HTMLElement
279
- : !!value && typeof value === 'object' && value !== null && value.nodeType === 1 && typeof value.nodeName === 'string';
280
- };
281
-
282
- /**
283
- * @summary Checks if the `value` is empty.
284
- * @memberof FooGallery.utils.is
285
- * @function empty
286
- * @param {*} value - The value to check.
287
- * @returns {boolean} `true` if the supplied `value` is empty.
288
- * @description The following values are considered to be empty by this method:
289
- *
290
- * <ul><!--
291
- * --><li>`""` - An empty string</li><!--
292
- * --><li>`0` - 0 as an integer</li><!--
293
- * --><li>`0.0` - 0 as a float</li><!--
294
- * --><li>`[]` - An empty array</li><!--
295
- * --><li>`{}` - An empty object</li><!--
296
- * --><li>`$()` - An empty jQuery object</li><!--
297
- * --><li>`false`</li><!--
298
- * --><li>`null`</li><!--
299
- * --><li>`undefined`</li><!--
300
- * --></ul>
301
- * @example {@run true}
302
- * // alias the FooGallery.utils.is namespace
303
- * var _is = FooGallery.utils.is;
304
- *
305
- * console.log( _is.empty( undefined ) ); // => true
306
- * console.log( _is.empty( null ) ); // => true
307
- * console.log( _is.empty( 0 ) ); // => true
308
- * console.log( _is.empty( 0.0 ) ); // => true
309
- * console.log( _is.empty( "" ) ); // => true
310
- * console.log( _is.empty( [] ) ); // => true
311
- * console.log( _is.empty( {} ) ); // => true
312
- * console.log( _is.empty( 1 ) ); // => false
313
- * console.log( _is.empty( 0.1 ) ); // => false
314
- * console.log( _is.empty( "one" ) ); // => false
315
- * console.log( _is.empty( ["one"] ) ); // => false
316
- * console.log( _is.empty( { "name": "My Object" } ) ); // => false
317
- */
318
- _.is.empty = function(value){
319
- if (_.is.undef(value) || value === null) return true;
320
- if (_.is.number(value) && value == 0) return true;
321
- if (_.is.boolean(value) && value === false) return true;
322
- if (_.is.string(value) && value.length === 0) return true;
323
- if (_.is.array(value) && value.length === 0) return true;
324
- if (_.is.jq(value) && value.length === 0) return true;
325
- if (_.is.hash(value)){
326
- for(var prop in value) {
327
- if(value.hasOwnProperty(prop))
328
- return false;
329
- }
330
- return true;
331
- }
332
- return false;
333
- };
334
-
335
- /**
336
- * @summary Checks if the `value` is an error.
337
- * @memberof FooGallery.utils.is
338
- * @function error
339
- * @param {*} value - The value to check.
340
- * @returns {boolean} `true` if the supplied `value` is an error.
341
- * @example {@run true}
342
- * // alias the FooGallery.utils.is namespace
343
- * var _is = FooGallery.utils.is,
344
- * // create some errors to test
345
- * err1 = new Error("err1"),
346
- * err2 = new SyntaxError("err2");
347
- *
348
- * console.log( _is.error( err1 ) ); // => true
349
- * console.log( _is.error( err2 ) ); // => true
350
- * console.log( _is.error( null ) ); // => false
351
- * console.log( _is.error( 123 ) ); // => false
352
- * console.log( _is.error( "" ) ); // => false
353
- * console.log( _is.error( {} ) ); // => false
354
- * console.log( _is.error( [] ) ); // => false
355
- */
356
- _.is.error = function (value) {
357
- return '[object Error]' === Object.prototype.toString.call(value);
358
- };
359
-
360
- /**
361
- * @summary Checks if the `value` is a function.
362
- * @memberof FooGallery.utils.is
363
- * @function fn
364
- * @param {*} value - The value to check.
365
- * @returns {boolean} `true` if the supplied `value` is a function.
366
- * @example {@run true}
367
- * // alias the FooGallery.utils.is namespace
368
- * var _is = FooGallery.utils.is,
369
- * // create a function to test
370
- * func = function(){};
371
- *
372
- * console.log( _is.fn( func ) ); // => true
373
- * console.log( _is.fn( null ) ); // => false
374
- * console.log( _is.fn( 123 ) ); // => false
375
- * console.log( _is.fn( "" ) ); // => false
376
- */
377
- _.is.fn = function (value) {
378
- return value === window.alert || '[object Function]' === Object.prototype.toString.call(value);
379
- };
380
-
381
- /**
382
- * @summary Checks if the `value` is a hash.
383
- * @memberof FooGallery.utils.is
384
- * @function hash
385
- * @param {*} value - The value to check.
386
- * @returns {boolean} `true` if the supplied `value` is a hash.
387
- * @example {@run true}
388
- * // alias the FooGallery.utils.is namespace
389
- * var _is = FooGallery.utils.is;
390
- *
391
- * console.log( _is.hash( {"some": "prop"} ) ); // => true
392
- * console.log( _is.hash( {} ) ); // => true
393
- * console.log( _is.hash( window ) ); // => false
394
- * console.log( _is.hash( document ) ); // => false
395
- * console.log( _is.hash( "" ) ); // => false
396
- * console.log( _is.hash( 123 ) ); // => false
397
- */
398
- _.is.hash = function (value) {
399
- return _.is.object(value) && value.constructor === Object && !value.nodeType && !value.setInterval;
400
- };
401
-
402
- /**
403
- * @summary Checks if the `value` is a jQuery object.
404
- * @memberof FooGallery.utils.is
405
- * @function jq
406
- * @param {*} value - The value to check.
407
- * @returns {boolean} `true` if the supplied `value` is a jQuery object.
408
- * @example {@run true}
409
- * // alias the FooGallery.utils.is namespace
410
- * var _is = FooGallery.utils.is,
411
- * // create an element to test
412
- * el = document.createElement("span");
413
- *
414
- * console.log( _is.jq( $(el) ) ); // => true
415
- * console.log( _is.jq( $() ) ); // => true
416
- * console.log( _is.jq( el ) ); // => false
417
- * console.log( _is.jq( {} ) ); // => false
418
- * console.log( _is.jq( null ) ); // => false
419
- * console.log( _is.jq( 123 ) ); // => false
420
- * console.log( _is.jq( "" ) ); // => false
421
- */
422
- _.is.jq = function(value){
423
- return !_.is.undef($) && value instanceof $;
424
- };
425
-
426
- /**
427
- * @summary Checks if the `value` is a number.
428
- * @memberof FooGallery.utils.is
429
- * @function number
430
- * @param {*} value - The value to check.
431
- * @returns {boolean}
432
- * @example {@run true}
433
- * // alias the FooGallery.utils.is namespace
434
- * var _is = FooGallery.utils.is;
435
- *
436
- * console.log( _is.number( 123 ) ); // => true
437
- * console.log( _is.number( undefined ) ); // => false
438
- * console.log( _is.number( null ) ); // => false
439
- * console.log( _is.number( "" ) ); // => false
440
- */
441
- _.is.number = function (value) {
442
- return '[object Number]' === Object.prototype.toString.call(value) && !isNaN(value);
443
- };
444
-
445
- /**
446
- * @summary Checks if the `value` is an object.
447
- * @memberof FooGallery.utils.is
448
- * @function object
449
- * @param {*} value - The value to check.
450
- * @returns {boolean} `true` if the supplied `value` is an object.
451
- * @example {@run true}
452
- * // alias the FooGallery.utils.is namespace
453
- * var _is = FooGallery.utils.is;
454
- *
455
- * console.log( _is.object( {"some": "prop"} ) ); // => true
456
- * console.log( _is.object( {} ) ); // => true
457
- * console.log( _is.object( window ) ); // => true
458
- * console.log( _is.object( document ) ); // => true
459
- * console.log( _is.object( undefined ) ); // => false
460
- * console.log( _is.object( null ) ); // => false
461
- * console.log( _is.object( "" ) ); // => false
462
- * console.log( _is.object( 123 ) ); // => false
463
- */
464
- _.is.object = function (value) {
465
- return '[object Object]' === Object.prototype.toString.call(value) && !_.is.undef(value) && value !== null;
466
- };
467
-
468
- /**
469
- * @summary Checks if the `value` is a promise.
470
- * @memberof FooGallery.utils.is
471
- * @function promise
472
- * @param {*} value - The object to check.
473
- * @returns {boolean} `true` if the supplied `value` is an object.
474
- * @description This is a simple check to determine if an object is a jQuery promise object. It simply checks the object has a `then` and `promise` function defined.
475
- *
476
- * The promise object is created as an object literal inside of `jQuery.Deferred`, it has no prototype, nor any other truly unique properties that could be used to distinguish it.
477
- *
478
- * This method should be a little more accurate than the internal jQuery one that simply checks for a `promise` function.
479
- * @example {@run true}
480
- * // alias the FooGallery.utils.is namespace
481
- * var _is = FooGallery.utils.is;
482
- *
483
- * console.log( _is.promise( $.Deferred() ) ); // => true
484
- * console.log( _is.promise( {} ) ); // => false
485
- * console.log( _is.promise( undefined ) ); // => false
486
- * console.log( _is.promise( null ) ); // => false
487
- * console.log( _is.promise( "" ) ); // => false
488
- * console.log( _is.promise( 123 ) ); // => false
489
- */
490
- _.is.promise = function(value){
491
- return _.is.object(value) && _.is.fn(value.then) && _.is.fn(value.promise);
492
- };
493
-
494
- /**
495
- * @summary Checks if the `value` is a valid CSS length.
496
- * @memberof FooGallery.utils.is
497
- * @function size
498
- * @param {*} value - The value to check.
499
- * @returns {boolean} `true` if the `value` is a number or CSS length.
500
- * @example {@run true}
501
- * // alias the FooGallery.utils.is namespace
502
- * var _is = FooGallery.utils.is;
503
- *
504
- * console.log( _is.size( 80 ) ); // => true
505
- * console.log( _is.size( "80px" ) ); // => true
506
- * console.log( _is.size( "80em" ) ); // => true
507
- * console.log( _is.size( "80%" ) ); // => true
508
- * console.log( _is.size( {} ) ); // => false
509
- * console.log( _is.size( undefined ) ); // => false
510
- * console.log( _is.size( null ) ); // => false
511
- * console.log( _is.size( "" ) ); // => false
512
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/length|&lt;length&gt; - CSS | MDN} for more information on CSS length values.
513
- */
514
- _.is.size = function(value){
515
- if (!(_.is.string(value) && !_.is.empty(value)) && !_.is.number(value)) return false;
516
- return /^(auto|none|(?:[\d\.]*)+?(?:%|px|mm|q|cm|in|pt|pc|em|ex|ch|rem|vh|vw|vmin|vmax)?)$/.test(value);
517
- };
518
-
519
- /**
520
- * @summary Checks if the `value` is a string.
521
- * @memberof FooGallery.utils.is
522
- * @function string
523
- * @param {*} value - The value to check.
524
- * @returns {boolean} `true` if the `value` is a string.
525
- * @example {@run true}
526
- * // alias the FooGallery.utils.is namespace
527
- * var _is = FooGallery.utils.is;
528
- *
529
- * console.log( _is.string( "" ) ); // => true
530
- * console.log( _is.string( undefined ) ); // => false
531
- * console.log( _is.string( null ) ); // => false
532
- * console.log( _is.string( 123 ) ); // => false
533
- */
534
- _.is.string = function (value) {
535
- return '[object String]' === Object.prototype.toString.call(value);
536
- };
537
-
538
- /**
539
- * @summary Checks if the `value` is `undefined`.
540
- * @memberof FooGallery.utils.is
541
- * @function undef
542
- * @param {*} value - The value to check is undefined.
543
- * @returns {boolean} `true` if the supplied `value` is `undefined`.
544
- * @example {@run true}
545
- * // alias the FooGallery.utils.is namespace
546
- * var _is = FooGallery.utils.is;
547
- *
548
- * console.log( _is.undef( undefined ) ); // => true
549
- * console.log( _is.undef( null ) ); // => false
550
- * console.log( _is.undef( 123 ) ); // => false
551
- * console.log( _is.undef( "" ) ); // => false
552
- */
553
- _.is.undef = function (value) {
554
- return typeof value === 'undefined';
555
- };
556
-
557
- })(
558
- // dependencies
559
- FooGallery.utils.$,
560
- FooGallery.utils
561
- );
562
- (function($, _, _is){
563
- // only register methods if this version is the current version
564
- if (_.version !== '0.0.5') return;
565
-
566
- /**
567
- * @memberof FooGallery.utils
568
- * @namespace fn
569
- * @summary Contains common function utility methods.
570
- */
571
- _.fn = {};
572
-
573
- var fnStr = Function.prototype.toString;
574
-
575
- /**
576
- * @summary The regular expression to test if a function uses the `this._super` method applied by the {@link FooGallery.utils.fn.add} method.
577
- * @memberof FooGallery.utils.fn
578
- * @name CONTAINS_SUPER
579
- * @type {RegExp}
580
- * @default /\b_super\b/
581
- * @readonly
582
- * @description When the script is first loaded into the page this performs a quick check to see if the browser supports function decompilation. If it does the regular expression is set to match the expected `_super`, however if function decompilation is not supported, the regular expression is set to match anything effectively making the test always return `true`.
583
- * @example {@run true}
584
- * // alias the FooGallery.utils.fn namespace
585
- * var _fn = FooGallery.utils.fn;
586
- *
587
- * // create some functions to test
588
- * function testFn1(){}
589
- * function testFn2(){
590
- * this._super();
591
- * }
592
- *
593
- * console.log( _fn.CONTAINS_SUPER.test( testFn1 ) ); // => false
594
- * console.log( _fn.CONTAINS_SUPER.test( testFn2 ) ); // => true
595
- *
596
- * // NOTE: in browsers that don't support functional decompilation both tests will return `true`
597
- */
598
- _.fn.CONTAINS_SUPER = /xyz/.test(fnStr.call(function(){
599
- //noinspection JSUnresolvedVariable,BadExpressionStatementJS
600
- xyz;
601
- })) ? /\b_super\b/ : /.*/;
602
-
603
- /**
604
- * @summary Adds or overrides the given method `name` on the `proto` using the supplied `fn`.
605
- * @memberof FooGallery.utils.fn
606
- * @function addOrOverride
607
- * @param {Object} proto - The prototype to add the method to.
608
- * @param {string} name - The name of the method to add, if this already exists the original will be exposed within the scope of the supplied `fn` as `this._super`.
609
- * @param {function} fn - The function to add to the prototype, if this is overriding an existing method you can use `this._super` to access the original within its' scope.
610
- * @description If the new method overrides a pre-existing one, this function will expose the overridden method as `this._super` within the new methods scope.
611
- *
612
- * This replaces having to write out the following to override a method and call its original:
613
- *
614
- * ```javascript
615
- * var original = MyClass.prototype.someMethod;
616
- * MyClass.prototype.someMethod = function(arg1, arg2){
617
- * // execute the original
618
- * original.call(this, arg1, arg2);
619
- * };
620
- * ```
621
- *
622
- * With the following:
623
- *
624
- * ```javascript
625
- * FooGallery.utils.fn.addOrOverride( MyClass.prototype, "someMethod", function(arg1, arg2){
626
- * // execute the original
627
- * this._super(arg1, arg2);
628
- * });
629
- * ```
630
- *
631
- * This method is used by the {@link FooGallery.utils.Class} to implement the inheritance of individual methods.
632
- * @example {@run true}
633
- * // alias the FooGallery.utils.fn namespace
634
- * var _fn = FooGallery.utils.fn;
635
- *
636
- * var proto = {
637
- * write: function( message ){
638
- * console.log( "Original#write: " + message );
639
- * }
640
- * };
641
- *
642
- * proto.write( "My message" ); // => "Original#write: My message"
643
- *
644
- * _fn.addOrOverride( proto, "write", function( message ){
645
- * message = "Override#write: " + message;
646
- * this._super( message );
647
- * } );
648
- *
649
- * proto.write( "My message" ); // => "Original#write: Override#write: My message"
650
- */
651
- _.fn.addOrOverride = function(proto, name, fn){
652
- if (!_is.object(proto) || !_is.string(name) || _is.empty(name) || !_is.fn(fn)) return;
653
- var _super = proto[name],
654
- wrap = _is.fn(_super) && _.fn.CONTAINS_SUPER.test(fnStr.call(fn));
655
- // only wrap the function if it overrides a method and makes use of `_super` within it's body.
656
- proto[name] = wrap ?
657
- (function (_super, fn) {
658
- // create a new wrapped that exposes the original method as `_super`
659
- return function () {
660
- var tmp = this._super;
661
- this._super = _super;
662
- var ret = fn.apply(this, arguments);
663
- this._super = tmp;
664
- return ret;
665
- };
666
- })(_super, fn) : fn;
667
- };
668
-
669
- /**
670
- * @summary Use the `Function.prototype.apply` method on a class constructor using the `new` keyword.
671
- * @memberof FooGallery.utils.fn
672
- * @function apply
673
- * @param {Object} klass - The class to create.
674
- * @param {Array} [args=[]] - The arguments to pass to the constructor.
675
- * @returns {function} The new instance of the `klass` created with the supplied `args`.
676
- * @description When using the default `Function.prototype.apply` you can't use it on class constructors requiring the `new` keyword, this method allows us to do that.
677
- * @example {@run true}
678
- * // alias the FooGallery.utils.fn namespace
679
- * var _fn = FooGallery.utils.fn;
680
- *
681
- * // create a class to test with
682
- * function Test( name, value ){
683
- * if ( !( this instanceof Test )){
684
- * console.log( "Test instantiated without the `new` keyword." );
685
- * return;
686
- * }
687
- * console.log( "Test: name = " + name + ", value = " + value );
688
- * }
689
- *
690
- * Test.apply( Test, ["My name", "My value"] ); // => "Test instantiated without the `new` keyword."
691
- * _fn.apply( Test, ["My name", "My value"] ); // => "Test: name = My name, value = My value"
692
- */
693
- _.fn.apply = function(klass, args){
694
- args = _is.array(args) ? args : [];
695
- function Class() {
696
- return klass.apply(this, args);
697
- }
698
- Class.prototype = klass.prototype;
699
- //noinspection JSValidateTypes
700
- return new Class();
701
- };
702
-
703
- /**
704
- * @summary Converts the default `arguments` object into a proper array.
705
- * @memberof FooGallery.utils.fn
706
- * @function arg2arr
707
- * @param {Arguments} args - The arguments object to create an array from.
708
- * @returns {Array}
709
- * @description This method is simply a replacement for calling `Array.prototype.slice.call()` to create an array from an `arguments` object.
710
- * @example {@run true}
711
- * // alias the FooGallery.utils.fn namespace
712
- * var _fn = FooGallery.utils.fn;
713
- *
714
- * function callMe(){
715
- * var args = _fn.arg2arr(arguments);
716
- * console.log( arguments instanceof Array ); // => false
717
- * console.log( args instanceof Array ); // => true
718
- * console.log( args ); // => [ "arg1", "arg2" ]
719
- * }
720
- *
721
- * callMe("arg1", "arg2");
722
- */
723
- _.fn.arg2arr = function(args){
724
- return Array.prototype.slice.call(args);
725
- };
726
-
727
- /**
728
- * @summary Checks the given `value` and ensures a function is returned.
729
- * @memberof FooGallery.utils.fn
730
- * @function check
731
- * @param {?Object} thisArg=window - The `this` keyword within the returned function, if the supplied value is not an object this defaults to the `window`.
732
- * @param {*} value - The value to check, if not a function or the name of one then the `def` value is automatically returned.
733
- * @param {function} [def=jQuery.noop] - A default function to use if the `value` is not resolved to a function.
734
- * @param {Object} [ctx=window] - If the `value` is a string this is supplied to the {@link FooGallery.utils.fn.fetch} method as the content to retrieve the function from.
735
- * @returns {function} A function that ensures the correct context is applied when executed.
736
- * @description This function is primarily used to check the value of a callback option that could be supplied as either a function or a string.
737
- *
738
- * When just the function name is supplied this method uses the {@link FooGallery.utils.fn.fetch} method to resolve and wrap it to ensure when it's called the correct context is applied.
739
- *
740
- * Being able to resolve a function from a name allows callbacks to be easily set even through data attributes as you can just supply the full function name as a string and then use this method to retrieve the actual function.
741
- * @example {@run true}
742
- * // alias the FooGallery.utils.fn namespace
743
- * var _fn = FooGallery.utils.fn;
744
- *
745
- * // a simple `api` with a `sendMessage` function
746
- * window.api = {
747
- * sendMessage: function(){
748
- * this.write( "window.api.sendMessage" );
749
- * },
750
- * child: {
751
- * api: {
752
- * sendMessage: function(){
753
- * this.write( "window.api.child.api.sendMessage" );
754
- * }
755
- * }
756
- * }
757
- * };
758
- *
759
- * // a default function to use in case the check fails
760
- * var def = function(){
761
- * this.write( "default" );
762
- * };
763
- *
764
- * // an object to use as the `this` object within the scope of the checked functions
765
- * var thisArg = {
766
- * write: function( message ){
767
- * console.log( message );
768
- * }
769
- * };
770
- *
771
- * // check the value and return a wrapped function ensuring the correct context.
772
- * var fn = _fn.check( thisArg, null, def );
773
- * fn(); // => "default"
774
- *
775
- * fn = _fn.check( thisArg, "api.doesNotExist", def );
776
- * fn(); // => "default"
777
- *
778
- * fn = _fn.check( thisArg, api.sendMessage, def );
779
- * fn(); // => "window.api.sendMessage"
780
- *
781
- * fn = _fn.check( thisArg, "api.sendMessage", def );
782
- * fn(); // => "window.api.sendMessage"
783
- *
784
- * fn = _fn.check( thisArg, "api.sendMessage", def, window.api.child );
785
- * fn(); // => "window.api.child.api.sendMessage"
786
- */
787
- _.fn.check = function(thisArg, value, def, ctx){
788
- def = _is.fn(def) ? def : $.noop;
789
- thisArg = _is.object(thisArg) ? thisArg : window;
790
- function wrap(fn){
791
- return function(){
792
- return fn.apply(thisArg, arguments);
793
- };
794
- }
795
- value = _is.string(value) ? _.fn.fetch(value, ctx) : value;
796
- return _is.fn(value) ? wrap(value) : wrap(def);
797
- };
798
-
799
- /**
800
- * @summary Fetches a function given its `name`.
801
- * @memberof FooGallery.utils.fn
802
- * @function fetch
803
- * @param {string} name - The name of the function to fetch. This can be a `.` notated name.
804
- * @param {Object} [ctx=window] - The context to retrieve the function from, defaults to the `window` object.
805
- * @returns {?function} `null` if a function with the given name is not found within the context.
806
- * @example {@run true}
807
- * // alias the FooGallery.utils.fn namespace
808
- * var _fn = FooGallery.utils.fn;
809
- *
810
- * // create a dummy `api` with a `sendMessage` function to test
811
- * window.api = {
812
- * sendMessage: function( message ){
813
- * console.log( "api.sendMessage: " + message );
814
- * }
815
- * };
816
- *
817
- * // the below shows 3 different ways to fetch the `sendMessage` function
818
- * var send1 = _fn.fetch( "api.sendMessage" );
819
- * var send2 = _fn.fetch( "api.sendMessage", window );
820
- * var send3 = _fn.fetch( "sendMessage", window.api );
821
- *
822
- * // all the retrieved methods should be the same
823
- * console.log( send1 === send2 && send2 === send3 ); // => true
824
- *
825
- * // check if the function was found
826
- * if ( send1 != null ){
827
- * send1( "My message" ); // => "api.sendMessage: My message"
828
- * }
829
- */
830
- _.fn.fetch = function(name, ctx){
831
- if (!_is.string(name) || _is.empty(name)) return null;
832
- ctx = _is.object(ctx) ? ctx : window;
833
- $.each(name.split('.'), function(i, part){
834
- if (ctx[part]) ctx = ctx[part];
835
- else return false;
836
- });
837
- return _is.fn(ctx) ? ctx : null;
838
- };
839
-
840
- /**
841
- * @summary Enqueues methods using the given `name` from all supplied `objects` and executes each in order with the given arguments.
842
- * @memberof FooGallery.utils.fn
843
- * @function enqueue
844
- * @param {Array.<Object>} objects - The objects to call the method on.
845
- * @param {string} name - The name of the method to execute.
846
- * @param {*} [arg1] - The first argument to call the method with.
847
- * @param {...*} [argN] - Any additional arguments for the method.
848
- * @returns {Promise} If `resolved` the first argument supplied to any success callbacks is an array of all returned value(s). These values are encapsulated within their own array as if the method returned a promise it could be resolved with more than one argument.
849
- *
850
- * If `rejected` any fail callbacks are supplied the arguments the promise was rejected with plus an additional one appended by this method, an array of all objects that have already had their methods run. This allows you to perform rollback operations if required after a failure. The last object in this array would contain the method that raised the error.
851
- * @description This method allows an array of `objects` that implement a common set of methods to be executed in a supplied order. Each method in the queue is only executed after the successful completion of the previous. Success is evaluated as the method did not throw an error and if it returned a promise it was resolved.
852
- *
853
- * An example of this being used within the plugin is the loading and execution of methods on the various components. Using this method ensures components are loaded and have their methods executed in a static order regardless of when they were registered with the plugin or if the method is async. This way if `ComponentB`'s `preinit` relies on properties set in `ComponentA`'s `preinit` method you can register `ComponentB` with a lower priority than `ComponentA` and you can be assured `ComponentA`'s `preinit` completed successfully before `ComponentB`'s `preinit` is called event if it performs an async operation.
854
- * @example {@caption Shows a basic example of how you can use this method.}{@run true}
855
- * // alias the FooGallery.utils.fn namespace
856
- * var _fn = FooGallery.utils.fn;
857
- *
858
- * // create some dummy objects that implement the same members or methods.
859
- * var obj1 = {
860
- * "name": "obj1",
861
- * "appendName": function(str){
862
- * console.log( "Executing obj1.appendName..." );
863
- * return str + this.name;
864
- * }
865
- * };
866
- *
867
- * // this objects `appendName` method returns a promise
868
- * var obj2 = {
869
- * "name": "obj2",
870
- * "appendName": function(str){
871
- * console.log( "Executing obj2.appendName..." );
872
- * var self = this;
873
- * return $.Deferred(function(def){
874
- * // use a setTimeout to delay execution
875
- * setTimeout(function(){
876
- * def.resolve(str + self.name);
877
- * }, 300);
878
- * });
879
- * }
880
- * };
881
- *
882
- * // this objects `appendName` method is only executed once obj2's promise is resolved
883
- * var obj3 = {
884
- * "name": "obj3",
885
- * "appendName": function(str){
886
- * console.log( "Executing obj3.appendName..." );
887
- * return str + this.name;
888
- * }
889
- * };
890
- *
891
- * _fn.enqueue( [obj1, obj2, obj3], "appendName", "modified_by:" ).then(function(results){
892
- * console.log( results ); // => [ [ "modified_by:obj1" ], [ "modified_by:obj2" ], [ "modified_by:obj3" ] ]
893
- * });
894
- * @example {@caption If an error is thrown by one of the called methods or it returns a promise that is rejected, execution is halted and any fail callbacks are executed. The last argument is an array of objects that have had their methods run, the last object within this array is the one that raised the error.}{@run true}
895
- * // alias the FooGallery.utils.fn namespace
896
- * var _fn = FooGallery.utils.fn;
897
- *
898
- * // create some dummy objects that implement the same members or methods.
899
- * var obj1 = {
900
- * "name": "obj1",
901
- * "last": null,
902
- * "appendName": function(str){
903
- * console.log( "Executing obj1.appendName..." );
904
- * return this.last = str + this.name;
905
- * },
906
- * "rollback": function(){
907
- * console.log( "Executing obj1.rollback..." );
908
- * this.last = null;
909
- * }
910
- * };
911
- *
912
- * // this objects `appendName` method throws an error
913
- * var obj2 = {
914
- * "name": "obj2",
915
- * "last": null,
916
- * "appendName": function(str){
917
- * console.log( "Executing obj2.appendName..." );
918
- * //throw new Error("Oops, something broke.");
919
- * var self = this;
920
- * return $.Deferred(function(def){
921
- * // use a setTimeout to delay execution
922
- * setTimeout(function(){
923
- * self.last = str + self.name;
924
- * def.reject(Error("Oops, something broke."));
925
- * }, 300);
926
- * });
927
- * },
928
- * "rollback": function(){
929
- * console.log( "Executing obj2.rollback..." );
930
- * this.last = null;
931
- * }
932
- * };
933
- *
934
- * // this objects `appendName` and `rollback` methods are never executed
935
- * var obj3 = {
936
- * "name": "obj3",
937
- * "last": null,
938
- * "appendName": function(str){
939
- * console.log( "Executing obj3.appendName..." );
940
- * return this.last = str + this.name;
941
- * },
942
- * "rollback": function(){
943
- * console.log( "Executing obj3.rollback..." );
944
- * this.last = null;
945
- * }
946
- * };
947
- *
948
- * _fn.enqueue( [obj1, obj2, obj3], "appendName", "modified_by:" ).fail(function(err, run){
949
- * console.log( err.message ); // => "Oops, something broke."
950
- * console.log( run ); // => [ {"name":"obj1","last":"modified_by:obj1"}, {"name":"obj2","last":"modified_by:obj2"} ]
951
- * var guilty = run[run.length - 1];
952
- * console.log( "Error thrown by: " + guilty.name ); // => "obj2"
953
- * run.reverse(); // reverse execution when rolling back to avoid dependency issues
954
- * return _fn.enqueue( run, "rollback" ).then(function(){
955
- * console.log( "Error handled and rollback performed." );
956
- * console.log( run ); // => [ {"name":"obj1","last":null}, {"name":"obj2","last":null} ]
957
- * });
958
- * });
959
- */
960
- _.fn.enqueue = function(objects, name, arg1, argN){
961
- var args = _.fn.arg2arr(arguments), // get an array of all supplied arguments
962
- def = $.Deferred(), // the main deferred object for the function
963
- queue = $.Deferred(), // the deferred object to use as an queue
964
- promise = queue.promise(), // used to register component methods for execution
965
- results = [], // stores the results of each method to be returned by the main deferred
966
- run = [], // stores each object once its' method has been run
967
- first = true; // whether or not this is the first resolve callback
968
-
969
- // take the objects and name parameters out of the args array
970
- objects = args.shift();
971
- name = args.shift();
972
-
973
- // safely execute a function, catch any errors and reject the deferred if required.
974
- function safe(obj, method){
975
- try {
976
- run.push(obj);
977
- return method.apply(obj, args);
978
- } catch(err) {
979
- def.reject(err, run);
980
- return def;
981
- }
982
- }
983
-
984
- // loop through all the supplied objects
985
- $.each(objects, function(i, obj){
986
- // if the obj has a function with the supplied name
987
- if (_is.fn(obj[name])){
988
- // then register the method in the callback queue
989
- promise = promise.then(function(){
990
- // only register the result if this is not the first resolve callback, the first is triggered by this function kicking off the queue
991
- if (!first){
992
- var resolveArgs = _.fn.arg2arr(arguments);
993
- results.push(resolveArgs);
994
- }
995
- first = false;
996
- // execute the method and return it's result, if the result is a promise
997
- // the next method will only be executed once it's resolved
998
- return safe(obj, obj[name]);
999
- });
1000
- }
1001
- });
1002
-
1003
- // add one last callback to catch the final result
1004
- promise.then(function(){
1005
- // only register the result if this is not the first resolve callback
1006
- if (!first){
1007
- var resolveArgs = _.fn.arg2arr(arguments);
1008
- results.push(resolveArgs);
1009
- }
1010
- first = false;
1011
- // resolve the main deferred with the array of all the method results
1012
- def.resolve(results);
1013
- });
1014
-
1015
- // hook into failures and ensure the run array is appended to the args
1016
- promise.fail(function(){
1017
- var rejectArgs = _.fn.arg2arr(arguments);
1018
- rejectArgs.push(run);
1019
- def.reject.apply(def, rejectArgs);
1020
- });
1021
-
1022
- // kick off the queue
1023
- queue.resolve();
1024
-
1025
- return def.promise();
1026
- };
1027
-
1028
- /**
1029
- * @summary Waits for the outcome of all promises regardless of failure and resolves supplying the results of just those that succeeded.
1030
- * @memberof FooGallery.utils.fn
1031
- * @function when
1032
- * @param {Promise[]} promises - The array of promises to wait for.
1033
- * @returns {Promise}
1034
- */
1035
- _.fn.when = function(promises){
1036
- if (!_is.array(promises) || _is.empty(promises)) return $.when();
1037
- var d = $.Deferred(), results = [], remaining = promises.length;
1038
- for(var i = 0; i < promises.length; i++){
1039
- promises[i].then(function(res){
1040
- results.push(res); // on success, add to results
1041
- }).always(function(){
1042
- remaining--; // always mark as finished
1043
- if(!remaining) d.resolve(results);
1044
- })
1045
- }
1046
- return d.promise(); // return a promise on the remaining values
1047
- };
1048
-
1049
- /**
1050
- * @summary Return a promise rejected using the supplied args.
1051
- * @memberof FooGallery.utils.fn
1052
- * @function rejectWith
1053
- * @param {*} [arg1] - The first argument to reject the promise with.
1054
- * @param {...*} [argN] - Any additional arguments to reject the promise with.
1055
- * @returns {Promise}
1056
- */
1057
- _.fn.rejectWith = function(arg1, argN){
1058
- var def = $.Deferred(), args = _.fn.arg2arr(arguments);
1059
- return def.reject.apply(def, args).promise();
1060
- };
1061
-
1062
- /**
1063
- * @summary Return a promise resolved using the supplied args.
1064
- * @memberof FooGallery.utils.fn
1065
- * @function resolveWith
1066
- * @param {*} [arg1] - The first argument to resolve the promise with.
1067
- * @param {...*} [argN] - Any additional arguments to resolve the promise with.
1068
- * @returns {Promise}
1069
- */
1070
- _.fn.resolveWith = function(arg1, argN){
1071
- var def = $.Deferred(), args = _.fn.arg2arr(arguments);
1072
- return def.resolve.apply(def, args).promise();
1073
- };
1074
-
1075
- /**
1076
- * @summary A resolved promise object.
1077
- * @memberof FooGallery.utils.fn
1078
- * @name resolved
1079
- * @type {Promise}
1080
- */
1081
- _.fn.resolved = $.Deferred().resolve().promise();
1082
-
1083
- /**
1084
- * @summary A rejected promise object.
1085
- * @memberof FooGallery.utils.fn
1086
- * @name resolved
1087
- * @type {Promise}
1088
- */
1089
- _.fn.rejected = $.Deferred().reject().promise();
1090
-
1091
- })(
1092
- // dependencies
1093
- FooGallery.utils.$,
1094
- FooGallery.utils,
1095
- FooGallery.utils.is
1096
- );
1097
- (function(_, _is){
1098
- // only register methods if this version is the current version
1099
- if (_.version !== '0.0.5') return;
1100
-
1101
- /**
1102
- * @summary Contains common url utility methods.
1103
- * @memberof FooGallery.utils
1104
- * @namespace url
1105
- */
1106
- _.url = {};
1107
-
1108
- // used for parsing a url into it's parts.
1109
- var _a = document.createElement('a');
1110
-
1111
- /**
1112
- * @summary Parses the supplied url into an object containing it's component parts.
1113
- * @memberof FooGallery.utils.url
1114
- * @function parts
1115
- * @param {string} url - The url to parse.
1116
- * @returns {FooGallery.utils.url~Parts}
1117
- * @example {@run true}
1118
- * // alias the FooGallery.utils.url namespace
1119
- * var _url = FooGallery.utils.url;
1120
- *
1121
- * console.log( _url.parts( "http://example.com/path/?param=true#something" ) ); // => {"hash":"#something", ...}
1122
- */
1123
- _.url.parts = function(url){
1124
- _a.href = url;
1125
- return {
1126
- hash: _a.hash, host: _a.host, hostname: _a.hostname, href: _a.href,
1127
- origin: _a.origin, pathname: _a.pathname, port: _a.port,
1128
- protocol: _a.protocol, search: _a.search
1129
- };
1130
- };
1131
-
1132
- /**
1133
- * @summary Given a <code>url</code> that could be relative or full this ensures a full url is returned.
1134
- * @memberof FooGallery.utils.url
1135
- * @function full
1136
- * @param {string} url - The url to ensure is full.
1137
- * @returns {?string} `null` if the given `path` is not a string or empty.
1138
- * @description Given a full url this will simply return it however if given a relative url this will create a full url using the current location to fill in the blanks.
1139
- * @example {@run true}
1140
- * // alias the FooGallery.utils.url namespace
1141
- * var _url = FooGallery.utils.url;
1142
- *
1143
- * console.log( _url.full( "http://example.com/path/" ) ); // => "http://example.com/path/"
1144
- * console.log( _url.full( "/path/" ) ); // => "{protocol}//{host}/path/"
1145
- * console.log( _url.full( "path/" ) ); // => "{protocol}//{host}/{pathname}/path/"
1146
- * console.log( _url.full( "../path/" ) ); // => "{protocol}//{host}/{calculated pathname}/path/"
1147
- * console.log( _url.full() ); // => null
1148
- * console.log( _url.full( 123 ) ); // => null
1149
- */
1150
- _.url.full = function(url){
1151
- if (!_is.string(url) || _is.empty(url)) return null;
1152
- _a.href = url;
1153
- return _a.href;
1154
- };
1155
-
1156
- /**
1157
- * @summary Gets or sets a parameter in the given <code>search</code> string.
1158
- * @memberof FooGallery.utils.url
1159
- * @function param
1160
- * @param {string} search - The search string to use (usually `location.search`).
1161
- * @param {string} key - The key of the parameter.
1162
- * @param {string} [value] - The value to set for the parameter. If not provided the current value for the `key` is returned.
1163
- * @returns {?string} The value of the `key` in the given `search` string if no `value` is supplied or `null` if the `key` does not exist.
1164
- * @returns {string} A modified `search` string if a `value` is supplied.
1165
- * @example <caption>Shows how to retrieve a parameter value from a search string.</caption>{@run true}
1166
- * // alias the FooGallery.utils.url namespace
1167
- * var _url = FooGallery.utils.url,
1168
- * // create a search string to test
1169
- * search = "?wmode=opaque&autoplay=1";
1170
- *
1171
- * console.log( _url.param( search, "wmode" ) ); // => "opaque"
1172
- * console.log( _url.param( search, "autoplay" ) ); // => "1"
1173
- * console.log( _url.param( search, "nonexistent" ) ); // => null
1174
- * @example <caption>Shows how to set a parameter value in the given search string.</caption>{@run true}
1175
- * // alias the FooGallery.utils.url namespace
1176
- * var _url = FooGallery.utils.url,
1177
- * // create a search string to test
1178
- * search = "?wmode=opaque&autoplay=1";
1179
- *
1180
- * console.log( _url.param( search, "wmode", "window" ) ); // => "?wmode=window&autoplay=1"
1181
- * console.log( _url.param( search, "autoplay", "0" ) ); // => "?wmode=opaque&autoplay=0"
1182
- * console.log( _url.param( search, "v", "2" ) ); // => "?wmode=opaque&autoplay=1&v=2"
1183
- */
1184
- _.url.param = function(search, key, value){
1185
- if (!_is.string(search) || _is.empty(search) || !_is.string(key) || _is.empty(key)) return search;
1186
- var regex, match, result, param;
1187
- if (_is.undef(value)){
1188
- regex = new RegExp('[?|&]' + key + '=([^&;]+?)(&|#|;|$)'); // regex to match the key and it's value but only capture the value
1189
- match = regex.exec(search) || [,""]; // match the param otherwise return an empty string match
1190
- result = match[1].replace(/\+/g, '%20'); // replace any + character's with spaces
1191
- return _is.string(result) && !_is.empty(result) ? decodeURIComponent(result) : null; // decode the result otherwise return null
1192
- }
1193
- if (value === "" || value === null){
1194
- regex = new RegExp('^([^#]*\?)(([^#]*)&)?' + key + '(\=[^&#]*)?(&|#|$)');
1195
- result = search.replace(regex, '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/,'$1$3$4');
1196
- } else {
1197
- regex = new RegExp('([?&])' + key + '[^&]*'); // regex to match the key and it's current value but only capture the preceding ? or & char
1198
- param = key + '=' + encodeURIComponent(value);
1199
- result = search.replace(regex, '$1' + param); // replace any existing instance of the key with the new value
1200
- // If nothing was replaced, then add the new param to the end
1201
- if (result === search && !regex.test(result)) { // if no replacement occurred and the parameter is not currently in the result then add it
1202
- result += '&' + param;
1203
- }
1204
- }
1205
- return result;
1206
- };
1207
-
1208
- //######################
1209
- //## Type Definitions ##
1210
- //######################
1211
-
1212
- /**
1213
- * @summary A plain JavaScript object returned by the {@link FooGallery.utils.url.parts} method.
1214
- * @typedef {Object} FooGallery.utils.url~Parts
1215
- * @property {string} hash - A string containing a `#` followed by the fragment identifier of the URL.
1216
- * @property {string} host - A string containing the host, that is the hostname, a `:`, and the port of the URL.
1217
- * @property {string} hostname - A string containing the domain of the URL.
1218
- * @property {string} href - A string containing the entire URL.
1219
- * @property {string} origin - A string containing the canonical form of the origin of the specific location.
1220
- * @property {string} pathname - A string containing an initial `/` followed by the path of the URL.
1221
- * @property {string} port - A string containing the port number of the URL.
1222
- * @property {string} protocol - A string containing the protocol scheme of the URL, including the final `:`.
1223
- * @property {string} search - A string containing a `?` followed by the parameters of the URL. Also known as "querystring".
1224
- * @see {@link FooGallery.utils.url.parts} for example usage.
1225
- */
1226
-
1227
- })(
1228
- // dependencies
1229
- FooGallery.utils,
1230
- FooGallery.utils.is
1231
- );
1232
- (function (_, _is, _fn) {
1233
- // only register methods if this version is the current version
1234
- if (_.version !== '0.0.5') return;
1235
-
1236
- /**
1237
- * @summary Contains common string utility methods.
1238
- * @memberof FooGallery.utils
1239
- * @namespace str
1240
- */
1241
- _.str = {};
1242
-
1243
- /**
1244
- * @summary Converts the given `target` to camel case.
1245
- * @memberof FooGallery.utils.str
1246
- * @function camel
1247
- * @param {string} target - The string to camel case.
1248
- * @returns {string}
1249
- * @example {@run true}
1250
- * // alias the FooGallery.utils.str namespace
1251
- * var _str = FooGallery.utils.str;
1252
- *
1253
- * console.log( _str.camel( "max-width" ) ); // => "maxWidth"
1254
- * console.log( _str.camel( "max--width" ) ); // => "maxWidth"
1255
- * console.log( _str.camel( "max Width" ) ); // => "maxWidth"
1256
- * console.log( _str.camel( "Max_width" ) ); // => "maxWidth"
1257
- * console.log( _str.camel( "MaxWidth" ) ); // => "maxWidth"
1258
- * console.log( _str.camel( "Abbreviations like CSS are left intact" ) ); // => "abbreviationsLikeCSSAreLeftIntact"
1259
- */
1260
- _.str.camel = function (target) {
1261
- if (_is.empty(target)) return target;
1262
- if (target.toUpperCase() === target) return target.toLowerCase();
1263
- return target.replace(/^([A-Z])|[-\s_]+(\w)/g, function (match, p1, p2) {
1264
- if (_is.string(p2)) return p2.toUpperCase();
1265
- return p1.toLowerCase();
1266
- });
1267
- };
1268
-
1269
- /**
1270
- * @summary Checks if the `target` contains the given `substr`.
1271
- * @memberof FooGallery.utils.str
1272
- * @function contains
1273
- * @param {string} target - The string to check.
1274
- * @param {string} substr - The string to check for.
1275
- * @param {boolean} [ignoreCase=false] - Whether or not to ignore casing when performing the check.
1276
- * @returns {boolean} `true` if the `target` contains the given `substr`.
1277
- * @example {@run true}
1278
- * // alias the FooGallery.utils.str namespace
1279
- * var _str = FooGallery.utils.str,
1280
- * // create a string to test
1281
- * target = "To be, or not to be, that is the question.";
1282
- *
1283
- * console.log( _str.contains( target, "To be" ) ); // => true
1284
- * console.log( _str.contains( target, "question" ) ); // => true
1285
- * console.log( _str.contains( target, "no" ) ); // => true
1286
- * console.log( _str.contains( target, "nonexistent" ) ); // => false
1287
- * console.log( _str.contains( target, "TO BE" ) ); // => false
1288
- * console.log( _str.contains( target, "TO BE", true ) ); // => true
1289
- */
1290
- _.str.contains = function (target, substr, ignoreCase) {
1291
- if (!_is.string(target) || _is.empty(target) || !_is.string(substr) || _is.empty(substr)) return false;
1292
- return substr.length <= target.length
1293
- && (!!ignoreCase ? target.toUpperCase().indexOf(substr.toUpperCase()) : target.indexOf(substr)) !== -1;
1294
- };
1295
-
1296
- /**
1297
- * @summary Checks if the `target` contains the given `word`.
1298
- * @memberof FooGallery.utils.str
1299
- * @function containsWord
1300
- * @param {string} target - The string to check.
1301
- * @param {string} word - The word to check for.
1302
- * @param {boolean} [ignoreCase=false] - Whether or not to ignore casing when performing the check.
1303
- * @returns {boolean} `true` if the `target` contains the given `word`.
1304
- * @description This method differs from {@link FooGallery.utils.str.contains} in that it searches for whole words by splitting the `target` string on word boundaries (`\b`) and then comparing the individual parts.
1305
- * @example {@run true}
1306
- * // alias the FooGallery.utils.str namespace
1307
- * var _str = FooGallery.utils.str,
1308
- * // create a string to test
1309
- * target = "To be, or not to be, that is the question.";
1310
- *
1311
- * console.log( _str.containsWord( target, "question" ) ); // => true
1312
- * console.log( _str.containsWord( target, "no" ) ); // => false
1313
- * console.log( _str.containsWord( target, "NOT" ) ); // => false
1314
- * console.log( _str.containsWord( target, "NOT", true ) ); // => true
1315
- * console.log( _str.containsWord( target, "nonexistent" ) ); // => false
1316
- */
1317
- _.str.containsWord = function(target, word, ignoreCase){
1318
- if (!_is.string(target) || _is.empty(target) || !_is.string(word) || _is.empty(word) || target.length < word.length)
1319
- return false;
1320
- var parts = target.split(/\W/);
1321
- for (var i = 0, len = parts.length; i < len; i++){
1322
- if (ignoreCase ? parts[i].toUpperCase() == word.toUpperCase() : parts[i] == word) return true;
1323
- }
1324
- return false;
1325
- };
1326
-
1327
- /**
1328
- * @summary Checks if the `target` ends with the given `substr`.
1329
- * @memberof FooGallery.utils.str
1330
- * @function endsWith
1331
- * @param {string} target - The string to check.
1332
- * @param {string} substr - The substr to check for.
1333
- * @returns {boolean} `true` if the `target` ends with the given `substr`.
1334
- * @example {@run true}
1335
- * // alias the FooGallery.utils.str namespace
1336
- * var _str = FooGallery.utils.str;
1337
- *
1338
- * console.log( _str.endsWith( "something", "g" ) ); // => true
1339
- * console.log( _str.endsWith( "something", "ing" ) ); // => true
1340
- * console.log( _str.endsWith( "something", "no" ) ); // => false
1341
- */
1342
- _.str.endsWith = function (target, substr) {
1343
- if (!_is.string(target) || _is.empty(target) || !_is.string(substr) || _is.empty(substr)) return target == substr;
1344
- return target.slice(target.length - substr.length) == substr;
1345
- };
1346
-
1347
- /**
1348
- * @summary Escapes the `target` for use in a regular expression.
1349
- * @memberof FooGallery.utils.str
1350
- * @function escapeRegExp
1351
- * @param {string} target - The string to escape.
1352
- * @returns {string}
1353
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions|Regular Expressions: Using Special Characters - JavaScript | MDN}
1354
- */
1355
- _.str.escapeRegExp = function(target){
1356
- if (_is.empty(target)) return target;
1357
- return target.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1358
- };
1359
-
1360
- /**
1361
- * @summary Generates a 32 bit FNV-1a hash from the given `target`.
1362
- * @memberof FooGallery.utils.str
1363
- * @function fnv1a
1364
- * @param {string} target - The string to generate a hash from.
1365
- * @returns {?number} `null` if the `target` is not a string or empty otherwise a 32 bit FNV-1a hash.
1366
- * @example {@run true}
1367
- * // alias the FooGallery.utils.str namespace
1368
- * var _str = FooGallery.utils.str;
1369
- *
1370
- * console.log( _str.fnv1a( "Some string to generate a hash for." ) ); // => 207568994
1371
- * console.log( _str.fnv1a( "Some string to generate a hash for" ) ); // => 1350435704
1372
- * @see {@link https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function|Fowler–Noll–Vo hash function}
1373
- */
1374
- _.str.fnv1a = function(target){
1375
- if (!_is.string(target) || _is.empty(target)) return null;
1376
- var i, l, hval = 0x811c9dc5;
1377
- for (i = 0, l = target.length; i < l; i++) {
1378
- hval ^= target.charCodeAt(i);
1379
- hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
1380
- }
1381
- return hval >>> 0;
1382
- };
1383
-
1384
- /**
1385
- * @summary Returns the remainder of the `target` split on the first index of the given `substr`.
1386
- * @memberof FooGallery.utils.str
1387
- * @function from
1388
- * @param {string} target - The string to split.
1389
- * @param {string} substr - The substring to split on.
1390
- * @returns {?string} `null` if the given `substr` does not exist within the `target`.
1391
- * @example {@run true}
1392
- * // alias the FooGallery.utils.str namespace
1393
- * var _str = FooGallery.utils.str,
1394
- * // create a string to test
1395
- * target = "To be, or not to be, that is the question.";
1396
- *
1397
- * console.log( _str.from( target, "no" ) ); // => "t to be, that is the question."
1398
- * console.log( _str.from( target, "that" ) ); // => " is the question."
1399
- * console.log( _str.from( target, "question" ) ); // => "."
1400
- * console.log( _str.from( target, "nonexistent" ) ); // => null
1401
- */
1402
- _.str.from = function (target, substr) {
1403
- if (!_is.string(target) || _is.empty(target) || !_is.string(substr) || _is.empty(substr)) return null;
1404
- return _.str.contains(target, substr) ? target.substring(target.indexOf(substr) + substr.length) : null;
1405
- };
1406
-
1407
- /**
1408
- * @summary Joins any number of strings using the given `separator`.
1409
- * @memberof FooGallery.utils.str
1410
- * @function join
1411
- * @param {string} separator - The separator to use to join the strings.
1412
- * @param {string} part - The first string to join.
1413
- * @param {...string} [partN] - Any number of additional strings to join.
1414
- * @returns {?string}
1415
- * @description This method differs from using the standard `Array.prototype.join` function to join strings in that it ignores empty parts and checks to see if each starts with the supplied `separator`. If the part starts with the `separator` it is removed before appending it to the final result.
1416
- * @example {@run true}
1417
- * // alias the FooGallery.utils.str namespace
1418
- * var _str = FooGallery.utils.str;
1419
- *
1420
- * console.log( _str.join( "_", "all", "in", "one" ) ); // => "all_in_one"
1421
- * console.log( _str.join( "_", "all", "_in", "one" ) ); // => "all_in_one"
1422
- * console.log( _str.join( "/", "http://", "/example.com/", "/path/to/image.png" ) ); // => "http://example.com/path/to/image.png"
1423
- * console.log( _str.join( "/", "http://", "/example.com", "/path/to/image.png" ) ); // => "http://example.com/path/to/image.png"
1424
- * console.log( _str.join( "/", "http://", "example.com", "path/to/image.png" ) ); // => "http://example.com/path/to/image.png"
1425
- */
1426
- _.str.join = function(separator, part, partN){
1427
- if (!_is.string(separator) || !_is.string(part)) return null;
1428
- var parts = _fn.arg2arr(arguments);
1429
- separator = parts.shift();
1430
- var i, l, result = parts.shift();
1431
- for (i = 0, l = parts.length; i < l; i++){
1432
- part = parts[i];
1433
- if (_is.empty(part)) continue;
1434
- if (_.str.endsWith(result, separator)){
1435
- result = result.slice(0, result.length-separator.length);
1436
- }
1437
- if (_.str.startsWith(part, separator)){
1438
- part = part.slice(separator.length);
1439
- }
1440
- result += separator + part;
1441
- }
1442
- return result;
1443
- };
1444
-
1445
- /**
1446
- * @summary Checks if the `target` starts with the given `substr`.
1447
- * @memberof FooGallery.utils.str
1448
- * @function startsWith
1449
- * @param {string} target - The string to check.
1450
- * @param {string} substr - The substr to check for.
1451
- * @returns {boolean} `true` if the `target` starts with the given `substr`.
1452
- * @example {@run true}
1453
- * // alias the FooGallery.utils.str namespace
1454
- * var _str = FooGallery.utils.str;
1455
- *
1456
- * console.log( _str.startsWith( "something", "s" ) ); // => true
1457
- * console.log( _str.startsWith( "something", "some" ) ); // => true
1458
- * console.log( _str.startsWith( "something", "no" ) ); // => false
1459
- */
1460
- _.str.startsWith = function (target, substr) {
1461
- if (_is.empty(target) || _is.empty(substr)) return false;
1462
- return target.slice(0, substr.length) == substr;
1463
- };
1464
-
1465
- /**
1466
- * @summary Returns the first part of the `target` split on the first index of the given `substr`.
1467
- * @memberof FooGallery.utils.str
1468
- * @function until
1469
- * @param {string} target - The string to split.
1470
- * @param {string} substr - The substring to split on.
1471
- * @returns {string} The `target` if the `substr` does not exist.
1472
- * @example {@run true}
1473
- * // alias the FooGallery.utils.str namespace
1474
- * var _str = FooGallery.utils.str,
1475
- * // create a string to test
1476
- * target = "To be, or not to be, that is the question.";
1477
- *
1478
- * console.log( _str.until( target, "no" ) ); // => "To be, or "
1479
- * console.log( _str.until( target, "that" ) ); // => "To be, or not to be, "
1480
- * console.log( _str.until( target, "question" ) ); // => "To be, or not to be, that is the "
1481
- * console.log( _str.until( target, "nonexistent" ) ); // => "To be, or not to be, that is the question."
1482
- */
1483
- _.str.until = function (target, substr) {
1484
- if (_is.empty(target) || _is.empty(substr)) return target;
1485
- return _.str.contains(target, substr) ? target.substring(0, target.indexOf(substr)) : target;
1486
- };
1487
-
1488
- /**
1489
- * @summary A basic string formatter that can use both index and name based placeholders but handles only string or number replacements.
1490
- * @memberof FooGallery.utils.str
1491
- * @function format
1492
- * @param {string} target - The format string containing any placeholders to replace.
1493
- * @param {string|number|Object|Array} arg1 - The first value to format the target with. If an object is supplied it's properties are used to match named placeholders. If an array, string or number is supplied it's values are used to match any index placeholders.
1494
- * @param {...(string|number)} [argN] - Any number of additional strings or numbers to format the target with.
1495
- * @returns {string} The string formatted with the supplied arguments.
1496
- * @description This method allows you to supply the replacements as an object when using named placeholders or as an array or additional arguments when using index placeholders.
1497
- *
1498
- * This does not perform a simultaneous replacement of placeholders, which is why it's referred to as a basic formatter. This means replacements that contain placeholders within there value could end up being replaced themselves as seen in the last example.
1499
- * @example {@caption The following shows how to use index placeholders.}{@run true}
1500
- * // alias the FooGallery.utils.str namespace
1501
- * var _str = FooGallery.utils.str,
1502
- * // create a format string using index placeholders
1503
- * format = "Hello, {0}, are you feeling {1}?";
1504
- *
1505
- * console.log( _str.format( format, "Steve", "OK" ) ); // => "Hello, Steve, are you feeling OK?"
1506
- * // or
1507
- * console.log( _str.format( format, [ "Steve", "OK" ] ) ); // => "Hello, Steve, are you feeling OK?"
1508
- * @example {@caption While the above works perfectly fine the downside is that the placeholders provide no clues as to what should be supplied as a replacement value, this is were supplying an object and using named placeholders steps in.}{@run true}
1509
- * // alias the FooGallery.utils.str namespace
1510
- * var _str = FooGallery.utils.str,
1511
- * // create a format string using named placeholders
1512
- * format = "Hello, {name}, are you feeling {adjective}?";
1513
- *
1514
- * console.log( _str.format( format, {name: "Steve", adjective: "OK"} ) ); // => "Hello, Steve, are you feeling OK?"
1515
- * @example {@caption The following demonstrates the issue with not performing a simultaneous replacement of placeholders.}{@run true}
1516
- * // alias the FooGallery.utils.str namespace
1517
- * var _str = FooGallery.utils.str;
1518
- *
1519
- * console.log( _str.format("{0}{1}", "{1}", "{0}") ); // => "{0}{0}"
1520
- *
1521
- * // If the replacement happened simultaneously the result would be "{1}{0}" but this method executes
1522
- * // replacements synchronously as seen below:
1523
- *
1524
- * // "{0}{1}".replace( "{0}", "{1}" )
1525
- * // => "{1}{1}".replace( "{1}", "{0}" )
1526
- * // => "{0}{0}"
1527
- */
1528
- _.str.format = function (target, arg1, argN){
1529
- var args = _fn.arg2arr(arguments);
1530
- target = args.shift(); // remove the target from the args
1531
- if (_is.empty(target) || _is.empty(args)) return target;
1532
- if (args.length === 1 && (_is.array(args[0]) || _is.object(args[0]))){
1533
- args = args[0];
1534
- }
1535
- for (var arg in args){
1536
- target = target.replace(new RegExp("\\{" + arg + "\\}", "gi"), args[arg]);
1537
- }
1538
- return target;
1539
- };
1540
-
1541
- })(
1542
- // dependencies
1543
- FooGallery.utils,
1544
- FooGallery.utils.is,
1545
- FooGallery.utils.fn
1546
- );
1547
- (function($, _, _is, _fn, _str){
1548
- // only register methods if this version is the current version
1549
- if (_.version !== '0.0.5') return;
1550
-
1551
- /**
1552
- * @summary Contains common object utility methods.
1553
- * @memberof FooGallery.utils
1554
- * @namespace obj
1555
- */
1556
- _.obj = {};
1557
-
1558
- // used by the obj.create method
1559
- var Obj = function () {};
1560
- /**
1561
- * @summary Creates a new object with the specified prototype.
1562
- * @memberof FooGallery.utils.obj
1563
- * @function create
1564
- * @param {object} proto - The object which should be the prototype of the newly-created object.
1565
- * @returns {object} A new object with the specified prototype.
1566
- * @description This is a basic implementation of the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create|Object.create} method.
1567
- */
1568
- _.obj.create = function (proto) {
1569
- if (!_is.object(proto))
1570
- throw TypeError('Argument must be an object');
1571
- Obj.prototype = proto;
1572
- var result = new Obj();
1573
- Obj.prototype = null;
1574
- return result;
1575
- };
1576
-
1577
- /**
1578
- * @summary Merge the contents of two or more objects together into the first `target` object.
1579
- * @memberof FooGallery.utils.obj
1580
- * @function extend
1581
- * @param {Object} target - The object to merge properties into.
1582
- * @param {Object} object - An object containing properties to merge.
1583
- * @param {...Object} [objectN] - Additional objects containing properties to merge.
1584
- * @returns {Object} The `target` merged with the contents from any additional objects.
1585
- * @description This does not merge arrays by index as jQuery does, it treats them as a single property and replaces the array with a shallow copy of the new one.
1586
- *
1587
- * This method makes use of the {@link FooGallery.utils.obj.merge} method internally.
1588
- * @example {@run true}
1589
- * // alias the FooGallery.utils.obj namespace
1590
- * var _obj = FooGallery.utils.obj,
1591
- * // create some objects to merge
1592
- * defaults = {"name": "My Object", "enabled": false, "arr": [1,2,3]},
1593
- * options = {"enabled": true, "something": 123, "arr": [4,5,6]};
1594
- *
1595
- * // merge the two objects into a new third one without modifying either of the originals
1596
- * var settings = _obj.extend( {}, defaults, options );
1597
- *
1598
- * console.log( settings ); // => {"name": "My Object", "enabled": true, "arr": [4,5,6], "something": 123}
1599
- * console.log( defaults ); // => {"name": "My Object", "enabled": true, "arr": [1,2,3]}
1600
- * console.log( options ); // => {"enabled": true, "arr": [4,5,6], "something": 123}
1601
- */
1602
- _.obj.extend = function(target, object, objectN){
1603
- target = _is.object(target) ? target : {};
1604
- var objects = _fn.arg2arr(arguments);
1605
- objects.shift();
1606
- $.each(objects, function(i, object){
1607
- _.obj.merge(target, object);
1608
- });
1609
- return target;
1610
- };
1611
-
1612
- /**
1613
- * @summary Merge the contents of two objects together into the first `target` object.
1614
- * @memberof FooGallery.utils.obj
1615
- * @function merge
1616
- * @param {Object} target - The object to merge properties into.
1617
- * @param {Object} object - The object containing properties to merge.
1618
- * @returns {Object} The `target` merged with the contents from the `object`.
1619
- * @description This does not merge arrays by index as jQuery does, it treats them as a single property and replaces the array with a shallow copy of the new one.
1620
- *
1621
- * This method is used internally by the {@link FooGallery.utils.obj.extend} method.
1622
- * @example {@run true}
1623
- * // alias the FooGallery.utils.obj namespace
1624
- * var _obj = FooGallery.utils.obj,
1625
- * // create some objects to merge
1626
- * target = {"name": "My Object", "enabled": false, "arr": [1,2,3]},
1627
- * object = {"enabled": true, "something": 123, "arr": [4,5,6]};
1628
- *
1629
- * console.log( _obj.merge( target, object ) ); // => {"name": "My Object", "enabled": true, "arr": [4,5,6], "something": 123}
1630
- */
1631
- _.obj.merge = function(target, object){
1632
- target = _is.object(target) ? target : {};
1633
- object = _is.object(object) ? object : {};
1634
- for (var prop in object) {
1635
- if (object.hasOwnProperty(prop)) {
1636
- if (_is.object(object[prop])) {
1637
- target[prop] = _is.object(target[prop]) ? target[prop] : {};
1638
- _.obj.merge(target[prop], object[prop]);
1639
- } else if (_is.array(object[prop])) {
1640
- target[prop] = object[prop].slice();
1641
- } else {
1642
- target[prop] = object[prop];
1643
- }
1644
- }
1645
- }
1646
- return target;
1647
- };
1648
-
1649
- /**
1650
- * @summary Merge the validated properties of the `object` into the `target` using the optional `mappings`.
1651
- * @memberof FooGallery.utils.obj
1652
- * @function mergeValid
1653
- * @param {Object} target - The object to merge properties into.
1654
- * @param {FooGallery.utils.obj~Validators} validators - An object containing validators for the `target` object properties.
1655
- * @param {Object} object - The object containing properties to merge.
1656
- * @param {FooGallery.utils.obj~Mappings} [mappings] - An object containing property name mappings.
1657
- * @returns {Object} The modified `target` object containing any valid properties from the supplied `object`.
1658
- * @example {@caption Shows the basic usage for this method and shows how invalid properties or those with no corresponding validator are ignored.}{@run true}
1659
- * // alias the FooGallery.utils.obj and FooGallery.utils.is namespaces
1660
- * var _obj = FooGallery.utils.obj,
1661
- * _is = FooGallery.utils.is;
1662
- *
1663
- * //create the target object and it's validators
1664
- * var target = {"name":"John","location":"unknown"},
1665
- * validators = {"name":_is.string,"location":_is.string};
1666
- *
1667
- * // create the object to merge into the target
1668
- * var object = {
1669
- * "name": 1234, // invalid
1670
- * "location": "Liverpool", // updated
1671
- * "notMerged": true // ignored
1672
- * };
1673
- *
1674
- * // merge the object into the target, invalid properties or those with no corresponding validator are ignored.
1675
- * console.log( _obj.mergeValid( target, validators, object ) ); // => { "name": "John", "location": "Liverpool" }
1676
- * @example {@caption Shows how to supply a mappings object for this method.}{@run true}
1677
- * // alias the FooGallery.utils.obj and FooGallery.utils.is namespaces
1678
- * var _obj = FooGallery.utils.obj,
1679
- * _is = FooGallery.utils.is;
1680
- *
1681
- * //create the target object and it's validators
1682
- * var target = {"name":"John","location":"unknown"},
1683
- * validators = {"name":_is.string,"location":_is.string};
1684
- *
1685
- * // create the object to merge into the target
1686
- * var object = {
1687
- * "name": { // ignored
1688
- * "proper": "Christopher", // mapped to name if short is invalid
1689
- * "short": "Chris" // map to name
1690
- * },
1691
- * "city": "London" // map to location
1692
- * };
1693
- *
1694
- * // create the mapping object
1695
- * var mappings = {
1696
- * "name": [ "name.short", "name.proper" ], // try use the short name and fallback to the proper
1697
- * "location": "city"
1698
- * };
1699
- *
1700
- * // merge the object into the target using the mappings, invalid properties or those with no corresponding validator are ignored.
1701
- * console.log( _obj.mergeValid( target, validators, object, mappings ) ); // => { "name": "Chris", "location": "London" }
1702
- */
1703
- _.obj.mergeValid = function(target, validators, object, mappings){
1704
- if (!_is.hash(object) || !_is.hash(validators)) return target;
1705
- validators = _is.hash(validators) ? validators : {};
1706
- mappings = _is.hash(mappings) ? mappings : {};
1707
- var prop, maps, value;
1708
- for (prop in validators){
1709
- if (!validators.hasOwnProperty(prop) || !_is.fn(validators[prop])) continue;
1710
- maps = _is.array(mappings[prop]) ? mappings[prop] : (_is.string(mappings[prop]) ? [mappings[prop]] : [prop]);
1711
- $.each(maps, function(i, map){
1712
- value = _.obj.prop(object, map);
1713
- if (_is.undef(value)) return; // continue
1714
- if (validators[prop](value)){
1715
- _.obj.prop(target, prop, value);
1716
- return false; // break
1717
- }
1718
- });
1719
- }
1720
- return target;
1721
- };
1722
-
1723
- /**
1724
- * @summary Get or set a property value given its `name`.
1725
- * @memberof FooGallery.utils.obj
1726
- * @function prop
1727
- * @param {Object} object - The object to inspect for the property.
1728
- * @param {string} name - The name of the property to fetch. This can be a `.` notated name.
1729
- * @param {*} [value] - If supplied this is the value to set for the property.
1730
- * @returns {*} The value for the `name` property, if it does not exist then `undefined`.
1731
- * @returns {undefined} If a `value` is supplied this method returns nothing.
1732
- * @example {@caption Shows how to get a property value from an object.}{@run true}
1733
- * // alias the FooGallery.utils.obj namespace
1734
- * var _obj = FooGallery.utils.obj,
1735
- * // create an object to test
1736
- * object = {
1737
- * "name": "My Object",
1738
- * "some": {
1739
- * "thing": 123
1740
- * }
1741
- * };
1742
- *
1743
- * console.log( _obj.prop( object, "name" ) ); // => "My Object"
1744
- * console.log( _obj.prop( object, "some.thing" ) ); // => 123
1745
- * @example {@caption Shows how to set a property value for an object.}{@run true}
1746
- * // alias the FooGallery.utils.obj namespace
1747
- * var _obj = FooGallery.utils.obj,
1748
- * // create an object to test
1749
- * object = {
1750
- * "name": "My Object",
1751
- * "some": {
1752
- * "thing": 123
1753
- * }
1754
- * };
1755
- *
1756
- * _obj.prop( object, "name", "My Updated Object" );
1757
- * _obj.prop( object, "some.thing", 987 );
1758
- *
1759
- * console.log( object ); // => { "name": "My Updated Object", "some": { "thing": 987 } }
1760
- */
1761
- _.obj.prop = function(object, name, value){
1762
- if (!_is.object(object) || _is.empty(name)) return;
1763
- var parts, last;
1764
- if (_is.undef(value)){
1765
- if (_str.contains(name, '.')){
1766
- parts = name.split('.');
1767
- last = parts.length - 1;
1768
- $.each(parts, function(i, part){
1769
- if (i === last){
1770
- value = object[part];
1771
- } else if (_is.hash(object[part])) {
1772
- object = object[part];
1773
- } else {
1774
- // exit early
1775
- return false;
1776
- }
1777
- });
1778
- } else if (!_is.undef(object[name])){
1779
- value = object[name];
1780
- }
1781
- return value;
1782
- }
1783
- if (_str.contains(name, '.')){
1784
- parts = name.split('.');
1785
- last = parts.length - 1;
1786
- $.each(parts, function(i, part){
1787
- if (i === last){
1788
- object[part] = value;
1789
- } else {
1790
- object = _is.hash(object[part]) ? object[part] : (object[part] = {});
1791
- }
1792
- });
1793
- } else if (!_is.undef(object[name])){
1794
- object[name] = value;
1795
- }
1796
- };
1797
-
1798
- //######################
1799
- //## Type Definitions ##
1800
- //######################
1801
-
1802
- /**
1803
- * @summary An object used by the {@link FooGallery.utils.obj.mergeValid|mergeValid} method to map new values onto the `target` object.
1804
- * @typedef {Object.<string,string>|Object.<string,Array.<string>>} FooGallery.utils.obj~Mappings
1805
- * @description The mappings object is a single level object. If you want to map a property from/to a child object on either the source or target objects you must supply the name using `.` notation as seen in the below example with the `"name.first"` to `"Name.Short"` mapping.
1806
- * @example {@caption The basic structure of a mappings object is the below.}
1807
- * {
1808
- * "TargetName": "SourceName", // for top level properties
1809
- * "Child.TargetName": "Child.SourceName" // for child properties
1810
- * }
1811
- * @example {@caption Given the following target object.}
1812
- * var target = {
1813
- * "name": {
1814
- * "first": "",
1815
- * "last": null
1816
- * },
1817
- * "age": 0
1818
- * };
1819
- * @example {@caption And the following object to merge.}
1820
- * var object = {
1821
- * "Name": {
1822
- * "Full": "Christopher",
1823
- * "Short": "Chris"
1824
- * },
1825
- * "Age": 32
1826
- * };
1827
- * @example {@caption The mappings object would look like the below.}
1828
- * var mappings = {
1829
- * "name.first": "Name.Short",
1830
- * "age": "Age"
1831
- * };
1832
- * @example {@caption If you want the `"name.first"` property to try to use the `"Name.Short"` value but fallback to `"Name.Proper"` you can specify the mapping value as an array.}
1833
- * var mappings = {
1834
- * "name.first": [ "Name.Short", "Name.Proper" ],
1835
- * "age": "Age"
1836
- * };
1837
- */
1838
-
1839
- /**
1840
- * @summary An object used by the {@link FooGallery.utils.obj.mergeValid|mergeValid} method to validate properties.
1841
- * @typedef {Object.<string,function(*):boolean>} FooGallery.utils.obj~Validators
1842
- * @description The validators object is a single level object. If you want to validate a property of a child object you must supply the name using `.` notation as seen in the below example with the `"name.first"` and `"name.last"` properties.
1843
- *
1844
- * Any function that accepts a value to test as the first argument and returns a boolean can be used as a validator. This means the majority of the {@link FooGallery.utils.is} methods can be used directly. If the property supports multiple types just provide your own function as seen with `"name.last"` in the below example.
1845
- * @example {@caption The basic structure of a validators object is the below.}
1846
- * {
1847
- * "PropName": function(*):boolean, // for top level properties
1848
- * "Child.PropName": function(*):boolean // for child properties
1849
- * }
1850
- * @example {@caption Given the following target object.}
1851
- * var target = {
1852
- * "name": {
1853
- * "first": "", // must be a string
1854
- * "last": null // must be a string or null
1855
- * },
1856
- * "age": 0 // must be a number
1857
- * };
1858
- * @example {@caption The validators object could be created as seen below.}
1859
- * // alias the FooGallery.utils.is namespace
1860
- * var _is = FooGallery.utils.is;
1861
- *
1862
- * var validators = {
1863
- * "name.first": _is.string,
1864
- * "name.last": function(value){
1865
- * return _is.string(value) || value === null;
1866
- * },
1867
- * "age": _is.number
1868
- * };
1869
- */
1870
-
1871
- })(
1872
- // dependencies
1873
- FooGallery.utils.$,
1874
- FooGallery.utils,
1875
- FooGallery.utils.is,
1876
- FooGallery.utils.fn,
1877
- FooGallery.utils.str
1878
- );
1879
- (function($, _, _is){
1880
- // only register methods if this version is the current version
1881
- if (_.version !== '0.0.5') return;
1882
-
1883
- // any methods that have dependencies but don't fall into a specific subset or namespace can be added here
1884
-
1885
- /**
1886
- * @summary The callback for the {@link FooGallery.utils.ready} method.
1887
- * @callback FooGallery.utils~readyCallback
1888
- * @param {jQuery} $ - The instance of jQuery the plugin was registered with.
1889
- * @this window
1890
- * @see Take a look at the {@link FooGallery.utils.ready} method for example usage.
1891
- */
1892
-
1893
- /**
1894
- * @summary Waits for the DOM to be accessible and then executes the supplied callback.
1895
- * @memberof FooGallery.utils
1896
- * @function ready
1897
- * @param {FooGallery.utils~readyCallback} callback - The function to execute once the DOM is accessible.
1898
- * @example {@caption This method can be used as a replacement for the jQuery ready callback to avoid an error in another script stopping our scripts from running.}
1899
- * FooGallery.utils.ready(function($){
1900
- * // do something
1901
- * });
1902
- */
1903
- _.ready = function (callback) {
1904
- function onready(){
1905
- try { callback.call(window, _.$); }
1906
- catch(err) { console.error(err); }
1907
- }
1908
- if (Function('/*@cc_on return true@*/')() ? document.readyState === "complete" : document.readyState !== "loading") onready();
1909
- else document.addEventListener('DOMContentLoaded', onready, false);
1910
- };
1911
-
1912
- // A variable to hold the last number used to generate an ID in the current page.
1913
- var uniqueId = 0;
1914
-
1915
- /**
1916
- * @summary Generate and apply a unique id for the given `$element`.
1917
- * @memberof FooGallery.utils
1918
- * @function uniqueId
1919
- * @param {jQuery} $element - The jQuery element object to retrieve an id from or generate an id for.
1920
- * @param {string} [prefix="uid-"] - A prefix to append to the start of any generated ids.
1921
- * @returns {string} Either the `$element`'s existing id or a generated one that has been applied to it.
1922
- * @example {@run true}
1923
- * // alias the FooGallery.utils namespace
1924
- * var _ = FooGallery.utils;
1925
- *
1926
- * // create some elements to test
1927
- * var $hasId = $("<span/>", {id: "exists"});
1928
- * var $generatedId = $("<span/>");
1929
- * var $generatedPrefixedId = $("<span/>");
1930
- *
1931
- * console.log( _.uniqueId( $hasId ) ); // => "exists"
1932
- * console.log( $hasId.attr( "id" ) ); // => "exists"
1933
- * console.log( _.uniqueId( $generatedId ) ); // => "uid-1"
1934
- * console.log( $generatedId.attr( "id" ) ); // => "uid-1"
1935
- * console.log( _.uniqueId( $generatedPrefixedId, "plugin-" ) ); // => "plugin-2"
1936
- * console.log( $generatedPrefixedId.attr( "id" ) ); // => "plugin-2"
1937
- */
1938
- _.uniqueId = function($element, prefix){
1939
- var id = $element.attr('id');
1940
- if (_is.empty(id)){
1941
- prefix = _is.string(prefix) && !_is.empty(prefix) ? prefix : "uid-";
1942
- id = prefix + (++uniqueId);
1943
- $element.attr('id', id).data('__uniqueId__', true);
1944
- }
1945
- return id;
1946
- };
1947
-
1948
- /**
1949
- * @summary Remove the id from the given `$element` if it was set using the {@link FooGallery.utils.uniqueId|uniqueId} method.
1950
- * @memberof FooGallery.utils
1951
- * @function removeUniqueId
1952
- * @param {jQuery} $element - The jQuery element object to remove a generated id from.
1953
- * @example {@run true}
1954
- * // alias the FooGallery.utils namespace
1955
- * var _ = FooGallery.utils;
1956
- *
1957
- * // create some elements to test
1958
- * var $hasId = $("<span/>", {id: "exists"});
1959
- * var $generatedId = $("<span/>");
1960
- * var $generatedPrefixedId = $("<span/>");
1961
- *
1962
- * console.log( _.uniqueId( $hasId ) ); // => "exists"
1963
- * console.log( _.uniqueId( $generatedId ) ); // => "uid-1"
1964
- * console.log( _.uniqueId( $generatedPrefixedId, "plugin-" ) ); // => "plugin-2"
1965
- */
1966
- _.removeUniqueId = function($element){
1967
- if ($element.data('__uniqueId__')){
1968
- $element.removeAttr('id').removeData('__uniqueId__');
1969
- }
1970
- };
1971
-
1972
- })(
1973
- // dependencies
1974
- FooGallery.utils.$,
1975
- FooGallery.utils,
1976
- FooGallery.utils.is
1977
- );
1978
- (function($, _, _is){
1979
- // only register methods if this version is the current version
1980
- if (_.version !== '0.0.5') return;
1981
-
1982
- /**
1983
- * @summary Contains common utility methods and members for the CSS transition property.
1984
- * @memberof FooGallery.utils
1985
- * @namespace transition
1986
- */
1987
- _.transition = {};
1988
-
1989
- // create a test element to check for the existence of the various transition properties
1990
- var testElement = document.createElement('div');
1991
-
1992
- /**
1993
- * @summary Whether or not transitions are supported by the current browser.
1994
- * @memberof FooGallery.utils.transition
1995
- * @name supported
1996
- * @type {boolean}
1997
- */
1998
- _.transition.supported = (
1999
- /**
2000
- * @ignore
2001
- * @summary Performs a one time test to see if transitions are supported
2002
- * @param {Element} el - An element to test with.
2003
- * @returns {boolean} `true` if transitions are supported.
2004
- */
2005
- function(el){
2006
- var style = el.style;
2007
- return _is.string(style['transition'])
2008
- || _is.string(style['WebkitTransition'])
2009
- || _is.string(style['MozTransition'])
2010
- || _is.string(style['msTransition'])
2011
- || _is.string(style['OTransition']);
2012
- }
2013
- )(testElement);
2014
-
2015
- /**
2016
- * @summary The `transitionend` event name for the current browser.
2017
- * @memberof FooGallery.utils.transition
2018
- * @name end
2019
- * @type {string}
2020
- * @description Depending on the browser this returns one of the following values:
2021
- *
2022
- * <ul><!--
2023
- * --><li>`"transitionend"`</li><!--
2024
- * --><li>`"webkitTransitionEnd"`</li><!--
2025
- * --><li>`"msTransitionEnd"`</li><!--
2026
- * --><li>`"oTransitionEnd"`</li><!--
2027
- * --><li>`null` - If the browser doesn't support transitions</li><!--
2028
- * --></ul>
2029
- */
2030
- _.transition.end = (
2031
- /**
2032
- * @ignore
2033
- * @summary Performs a one time test to determine which `transitionend` event to use for the current browser.
2034
- * @param {Element} el - An element to test with.
2035
- * @returns {?string} The correct `transitionend` event for the current browser, `null` if the browser doesn't support transitions.
2036
- */
2037
- function(el){
2038
- var style = el.style;
2039
- if (_is.string(style['transition'])) return 'transitionend';
2040
- if (_is.string(style['WebkitTransition'])) return 'webkitTransitionEnd';
2041
- if (_is.string(style['MozTransition'])) return 'transitionend';
2042
- if (_is.string(style['msTransition'])) return 'msTransitionEnd';
2043
- if (_is.string(style['OTransition'])) return 'oTransitionEnd';
2044
- return null;
2045
- }
2046
- )(testElement);
2047
-
2048
- /**
2049
- * @summary Gets the `transition-duration` value for the supplied jQuery element.
2050
- * @memberof FooGallery.utils.transition
2051
- * @function duration
2052
- * @param {jQuery} $element - The jQuery element to retrieve the duration from.
2053
- * @param {number} [def=0] - The default value to return if no duration is set.
2054
- * @returns {number} The value of the `transition-duration` property converted to a millisecond value.
2055
- */
2056
- _.transition.duration = function($element, def){
2057
- def = _is.number(def) ? def : 0;
2058
- if (!_is.jq($element)) return def;
2059
- // we can use jQuery.css() method to retrieve the value cross browser
2060
- var duration = $element.css('transition-duration');
2061
- if (/^([\d\.]*)+?(ms|s)$/i.test(duration)){
2062
- // if we have a valid time value
2063
- var match = duration.match(/^([\d\.]*)+?(ms|s)$/i),
2064
- value = parseFloat(match[1]),
2065
- unit = match[2].toLowerCase();
2066
- if (unit === 's'){
2067
- // convert seconds to milliseconds
2068
- value = value * 1000;
2069
- }
2070
- return value;
2071
- }
2072
- return def;
2073
- };
2074
-
2075
- /**
2076
- * @summary Start a transition by toggling the supplied `className` on the `$element`.
2077
- * @memberof FooGallery.utils.transition
2078
- * @function start
2079
- * @param {jQuery} $element - The jQuery element to start the transition on.
2080
- * @param {string} className - One or more class names (separated by spaces) to be toggled that starts the transition.
2081
- * @param {boolean} [state] - A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.
2082
- * @param {number} [timeout] - The maximum time, in milliseconds, to wait for the `transitionend` event to be raised. If not provided this will be automatically set to the elements `transition-duration` property plus an extra 50 milliseconds.
2083
- * @returns {Promise}
2084
- * @description This method lets us use CSS transitions by toggling a class and using the `transitionend` event to perform additional actions once the transition has completed across all browsers. In browsers that do not support transitions this method would behave the same as if just calling jQuery's `.toggleClass` method.
2085
- *
2086
- * The last parameter `timeout` is used to create a timer that behaves as a safety net in case the `transitionend` event is never raised and ensures the deferred returned by this method is resolved or rejected within a specified time.
2087
- * @see {@link https://developer.mozilla.org/en/docs/Web/CSS/transition-duration|transition-duration - CSS | MDN} for more information on the `transition-duration` CSS property.
2088
- */
2089
- _.transition.start = function($element, className, state, timeout){
2090
- var deferred = $.Deferred();
2091
-
2092
- $element = $element.first();
2093
-
2094
- if (_.transition.supported){
2095
- var safety = $element.data('transition_safety');
2096
- if (_is.hash(safety) && _is.number(safety.timer)){
2097
- clearTimeout(safety.timer);
2098
- $element.removeData('transition_safety').off(_.transition.end + '.utils');
2099
- safety.deferred.reject();
2100
- }
2101
- timeout = _is.number(timeout) ? timeout : _.transition.duration($element) + 50;
2102
- safety = {
2103
- deferred: deferred,
2104
- timer: setTimeout(function(){
2105
- // This is the safety net in case a transition fails for some reason and the transitionend event is never raised.
2106
- // This will remove the bound event and resolve the deferred
2107
- $element.removeData('transition_safety').off(_.transition.end + '.utils');
2108
- deferred.resolve();
2109
- }, timeout)
2110
- };
2111
- $element.data('transition_safety', safety);
2112
-
2113
- $element.on(_.transition.end + '.utils', function(e){
2114
- if ($element.is(e.target)){
2115
- clearTimeout(safety.timer);
2116
- $element.removeData('transition_safety').off(_.transition.end + '.utils');
2117
- deferred.resolve();
2118
- }
2119
- });
2120
- }
2121
-
2122
- setTimeout(function(){
2123
- // This is executed inside of a 20ms timeout to allow the binding of the event handler above to actually happen before the class is toggled
2124
- $element.toggleClass(className, state);
2125
- if (!_.transition.supported){
2126
- // If the browser doesn't support transitions then just resolve the deferred
2127
- deferred.resolve();
2128
- }
2129
- }, 20);
2130
-
2131
- return deferred.promise();
2132
- };
2133
-
2134
- })(
2135
- // dependencies
2136
- FooGallery.utils.$,
2137
- FooGallery.utils,
2138
- FooGallery.utils.is
2139
- );
2140
- (function ($, _, _is, _obj, _fn) {
2141
- // only register methods if this version is the current version
2142
- if (_.version !== '0.0.5') return;
2143
-
2144
- /**
2145
- * @summary A base class providing some helper methods for prototypal inheritance.
2146
- * @memberof FooGallery.utils
2147
- * @constructs Class
2148
- * @description This is a base class for making prototypal inheritance simpler to work with. It provides an easy way to inherit from another class and exposes a `_super` method within the scope of any overriding methods that allows a simple way to execute the overridden function.
2149
- *
2150
- * Have a look at the {@link FooGallery.utils.Class.extend|extend} and {@link FooGallery.utils.Class.override|override} method examples to see some basic usage.
2151
- * @example {@caption When using this base class the actual construction of a class is performed by the `construct` method.}
2152
- * var MyClass = FooGallery.utils.Class.extend({
2153
- * construct: function(arg1, arg2){
2154
- * // handle the construction logic here
2155
- * }
2156
- * });
2157
- *
2158
- * // use the class
2159
- * var myClass = new MyClass( "arg1:value", "arg2:value" );
2160
- */
2161
- _.Class = function(){};
2162
-
2163
- /**
2164
- * @ignore
2165
- * @summary The original function when within the scope of an overriding method.
2166
- * @memberof FooGallery.utils.Class#
2167
- * @name _super
2168
- * @type {?function}
2169
- * @description This is only available within the scope of an overriding method if it was created using the {@link FooGallery.utils.Class.extend|extend}, {@link FooGallery.utils.Class.override|override} or {@link FooGallery.utils.fn.addOrOverride} methods.
2170
- * @see {@link FooGallery.utils.fn.addOrOverride} to see an example of how this property is used.
2171
- */
2172
-
2173
- /**
2174
- * @summary Creates a new class that inherits from this one which in turn allows itself to be extended.
2175
- * @memberof FooGallery.utils.Class
2176
- * @function extend
2177
- * @param {Object} [definition] - An object containing any methods to implement/override.
2178
- * @returns {function} A new class that inherits from the base class.
2179
- * @description Every class created using this method has both the {@link FooGallery.utils.Class.extend|extend} and {@link FooGallery.utils.Class.override|override} static methods added to it to allow it to be extended.
2180
- * @example {@caption The below shows an example of how to implement inheritance using this method.}{@run true}
2181
- * // create a base Person class
2182
- * var Person = FooGallery.utils.Class.extend({
2183
- * construct: function(isDancing){
2184
- * this.dancing = isDancing;
2185
- * },
2186
- * dance: function(){
2187
- * return this.dancing;
2188
- * }
2189
- * });
2190
- *
2191
- * var Ninja = Person.extend({
2192
- * construct: function(){
2193
- * // Call the inherited version of construct()
2194
- * this._super( false );
2195
- * },
2196
- * dance: function(){
2197
- * // Call the inherited version of dance()
2198
- * return this._super();
2199
- * },
2200
- * swingSword: function(){
2201
- * return true;
2202
- * }
2203
- * });
2204
- *
2205
- * var p = new Person(true);
2206
- * console.log( p.dance() ); // => true
2207
- *
2208
- * var n = new Ninja();
2209
- * console.log( n.dance() ); // => false
2210
- * console.log( n.swingSword() ); // => true
2211
- * console.log(
2212
- * p instanceof Person && p.constructor === Person && p instanceof FooGallery.utils.Class
2213
- * && n instanceof Ninja && n.constructor === Ninja && n instanceof Person && n instanceof FooGallery.utils.Class
2214
- * ); // => true
2215
- */
2216
- _.Class.extend = function(definition){
2217
- definition = _is.hash(definition) ? definition : {};
2218
- var proto = _obj.create(this.prototype); // create a new prototype to work with so we don't modify the original
2219
- // iterate over all properties in the supplied definition and update the prototype
2220
- for (var name in definition) {
2221
- if (!definition.hasOwnProperty(name)) continue;
2222
- _fn.addOrOverride(proto, name, definition[name]);
2223
- }
2224
- // if no construct method is defined add a default one that does nothing
2225
- proto.construct = _is.fn(proto.construct) ? proto.construct : function(){};
2226
-
2227
- // create the new class using the prototype made above
2228
- function Class() {
2229
- if (!_is.fn(this.construct))
2230
- throw new SyntaxError('FooGallery.utils.Class objects must be constructed with the "new" keyword.');
2231
- this.construct.apply(this, arguments);
2232
- }
2233
- Class.prototype = proto;
2234
- //noinspection JSUnresolvedVariable
2235
- Class.prototype.constructor = _is.fn(proto.__ctor__) ? proto.__ctor__ : Class;
2236
- Class.extend = _.Class.extend;
2237
- Class.override = _.Class.override;
2238
- return Class;
2239
- };
2240
-
2241
- /**
2242
- * @summary Overrides a single method on this class.
2243
- * @memberof FooGallery.utils.Class
2244
- * @function override
2245
- * @param {string} name - The name of the function to override.
2246
- * @param {function} fn - The new function to override with, the `_super` method will be made available within this function.
2247
- * @description This is a helper method for overriding a single function of a {@link FooGallery.utils.Class} or one of its child classes. This uses the {@link FooGallery.utils.fn.addOrOverride} method internally and simply provides the correct prototype.
2248
- * @example {@caption The below example wraps the `Person.prototype.dance` method with a new one that inverts the result. Note the override applies even to instances of the class that are already created.}{@run true}
2249
- * var Person = FooGallery.utils.Class.extend({
2250
- * construct: function(isDancing){
2251
- * this.dancing = isDancing;
2252
- * },
2253
- * dance: function(){
2254
- * return this.dancing;
2255
- * }
2256
- * });
2257
- *
2258
- * var p = new Person(true);
2259
- * console.log( p.dance() ); // => true
2260
- *
2261
- * Person.override("dance", function(){
2262
- * // Call the original version of dance()
2263
- * return !this._super();
2264
- * });
2265
- *
2266
- * console.log( p.dance() ); // => false
2267
- */
2268
- _.Class.override = function(name, fn){
2269
- _fn.addOrOverride(this.prototype, name, fn);
2270
- };
2271
-
2272
- })(
2273
- // dependencies
2274
- FooGallery.utils.$,
2275
- FooGallery.utils,
2276
- FooGallery.utils.is,
2277
- FooGallery.utils.obj,
2278
- FooGallery.utils.fn
2279
- );
2280
- (function($, _, _is){
2281
- // only register methods if this version is the current version
2282
- if (_.version !== '0.0.5') return;
2283
-
2284
- _.Bounds = _.Class.extend(/** @lends FooGallery.utils.Bounds */{
2285
- /**
2286
- * @summary A simple bounding rectangle class.
2287
- * @memberof FooGallery.utils
2288
- * @constructs Bounds
2289
- * @augments FooGallery.utils.Class
2290
- * @borrows FooGallery.utils.Class.extend as extend
2291
- * @borrows FooGallery.utils.Class.override as override
2292
- */
2293
- construct: function(){
2294
- var self = this;
2295
- self.top = 0;
2296
- self.right = 0;
2297
- self.bottom = 0;
2298
- self.left = 0;
2299
- self.width = 0;
2300
- self.height = 0;
2301
- },
2302
- /**
2303
- * @summary Inflate the bounds by the specified amount.
2304
- * @memberof FooGallery.utils.Bounds#
2305
- * @function inflate
2306
- * @param {number} amount - A positive number will expand the bounds while a negative one will shrink it.
2307
- * @returns {FooGallery.utils.Bounds}
2308
- */
2309
- inflate: function(amount){
2310
- var self = this;
2311
- if (_is.number(amount)){
2312
- self.top -= amount;
2313
- self.right += amount;
2314
- self.bottom += amount;
2315
- self.left -= amount;
2316
- self.width += amount * 2;
2317
- self.height += amount * 2;
2318
- }
2319
- return self;
2320
- },
2321
- /**
2322
- * @summary Checks if the supplied bounds object intersects with this one.
2323
- * @memberof FooGallery.utils.Bounds#
2324
- * @function intersects
2325
- * @param {FooGallery.utils.Bounds} bounds - The bounds to check.
2326
- * @returns {boolean}
2327
- */
2328
- intersects: function(bounds){
2329
- var self = this;
2330
- return self.left <= bounds.right && bounds.left <= self.right && self.top <= bounds.bottom && bounds.top <= self.bottom;
2331
- }
2332
- });
2333
-
2334
- var __$window;
2335
- /**
2336
- * @summary Gets the bounding rectangle of the current viewport.
2337
- * @memberof FooGallery.utils
2338
- * @function getViewportBounds
2339
- * @param {number} [inflate] - An amount to inflate the bounds by. A positive number will expand the bounds outside of the visible viewport while a negative one would shrink it.
2340
- * @returns {FooGallery.utils.Bounds}
2341
- */
2342
- _.getViewportBounds = function(inflate){
2343
- if (!__$window) __$window = $(window);
2344
- var bounds = new _.Bounds();
2345
- bounds.top = __$window.scrollTop();
2346
- bounds.left = __$window.scrollLeft();
2347
- bounds.width = __$window.width();
2348
- bounds.height = __$window.height();
2349
- bounds.right = bounds.left + bounds.width;
2350
- bounds.bottom = bounds.top + bounds.height;
2351
- bounds.inflate(inflate);
2352
- return bounds;
2353
- };
2354
-
2355
- /**
2356
- * @summary Get the bounding rectangle for the supplied element.
2357
- * @memberof FooGallery.utils
2358
- * @function getElementBounds
2359
- * @param {(jQuery|HTMLElement|string)} element - The jQuery wrapper around the element, the element itself, or a CSS selector to retrieve the element with.
2360
- * @returns {FooGallery.utils.Bounds}
2361
- */
2362
- _.getElementBounds = function(element){
2363
- if (!_is.jq(element)) element = $(element);
2364
- var bounds = new _.Bounds();
2365
- if (element.length !== 0){
2366
- var offset = element.offset();
2367
- bounds.top = offset.top;
2368
- bounds.left = offset.left;
2369
- bounds.width = element.width();
2370
- bounds.height = element.height();
2371
- }
2372
- bounds.right = bounds.left + bounds.width;
2373
- bounds.bottom = bounds.top + bounds.height;
2374
- return bounds;
2375
- };
2376
-
2377
- })(
2378
- FooGallery.utils.$,
2379
- FooGallery.utils,
2380
- FooGallery.utils.is
2381
- );
2382
- (function($, _, _is, _fn){
2383
- // only register methods if this version is the current version
2384
- if (_.version !== '0.0.5') return;
2385
-
2386
- _.Factory = _.Class.extend(/** @lends FooGallery.utils.Factory */{
2387
- /**
2388
- * @summary A factory for classes allowing them to be registered and created using a friendly name.
2389
- * @memberof FooGallery.utils
2390
- * @constructs Factory
2391
- * @description This class allows other classes to register themselves for use at a later time. Depending on how you intend to use the registered classes you can also specify a load and execution order through the `priority` parameter of the {@link FooGallery.utils.Factory#register|register} method.
2392
- * @augments FooGallery.utils.Class
2393
- * @borrows FooGallery.utils.Class.extend as extend
2394
- * @borrows FooGallery.utils.Class.override as override
2395
- */
2396
- construct: function(){
2397
- /**
2398
- * @summary An object containing all registered classes.
2399
- * @memberof FooGallery.utils.Factory#
2400
- * @name registered
2401
- * @type {Object.<string, Object>}
2402
- * @readonly
2403
- * @example {@caption The following shows the structure of this object. The `<name>` placeholders would be the name the class was registered with.}
2404
- * {
2405
- * "<name>": {
2406
- * "name": <string>,
2407
- * "klass": <function>,
2408
- * "priority": <number>
2409
- * },
2410
- * "<name>": {
2411
- * "name": <string>,
2412
- * "klass": <function>,
2413
- * "priority": <number>
2414
- * },
2415
- * ...
2416
- * }
2417
- */
2418
- this.registered = {};
2419
- },
2420
- /**
2421
- * @summary Checks if the factory contains a class registered using the supplied `name`.
2422
- * @memberof FooGallery.utils.Factory#
2423
- * @function contains
2424
- * @param {string} name - The name of the class to check.
2425
- * @returns {boolean}
2426
- * @example {@run true}
2427
- * // create a new instance of the factory, this is usually exposed by the class that will be using the factory.
2428
- * var factory = new FooGallery.utils.Factory();
2429
- *
2430
- * // create a class to register
2431
- * function Test(){}
2432
- *
2433
- * // register the class with the factory with the default priority
2434
- * factory.register( "test", Test );
2435
- *
2436
- * // test if the class was registered
2437
- * console.log( factory.contains( "test" ) ); // => true
2438
- */
2439
- contains: function(name){
2440
- return !_is.undef(this.registered[name]);
2441
- },
2442
- /**
2443
- * @summary Creates new instances of all registered classes using there registered priority and the supplied arguments.
2444
- * @memberof FooGallery.utils.Factory#
2445
- * @function load
2446
- * @param {Object.<string, function>} overrides - An object containing classes to override any matching registered classes with, if no overrides are required you can pass `false` or `null`.
2447
- * @param {*} arg1 - The first argument to supply when creating new instances of all registered classes.
2448
- * @param {...*} [argN] - Any number of additional arguments to supply when creating new instances of all registered classes.
2449
- * @returns {Array.<Object>} An array containing new instances of all registered classes.
2450
- * @description The class indexes within the result array are determined by the `priority` they were registered with, the higher the `priority` the lower the index.
2451
- *
2452
- * This method is designed to be used when all registered classes share a common interface or base type and constructor arguments.
2453
- * @example {@caption The following loads all registered classes into an array ordered by there priority.}{@run true}
2454
- * // create a new instance of the factory, this is usually exposed by the class that will be using the factory.
2455
- * var factory = new FooGallery.utils.Factory();
2456
- *
2457
- * // create a base Extension class
2458
- * var Extension = FooGallery.utils.Class.extend({
2459
- * construct: function( type, options ){
2460
- * this.type = type;
2461
- * this.options = options;
2462
- * },
2463
- * getType: function(){
2464
- * return this.type;
2465
- * }
2466
- * });
2467
- *
2468
- * // create various item, this would usually be in another file
2469
- * var MyExtension1 = Extension.extend({
2470
- * construct: function(options){
2471
- * this._super( "my-extension-1", options );
2472
- * }
2473
- * });
2474
- * factory.register( "my-extension-1", MyExtension1, 0 );
2475
- *
2476
- * // create various item, this would usually be in another file
2477
- * var MyExtension2 = Extension.extend({
2478
- * construct: function(options){
2479
- * this._super( "my-extension-2", options );
2480
- * }
2481
- * });
2482
- * factory.register( "my-extension-2", MyExtension2, 1 );
2483
- *
2484
- * // load all registered classes according to there priority passing the options to all constructors
2485
- * var loaded = factory.load( null, {"something": true} );
2486
- *
2487
- * // only two classes should be loaded
2488
- * console.log( loaded.length ); // => 2
2489
- *
2490
- * // the MyExtension2 class is loaded first due to it's priority being higher than the MyExtension1 class.
2491
- * console.log( loaded[0] instanceof MyExtension2 && loaded[0] instanceof Extension ); // => true
2492
- * console.log( loaded[1] instanceof MyExtension1 && loaded[1] instanceof Extension ); // => true
2493
- *
2494
- * // do something with the loaded classes
2495
- * @example {@caption The following loads all registered classes into an array ordered by there priority but uses the overrides parameter to swap out one of them for a custom implementation.}{@run true}
2496
- * // create a new instance of the factory, this is usually exposed by the class that will be using the factory.
2497
- * var factory = new FooGallery.utils.Factory();
2498
- *
2499
- * // create a base Extension class
2500
- * var Extension = FooGallery.utils.Class.extend({
2501
- * construct: function( type, options ){
2502
- * this.type = type;
2503
- * this.options = options;
2504
- * },
2505
- * getType: function(){
2506
- * return this.type;
2507
- * }
2508
- * });
2509
- *
2510
- * // create a new extension, this would usually be in another file
2511
- * var MyExtension1 = Extension.extend({
2512
- * construct: function(options){
2513
- * this._super( "my-extension-1", options );
2514
- * }
2515
- * });
2516
- * factory.register( "my-extension-1", MyExtension1, 0 );
2517
- *
2518
- * // create a new extension, this would usually be in another file
2519
- * var MyExtension2 = Extension.extend({
2520
- * construct: function(options){
2521
- * this._super( "my-extension-2", options );
2522
- * }
2523
- * });
2524
- * factory.register( "my-extension-2", MyExtension2, 1 );
2525
- *
2526
- * // create a custom extension that is not registered but overrides the default "my-extension-1"
2527
- * var UpdatedMyExtension1 = MyExtension1.extend({
2528
- * construct: function(options){
2529
- * this._super( options );
2530
- * // do something different to the original MyExtension1 class
2531
- * }
2532
- * });
2533
- *
2534
- * // load all registered classes but swaps out the registered "my-extension-1" for the supplied override.
2535
- * var loaded = factory.load( {"my-extension-1": UpdatedMyExtension1}, {"something": true} );
2536
- *
2537
- * // only two classes should be loaded
2538
- * console.log( loaded.length ); // => 2
2539
- *
2540
- * // the MyExtension2 class is loaded first due to it's priority being higher than the UpdatedMyExtension1 class which inherited a priority of 0.
2541
- * console.log( loaded[0] instanceof MyExtension2 && loaded[0] instanceof Extension ); // => true
2542
- * console.log( loaded[1] instanceof UpdatedMyExtension1 && loaded[1] instanceof MyExtension1 && loaded[1] instanceof Extension ); // => true
2543
- *
2544
- * // do something with the loaded classes
2545
- */
2546
- load: function(overrides, arg1, argN){
2547
- var self = this,
2548
- args = _fn.arg2arr(arguments),
2549
- reg = [],
2550
- loaded = [],
2551
- name, klass;
2552
-
2553
- overrides = args.shift() || {};
2554
- for (name in self.registered){
2555
- if (!self.registered.hasOwnProperty(name)) continue;
2556
- var component = self.registered[name];
2557
- if (overrides.hasOwnProperty(name)){
2558
- klass = overrides[name];
2559
- if (_is.string(klass)) klass = _fn.fetch(overrides[name]);
2560
- if (_is.fn(klass)){
2561
- component = {name: name, klass: klass, priority: self.registered[name].priority};
2562
- }
2563
- }
2564
- reg.push(component);
2565
- }
2566
-
2567
- for (name in overrides){
2568
- if (!overrides.hasOwnProperty(name) || self.registered.hasOwnProperty(name)) continue;
2569
- klass = overrides[name];
2570
- if (_is.string(klass)) klass = _fn.fetch(overrides[name]);
2571
- if (_is.fn(klass)){
2572
- reg.push({name: name, klass: klass, priority: 0});
2573
- }
2574
- }
2575
-
2576
- reg.sort(function(a, b){ return b.priority - a.priority; });
2577
- $.each(reg, function(i, r){
2578
- if (_is.fn(r.klass)){
2579
- loaded.push(_fn.apply(r.klass, args));
2580
- }
2581
- });
2582
- return loaded;
2583
- },
2584
- /**
2585
- * @summary Create a new instance of a class registered with the supplied `name` and arguments.
2586
- * @memberof FooGallery.utils.Factory#
2587
- * @function make
2588
- * @param {string} name - The name of the class to create.
2589
- * @param {*} arg1 - The first argument to supply to the new instance.
2590
- * @param {...*} [argN] - Any number of additional arguments to supply to the new instance.
2591
- * @returns {Object}
2592
- * @example {@caption The following shows how to create a new instance of a registered class.}{@run true}
2593
- * // create a new instance of the factory, this is usually done by the class that will be using it.
2594
- * var factory = new FooGallery.utils.Factory();
2595
- *
2596
- * // create a Logger class to register, this would usually be in another file
2597
- * var Logger = FooGallery.utils.Class.extend({
2598
- * write: function( message ){
2599
- * console.log( "Logger#write: " + message );
2600
- * }
2601
- * });
2602
- *
2603
- * factory.register( "logger", Logger );
2604
- *
2605
- * // create a new instances of the class registered as "logger"
2606
- * var logger = factory.make( "logger" );
2607
- * logger.write( "My message" ); // => "Logger#write: My message"
2608
- */
2609
- make: function(name, arg1, argN){
2610
- var self = this, args = _fn.arg2arr(arguments), reg;
2611
- name = args.shift();
2612
- reg = self.registered[name];
2613
- if (_is.hash(reg) && _is.fn(reg.klass)){
2614
- return _fn.apply(reg.klass, args);
2615
- }
2616
- return null;
2617
- },
2618
- /**
2619
- * @summary Gets an array of all registered names.
2620
- * @memberof FooGallery.utils.Factory#
2621
- * @function names
2622
- * @param {boolean} [prioritize=false] - Whether or not to order the names by the priority they were registered with.
2623
- * @returns {Array.<string>}
2624
- * @example {@run true}
2625
- * // create a new instance of the factory, this is usually exposed by the class that will be using the factory.
2626
- * var factory = new FooGallery.utils.Factory();
2627
- *
2628
- * // create some classes to register
2629
- * function Test1(){}
2630
- * function Test2(){}
2631
- *
2632
- * // register the classes with the factory with the default priority
2633
- * factory.register( "test-1", Test1 );
2634
- * factory.register( "test-2", Test2, 1 );
2635
- *
2636
- * // log all registered names
2637
- * console.log( factory.names() ); // => ["test-1","test-2"]
2638
- * console.log( factory.names( true ) ); // => ["test-2","test-1"] ~ "test-2" appears before "test-1" as it was registered with a higher priority
2639
- */
2640
- names: function( prioritize ){
2641
- prioritize = _is.boolean(prioritize) ? prioritize : false;
2642
- var names = [], name;
2643
- if (prioritize){
2644
- var reg = [];
2645
- for (name in this.registered){
2646
- if (!this.registered.hasOwnProperty(name)) continue;
2647
- reg.push(this.registered[name]);
2648
- }
2649
- reg.sort(function(a, b){ return b.priority - a.priority; });
2650
- $.each(reg, function(i, r){
2651
- names.push(r.name);
2652
- });
2653
- } else {
2654
- for (name in this.registered){
2655
- if (!this.registered.hasOwnProperty(name)) continue;
2656
- names.push(name);
2657
- }
2658
- }
2659
- return names;
2660
- },
2661
- /**
2662
- * @summary Registers a `klass` constructor with the factory using the given `name`.
2663
- * @memberof FooGallery.utils.Factory#
2664
- * @function register
2665
- * @param {string} name - The friendly name of the class.
2666
- * @param {function} klass - The class constructor to register.
2667
- * @param {number} [priority=0] - This determines the index for the class when using either the {@link FooGallery.utils.Factory#load|load} or {@link FooGallery.utils.Factory#names|names} methods, a higher value equals a lower index.
2668
- * @returns {boolean} `true` if the `klass` was successfully registered.
2669
- * @description Once a class is registered you can use either the {@link FooGallery.utils.Factory#load|load} or {@link FooGallery.utils.Factory#make|make} methods to create new instances depending on your use case.
2670
- * @example {@run true}
2671
- * // create a new instance of the factory, this is usually exposed by the class that will be using the factory.
2672
- * var factory = new FooGallery.utils.Factory();
2673
- *
2674
- * // create a class to register
2675
- * function Test(){}
2676
- *
2677
- * // register the class with the factory with the default priority
2678
- * var succeeded = factory.register( "test", Test );
2679
- *
2680
- * console.log( succeeded ); // => true
2681
- * console.log( factory.registered.hasOwnProperty( "test" ) ); // => true
2682
- * console.log( factory.registered[ "test" ].name === "test" ); // => true
2683
- * console.log( factory.registered[ "test" ].klass === Test ); // => true
2684
- * console.log( factory.registered[ "test" ].priority === 0 ); // => true
2685
- */
2686
- register: function(name, klass, priority){
2687
- if (!_is.string(name) || _is.empty(name) || !_is.fn(klass)) return false;
2688
- priority = _is.number(priority) ? priority : 0;
2689
- var current = this.registered[name];
2690
- this.registered[name] = {
2691
- name: name,
2692
- klass: klass,
2693
- priority: !_is.undef(current) ? current.priority : priority
2694
- };
2695
- return true;
2696
- }
2697
- });
2698
-
2699
- })(
2700
- // dependencies
2701
- FooGallery.utils.$,
2702
- FooGallery.utils,
2703
- FooGallery.utils.is,
2704
- FooGallery.utils.fn
2705
- );
2706
- (function(_, _fn, _str){
2707
- // only register methods if this version is the current version
2708
- if (_.version !== '0.0.5') return;
2709
-
2710
- _.Debugger = _.Class.extend(/** @lends FooGallery.utils.Debugger */{
2711
- /**
2712
- * @summary A debug utility class that can be enabled across sessions using the given `key` by storing its state in `localStorage`.
2713
- * @memberof FooGallery.utils
2714
- * @constructs Debugger
2715
- * @param {string} key - The key to use to store the debug state in `localStorage`.
2716
- * @description This class allows you to write additional debug info to the console within your code which by default is not actually output. You can then enable the debugger and it will start to output the results to the console.
2717
- *
2718
- * This most useful feature of this is the ability to store the debug state across page sessions by using `localStorage`. This allows you enable the debugger and then refresh the page to view any debugger output that occurs on page load.
2719
- */
2720
- construct: function(key){
2721
- /**
2722
- * @summary The key used to store the debug state in `localStorage`.
2723
- * @memberof FooGallery.utils.Debugger#
2724
- * @name key
2725
- * @type {string}
2726
- */
2727
- this.key = key;
2728
- /**
2729
- * @summary Whether or not the debugger is currently enabled.
2730
- * @memberof FooGallery.utils.Debugger#
2731
- * @name enabled
2732
- * @type {boolean}
2733
- * @readonly
2734
- * @description The value for this property is synced with the current state stored in `localStorage` and should never set from outside of this class.
2735
- */
2736
- this.enabled = !!localStorage.getItem(this.key);
2737
- },
2738
- /**
2739
- * @summary Enable the debugger causing additional info to be logged to the console.
2740
- * @memberof FooGallery.utils.Debugger#
2741
- * @function enable
2742
- * @example
2743
- * var d = new FooGallery.utils.Debugger( "FOO_DEBUG" );
2744
- * d.log( "Never logged" );
2745
- * d.enabled();
2746
- * d.log( "I am logged!" );
2747
- */
2748
- enable: function(){
2749
- this.enabled = true;
2750
- localStorage.setItem(this.key, this.enabled);
2751
- },
2752
- /**
2753
- * @summary Disable the debugger stopping additional info being logged to the console.
2754
- * @memberof FooGallery.utils.Debugger#
2755
- * @function disable
2756
- * @example
2757
- * var d = new FooGallery.utils.Debugger( "FOO_DEBUG" );
2758
- * d.log( "Never logged" );
2759
- * d.enabled();
2760
- * d.log( "I am logged!" );
2761
- * d.disable();
2762
- * d.log( "Never logged" );
2763
- */
2764
- disable: function(){
2765
- this.enabled = false;
2766
- localStorage.removeItem(this.key);
2767
- },
2768
- /**
2769
- * @summary Logs the supplied message and additional arguments to the console when enabled.
2770
- * @memberof FooGallery.utils.Debugger#
2771
- * @function log
2772
- * @param {string} message - The message to log to the console.
2773
- * @param {*} [argN] - Any number of additional arguments to supply after the message.
2774
- * @description This method basically wraps the `console.log` method and simply checks the enabled state of the debugger before passing along any supplied arguments.
2775
- */
2776
- log: function(message, argN){
2777
- if (!this.enabled) return;
2778
- console.log.apply(console, _fn.arg2arr(arguments));
2779
- },
2780
- /**
2781
- * @summary Logs the formatted message and additional arguments to the console when enabled.
2782
- * @memberof FooGallery.utils.Debugger#
2783
- * @function logf
2784
- * @param {string} message - The message containing named `replacements` to log to the console.
2785
- * @param {Object.<string, *>} replacements - An object containing key value pairs used to perform a named format on the `message`.
2786
- * @param {*} [argN] - Any number of additional arguments to supply after the message.
2787
- * @see {@link FooGallery.utils.str.format} for more information on supplying the replacements object.
2788
- */
2789
- logf: function(message, replacements, argN){
2790
- if (!this.enabled) return;
2791
- var args = _fn.arg2arr(arguments);
2792
- message = args.shift();
2793
- replacements = args.shift();
2794
- args.unshift(_str.format(message, replacements));
2795
- this.log.apply(this, args);
2796
- }
2797
- });
2798
-
2799
- })(
2800
- // dependencies
2801
- FooGallery.utils,
2802
- FooGallery.utils.fn,
2803
- FooGallery.utils.str
2804
- );
2805
- (function($, _, _is){
2806
- // only register methods if this version is the current version
2807
- if (_.version !== '0.0.5') return;
2808
-
2809
- _.Throttle = _.Class.extend(/** @lends FooGallery.utils.Throttle */{
2810
- /**
2811
- * @summary A timer to throttle the execution of code.
2812
- * @memberof FooGallery.utils
2813
- * @constructs
2814
- * @param {number} [idle=0] - The idle time, in milliseconds, that must pass before executing the callback supplied to the {@link FooGallery.utils.Throttle#limit|limit} method.
2815
- * @augments FooGallery.utils.Class
2816
- * @borrows FooGallery.utils.Class.extend as extend
2817
- * @borrows FooGallery.utils.Class.override as override
2818
- * @description This class is basically a wrapper around the {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout|window.setTimeout} and {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout|window.clearTimeout} functions. It was created to help throttle the execution of code in event handlers that could be called multiple times per second such as the window resize event. It is meant to limit the execution of expensive code until the specified idle time has lapsed.
2819
- *
2820
- * Take a look at the examples for the {@link FooGallery.utils.Throttle#limit|limit} and {@link FooGallery.utils.Throttle#clear|clear} methods for basic usage.
2821
- * @example <caption>The below shows how you can use this class to prevent expensive code being executed with every call to your window resize handler. If you run this example resize your browser to see when the messages are logged.</caption>{@run true}
2822
- * var throttle = new FooGallery.utils.Throttle( 50 );
2823
- *
2824
- * $(window).on("resize", function(){
2825
- *
2826
- * throttle.limit(function(){
2827
- * console.log( "Only called when resizing has stopped for at least 50 milliseconds." );
2828
- * });
2829
- *
2830
- * });
2831
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout|WindowTimers.setTimeout() - Web APIs | MDN}
2832
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout|WindowTimers.clearTimeout() - Web APIs | MDN}
2833
- */
2834
- construct: function(idle){
2835
- /**
2836
- * @summary The id from the last call to {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout|window.setTimeout}.
2837
- * @type {?number}
2838
- * @readonly
2839
- * @default null
2840
- */
2841
- this.id = null;
2842
- /**
2843
- * @summary Whether or not there is an active timer.
2844
- * @type {boolean}
2845
- * @readonly
2846
- * @default false
2847
- */
2848
- this.active = false;
2849
- /**
2850
- * @summary The idle time, in milliseconds, the timer should wait before executing the callback supplied to the {@link FooGallery.utils.Throttle#limit|limit} method.
2851
- * @type {number}
2852
- * @readonly
2853
- * @default 0
2854
- */
2855
- this.idle = _is.number(idle) ? idle : 0;
2856
- },
2857
- /**
2858
- * @summary Starts a new timer clearing any previously set and executes the <code>callback</code> once it expires.
2859
- * @instance
2860
- * @param {function} callback - The function to call once the timer expires.
2861
- * @example <caption>In the below example the <code>callback</code> function will only be executed once despite the repeated calls to the {@link FooGallery.utils.Throttle#limit|limit} method as each call resets the idle timer.</caption>{@run true}
2862
- * // create a new throttle
2863
- * var throttle = new FooGallery.utils.Throttle( 50 );
2864
- *
2865
- * // this `for` loop represents something like the window resize event that could call your handler multiple times a second
2866
- * for (var i = 0, max = 5; i < max; i++){
2867
- *
2868
- * throttle.limit( function(){
2869
- * console.log( "Only called once, after the idle timer lapses" );
2870
- * } );
2871
- *
2872
- * }
2873
- */
2874
- limit: function(callback){
2875
- if (!_is.fn(callback)) return;
2876
- this.clear();
2877
- var self = this;
2878
- this.active = true;
2879
- this.id = setTimeout(function(){
2880
- self.active = false;
2881
- self.id = null;
2882
- callback();
2883
- }, this.idle);
2884
- },
2885
- /**
2886
- * @summary Clear any previously set timer and prevent the execution of its' callback.
2887
- * @instance
2888
- * @example <caption>The below shows how to cancel an active throttle and prevent the execution of it's callback.</caption>{@run true}
2889
- * // create a new throttle
2890
- * var throttle = new FooGallery.utils.Throttle( 50 );
2891
- *
2892
- * // this `for` loop represents something like the window resize event that could call your handler multiple times a second
2893
- * for (var i = 0, max = 5; i < max; i++){
2894
- *
2895
- * throttle.limit( function(){
2896
- * console.log( "I'm never called" );
2897
- * } );
2898
- *
2899
- * }
2900
- *
2901
- * // cancel the current throttle timer
2902
- * throttle.clear();
2903
- */
2904
- clear: function(){
2905
- if (_is.number(this.id)){
2906
- clearTimeout(this.id);
2907
- this.active = false;
2908
- this.id = null;
2909
- }
2910
- }
2911
- });
2912
-
2913
- })(
2914
- // dependencies
2915
- FooGallery.utils.$,
2916
- FooGallery.utils,
2917
- FooGallery.utils.is
2918
- );
2919
- (function($, _, _utils, _is, _fn){
2920
-
2921
- _.debug = new _utils.Debugger("__FooGallery__");
2922
-
2923
- /**
2924
- * @summary Simple utility method to convert space delimited strings of CSS class names into a CSS selector.
2925
- * @memberof FooGallery.utils
2926
- * @function selectify
2927
- * @param {(string|string[]|object)} classes - A single space delimited string of CSS class names to convert or an array of them with each item being included in the selector using the OR (`,`) syntax as a separator. If an object is supplied the result will be an object with the same property names but the values converted to selectors.
2928
- * @returns {(object|string)}
2929
- */
2930
- _utils.selectify = function(classes){
2931
- if (_is.hash(classes)){
2932
- var result = {}, selector;
2933
- for (var name in classes){
2934
- if (!classes.hasOwnProperty(name)) continue;
2935
- if (selector = _utils.selectify(classes[name])){
2936
- result[name] = selector;
2937
- }
2938
- }
2939
- return result;
2940
- }
2941
- if (_is.string(classes) || _is.array(classes)){
2942
- if (_is.string(classes)) classes = [classes];
2943
- return $.map(classes, function(str){
2944
- return _is.string(str) ? "." + str.split(/\s/g).join(".") : null;
2945
- }).join(",");
2946
- }
2947
- return null;
2948
- };
2949
-
2950
- /**
2951
- * @summary The url of an empty 1x1 pixel image used as the default value for the `placeholder` and `error` {@link FooGallery.defaults|options}.
2952
- * @memberof FooGallery
2953
- * @name emptyImage
2954
- * @type {string}
2955
- * @default "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
2956
- */
2957
- _.emptyImage = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
2958
-
2959
- /**
2960
- * @summary The name to use when getting or setting an instance of a {@link FooGallery.Template|template} on an element using jQuery's `.data()` method.
2961
- * @memberof FooGallery
2962
- * @name dataTemplate
2963
- * @type {string}
2964
- * @default "__FooGallery__"
2965
- */
2966
- _.dataTemplate = "__FooGallery__";
2967
-
2968
- /**
2969
- * @summary The name to use when getting or setting an instance of a {@link FooGallery.Item|item} on an element using jQuery's `.data()` method.
2970
- * @memberof FooGallery
2971
- * @name dataItem
2972
- * @type {string}
2973
- * @default "__FooGalleryItem__"
2974
- */
2975
- _.dataItem = "__FooGalleryItem__";
2976
-
2977
- _.init = function(options, element){
2978
- return _.template.make(options, element).initialize();
2979
- };
2980
-
2981
- _.initAll = function(options){
2982
- return _fn.when($(".foogallery").map(function(i, element){
2983
- return _.init(options, element);
2984
- }).get());
2985
- };
2986
-
2987
- _.parseSrc = function(src, srcWidth, srcHeight, srcset, renderWidth, renderHeight){
2988
- if (!_is.string(src)) return null;
2989
- // if there is no srcset just return the src
2990
- if (!_is.string(srcset)) return src;
2991
-
2992
- // parse the srcset into objects containing the url, width, height and pixel density for each supplied source
2993
- var list = $.map(srcset.replace(/(\s[\d.]+[whx]),/g, '$1 @,@ ').split(' @,@ '), function (val) {
2994
- return {
2995
- url: /^\s*(\S*)/.exec(val)[1],
2996
- w: parseFloat((/\S\s+(\d+)w/.exec(val) || [0, Infinity])[1]),
2997
- h: parseFloat((/\S\s+(\d+)h/.exec(val) || [0, Infinity])[1]),
2998
- x: parseFloat((/\S\s+([\d.]+)x/.exec(val) || [0, 1])[1])
2999
- };
3000
- });
3001
-
3002
- // if there is no items parsed from the srcset then just return the src
3003
- if (!list.length) return src;
3004
-
3005
- // add the current src into the mix by inspecting the first parsed item to figure out how to handle it
3006
- list.unshift({
3007
- url: src,
3008
- w: list[0].w !== Infinity && list[0].h === Infinity ? srcWidth : Infinity,
3009
- h: list[0].h !== Infinity && list[0].w === Infinity ? srcHeight : Infinity,
3010
- x: 1
3011
- });
3012
-
3013
- // get the current viewport info and use it to determine the correct src to load
3014
- var dpr = window.devicePixelRatio || 1,
3015
- area = {w: renderWidth * dpr, h: renderHeight * dpr, x: dpr},
3016
- property;
3017
-
3018
- // first check each of the viewport properties against the max values of the same properties in our src array
3019
- // only src's with a property greater than the viewport or equal to the max are kept
3020
- for (property in area) {
3021
- if (!area.hasOwnProperty(property)) continue;
3022
- list = $.grep(list, (function (prop, limit) {
3023
- return function (item) {
3024
- return item[prop] >= area[prop] || item[prop] === limit;
3025
- };
3026
- })(property, Math.max.apply(null, $.map(list, function (item) {
3027
- return item[property];
3028
- }))));
3029
- }
3030
-
3031
- // next reduce our src array by comparing the viewport properties against the minimum values of the same properties of each src
3032
- // only src's with a property equal to the minimum are kept
3033
- for (property in area) {
3034
- if (!area.hasOwnProperty(property)) continue;
3035
- list = $.grep(list, (function (prop, limit) {
3036
- return function (item) {
3037
- return item[prop] === limit;
3038
- };
3039
- })(property, Math.min.apply(null, $.map(list, function (item) {
3040
- return item[property];
3041
- }))));
3042
- }
3043
-
3044
- // return the first url as it is the best match for the current viewport
3045
- return list[0].url;
3046
- };
3047
-
3048
- /**
3049
- * @summary Expose FooGallery as a jQuery plugin.
3050
- * @memberof external:"jQuery.fn"#
3051
- * @function foogallery
3052
- * @param {(object|string)} [options] - The options to supply to FooGallery or one of the supported method names.
3053
- * @param {external:"jQuery.fn"~readyCallback} [ready] - A callback executed once each template initialized is ready.
3054
- * @returns {jQuery}
3055
- * @example {@caption The below shows using this method in its simplest form, initializing a template on pre-existing elements.}{@lang html}
3056
- * <!-- The container element for the template -->
3057
- * <div id="gallery-1" class="foogallery">
3058
- * <!-- A single item -->
3059
- * <div class="fg-item" data-id="[item.id]">
3060
- * <div class="fg-item-inner">
3061
- * <a class="fg-thumb" href="[item.href]">
3062
- * <img class="fg-image" width="[item.width]" height="[item.height]"
3063
- * title="[item.title]" alt="[item.description]"
3064
- * data-src="[item.src]"
3065
- * data-srcset="[item.srcset]" />
3066
- * <!-- Optional caption markup -->
3067
- * <div class="fg-caption">
3068
- * <div class="fg-caption-inner">
3069
- * <div class="fg-caption-title">[item.title]</div>
3070
- * <div class="fg-caption-desc">[item.description]</div>
3071
- * </div>
3072
- * </div>
3073
- * </a>
3074
- * </div>
3075
- * </div>
3076
- * <!-- Any number of additional items -->
3077
- * </div>
3078
- * <script>
3079
- * jQuery(function($){
3080
- * $("#gallery-1").foogallery();
3081
- * });
3082
- * </script>
3083
- * @example {@caption Options can be supplied directly to the `.foogallery()` method or by supplying them using the `data-foogallery` attribute. If supplied using the attribute the value must follow [valid JSON syntax](http://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example) including quoted property names. If the same option is supplied in both locations as it is below, the value from the attribute overrides the value supplied to the method, in this case `lazy` would be `true`.}{@lang html}
3084
- * <!-- Supplying the options using the attribute -->
3085
- * <div id="gallery-1" class="foogallery fg-responsive" data-foogallery='{"lazy": true}'>
3086
- * <!-- Items -->
3087
- * </div>
3088
- * <script>
3089
- * jQuery(function($){
3090
- * // Supply the options directly to the method
3091
- * $("#gallery-1").foogallery({
3092
- * lazy: false
3093
- * });
3094
- * });
3095
- * </script>
3096
- */
3097
- $.fn.foogallery = function(options, ready){
3098
- return this.filter(".foogallery").each(function(i, element){
3099
- if (_is.string(options)){
3100
- var template = $.data(element, _.dataTemplate);
3101
- if (template instanceof _.Template){
3102
- switch (options){
3103
- case "layout":
3104
- template.layout();
3105
- return;
3106
- case "destroy":
3107
- template.destroy();
3108
- return;
3109
- }
3110
- }
3111
- } else {
3112
- _.template.make(options, element).initialize().then(function(template){
3113
- if (_is.fn(ready)){
3114
- ready(template);
3115
- }
3116
- });
3117
- }
3118
- });
3119
- };
3120
-
3121
- /**
3122
- * @summary If supplied this method is executed after each template is initialized.
3123
- * @callback external:"jQuery.fn"~readyCallback
3124
- * @param {FooGallery.Template} template - The template that was initialized.
3125
- * @example {@caption The below shows an example of supplying this callback to the `.foogallery()` method.}
3126
- * jQuery(".foogallery").foogallery({
3127
- * // Options here
3128
- * }, function(template){
3129
- * // Called after each template is initialized on the matched elements
3130
- * });
3131
- */
3132
-
3133
- })(
3134
- FooGallery.$,
3135
- FooGallery,
3136
- FooGallery.utils,
3137
- FooGallery.utils.is,
3138
- FooGallery.utils.fn
3139
- );
3140
- (function($, _, _utils, _is, _fn, _obj){
3141
-
3142
- _.TemplateFactory = _utils.Factory.extend(/** @lends FooGallery.TemplateFactory */{
3143
- /**
3144
- * @summary A factory for galleries allowing them to be easily registered and created.
3145
- * @memberof FooGallery
3146
- * @constructs TemplateFactory
3147
- * @description The plugin makes use of an instance of this class exposed as {@link FooGallery.template}.
3148
- * @augments FooGallery.utils.Factory
3149
- * @borrows FooGallery.utils.Class.extend as extend
3150
- * @borrows FooGallery.utils.Class.override as override
3151
- */
3152
- construct: function(){
3153
- /**
3154
- * @summary An object containing all registered galleries.
3155
- * @memberof FooGallery.TemplateFactory#
3156
- * @name registered
3157
- * @type {Object.<string, Object>}
3158
- * @readonly
3159
- * @example {@caption The following shows the structure of this object. The `<name>` placeholders would be the name the class was registered with.}
3160
- * {
3161
- * "<name>": {
3162
- * "name": <string>,
3163
- * "klass": <function>,
3164
- * "test": <function>,
3165
- * "priority": <number>
3166
- * },
3167
- * "<name>": {
3168
- * "name": <string>,
3169
- * "klass": <function>,
3170
- * "test": <function>,
3171
- * "priority": <number>
3172
- * },
3173
- * ...
3174
- * }
3175
- */
3176
- this.registered = {};
3177
- },
3178
- /**
3179
- * @summary Registers a template constructor with the factory using the given `name` and `test` function.
3180
- * @memberof FooGallery.TemplateFactory#
3181
- * @function register
3182
- * @param {string} name - The friendly name of the class.
3183
- * @param {FooGallery.Template} template - The template constructor to register.
3184
- * @param {object} options - The default options for the template.
3185
- * @param {object} [classes={}] - The CSS classes for the template.
3186
- * @param {object} [il8n={}] - The il8n strings for the template.
3187
- * @param {number} [priority=0] - This determines the index for the class when using either the {@link FooGallery.TemplateFactory#load|load} or {@link FooGallery.TemplateFactory#names|names} methods, a higher value equals a lower index.
3188
- * @returns {boolean} `true` if the `klass` was successfully registered.
3189
- */
3190
- register: function(name, template, options, classes, il8n, priority){
3191
- var self = this, result = self._super(name, template, priority);
3192
- if (result){
3193
- var reg = self.registered;
3194
- reg[name].opt = _is.hash(options) ? options : {};
3195
- reg[name].cls = _is.hash(classes) ? classes : {};
3196
- reg[name].il8n = _is.hash(il8n) ? il8n : {};
3197
- }
3198
- return result;
3199
- },
3200
- /**
3201
- * @summary Create a new instance of a registered template from the supplied `element` and `options`.
3202
- * @memberof FooGallery.TemplateFactory#
3203
- * @function make
3204
- * @param {(object|FooGallery~Options)} [options] - The options for the template. If not supplied this will fall back to using the {@link FooGallery.defaults|defaults}.
3205
- * @param {(jQuery|HTMLElement|string)} [element] - The jQuery object, HTMLElement or selector of the template element to create. If not supplied the {@link FooGallery~Options#type|type} options' value is used.
3206
- * @returns {FooGallery.Template}
3207
- */
3208
- make: function(options, element){
3209
- element = _is.jq(element) ? element : $(element);
3210
- options = _obj.merge(options, element.data("foogallery"));
3211
- var self = this, type = self.type(options, element);
3212
- if (!self.contains(type)) return null;
3213
- options = self.options(type, options);
3214
- return self._super(type, options, element);
3215
- },
3216
- type: function(options, element){
3217
- element = _is.jq(element) ? element : $(element);
3218
- var self = this, type = _is.hash(options) && _is.hash(options) && _is.string(options.type) && self.contains(options.type) ? options.type : "core";
3219
- if (type === "core" && element.length > 0){
3220
- var reg = self.registered, names = self.names(true);
3221
- for (var i = 0, l = names.length; i < l; i++) {
3222
- if (!reg.hasOwnProperty(names[i])) continue;
3223
- var name = names[i], cls = reg[name].cls;
3224
- if (!_is.string(cls.container)) continue;
3225
- var selector = _utils.selectify(cls.container);
3226
- if (element.is(selector)) {
3227
- type = names[i];
3228
- break;
3229
- }
3230
- }
3231
- }
3232
- return type;
3233
- },
3234
- configure: function(name, options, classes, il8n){
3235
- var self = this;
3236
- if (self.contains(name)){
3237
- var reg = self.registered;
3238
- _obj.extend(reg[name].opt, options);
3239
- _obj.extend(reg[name].cls, classes);
3240
- _obj.extend(reg[name].il8n, il8n);
3241
- }
3242
- },
3243
- options: function(name, options){
3244
- options = _is.hash(options) ? options : {};
3245
- var self = this, reg = self.registered,
3246
- def = reg["core"].opt,
3247
- cls = reg["core"].cls,
3248
- il8n = reg["core"].il8n;
3249
-
3250
- options = _.paging.merge(options);
3251
- if (name !== "core" && self.contains(name)){
3252
- options = _obj.extend({}, def, reg[name].opt, options);
3253
- options.cls = _obj.extend({}, cls, reg[name].cls, options.cls);
3254
- options.il8n = _obj.extend({}, il8n, reg[name].il8n, options.il8n);
3255
- } else {
3256
- options = _obj.extend({}, def, options);
3257
- options.cls = _obj.extend({}, cls, options.cls);
3258
- options.il8n = _obj.extend({}, il8n, options.il8n);
3259
- }
3260
- return options;
3261
- }
3262
- });
3263
-
3264
- /**
3265
- * @summary The factory used to register and create the various template types of FooGallery.
3266
- * @memberof FooGallery
3267
- * @name template
3268
- * @type {FooGallery.TemplateFactory}
3269
- */
3270
- _.template = new _.TemplateFactory();
3271
-
3272
- })(
3273
- FooGallery.$,
3274
- FooGallery,
3275
- FooGallery.utils,
3276
- FooGallery.utils.is,
3277
- FooGallery.utils.fn,
3278
- FooGallery.utils.obj
3279
- );
3280
- (function(_, _utils, _is, _fn, _obj){
3281
-
3282
- _.PagingFactory = _utils.Factory.extend(/** @lends FooGallery.PagingFactory */{
3283
- /**
3284
- * @summary A factory for paging types allowing them to be easily registered and created.
3285
- * @memberof FooGallery
3286
- * @constructs PagingFactory
3287
- * @description The plugin makes use of an instance of this class exposed as {@link FooGallery.paging}.
3288
- * @augments FooGallery.Factory
3289
- * @borrows FooGallery.Factory.extend as extend
3290
- * @borrows FooGallery.Factory.override as override
3291
- */
3292
- construct: function(){
3293
- /**
3294
- * @summary An object containing all registered paging types.
3295
- * @memberof FooGallery.PagingFactory#
3296
- * @name registered
3297
- * @type {Object.<string, Object>}
3298
- * @readonly
3299
- * @example {@caption The following shows the structure of this object. The `<name>` placeholders would be the name the class was registered with.}
3300
- * {
3301
- * "<name>": {
3302
- * "name": <string>,
3303
- * "klass": <function>,
3304
- * "ctrl": <function>,
3305
- * "priority": <number>
3306
- * },
3307
- * "<name>": {
3308
- * "name": <string>,
3309
- * "klass": <function>,
3310
- * "ctrl": <function>,
3311
- * "priority": <number>
3312
- * },
3313
- * ...
3314
- * }
3315
- */
3316
- this.registered = {};
3317
- },
3318
- /**
3319
- * @summary Registers a paging `type` constructor with the factory using the given `name` and `test` function.
3320
- * @memberof FooGallery.PagingFactory#
3321
- * @function register
3322
- * @param {string} name - The friendly name of the class.
3323
- * @param {FooGallery.Paging} type - The paging type constructor to register.
3324
- * @param {FooGallery.PagingControl} [ctrl] - An optional control to register for the paging type.
3325
- * @param {object} [options={}] - The default options for the paging type.
3326
- * @param {object} [classes={}] - The CSS classes for the paging type.
3327
- * @param {object} [il8n={}] - The il8n strings for the paging type.
3328
- * @param {number} [priority=0] - This determines the index for the class when using either the {@link FooGallery.PagingFactory#load|load} or {@link FooGallery.PagingFactory#names|names} methods, a higher value equals a lower index.
3329
- * @returns {boolean} `true` if the `klass` was successfully registered.
3330
- */
3331
- register: function(name, type, ctrl, options, classes, il8n, priority){
3332
- var self = this, result = self._super(name, type, priority);
3333
- if (result){
3334
- var reg = self.registered;
3335
- reg[name].ctrl = _is.fn(ctrl) ? ctrl : null;
3336
- reg[name].opt = _is.hash(options) ? options : {};
3337
- reg[name].cls = _is.hash(classes) ? classes : {};
3338
- reg[name].il8n = _is.hash(il8n) ? il8n : {};
3339
- }
3340
- return result;
3341
- },
3342
- // /**
3343
- // * @summary Create a new instance of a registered paging type for the supplied `template`.
3344
- // * @memberof FooGallery.PagingFactory#
3345
- // * @function make
3346
- // * @param {FooGallery.Template} template - The template creating the new instance.
3347
- // * @returns {FooGallery.Paging}
3348
- // */
3349
- // make: function(template){
3350
- // var self = this, paging, type;
3351
- // if (!(template instanceof _.Template) || !_is.hash(paging = template.opt.paging) || !self.contains(type = paging.type) || type === "default") return null;
3352
- // var reg = self.registered;
3353
- // template.opt.paging = _obj.extend({}, reg["default"].opt, reg[type].opt, template.opt.paging);
3354
- // template.cls.paging = _obj.extend({}, reg["default"].cls, reg[type].cls, template.cls.paging);
3355
- // template.il8n.paging = _obj.extend({}, reg["default"].il8n, reg[type].il8n, template.il8n.paging);
3356
- // template.sel.paging = _utils.selectify(template.cls.paging);
3357
- // return self._super(type, template);
3358
- // },
3359
- type: function(options){
3360
- var self = this, opt;
3361
- return _is.hash(options) && _is.hash(opt = options.paging) && _is.string(opt.type) && self.contains(opt.type) ? opt.type : null;
3362
- },
3363
- merge: function(options){
3364
- options = _is.hash(options) ? options : {};
3365
- var self = this, type = self.type(options),
3366
- reg = self.registered,
3367
- def = reg["default"].opt,
3368
- def_cls = reg["default"].cls,
3369
- def_il8n = reg["default"].il8n,
3370
- opt = _is.hash(options.paging) ? options.paging : {},
3371
- cls = _is.hash(options.cls) && _is.hash(options.cls.paging) ? options.cls.paging : {},
3372
- il8n = _is.hash(options.il8n) && _is.hash(options.il8n.paging) ? options.il8n.paging : {};
3373
-
3374
- if (type !== "default" && self.contains(type)){
3375
- options.paging = _obj.extend({}, def, reg[type].opt, opt, {type: type});
3376
- options.cls = _obj.extend({}, {paging: def_cls}, {paging: reg[type].cls}, {paging: cls});
3377
- options.il8n = _obj.extend({}, {paging: def_il8n}, {paging: reg[type].il8n}, {paging: il8n});
3378
- } else {
3379
- options.paging = _obj.extend({}, def, opt, {type: type});
3380
- options.cls = _obj.extend({}, {paging: def_cls}, {paging: cls});
3381
- options.il8n = _obj.extend({}, {paging: def_il8n}, {paging: il8n});
3382
- }
3383
- return options;
3384
- },
3385
- configure: function(name, options, classes, il8n){
3386
- var self = this;
3387
- if (self.contains(name)){
3388
- var reg = self.registered;
3389
- _obj.extend(reg[name].opt, options);
3390
- _obj.extend(reg[name].cls, classes);
3391
- _obj.extend(reg[name].il8n, il8n);
3392
- }
3393
- },
3394
- options: function(name, options){
3395
- options = _is.hash(options) ? options : {};
3396
- var self = this,
3397
- reg = self.registered,
3398
- def = reg["default"].opt,
3399
- def_cls = reg["default"].cls,
3400
- def_il8n = reg["default"].il8n,
3401
- opt = _is.hash(options.paging) ? options.paging : {},
3402
- cls = _is.hash(options.cls) && _is.hash(options.cls.paging) ? options.cls.paging : {},
3403
- il8n = _is.hash(options.il8n) && _is.hash(options.il8n.paging) ? options.il8n.paging : {};
3404
-
3405
- if (name !== "default" && self.contains(name)){
3406
- options.paging = _obj.extend({}, def, reg[name].opt, opt, {type: name});
3407
- options.cls = _obj.extend({}, {paging: def_cls}, {paging: reg[name].cls}, {paging: cls});
3408
- options.il8n = _obj.extend({}, {paging: def_il8n}, {paging: reg[name].il8n}, {paging: il8n});
3409
- } else {
3410
- options.paging = _obj.extend({}, def, opt, {type: name});
3411
- options.cls = _obj.extend({}, {paging: def_cls}, {paging: cls});
3412
- options.il8n = _obj.extend({}, {paging: def_il8n}, {paging: il8n});
3413
- }
3414
- return options;
3415
- },
3416
- /**
3417
- * @summary Checks if the factory contains a control registered using the supplied `name`.
3418
- * @memberof FooGallery.PagingFactory#
3419
- * @function hasCtrl
3420
- * @param {string} name - The friendly name of the class.
3421
- * @returns {boolean}
3422
- */
3423
- hasCtrl: function(name){
3424
- var self = this, reg = self.registered[name];
3425
- return _is.hash(reg) && _is.fn(reg.ctrl);
3426
- },
3427
- /**
3428
- * @summary Create a new instance of a control class registered with the supplied `name` and arguments.
3429
- * @memberof FooGallery.PagingFactory#
3430
- * @function makeCtrl
3431
- * @param {string} name - The friendly name of the class.
3432
- * @param {FooGallery.Template} template - The template creating the control.
3433
- * @param {FooGallery.Paging} parent - The parent paging class creating the control.
3434
- * @param {string} position - The position the control will be displayed at.
3435
- * @returns {?FooGallery.PagingControl}
3436
- */
3437
- makeCtrl: function(name, template, parent, position){
3438
- var self = this, reg = self.registered[name];
3439
- if (_is.hash(reg) && _is.fn(reg.ctrl)){
3440
- return new reg.ctrl(template, parent, position);
3441
- }
3442
- return null;
3443
- }
3444
- });
3445
-
3446
- /**
3447
- * @summary The factory used to register and create the various paging types of FooGallery.
3448
- * @memberof FooGallery
3449
- * @name paging
3450
- * @type {FooGallery.PagingFactory}
3451
- */
3452
- _.paging = new _.PagingFactory();
3453
-
3454
- })(
3455
- FooGallery,
3456
- FooGallery.utils,
3457
- FooGallery.utils.is,
3458
- FooGallery.utils.fn,
3459
- FooGallery.utils.obj
3460
- );
3461
- (function($, _, _utils, _is, _fn, _str){
3462
-
3463
- _.Template = _utils.Class.extend(/** @lends FooGallery.Template */{
3464
- /**
3465
- * @summary The primary class for FooGallery, this controls the flow of the plugin across all templates.
3466
- * @memberof FooGallery
3467
- * @constructs Template
3468
- * @param {FooGallery~Options} [options] - The options for the template.
3469
- * @param {jQuery} [element] - The jQuery object of the templates' container element. If not supplied one will be created within the `parent` element supplied to the {@link FooGallery.Template#initialize|initialize} method.
3470
- * @augments FooGallery.utils.Class
3471
- * @borrows FooGallery.utils.Class.extend as extend
3472
- * @borrows FooGallery.utils.Class.override as override
3473
- */
3474
- construct: function(options, element){
3475
- var self = this;
3476
- /**
3477
- * @summary The jQuery object for the template container.
3478
- * @memberof FooGallery.Template#
3479
- * @name $el
3480
- * @type {jQuery}
3481
- */
3482
- self.$el = _is.jq(element) ? element : $(element);
3483
- /**
3484
- * @summary The options for the template.
3485
- * @memberof FooGallery.Template#
3486
- * @name opt
3487
- * @type {FooGallery~Options}
3488
- */
3489
- self.opt = options;
3490
- /**
3491
- * @summary Any custom options for the template.
3492
- * @memberof FooGallery.Template#
3493
- * @name template
3494
- * @type {object}
3495
- */
3496
- self.template = options.template;
3497
- /**
3498
- * @summary The ID for the template.
3499
- * @memberof FooGallery.Template#
3500
- * @name id
3501
- * @type {string}
3502
- */
3503
- self.id = self.$el.prop("id") || options.id;
3504
- /**
3505
- * @summary Whether or not the template created its' own container element.
3506
- * @memberof FooGallery.Template#
3507
- * @name createdSelf
3508
- * @type {boolean}
3509
- */
3510
- self.createdSelf = false;
3511
- /**
3512
- * @summary The CSS classes for the template.
3513
- * @memberof FooGallery.Template#
3514
- * @name cls
3515
- * @type {FooGallery~CSSClasses}
3516
- */
3517
- self.cls = options.cls;
3518
- /**
3519
- * @summary The il8n strings for the template.
3520
- * @memberof FooGallery.Template#
3521
- * @name il8n
3522
- * @type {FooGallery~il8n}
3523
- */
3524
- self.il8n = options.il8n;
3525
- /**
3526
- * @summary The CSS selectors for the template.
3527
- * @memberof FooGallery.Template#
3528
- * @name sel
3529
- * @type {FooGallery~CSSSelectors}
3530
- */
3531
- self.sel = _utils.selectify(self.cls);
3532
- /**
3533
- * @summary The item manager for the template.
3534
- * @memberof FooGallery.Template#
3535
- * @name items
3536
- * @type {FooGallery.Items}
3537
- */
3538
- self.items = _.components.make("items", self);
3539
- /**
3540
- * @summary The page manager for the template.
3541
- * @memberof FooGallery.Template#
3542
- * @name pages
3543
- * @type {?FooGallery.Paging}
3544
- */
3545
- self.pages = _.paging.make(options.paging.type, self);
3546
- /**
3547
- * @summary The state manager for the template.
3548
- * @memberof FooGallery.Template#
3549
- * @name state
3550
- * @type {FooGallery.State}
3551
- */
3552
- self.state = _.components.make("state", self);
3553
- /**
3554
- * @summary The promise object returned by the {@link FooGallery.Template#initialize|initialize} method.
3555
- * @memberof FooGallery.Template#
3556
- * @name _initialize
3557
- * @type {?Promise}
3558
- * @private
3559
- */
3560
- self._initialize = null;
3561
- self.initializing = false;
3562
- self.initialized = false;
3563
- self.destroying = false;
3564
- self.destroyed = false;
3565
- },
3566
-
3567
- // ################
3568
- // ## Initialize ##
3569
- // ################
3570
-
3571
- /**
3572
- * @summary Initialize the template.
3573
- * @memberof FooGallery.Template#
3574
- * @function initialize
3575
- * @param {(jQuery|HTMLElement|string)} [parent] - If no element was supplied to the constructor you must supply a parent element for the template to append itself to. This can be a jQuery object, HTMLElement or a CSS selector.
3576
- * @returns {Promise.<FooGallery.Template>}
3577
- * @description Once resolved all options, objects and elements required by the template have been parsed or created and the initial load is complete.
3578
- * @fires FooGallery.Template~"pre-init.foogallery"
3579
- * @fires FooGallery.Template~"init.foogallery"
3580
- * @fires FooGallery.Template~"post-init.foogallery"
3581
- * @fires FooGallery.Template~"ready.foogallery"
3582
- */
3583
- initialize: function(parent){
3584
- var self = this;
3585
- if (_is.promise(self._initialize)) return self._initialize;
3586
- parent = _is.jq(parent) ? parent : $(parent);
3587
- return self._initialize = $.Deferred(function(def){
3588
- self.initializing = true;
3589
- if (parent.length === 0 && self.$el.parent().length === 0){
3590
- def.reject("A parent element is required.");
3591
- return;
3592
- }
3593
- if (self.$el.length === 0){
3594
- self.$el = self.create();
3595
- self.createdSelf = true;
3596
- }
3597
- if (parent.length > 0){
3598
- self.$el.appendTo(parent);
3599
- }
3600
- var queue = $.Deferred(), promise = queue.promise(), existing;
3601
- if (self.$el.length > 0 && (existing = self.$el.data(_.dataTemplate)) instanceof _.Template){
3602
- promise = promise.then(function(){
3603
- return existing.destroy().then(function(){
3604
- self.$el.data(_.dataTemplate, self);
3605
- });
3606
- });
3607
- } else {
3608
- self.$el.data(_.dataTemplate, self);
3609
- }
3610
- promise.then(function(){
3611
- if (self.destroying) return _fn.rejectWith("destroy in progress");
3612
- // at this point we have our container element free of pre-existing instances so let's bind any event listeners supplied by the .on option
3613
- if (!_is.empty(self.opt.on)){
3614
- self.$el.on(self.opt.on);
3615
- }
3616
-
3617
- /**
3618
- * @summary Raised before the template is fully initialized.
3619
- * @event FooGallery.Template~"pre-init.foogallery"
3620
- * @type {jQuery.Event}
3621
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3622
- * @param {FooGallery.Template} template - The template raising the event.
3623
- * @returns {Promise} Resolved once the pre-initialization work is complete, rejected if an error occurs or execution is prevented.
3624
- * @description At this point in the initialization chain the {@link FooGallery.Template#opt|opt} property has not undergone any additional parsing and is just the result of the {@link FooGallery.defaults|default options} being extended with any user supplied ones.
3625
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3626
- * $(".foogallery").foogallery({
3627
- * on: {
3628
- * "pre-init.foogallery": function(event, template){
3629
- * // do something
3630
- * }
3631
- * }
3632
- * });
3633
- * @example {@caption Calling the `preventDefault` method on the `event` object will prevent the template being initialized.}
3634
- * $(".foogallery").foogallery({
3635
- * on: {
3636
- * "pre-init.foogallery": function(event, template){
3637
- * if ("some condition"){
3638
- * // stop the template being initialized
3639
- * event.preventDefault();
3640
- * }
3641
- * }
3642
- * }
3643
- * });
3644
- */
3645
- var e = self.raise("pre-init");
3646
- if (e.isDefaultPrevented()) return _fn.rejectWith("pre-init default prevented");
3647
- }).then(function(){
3648
- if (self.destroying) return _fn.rejectWith("destroy in progress");
3649
- // checks the delay option and if it is greater than 0 waits for that amount of time before continuing
3650
- if (self.opt.delay <= 0) return _fn.resolved;
3651
- return $.Deferred(function(wait){
3652
- self._delay = setTimeout(function () {
3653
- self._delay = null;
3654
- wait.resolve();
3655
- }, self.opt.delay);
3656
- }).promise();
3657
- }).then(function(){
3658
- if (self.destroying) return _fn.rejectWith("destroy in progress");
3659
- /**
3660
- * @summary Raised before the template is initialized but after any pre-initialization work is complete.
3661
- * @event FooGallery.Template~"init.foogallery"
3662
- * @type {jQuery.Event}
3663
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3664
- * @param {FooGallery.Template} template - The template raising the event.
3665
- * @returns {Promise} Resolved once the initialization work is complete, rejected if an error occurs or execution is prevented.
3666
- * @description At this point in the initialization chain all additional option parsing has been completed but the base components such as the items or state are not yet initialized.
3667
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3668
- * $(".foogallery").foogallery({
3669
- * on: {
3670
- * "init.foogallery": function(event, template){
3671
- * // do something
3672
- * }
3673
- * }
3674
- * });
3675
- * @example {@caption Calling the `preventDefault` method on the `event` object will prevent the template being initialized.}
3676
- * $(".foogallery").foogallery({
3677
- * on: {
3678
- * "init.foogallery": function(event, template){
3679
- * if ("some condition"){
3680
- * // stop the template being initialized
3681
- * event.preventDefault();
3682
- * }
3683
- * }
3684
- * }
3685
- * });
3686
- * @example {@caption You can also prevent the default logic and replace it with your own by calling the `preventDefault` method on the `event` object and returning a promise.}
3687
- * $(".foogallery").foogallery({
3688
- * on: {
3689
- * "init.foogallery": function(event, template){
3690
- * // stop the default logic
3691
- * event.preventDefault();
3692
- * // you can execute the default logic by calling the handler directly yourself
3693
- * // var promise = template.onInit();
3694
- * // replace the default logic with your own
3695
- * return Promise;
3696
- * }
3697
- * }
3698
- * });
3699
- */
3700
- var e = self.raise("init");
3701
- if (e.isDefaultPrevented()) return _fn.rejectWith("init default prevented");
3702
- return self.items.fetch();
3703
- }).then(function(){
3704
- if (self.destroying) return _fn.rejectWith("destroy in progress");
3705
- /**
3706
- * @summary Raised after the template is initialized but before any post-initialization work is complete.
3707
- * @event FooGallery.Template~"post-init.foogallery"
3708
- * @type {jQuery.Event}
3709
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3710
- * @param {FooGallery.Template} template - The template raising the event.
3711
- * @returns {Promise} Resolved once the post-initialization work is complete, rejected if an error occurs or execution is prevented.
3712
- * @description At this point in the initialization chain all options, objects and elements required by the template have been parsed or created however the initial state has not been set yet and no items have been loaded.
3713
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3714
- * $(".foogallery").foogallery({
3715
- * on: {
3716
- * "post-init.foogallery": function(event, template){
3717
- * // do something
3718
- * }
3719
- * }
3720
- * });
3721
- * @example {@caption Calling the `preventDefault` method on the `event` object will prevent the template being initialized.}
3722
- * $(".foogallery").foogallery({
3723
- * on: {
3724
- * "post-init.foogallery": function(event, template){
3725
- * if ("some condition"){
3726
- * // stop the template being initialized
3727
- * event.preventDefault();
3728
- * }
3729
- * }
3730
- * }
3731
- * });
3732
- * @example {@caption You can also prevent the default logic and replace it with your own by calling the `preventDefault` method on the `event` object and returning a promise.}
3733
- * $(".foogallery").foogallery({
3734
- * on: {
3735
- * "post-init.foogallery": function(event, template){
3736
- * // stop the default logic
3737
- * event.preventDefault();
3738
- * // you can execute the default logic by calling the handler directly yourself
3739
- * // var promise = template.onPostInit();
3740
- * // replace the default logic with your own
3741
- * return Promise;
3742
- * }
3743
- * }
3744
- * });
3745
- */
3746
- var e = self.raise("post-init");
3747
- if (e.isDefaultPrevented()) return _fn.rejectWith("post-init default prevented");
3748
- var state = self.state.parse();
3749
- self.state.set(_is.empty(state) ? self.state.initial() : state);
3750
- $(window).on("scroll.foogallery", {self: self}, self.throttle(self.onWindowScroll, self.opt.throttle))
3751
- .on("popstate.foogallery", {self: self}, self.onWindowPopState);
3752
- }).then(function(){
3753
- if (self.destroying) return _fn.rejectWith("destroy in progress");
3754
- /**
3755
- * @summary Raised after the template is fully initialized but before the first load occurs.
3756
- * @event FooGallery.Template~"first-load.foogallery"
3757
- * @type {jQuery.Event}
3758
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3759
- * @param {FooGallery.Template} template - The template raising the event.
3760
- * @description This event is raised after all post-initialization work such as setting the initial state is performed but before the first load of items takes place.
3761
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3762
- * $(".foogallery").foogallery({
3763
- * on: {
3764
- * "first-load.foogallery": function(event, template){
3765
- * // do something
3766
- * }
3767
- * }
3768
- * });
3769
- */
3770
- self.raise("first-load");
3771
- return self.loadAvailable();
3772
- }).then(function(){
3773
- if (self.destroying) return _fn.rejectWith("destroy in progress");
3774
- self.initializing = false;
3775
- self.initialized = true;
3776
-
3777
- // performed purely to re-check if any items need to be loaded after content has possibly shifted
3778
- self._check(200);
3779
- self._check(500);
3780
- self._check(1000);
3781
- self._check(2000);
3782
- self._check(5000);
3783
-
3784
- /**
3785
- * @summary Raised after the template is fully initialized and is ready to be interacted with.
3786
- * @event FooGallery.Template~"ready.foogallery"
3787
- * @type {jQuery.Event}
3788
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3789
- * @param {FooGallery.Template} template - The template raising the event.
3790
- * @description This event is raised after all post-initialization work such as setting the initial state and performing the first load are completed.
3791
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3792
- * $(".foogallery").foogallery({
3793
- * on: {
3794
- * "ready.foogallery": function(event, template){
3795
- * // do something
3796
- * }
3797
- * }
3798
- * });
3799
- */
3800
- self.raise("ready");
3801
- def.resolve(self);
3802
- }).fail(function(err){
3803
- def.reject(err);
3804
- });
3805
- queue.resolve();
3806
- }).promise().fail(function(err){
3807
- console.log("initialize failed", self, err);
3808
- self.destroy();
3809
- });
3810
- },
3811
- /**
3812
- * @summary Create a new container element for the template returning the jQuery object.
3813
- * @memberof FooGallery.Template#
3814
- * @function create
3815
- * @returns {jQuery} A jQuery object to use as the container for the template.
3816
- * @description This method is called from within the {@link FooGallery.Template#initialize|initialize} method only if a container element is required.
3817
- * @example {@caption The below shows an example of what the returned jQuery objects' outer HTML would look like.}{@lang html}
3818
- * <div id="{options.id}" class="{options.cls.container} {options.classes}">
3819
- * </div>
3820
- */
3821
- create: function(){
3822
- var self = this;
3823
- return $("<div/>", {"id": self.id, "class": self.cls.container}).addClass(self.opt.classes);
3824
- },
3825
-
3826
- // #############
3827
- // ## Destroy ##
3828
- // #############
3829
-
3830
- /**
3831
- * @summary Destroy the template.
3832
- * @memberof FooGallery.Template#
3833
- * @function destroy
3834
- * @returns {Promise}
3835
- * @description Once this method is called it can not be stopped and the template will be destroyed.
3836
- * @fires FooGallery.Template~"destroy.foogallery"
3837
- */
3838
- destroy: function(){
3839
- var self = this;
3840
- if (self.destroyed) return _fn.resolved;
3841
- self.destroying = true;
3842
- return $.Deferred(function(def){
3843
- if (self.initializing && _is.promise(self._initialize)){
3844
- self._initialize.always(function(){
3845
- self.destroying = false;
3846
- self._destroy();
3847
- def.resolve();
3848
- });
3849
- } else {
3850
- self.destroying = false;
3851
- self._destroy();
3852
- def.resolve();
3853
- }
3854
- }).promise();
3855
- },
3856
- /**
3857
- * @summary Destroy the template.
3858
- * @memberof FooGallery.Template#
3859
- * @function _destroy
3860
- * @private
3861
- */
3862
- _destroy: function(){
3863
- var self = this;
3864
- if (self.destroyed) return;
3865
- /**
3866
- * @summary Raised before the template is destroyed.
3867
- * @event FooGallery.Template~"destroy.foogallery"
3868
- * @type {jQuery.Event}
3869
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3870
- * @param {FooGallery.Template} template - The template raising the event.
3871
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3872
- * $(".foogallery").foogallery({
3873
- * on: {
3874
- * "destroy.foogallery": function(event, template){
3875
- * // do something
3876
- * }
3877
- * }
3878
- * });
3879
- */
3880
- self.raise("destroy");
3881
- $(window).off("popstate.foogallery", self.onWindowPopState)
3882
- .off("scroll.foogallery");
3883
- self.state.destroy();
3884
- if (self.pages) self.pages.destroy();
3885
- self.items.destroy();
3886
- if (!_is.empty(self.opt.on)){
3887
- self.$el.off(self.opt.on);
3888
- }
3889
- /**
3890
- * @summary Raised after the template has been destroyed.
3891
- * @event FooGallery.Template~"destroyed.foogallery"
3892
- * @type {jQuery.Event}
3893
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3894
- * @param {FooGallery.Template} template - The template raising the event.
3895
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3896
- * $(".foogallery").foogallery({
3897
- * on: {
3898
- * "destroyed.foogallery": function(event, template){
3899
- * // do something
3900
- * }
3901
- * }
3902
- * });
3903
- */
3904
- self.raise("destroyed");
3905
- self.$el.removeData(_.dataTemplate);
3906
- if (self.createdSelf){
3907
- self.$el.remove();
3908
- }
3909
- self.$el = self.state = self.items = self.pages = null;
3910
- self.destroyed = true;
3911
- self.initializing = false;
3912
- self.initialized = false;
3913
- },
3914
-
3915
- // ################
3916
- // ## Load Items ##
3917
- // ################
3918
-
3919
- /**
3920
- * @summary Check if any available items need to be loaded and loads them.
3921
- * @memberof FooGallery.Template#
3922
- * @function loadAvailable
3923
- * @returns {Promise<FooGallery.Item[]>} Resolves with an array of {@link FooGallery.Item|items} as the first argument. If no items are loaded this array is empty.
3924
- */
3925
- loadAvailable: function(){
3926
- var self = this, items;
3927
- if (self.pages){
3928
- items = self.pages.available();
3929
- } else {
3930
- items = self.items.available();
3931
- }
3932
- return self.items.load(items);
3933
- },
3934
-
3935
- /**
3936
- * @summary Check if any available items need to be loaded and loads them.
3937
- * @memberof FooGallery.Template#
3938
- * @function _check
3939
- * @private
3940
- */
3941
- _check: function(delay){
3942
- delay = _is.number(delay) ? delay : 0;
3943
- var self = this;
3944
- setTimeout(function(){
3945
- if (self.initialized && (!self.destroying || !self.destroyed)){
3946
- self.loadAvailable();
3947
- }
3948
- }, delay);
3949
- },
3950
-
3951
- // #############
3952
- // ## Utility ##
3953
- // #############
3954
-
3955
- /**
3956
- * @summary Raises the supplied `eventName` on the template {@link FooGallery.Template#$el|element}.
3957
- * @memberof FooGallery.Template#
3958
- * @function raise
3959
- * @param {string} eventName - The name of the event to raise.
3960
- * @param {Array} [args] - An additional arguments to supply to the listeners for the event.
3961
- * @returns {?jQuery.Event} The jQuery.Event object or null if no `eventName` was supplied.
3962
- * @description This method also executes any listeners set on the template object itself. These listeners are not bound to the element but are executed after the event is raised but before any default logic is executed. The names of these listeners use the following convention; prefix the `eventName` with `"on-"` and then camel-case the result. e.g. `"pre-init"` becomes `onPreInit`.
3963
- * @example {@caption The following displays a listener for the `"pre-init.foogallery"` event in a sub-classed template.}
3964
- * FooGallery.MyTemplate = FooGallery.Template.extend({
3965
- * onPreInit: function(event, template){
3966
- * // do something
3967
- * }
3968
- * });
3969
- */
3970
- raise: function (eventName, args) {
3971
- if (!_is.string(eventName) || _is.empty(eventName)) return null;
3972
- args = _is.array(args) ? args : [];
3973
- var self = this,
3974
- name = eventName.split(".")[0],
3975
- listener = _str.camel("on-" + name),
3976
- event = $.Event(name + ".foogallery");
3977
- args.unshift(self); // add self
3978
- self.$el.trigger(event, args);
3979
- _.debug.logf("{id}|{name}:", {id: self.id, name: name}, args);
3980
- if (_is.fn(self[listener])){
3981
- args.unshift(event); // add event
3982
- self[listener].apply(self.$el.get(0), args);
3983
- }
3984
- return event;
3985
- },
3986
-
3987
- layout: function(){
3988
- var self = this;
3989
- if (self._initialize === null) return;
3990
- /**
3991
- * @summary Raised when the templates' {@link FooGallery.Template#layout|layout} method is called.
3992
- * @event FooGallery.Template~"layout.foogallery"
3993
- * @type {jQuery.Event}
3994
- * @param {jQuery.Event} event - The jQuery.Event object for the current event.
3995
- * @param {FooGallery.Template} template - The template raising the event.
3996
- * @description This allows templates to perform layout if required for example when visibility changes.
3997
- * @example {@caption To listen for this event and perform some action when it occurs you would bind to it as follows.}
3998
- * $(".foogallery").foogallery({
3999
- * on: {
4000
- * "layout.foogallery": function(event, template){
4001
- * // do something
4002
- * }
4003
- * }
4004
- * });
4005
- */
4006
- self.raise("layout");
4007
- },
4008
-
4009
- /**
4010
- * @summary Throttles the supplied function to only execute once every N milliseconds.
4011
- * @memberof FooGallery.Template#
4012
- * @function throttle
4013
- * @param {Function} fn - The function to throttle.
4014
- * @param {number} wait - The number of milliseconds to wait before allowing execution.
4015
- * @returns {Function}
4016
- */
4017
- throttle: function(fn, wait){
4018
- var time = Date.now();
4019
- return function() {
4020
- if ((time + wait - Date.now()) < 0) {
4021
- var args = _fn.arg2arr(arguments);
4022
- fn.apply(this, args);
4023
- time = Date.now();
4024
- }
4025
- }
4026
- },
4027
-
4028
- // ###############
4029
- // ## Listeners ##
4030
- // ###############
4031
-
4032
- /**
4033
- * @summary Listens for the windows popstate event and performs any actions required by the template.
4034
- * @memberof FooGallery.Template#
4035
- * @function onWindowPopState
4036
- * @param {jQuery.Event} e - The jQuery.Event object for the event.
4037
- * @private
4038
- */
4039
- onWindowPopState: function(e){
4040
- var self = e.data.self, state = e.originalEvent.state;
4041
- if (!_is.empty(state) && state.id === self.id){
4042
- self.state.set(state);
4043
- self.loadAvailable();
4044
- }
4045
- },
4046
- /**
4047
- * @summary Listens for the windows scroll event and performs any checks required by the template.
4048
- * @memberof FooGallery.Template#
4049
- * @function onWindowScroll
4050
- * @param {jQuery.Event} e - The jQuery.Event object for the event.
4051
- * @private
4052
- */
4053
- onWindowScroll: function(e){
4054
- var self = e.data.self;
4055
- self.loadAvailable();
4056
- }
4057
- });
4058
-
4059
- _.template.register("core", _.Template, {
4060
- id: null,
4061
- type: "core",
4062
- classes: "",
4063
- on: {},
4064
- lazy: true,
4065
- viewport: 200,
4066
- items: [],
4067
- delay: 100,
4068
- throttle: 50,
4069
- timeout: 60000,
4070
- srcset: "data-srcset",
4071
- src: "data-src",
4072
- template: {}
4073
- }, {
4074
- container: "foogallery"
4075
- }, {
4076
-
4077
- }, -100);
4078
-
4079
- /**
4080
- * @summary An object containing all the core template options.
4081
- * @typedef {object} FooGallery.Template~Options
4082
- * @property {?string} [id=null] - The id for the template. This is only required if creating a template without a pre-existing container element that has an `id` attribute.
4083
- * @property {string} [type="core"] - The type of template to load. If no container element exists to parse the type from this must be supplied so the correct type of template is loaded.
4084
- * @property {string} [classes=""] - A space delimited string of any additional CSS classes to append to the container element of the template.
4085
- * @property {object} [on={}] - An object containing any template events to bind to.
4086
- * @property {boolean} [lazy=true] - Whether or not to enable lazy loading of images.
4087
- * @property {number} [viewport=200] - The number of pixels to inflate the viewport by when checking to lazy load items.
4088
- * @property {(FooGallery.Item~Options[]|FooGallery.Item[]| string)} [items=[]] - An array of items to load when required. A url can be provided and the items will be fetched using an ajax call, the response should be a properly formatted JSON array of {@link FooGallery.Item~Options|item} object.
4089
- * @property {number} [delay=100] - The number of milliseconds to delay the initialization of a template.
4090
- * @property {number} [throttle=50] - The number of milliseconds to wait once scrolling has stopped before performing any work.
4091
- * @property {number} [timeout=60000] - The number of milliseconds to wait before forcing a timeout when loading items.
4092
- * @property {string} [src="data-src"] - The name of the attribute to retrieve an images src url from.
4093
- * @property {string} [srcset="data-srcset"] - The name of the attribute to retrieve an images srcset url from.
4094
- * @property {object} [template={}] - An object containing any additional custom options for the template.
4095
- * @property {FooGallery.Template~CSSClasses} [cls] - An object containing all CSS classes for the template.
4096
- * @property {FooGallery.Template~CSSSelectors} [sel] - An object containing all CSS selectors for the template.
4097
- * @property {FooGallery.Template~il8n} [il8n] - An object containing all il8n strings for the template.
4098
- * @property {FooGallery.Item~Options} [item] - An object containing the default values for all items.
4099
- * @property {FooGallery.State~Options} [state] - An object containing the state options for the template.
4100
- * @property {FooGallery.Paging~Options} [paging] - An object containing the default paging options for the template.
4101
- */
4102
-
4103
- /**
4104
- * @summary An object containing all CSS classes for the core template.
4105
- * @typedef {object} FooGallery.Template~CSSClasses
4106
- * @property {string} [container="foogallery"] - The base CSS class names to apply to the container element.
4107
- * @property {FooGallery.Item~CSSClasses} [item] - A simple object containing the CSS classes used by an item.
4108
- */
4109
-
4110
- /**
4111
- * @summary An object containing all il8n strings for the core template.
4112
- * @typedef {object} FooGallery.Template~il8n
4113
- */
4114
-
4115
- /**
4116
- * @summary An object containing all CSS selectors for the core template.
4117
- * @typedef {object} FooGallery.Template~CSSSelectors
4118
- * @property {string} [container=".foogallery"] - The selector for the base CSS class names for the container element.
4119
- * @property {FooGallery.Item~CSSSelectors} [item] - An object containing the CSS selectors for an item.
4120
- * @description This object is automatically generated from a {@link FooGallery.Template~CSSClasses|classes} object and its properties mirror those except the space delimited string of class names is converted into a CSS selector.
4121
- */
4122
-
4123
- })(
4124
- FooGallery.$,
4125
- FooGallery,
4126
- FooGallery.utils,
4127
- FooGallery.utils.is,
4128
- FooGallery.utils.fn,
4129
- FooGallery.utils.str
4130
- );
4131
-
4132
-
4133
- (function(_, _utils){
4134
-
4135
- _.Component = _utils.Class.extend(/** @lend FooGallery.Component */{
4136
- /**
4137
- * @summary The base class for all child components of a {@link FooGallery.Template|template}.
4138
- * @memberof FooGallery
4139
- * @constructs Component
4140
- * @param {FooGallery.Template} template - The template creating the component.
4141
- * @augments FooGallery.utils.Class
4142
- * @borrows FooGallery.utils.Class.extend as extend
4143
- * @borrows FooGallery.utils.Class.override as override
4144
- */
4145
- construct: function(template){
4146
- /**
4147
- * @summary The template that created this component.
4148
- * @memberof FooGallery.Component#
4149
- * @name tmpl
4150
- * @type {FooGallery.Template}
4151
- */
4152
- this.tmpl = template;
4153
- },
4154
- /**
4155
- * @summary Destroy the component making it ready for garbage collection.
4156
- * @memberof FooGallery.Component#
4157
- * @function destroy
4158
- */
4159
- destroy: function(){
4160
- this.tmpl = null;
4161
- }
4162
- });
4163
-
4164
- /**
4165
- * @summary A factory for registering and creating basic gallery components.
4166
- * @memberof FooGallery
4167
- * @name components
4168
- * @type {FooGallery.utils.Factory}
4169
- */
4170
- _.components = new _utils.Factory();
4171
-
4172
- })(
4173
- FooGallery,
4174
- FooGallery.utils
4175
- );
4176
- (function($, _, _is, _str){
4177
-
4178
- _.State = _.Component.extend(/** @lends FooGallery.State */{
4179
- /**
4180
- * @summary This class manages all the getting and setting of its' parent templates' state.
4181
- * @memberof FooGallery
4182
- * @constructs State
4183
- * @param {FooGallery.Template} template - The template to manage the state for.
4184
- * @augments FooGallery.Component
4185
- * @borrows FooGallery.utils.Class.extend as extend
4186
- * @borrows FooGallery.utils.Class.override as override
4187
- */
4188
- construct: function(template){
4189
- var self = this;
4190
- /**
4191
- * @ignore
4192
- * @memberof FooGallery.State#
4193
- * @function _super
4194
- */
4195
- self._super(template);
4196
- /**
4197
- * @summary Whether or not the history API is enabled in the current browser.
4198
- * @memberof FooGallery.State#
4199
- * @name apiEnabled
4200
- * @type {boolean}
4201
- * @readonly
4202
- */
4203
- self.apiEnabled = !!window.history && !!history.replaceState;
4204
- /**
4205
- * @summary The state specific options for the template.
4206
- * @memberof FooGallery.State#
4207
- * @name opt
4208
- * @type {FooGallery.State~Options}
4209
- */
4210
- self.opt = self.tmpl.opt.state;
4211
- /**
4212
- * @summary Whether or not the component is enabled.
4213
- * @memberof FooGallery.State#
4214
- * @name enabled
4215
- * @type {boolean}
4216
- */
4217
- self.enabled = self.opt.enabled;
4218
- /**
4219
- * @summary Which method of the history API to use by default when updating the state.
4220
- * @memberof FooGallery.State#
4221
- * @name pushOrReplace
4222
- * @type {string}
4223
- * @default "replace"
4224
- */
4225
- self.pushOrReplace = self.isPushOrReplace(self.opt.pushOrReplace) ? self.opt.pushOrReplace : "replace";
4226
-
4227
- var id = _str.escapeRegExp(self.tmpl.id),
4228
- values = _str.escapeRegExp(self.opt.values),
4229
- pair = _str.escapeRegExp(self.opt.pair);
4230
- /**
4231
- * @summary An object containing regular expressions used to test and parse a hash value into a state object.
4232
- * @memberof FooGallery.State#
4233
- * @name regex
4234
- * @type {{exists: RegExp, values: RegExp}}
4235
- * @readonly
4236
- * @description The regular expressions contained within this object are specific to this template and are created using the template {@link FooGallery.Template#id|id} and the delimiters from the {@link FooGallery.State#opt|options}.
4237
- */
4238
- self.regex = {
4239
- exists: new RegExp("^#"+id+"\\"+values+".+?"),
4240
- values: new RegExp("(\\w+)"+pair+"([^"+values+"]+)", "g")
4241
- };
4242
- },
4243
- /**
4244
- * @summary Destroy the component clearing any current state from the url and preparing it for garbage collection.
4245
- * @memberof FooGallery.State#
4246
- * @function destroy
4247
- */
4248
- destroy: function(){
4249
- var self = this;
4250
- self.clear();
4251
- self.opt = self.regex = {};
4252
- self._super();
4253
- },
4254
- /**
4255
- * @summary Check if the supplied value is `"push"` or `"replace"`.
4256
- * @memberof FooGallery.State#
4257
- * @function isPushOrReplace
4258
- * @param {*} value - The value to check.
4259
- * @returns {boolean}
4260
- */
4261
- isPushOrReplace: function(value){
4262
- return $.inArray(value, ["push","replace"]) !== -1;
4263
- },
4264
- /**
4265
- * @summary Check if the current url contains state for this template.
4266
- * @memberof FooGallery.State#
4267
- * @function exists
4268
- * @returns {boolean}
4269
- */
4270
- exists: function(){
4271
- return this.regex.exists.test(location.hash) && this.regex.values.test(location.hash);
4272
- },
4273
- /**
4274
- * @summary Parse the current url returning an object containing all values for the template.
4275
- * @memberof FooGallery.State#
4276
- * @function parse
4277
- * @returns {object}
4278
- * @description This method always returns an object, if successful the object contains properties otherwise it is just a plain empty object. For this method to be successful the current template {@link FooGallery.Template#id|id} must match the one from the url.
4279
- */
4280
- parse: function(){
4281
- var self = this, state = {};
4282
- if (self.exists()){
4283
- if (self.enabled){
4284
- state.id = self.tmpl.id;
4285
- var pairs = location.hash.match(self.regex.values);
4286
- $.each(pairs, function(i, pair){
4287
- var parts = pair.split(self.opt.pair);
4288
- if (parts.length === 2){
4289
- state[parts[0]] = parts[1].indexOf(self.opt.array) === -1
4290
- ? decodeURIComponent(parts[1])
4291
- : $.map(parts[1].split(self.opt.array), function(part){ return decodeURIComponent(part); });
4292
- if (_is.string(state[parts[0]]) && !isNaN(state[parts[0]])){
4293
- state[parts[0]] = parseInt(state[parts[0]]);
4294
- }
4295
- }
4296
- });
4297
- } else {
4298
- // if we're here it means there is a hash on the url but the option is disabled so remove it
4299
- if (self.apiEnabled){
4300
- history.replaceState(null, "", location.pathname + location.search);
4301
- } else {
4302
- location.hash = "#";
4303
- }
4304
- }
4305
- }
4306
- return state;
4307
- },
4308
- /**
4309
- * @summary Converts the supplied state object into a string value to use as a hash.
4310
- * @memberof FooGallery.State#
4311
- * @function hashify
4312
- * @param {object} state - The object to hashify.
4313
- * @returns {string}
4314
- */
4315
- hashify: function(state){
4316
- var self = this;
4317
- if (_is.hash(state)){
4318
- var hash