NextCellent Gallery – NextGEN Legacy - Version 1.9.26

Version Description

  • 2015-03-27 =

What's in it for you?

  • Improved Watermark with custom image selection (credits to Niko Strijbol)
  • fix: Albums preview image now correctly shows images from inside the album, not the last uploaded ones.

VERY IMPORTANT: Read ON!

NextCellent Gallery provides backward compatibility for older NextGEN until version 1.9.13 .

  • this plugin will gracefully deactivate if detects NextGEN is working (any version) to avoid compatibility issues.

  • Please remember to READ THE FAQ!!! Issues for failing to read the FAQ will be IGNORED!!!

  • If you like it, please spread the word and rate it accordingly. I guess a lot of annoyed users can take advantage of NextCellent. Thank you!

  • WE APPRECIATE YOUR FEEDBACK. Be our voice and comment it!!!!

Download this release

Release Info

Developer WPReady
Plugin Icon NextCellent Gallery – NextGEN Legacy
Version 1.9.26
Comparing to
See all releases

Code changes from version 1.9.25.3 to 1.9.26

admin/admin.php CHANGED
@@ -257,7 +257,7 @@ class nggAdminPanel {
257
  case "nggallery-options" :
258
  include_once( dirname( __FILE__ ) . '/settings.php' ); // nggallery_admin_options
259
  $ngg->option_page = new nggOptions ();
260
- $ngg->option_page->controller();
261
  break;
262
  case "nggallery-tags" :
263
  include_once( dirname( __FILE__ ) . '/tags.php' ); // nggallery_admin_tags
@@ -335,8 +335,7 @@ class nggAdminPanel {
335
  'no_gallery' => __( 'You didn\'t select a gallery!', 'nggallery' )
336
  ) );
337
  wp_register_script( 'ngg-progressbar', NGGALLERY_URLPATH . 'admin/js/ngg.progressbar.js', array( 'jquery' ), '2.0.1' );
338
- wp_register_script( 'jquery-ui-autocomplete', NGGALLERY_URLPATH . 'admin/js/jquery.ui.autocomplete.min.js',
339
- array('jquery-ui-core','jquery-ui-widget'), '1.8.15' );
340
 
341
  switch ( $_GET['page'] ) {
342
  case NGGFOLDER :
@@ -359,14 +358,14 @@ class nggAdminPanel {
359
  wp_enqueue_script( 'shutter' );
360
  break;
361
  case "nggallery-manage-album" :
362
- wp_enqueue_script( 'jquery-ui-autocomplete' );
363
  wp_enqueue_script( 'jquery-ui-dialog' );
364
  wp_enqueue_script( 'jquery-ui-sortable' );
365
- wp_enqueue_script( 'ngg-autocomplete', NGGALLERY_URLPATH . 'admin/js/ngg.autocomplete.js', array( 'jquery-ui-autocomplete' ), '1.0.1' );
366
  break;
367
  case "nggallery-options" :
368
  wp_enqueue_script( 'jquery-ui-tabs' );
369
  wp_enqueue_script( 'wp-color-picker' );
 
370
  break;
371
  case "nggallery-add-gallery" :
372
  wp_enqueue_script( 'jquery-ui-tabs' );
@@ -409,6 +408,7 @@ class nggAdminPanel {
409
  wp_enqueue_style( 'nggtabs', NGGALLERY_URLPATH . 'admin/css/jquery.ui.tabs.css', false, '2.5.0', 'screen' );
410
  wp_enqueue_style( 'nggadmin' );
411
  wp_enqueue_style( 'wp-color-picker' );
 
412
  break;
413
  case "nggallery-manage-gallery" :
414
  wp_enqueue_style( 'shutter', NGGALLERY_URLPATH . 'shutter/shutter-reloaded.css', false, '1.3.2', 'screen' );
257
  case "nggallery-options" :
258
  include_once( dirname( __FILE__ ) . '/settings.php' ); // nggallery_admin_options
259
  $ngg->option_page = new nggOptions ();
260
+ $ngg->option_page->show_page();
261
  break;
262
  case "nggallery-tags" :
263
  include_once( dirname( __FILE__ ) . '/tags.php' ); // nggallery_admin_tags
335
  'no_gallery' => __( 'You didn\'t select a gallery!', 'nggallery' )
336
  ) );
337
  wp_register_script( 'ngg-progressbar', NGGALLERY_URLPATH . 'admin/js/ngg.progressbar.js', array( 'jquery' ), '2.0.1' );
338
+ wp_register_script( 'ngg-autocomplete', NGGALLERY_URLPATH . 'admin/js/ngg.autocomplete.js', array( 'jquery-ui-autocomplete' ), '1.1' );
 
339
 
340
  switch ( $_GET['page'] ) {
341
  case NGGFOLDER :
358
  wp_enqueue_script( 'shutter' );
359
  break;
360
  case "nggallery-manage-album" :
 
361
  wp_enqueue_script( 'jquery-ui-dialog' );
362
  wp_enqueue_script( 'jquery-ui-sortable' );
363
+ wp_enqueue_script( 'ngg-autocomplete' );
364
  break;
365
  case "nggallery-options" :
366
  wp_enqueue_script( 'jquery-ui-tabs' );
367
  wp_enqueue_script( 'wp-color-picker' );
368
+ wp_enqueue_script( 'ngg-autocomplete');
369
  break;
370
  case "nggallery-add-gallery" :
371
  wp_enqueue_script( 'jquery-ui-tabs' );
408
  wp_enqueue_style( 'nggtabs', NGGALLERY_URLPATH . 'admin/css/jquery.ui.tabs.css', false, '2.5.0', 'screen' );
409
  wp_enqueue_style( 'nggadmin' );
410
  wp_enqueue_style( 'wp-color-picker' );
411
+ wp_enqueue_style( 'ngg-jqueryui' );
412
  break;
413
  case "nggallery-manage-gallery" :
414
  wp_enqueue_style( 'shutter', NGGALLERY_URLPATH . 'shutter/shutter-reloaded.css', false, '1.3.2', 'screen' );
admin/album.php CHANGED
@@ -57,6 +57,9 @@ class nggManageAlbum {
57
  return true;
58
  }
59
 
 
 
 
60
  function controller() {
61
  global $nggdb;
62
 
@@ -73,7 +76,7 @@ class nggManageAlbum {
73
  $this->galleries = $nggdb->find_all_galleries();
74
  $this->num_albums = count( $this->albums );
75
  $this->num_galleries = count( $this->galleries );
76
- $this->output();
77
 
78
  }
79
 
@@ -161,7 +164,11 @@ class nggManageAlbum {
161
  nggGallery::show_message(__('Updated successfully','nggallery'));
162
  }
163
 
164
- function output() {
 
 
 
 
165
 
166
  global $wpdb, $nggdb;
167
 
@@ -176,7 +183,7 @@ jQuery(document).ready(
176
  function()
177
  {
178
  jQuery("#previewpic").nggAutocomplete( {
179
- type: 'image',domain: "<?php echo home_url('index.php', is_ssl() ? 'https' : 'http'); ?>",width: "95%"
180
  });
181
 
182
  jQuery('#selectContainer').sortable( {
57
  return true;
58
  }
59
 
60
+ /**
61
+ * FZSM: small tweak to pas current Album Id to output.
62
+ */
63
  function controller() {
64
  global $nggdb;
65
 
76
  $this->galleries = $nggdb->find_all_galleries();
77
  $this->num_albums = count( $this->albums );
78
  $this->num_galleries = count( $this->galleries );
79
+ $this->output($this->currentID);
80
 
81
  }
82
 
164
  nggGallery::show_message(__('Updated successfully','nggallery'));
165
  }
166
 
167
+ /**
168
+ * FZSM: Added Album to autocomplete
169
+ * @param $currentAlbum
170
+ */
171
+ function output($currentAlbum) {
172
 
173
  global $wpdb, $nggdb;
174
 
183
  function()
184
  {
185
  jQuery("#previewpic").nggAutocomplete( {
186
+ type: 'image',domain: "<?php echo home_url('index.php', is_ssl() ? 'https' : 'http'); ?>",width: "95%", term: <?php echo $currentAlbum; ?>
187
  });
188
 
189
  jQuery('#selectContainer').sortable( {
admin/css/jquery.ui.css CHANGED
@@ -120,11 +120,10 @@
120
 
121
  /* jQuery Autocomplete */
122
  .ui-autocomplete { position: absolute; cursor: default; }
123
- .ui-autocomplete-start { background: white url('images/dropdown.png') right center no-repeat; }
124
  * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
125
  .ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
126
  /* this limit the height of the result list*/
127
- .ui-autocomplete { max-height: 90px; overflow-y: auto; }
128
  * html .ui-autocomplete { height: 90px; }
129
  .ui-autocomplete .ui-state-hover, .ui-autocomplete .ui-widget-content .ui-state-hover { background: #1e90ff; color: #FFFFFF !important; }
130
  .ui-autocomplete, .ui-autocomplete .ui-corner-all { -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; }
120
 
121
  /* jQuery Autocomplete */
122
  .ui-autocomplete { position: absolute; cursor: default; }
 
123
  * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
124
  .ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
125
  /* this limit the height of the result list*/
126
+ .ui-autocomplete { max-height: 50%; overflow-y: auto; }
127
  * html .ui-autocomplete { height: 90px; }
128
  .ui-autocomplete .ui-state-hover, .ui-autocomplete .ui-widget-content .ui-state-hover { background: #1e90ff; color: #FFFFFF !important; }
129
  .ui-autocomplete, .ui-autocomplete .ui-corner-all { -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; }
admin/css/nggadmin.css CHANGED
@@ -93,6 +93,7 @@ a.switch-expert {
93
  margin-right:8px;
94
  background: white;
95
  }
 
96
  #wm-preview h3{
97
  margin: 0;
98
  }
@@ -102,6 +103,18 @@ a.switch-expert {
102
  margin-left:40px;
103
  }
104
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  .wm-table {
106
  border-collapse:collapse;
107
  margin-top:1em;
93
  margin-right:8px;
94
  background: white;
95
  }
96
+
97
  #wm-preview h3{
98
  margin: 0;
99
  }
103
  margin-left:40px;
104
  }
105
 
106
+ #wm-preview-container {
107
+ max-width: 100%;
108
+ margin-top: 20px;
109
+ margin-bottom: 20px;
110
+ }
111
+
112
+ #wm-preview-image {
113
+ margin: auto;
114
+ display: block;
115
+ max-width: 100%;
116
+ }
117
+
118
  .wm-table {
119
  border-collapse:collapse;
120
  margin-top:1em;
admin/install.php CHANGED
@@ -210,8 +210,9 @@ function ngg_default_options() {
210
 
211
  // get the default value during first installation
212
  if (!is_array($ngg_wpmu_options)) {
213
- $ngg_wpmu_options['gallerypath'] = 'wp-content/blogs.dir/%BLOG_ID%/files/';
214
- $ngg_wpmu_options['wpmuCSSfile'] = 'nggallery.css';
 
215
  update_site_option('ngg_options', $ngg_wpmu_options);
216
  }
217
 
210
 
211
  // get the default value during first installation
212
  if (!is_array($ngg_wpmu_options)) {
213
+ $ngg_wpmu_options['gallerypath'] = 'wp-content/blogs.dir/%BLOG_ID%/files/';
214
+ $ngg_wpmu_options['wpmuCSSfile'] = 'nggallery.css';
215
+ $ngg_wpmu_options['silentUpdate'] = false;
216
  update_site_option('ngg_options', $ngg_wpmu_options);
217
  }
218
 
admin/js/ngg.autocomplete.js CHANGED
@@ -1,77 +1,136 @@
1
- /*
2
- * Implementation of jQuery UI Autocomplete
3
- * see http://jqueryui.com/demos/autocomplete/
4
- * Version: 1.0.1
5
- * Author : Alex Rabe
 
 
6
  *
7
- */
8
- jQuery.fn.nggAutocomplete = function ( args ) {
9
-
10
- var defaults = { type: 'image',
11
- domain: '',
12
- limit: 50 };
13
-
14
- var s = jQuery.extend( {}, defaults, args);
15
-
16
- var settings = { method: 'autocomplete',
17
- type: s.type,
18
- format: 'json',
19
- callback: 'json',
20
- limit: s.limit };
21
-
 
 
 
 
 
22
  var obj = this.selector;
23
- var id = jQuery(this).attr('id');
24
  var cache = {}, lastXhr;
25
-
26
- // get current value of drop down field
27
- var c_text = jQuery(obj + ' :selected').text();
28
- var c_val = jQuery(obj).val();
29
- // IE7 / IE 8 didnt get often the correct width
30
- if (s.width == undefined)
31
- var c_width = jQuery(this).width();
32
- else
33
- var c_width = s.width;
34
- //hide first the drop down field
35
- jQuery(obj).hide();
36
- jQuery(obj).after('<input name="' + id + '_ac" type="text" id="' + id + '_ac"/>');
37
- // Fill up current value & style
38
- jQuery(obj + "_ac").val(c_text);
39
- jQuery(obj + "_ac").css('width', c_width);
40
- // Add the dropdown icon
41
- jQuery(obj + "_ac").addClass('ui-autocomplete-start')
42
- jQuery(obj + "_ac").autocomplete({
43
- source: function( request, response ) {
44
- var term = request.term;
45
- if ( term in cache ) {
46
- response( cache[ term ] );
47
- return;
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  // adding more $_GET parameter
50
- request = jQuery.extend( {}, settings, request);
51
- lastXhr = jQuery.getJSON( s.domain, request, function( data, status, xhr ) {
52
- // add term to cache
53
- cache[ term ] = data;
54
- if ( xhr === lastXhr )
55
- response( data );
56
- });
 
57
  },
58
  minLength: 0,
59
- select: function( event, ui ) {
60
- // adding this to the dropdown list
61
- jQuery(obj).append( new Option(ui.item.label, ui.item.id) );
62
- // now select it
63
- jQuery(obj).val(ui.item.id);
64
- jQuery(obj + "_ac").removeClass('ui-autocomplete-start');
65
- }
66
- });
67
-
68
- jQuery(obj + "_ac").click(function() {
69
-
70
- var search = jQuery(obj + "_ac").val();
71
- // if the value is prefilled, we pass a empty string
72
- if ( search == c_text)
73
- search = '';
74
- // pass empty string as value to search for, displaying all results
75
- jQuery(obj + "_ac").autocomplete('search', search );
76
- });
77
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * NextCellent implementation of jQuery UI Autocomplete.
3
+ *
4
+ * @see http://jqueryui.com/demos/autocomplete/
5
+ * @see /xml/json.php for the API.
6
+ *
7
+ * @version 1.1
8
  *
9
+ */
10
+ jQuery.fn.nggAutocomplete = function (args) {
11
+
12
+ var defaults = {
13
+ type: 'image',
14
+ domain: '',
15
+ limit: 50
16
+ };
17
+
18
+ var s = jQuery.extend({}, defaults, args);
19
+
20
+ var settings = {
21
+ method: 'autocomplete',
22
+ type: s.type,
23
+ format: 'json',
24
+ callback: 'json',
25
+ limit: s.limit,
26
+ term: s.term
27
+ };
28
+
29
  var obj = this.selector;
30
+ var id = jQuery(this).attr('id');
31
  var cache = {}, lastXhr;
32
+
33
+ /**
34
+ * The element.
35
+ */
36
+ var obj_selector = jQuery(obj);
37
+
38
+ /**
39
+ * The current value of the dropdown field.
40
+ */
41
+ var c_text = jQuery(obj + ' option:selected').text();
42
+ var c_width = s.width;
43
+
44
+ /**
45
+ * Hide the drop down field and add the search field.
46
+ */
47
+ obj_selector.hide().after('<input name="' + id + '_ac" type="search" id="' + id + '_ac"/>');
48
+
49
+ /**
50
+ * The search field.
51
+ */
52
+ var obj_ac_selector = jQuery(obj + "_ac");
53
+
54
+ /**
55
+ * Add the current value and set the style.
56
+ */
57
+ obj_ac_selector.val(c_text).css('width', c_width).addClass('ui-autocomplete-start');
58
+
59
+ /**
60
+ * Initiate the autocomplete
61
+ * 20150305: only add term to request if term is not empty
62
+ */
63
+ obj_ac_selector.autocomplete({
64
+ source: function (request, response) {
65
+ var term = request.term;
66
+ console.log(response);
67
+ if (term in cache) {
68
+ response(cache[term]);
69
+ return;
70
+ }
71
  // adding more $_GET parameter
72
+ //20150303: invert stetting and request to make term priority
73
+ request = jQuery.extend({}, request, settings);
74
+ lastXhr = jQuery.getJSON(s.domain, request, function (data, status, xhr) {
75
+ // add term to cache
76
+ cache[term] = data;
77
+ if (xhr === lastXhr)
78
+ response(data);
79
+ });
80
  },
81
  minLength: 0,
82
+ select: function (event, ui) {
83
+ /**
84
+ * We we will add this to the selector.
85
+ *
86
+ * @type {Option} The option to be added.
87
+ */
88
+ var option = new Option(ui.item.label, ui.item.id);
89
+
90
+ /**
91
+ * Add the select attribute to the option and remove it from the others.
92
+ */
93
+ jQuery(option).attr('selected', true);
94
+ jQuery(obj + " option:selected").attr('selected', false);
95
+
96
+
97
+ /**
98
+ * Add the option.
99
+ */
100
+ obj_selector.append(option);
101
+
102
+ /**
103
+ * Remove autocomplete class.
104
+ */
105
+ obj_ac_selector.removeClass('ui-autocomplete-start');
106
+
107
+ /**
108
+ * Update the text selector
109
+ */
110
+ c_text = ui.item.label;
111
+
112
+ /**
113
+ * Trigger a custom event.
114
+ *
115
+ * @since 1.1
116
+ */
117
+ obj_selector.trigger('nggAutocompleteDone');
118
+ }
119
+ });
120
+
121
+ obj_ac_selector.click(function () {
122
+ //FZSM 20050307: There is an issue with drop downn list which it can stay behind form editor.
123
+ //this workaround makes drop-down z-index to follow dialo z-index.
124
+ jQuery ('.ui-autocomplete').css('z-index', jQuery('.ui-dialog').zIndex()+1);
125
+
126
+ var search = obj_ac_selector.val();
127
+
128
+ /**
129
+ * If the selected value is already present, we need to show all images.
130
+ */
131
+ if (search == c_text) {
132
+ search = '';
133
+ }
134
+ obj_ac_selector.autocomplete('search', search);
135
+ });
136
+ }
admin/settings.php CHANGED
@@ -12,29 +12,29 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
12
  class ngg_rebuild_unique_slugs {
13
 
14
  function start_rebuild() {
15
- global $wpdb;
16
 
17
- $total = array();
18
- // get the total number of images
19
  $total['images'] = intval( $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->nggpictures") );
20
- $total['gallery'] = intval( $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->nggallery") );
21
- $total['album'] = intval( $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->nggalbum") );
22
 
23
  $messages = array(
24
  'images' => __( 'Rebuild image structure : %s / %s images', 'nggallery' ),
25
  'gallery' => __( 'Rebuild gallery structure : %s / %s galleries', 'nggallery' ),
26
- 'album' => __( 'Rebuild album structure : %s / %s albums', 'nggallery' ),
27
  );
28
 
29
- foreach ( array_keys( $messages ) as $key ) {
30
 
31
- $message = sprintf( $messages[ $key ] ,
32
- "<span class='ngg-count-current'>0</span>",
33
- "<span class='ngg-count-total'>" . $total[ $key ] . "</span>"
34
- );
35
 
36
- echo "<div class='$key updated'><p class='ngg'>$message</p></div>";
37
- }
38
 
39
  $ajax_url = add_query_arg( 'action', 'ngg_rebuild_unique_slugs', admin_url( 'admin-ajax.php' ) );
40
  ?>
@@ -44,44 +44,44 @@ jQuery(document).ready(function($) {
44
  _action = 'images',
45
  images = <?php echo $total['images']; ?>,
46
  gallery = <?php echo $total['gallery']; ?>,
47
- album = <?php echo $total['album']; ?>,
48
- total = 0,
49
- offset = 0,
50
  count = 50;
51
 
52
  var $display = $('.ngg-count-current');
53
- $('.finished, .gallery, .album').hide();
54
- total = images;
55
 
56
  function call_again() {
57
  if ( offset > total ) {
58
- offset = 0;
59
- // 1st run finished
60
- if (_action == 'images') {
61
- _action = 'gallery';
62
- total = gallery;
63
- $('.images, .gallery').toggle();
64
- $display.html(offset);
65
- call_again();
66
- return;
67
- }
68
- // 2nd run finished
69
- if (_action == 'gallery') {
70
- _action = 'album';
71
- total = album;
72
- $('.gallery, .album').toggle();
73
- $display.html(offset);
74
- call_again();
75
- return;
76
- }
77
- // 3rd run finished, exit now
78
- if (_action == 'album') {
79
- $('.ngg')
80
- .html('<?php esc_html_e( 'Done.', 'nggallery' ); ?>')
81
- .parent('div').hide();
82
- $('.finished').show();
83
- return;
84
- }
85
  }
86
 
87
  $.post(ajax_url, {'_action': _action, 'offset': offset}, function(response) {
@@ -100,632 +100,798 @@ jQuery(document).ready(function($) {
100
  }
101
 
102
  //20150124 FZSM: Suggested rule: no class should call a spaghuetti code directly...
103
-
 
 
104
  class nggOptions {
105
 
106
- /**
107
- * nggOptions::__construct()
108
- *
109
- * @return void
110
- */
111
- function __construct() {
112
 
113
- // same as $_SERVER['REQUEST_URI'], but should work under IIS 6.0
114
  $this->filepath = admin_url() . 'admin.php?page=' . $_GET['page'];
115
 
116
- //Look for POST updates
117
- if ( !empty($_POST) )
118
  $this->processor();
119
- }
 
120
 
121
  /**
122
  * Save/Load options and add a new hook for plugins
123
- *
124
- * @return void
125
  */
126
- function processor() {
127
-
128
- global $ngg, $nggRewrite;
129
-
130
- $old_state = $ngg->options['usePermalinks'];
131
- $old_slug = $ngg->options['permalinkSlug'];
132
-
133
- if ( isset($_POST['updateoption']) ) {
134
- check_admin_referer('ngg_settings');
135
- // get the hidden option fields, taken from WP core
136
- if ( $_POST['page_options'] )
137
- $options = explode(',', stripslashes($_POST['page_options']));
138
-
139
- if ($options) {
140
- foreach ($options as $option) {
141
- $option = trim($option);
142
- $value = false;
143
- if ( isset( $_POST[ $option ] ) ) {
144
- $value = trim( $_POST[ $option ] );
145
- if ($value === "true") {
146
- $value = true;
147
- }
148
-
149
- if ( is_numeric( $value ) ) {
150
- $value = (int) $value;
151
- }
152
- }
153
-
154
- // $value = sanitize_option($option, $value); // This does stripslashes on those that need it
155
- $ngg->options[$option] = $value;
156
- }
157
-
158
- // do not allow a empty string
159
- if ( empty ( $ngg->options['permalinkSlug'] ) )
160
- $ngg->options['permalinkSlug'] = 'nggallery';
161
-
162
- // the path should always end with a slash
163
- $ngg->options['gallerypath'] = trailingslashit($ngg->options['gallerypath']);
164
- $ngg->options['imageMagickDir'] = trailingslashit($ngg->options['imageMagickDir']);
165
-
166
- // the custom sortorder must be ascending
167
- $ngg->options['galSortDir'] = ($ngg->options['galSort'] == 'sortorder') ? 'ASC' : $ngg->options['galSortDir'];
168
- }
169
- // Save options
170
- update_option('ngg_options', $ngg->options);
171
-
172
- // Flush Rewrite rules
173
- if ( $old_state != $ngg->options['usePermalinks'] || $old_slug != $ngg->options['permalinkSlug'] )
174
- $nggRewrite->flush();
175
-
176
- nggGallery::show_message(__('Settings updated successfully','nggallery'));
177
- }
178
-
179
- if ( isset($_POST['clearcache']) ) {
180
- check_admin_referer('ngg_settings');
181
-
182
- $path = WINABSPATH . $ngg->options['gallerypath'] . 'cache/';
183
-
184
- if (is_dir($path))
185
- if ($handle = opendir($path)) {
186
- while (false !== ($file = readdir($handle))) {
187
- if ($file != '.' && $file != '..') {
188
- @unlink($path . '/' . $file);
189
- }
190
- }
191
- closedir($handle);
192
- }
193
-
194
- nggGallery::show_message(__('Cache cleared','nggallery'));
195
- }
196
-
197
- if ( isset($_POST['createslugs']) ) {
198
- check_admin_referer('ngg_settings');
199
- ngg_rebuild_unique_slugs::start_rebuild();
200
- }
201
-
202
- do_action( 'ngg_update_options_page' );
203
-
204
- }
205
-
206
- /**
207
- * Render the page content
208
- * 20150124:FZSM: there should be a cleaner way to handle this, instead making dynamic functions and actions.
209
- * @return void
210
- */
211
- function controller() {
212
-
213
- // get list of tabs
214
- $tabs = $this->tabs_order();
215
 
216
- ?>
217
- <script type="text/javascript">
218
- jQuery(document).ready(function(){
219
- jQuery('html,body').scrollTop(0);
220
- jQuery('#slider').tabs({ fxFade: true, fxSpeed: 'fast' });
221
- jQuery('#slider').css('display', 'block');
222
- });
 
 
 
223
 
224
- function insertcode(value) {
225
- var effectcode;
226
- switch (value) {
227
- case "none":
228
- effectcode = "";
229
- jQuery('#tbImage').hide("slow");
230
- break;
231
- case "thickbox":
232
- effectcode = 'class="thickbox" rel="%GALLERY_NAME%"';
233
- jQuery('#tbImage').show("slow");
234
- break;
235
- case "lightbox":
236
- effectcode = 'rel="lightbox[%GALLERY_NAME%]"';
237
- jQuery('#tbImage').hide("slow");
238
- break;
239
- case "highslide":
240
- effectcode = 'class="highslide" onclick="return hs.expand(this, { slideshowGroup: %GALLERY_NAME% })"';
241
- jQuery('#tbImage').hide("slow");
242
- break;
243
- case "shutter":
244
- effectcode = 'class="shutterset_%GALLERY_NAME%"';
245
- jQuery('#tbImage').hide("slow");
246
- break;
247
- default:
248
- break;
249
  }
250
- jQuery("#thumbCode").val(effectcode);
251
- };
252
 
253
- jQuery(document).ready(function($){
254
- $('.picker').wpColorPicker();
255
- });
256
- </script>
257
- <div class="wrap ngg-wrap">
258
- <?php screen_icon( 'nextgen-gallery' ); ?>
259
- <h2><?php esc_html_e('Settings', 'nggallery') ?></h2>
260
- </div>
261
- <div id="slider" class="wrap" style="display: none;">
262
- <ul id="tabs">
263
- <?php
264
- foreach($tabs as $tab_key => $tab_name) {
265
- echo "\n\t\t<li><a class='nav-tab' href='#$tab_key'>$tab_name</a></li>";
266
- }
267
- ?>
268
- </ul>
269
- <?php
270
- foreach($tabs as $tab_key => $tab_name) {
271
- echo "\n\t<div id='$tab_key'>\n";
272
- // Looks for the internal class function, otherwise enable a hook for plugins
273
- if ( method_exists( $this, "tab_$tab_key" ))
274
- call_user_func( array( &$this , "tab_$tab_key") );
275
- else
276
- do_action( 'ngg_tab_content_' . $tab_key );
277
- echo "\n\t</div>";
278
- }
279
- ?>
280
- </div>
281
- <?php
282
-
283
- }
284
-
285
- /**
286
- * Create array for tabs and add a filter for other plugins to inject more tabs
287
- *
288
- * @return array $tabs
289
- */
290
- function tabs_order() {
291
-
292
- $tabs = array();
293
-
294
- $tabs['generaloptions'] = __('General', 'nggallery');
295
- $tabs['images'] = __('Images', 'nggallery');
296
- $tabs['gallery'] = __( 'Gallery', 'nggallery' );
297
- $tabs['effects'] = __('Effects', 'nggallery');
298
- $tabs['watermark'] = __('Watermark', 'nggallery');
299
- $tabs['slideshow'] = __('Slideshow', 'nggallery');
300
-
301
- $tabs = apply_filters('ngg_settings_tabs', $tabs);
302
-
303
- return $tabs;
304
-
305
- }
306
-
307
- function tab_generaloptions() {
308
- global $ngg;
309
-
310
- ?>
311
- <!-- General Options -->
312
- <h3><?php esc_html_e('General settings','nggallery'); ?></h3>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  <form name="generaloptions" method="post" action="<?php echo $this->filepath; ?>">
314
- <?php wp_nonce_field('ngg_settings') ?>
315
- <input type="hidden" name="page_options" value="gallerypath,silentUpgrade,deleteImg,useMediaRSS,usePicLens,usePermalinks,permalinkSlug,graphicLibrary,imageMagickDir,activateTags,appendType,maxImages" />
316
  <table class="form-table ngg-options">
317
- <tr valign="top">
318
- <th align="left"><?php esc_html_e('Gallery path','nggallery'); ?></th>
319
- <td><input <?php if (is_multisite()) echo 'readonly = "readonly"'; ?> type="text" class="regular-text code" name="gallerypath" value="<?php echo $ngg->options['gallerypath']; ?>" />
320
- <p class="description"><?php esc_html_e('This is the default path for all galleries','nggallery') ?></p></td>
321
- </tr>
322
  <tr>
323
- <th align="left"><?php esc_html_e('Silent database upgrade','nggallery'); ?></th>
324
- <td><input type="checkbox" name="silentUpgrade" value="true" <?php checked( true, $ngg->options['silentUpgrade']); ?> />
325
- <label for="silentUpgrade"><?php esc_html_e('Update the database without notice.','nggallery') ?></label></td>
 
 
326
  </tr>
327
- <tr valign="top">
328
- <th align="left"><?php esc_html_e('Image files','nggallery'); ?></th>
329
- <td><input <?php if (is_multisite()) echo 'readonly = "readonly"'; ?> type="checkbox" name="deleteImg" value="true" <?php checked(true, $ngg->options['deleteImg']); ?> />
330
- <?php esc_html_e('Delete files when removing a gallery from the database','nggallery'); ?></td>
 
 
331
  </tr>
332
  <tr>
333
- <th valign="top"><?php esc_html_e('Select graphic library','nggallery'); ?></th>
334
- <td><label><input name="graphicLibrary" type="radio" value="gd" <?php checked('gd', $ngg->options['graphicLibrary']); ?> /> <?php esc_html_e('GD Library', 'nggallery') ;?></label><br />
335
- <label><input name="graphicLibrary" type="radio" value="im" <?php checked('im', $ngg->options['graphicLibrary']); ?> /> <?php esc_html_e('ImageMagick (Experimental)', 'nggallery') ;?></label><br/>
336
- <?php esc_html_e('Path to the library:', 'nggallery') ;?>&nbsp;
337
- <input <?php if (is_multisite()) echo 'readonly = "readonly"'; ?> type="text" class="regular-text code" name="imageMagickDir" value="<?php echo $ngg->options['imageMagickDir']; ?>" />
 
338
  </td>
339
  </tr>
340
  <tr>
341
- <th align="left"><?php esc_html_e('Media RSS feed','nggallery'); ?></th>
342
- <td><input type="checkbox" name="useMediaRSS" value="true" <?php checked(true, $ngg->options['useMediaRSS']); ?> />
343
- <span><?php esc_html_e('Add a RSS feed to you blog header. Useful for CoolIris/PicLens','nggallery') ?></span></td>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
  </tr>
345
  <tr>
346
- <th align="left"><?php esc_html_e('PicLens/CoolIris','nggallery'); ?> (<a href="http://www.cooliris.com">CoolIris</a>)</th>
347
- <td><input type="checkbox" name="usePicLens" value="true" <?php checked(true, $ngg->options['usePicLens']); ?> />
348
- <?php esc_html_e('Include support for PicLens and CoolIris','nggallery') ?>
349
- <p class="description"><?php esc_html_e('When activated, JavaScript is added to your site footer. Make sure that wp_footer is called in your theme.','nggallery') ?></p></td>
350
  </td>
351
  </tr>
352
- </table>
353
- <h3><?php esc_html_e('Permalinks','nggallery') ?></h3>
354
- <table class="form-table ngg-options">
355
- <tr valign="top">
356
- <th align="left"><?php esc_html_e('Use permalinks','nggallery'); ?></th>
357
- <td><input type="checkbox" name="usePermalinks" value="true" <?php checked(true, $ngg->options['usePermalinks']); ?> />
358
- <?php esc_html_e('Adds a static link to all images','nggallery'); ?>
359
- <p class="description"><?php esc_html_e('When activating this option, you need to update your permalink structure once','nggallery'); ?></p></td>
360
  </tr>
 
 
 
361
  <tr>
 
362
  <td>
363
- <p><?php esc_html_e('Gallery slug:','nggallery'); ?></p></td>
364
- <td><input type="text" class="regular-text code" name="permalinkSlug" value="<?php echo $ngg->options['permalinkSlug']; ?>" /></td>
 
 
365
  </tr>
366
  <tr>
367
- <th valign="top"><?php esc_html_e('Recreate URLs','nggallery'); ?></th>
368
- <td><input type="submit" name="createslugs" class="button-secondary" value="<?php esc_attr_e('Start now','nggallery') ;?> &raquo;"/>
369
- <p class="description"><?php esc_html_e('If you\'ve changed these settings, you\'ll have to recreate the URLs.','nggallery'); ?></p></td>
 
 
 
 
 
 
370
  </tr>
371
  </table>
372
- <h3><?php esc_html_e('Related images','nggallery'); ?></h3>
373
  <table class="form-table ngg-options">
374
  <tr>
375
- <th valign="top"><?php esc_html_e('Add related images','nggallery'); ?></th>
376
- <td><input name="activateTags" type="checkbox" value="true" <?php checked(true, $ngg->options['activateTags']); ?> />
377
- <?php esc_html_e('This will add related images to every post','nggallery'); ?>
 
378
  </td>
379
  </tr>
380
  <tr>
381
- <th valign="top"><?php esc_html_e('Match with','nggallery'); ?></th>
382
- <td><label><input name="appendType" type="radio" value="category" <?php checked('category', $ngg->options['appendType']); ?> /> <?php esc_html_e('Categories', 'nggallery') ;?></label><br />
383
- <label><input name="appendType" type="radio" value="tags" <?php checked('tags', $ngg->options['appendType']); ?> /> <?php esc_html_e('Tags', 'nggallery') ;?></label>
 
 
 
 
 
 
 
 
 
 
384
  </td>
385
  </tr>
386
  <tr>
387
- <th valign="top"><?php esc_html_e('Max. number of images','nggallery'); ?></th>
388
- <td><input name="maxImages" type="number" step="1" min="1" value="<?php echo $ngg->options['maxImages']; ?>" class="small-text" />
389
- <p class="description"><?php esc_html_e('0 will show all images','nggallery'); ?></p>
 
390
  </td>
391
  </tr>
392
  </table>
393
- <div class="submit"><input class="button-primary" type="submit" name="updateoption" value="<?php esc_attr_e('Save Changes'); ?>"/></div>
394
  </form>
395
- <?php
396
- }
397
-
398
- function tab_images() {
399
- global $ngg;
400
- ?>
401
- <!-- Image settings -->
402
- <h3><?php esc_html_e('Image settings','nggallery'); ?></h3>
403
- <form name="imagesettings" method="POST" action="<?php echo $this->filepath.'#images'; ?>" >
404
- <?php wp_nonce_field('ngg_settings') ?>
405
- <input type="hidden" name="page_options" value="imgResize,imgWidth,imgHeight,imgQuality,imgBackup,imgAutoResize,thumbwidth,thumbheight,thumbfix,thumbquality" />
 
 
406
  <table class="form-table ngg-options">
407
- <tr valign="top">
408
- <th valign="top"><?php esc_html_e('Resize images','nggallery') ?></th>
409
- <td><label for="imgWidth"><?php esc_html_e('Width','nggallery') ?></label>
410
- <input type="number" step="1" min="0" class="small-text" name="imgWidth" class="small-text" value="<?php echo $ngg->options['imgWidth']; ?>" />
411
- <label for="imgHeight"><?php esc_html_e('Height','nggallery') ?></label>
412
- <input type="number" step="1" min="0" type="text" size="5" name="imgHeight" class="small-text" value="<?php echo $ngg->options['imgHeight']; ?>">
413
- <p class="description"><?php esc_html_e('Width and height (in pixels). NextCellent Gallery will keep the ratio size.','nggallery') ?></p></td>
 
 
414
  </tr>
415
- <tr valign="top">
416
- <th valign="top"><?php esc_html_e('Image quality','nggallery'); ?></th>
417
- <td><input type="number" step="1" min="0" max="100" class="small-text" name="imgQuality" value="<?php echo $ngg->options['imgQuality']; ?>" />
418
- <label for="imgQuality">%</label></td>
419
  </tr>
420
  <tr>
421
- <th valign="top"><?php esc_html_e('Backup original','nggallery'); ?></th>
422
- <td><input type="checkbox" name="imgBackup" value="true" <?php checked(true, $ngg->options['imgBackup']); ?> />
423
- <span><?php esc_html_e('Create a backup for the resized images','nggallery'); ?></span></td>
 
 
 
 
424
  </tr>
425
  <tr>
426
- <th valign="top"><?php esc_html_e('Automatically resize','nggallery'); ?></th>
427
- <td><input type="checkbox" name="imgAutoResize" value="1" <?php checked(true, $ngg->options['imgAutoResize']); ?> />
428
- <span><?php esc_html_e('Automatically resize images on upload.','nggallery') ?></span></td>
 
 
 
 
429
  </tr>
430
  </table>
431
- <!-- Thumbnail settings -->
432
- <h3><?php esc_html_e('Thumbnail settings','nggallery'); ?></h3>
433
- <p class="description"><?php esc_html_e('Please note: if you change these settings, you need to recreate the thumbnails under -> Manage Gallery .', 'nggallery') ?></p>
434
  <table class="form-table ngg-options">
435
- <tr valign="top">
436
- <th align="left"><?php esc_html_e('Thumbnail size','nggallery'); ?></th>
437
  <td>
438
- <label for="thumbwidth"><?php esc_html_e('Width','nggallery') ?></label>
439
- <input type="number" step="1" min="0" class="small-text" name="thumbwidth" value="<?php echo $ngg->options['thumbwidth']; ?>" />
440
- <label for="thumbheight"><?php esc_html_e('Height','nggallery') ?></label>
441
- <input type="number" step="1" min="0" class="small-text" name="thumbheight" value="<?php echo $ngg->options['thumbheight']; ?>" />
442
- <p class="description"><?php esc_html_e('These values are maximum values ','nggallery'); ?></p></td>
 
443
  </tr>
444
- <tr valign="top">
445
- <th align="left"><?php esc_html_e('Fixed size','nggallery'); ?></th>
446
- <td><input type="checkbox" name="thumbfix" value="true" <?php checked(true, $ngg->options['thumbfix']); ?> />
447
- <?php esc_html_e('This will ignore the aspect ratio, so no portrait thumbnails','nggallery') ?></td>
 
 
448
  </tr>
449
- <tr valign="top">
450
- <th align="left"><?php esc_html_e('Thumbnail quality','nggallery'); ?></th>
451
- <td><input type="number" step="1" min="0" max="100" class="small-text" name="thumbquality" value="<?php echo $ngg->options['thumbquality']; ?>" /><label for="thumbquality">%</label></td>
452
  </tr>
453
  </table>
454
- <h3><?php esc_html_e('Single picture','nggallery') ?></h3>
455
  <table class="form-table ngg-options">
456
  <tr>
457
- <th valign="top"><?php esc_html_e('Clear cache folder','nggallery'); ?></th>
458
- <td><input type="submit" name="clearcache" class="button-secondary" value="<?php esc_attr_e('Proceed now','nggallery') ;?> &raquo;"/></td>
459
  </tr>
460
  </table>
461
- <div class="submit"><input class="button-primary" type="submit" name="updateoption" value="<?php esc_attr_e('Save Changes') ;?>"/></div>
462
  </form>
463
 
464
- <?php
465
- }
466
-
467
- function tab_gallery() {
468
- global $ngg;
469
- ?>
470
- <!-- Gallery settings -->
471
- <h3><?php esc_html_e('Gallery settings','nggallery'); ?></h3>
472
- <form name="galleryform" method="POST" action="<?php echo $this->filepath.'#gallery'; ?>" >
473
- <?php wp_nonce_field('ngg_settings') ?>
474
- <input type="hidden" name="page_options" value="galNoPages,galImages,galColumns,galShowSlide,galTextSlide,galTextGallery,galShowOrder,galImgBrowser,galSort,galSortDir,galHiddenImg,galAjaxNav" />
 
 
475
  <table class="form-table ngg-options">
476
  <tr>
477
- <th valign="top"><?php esc_html_e('Inline gallery','nggallery') ?></th>
478
- <td><input name="galNoPages" type="checkbox" value="true" <?php checked(true, $ngg->options['galNoPages']); ?> />
479
- <?php esc_html_e('Galleries will not be shown on a subpage, but on the same page.','nggallery') ?>
 
480
  </td>
481
  </tr>
482
  <tr>
483
- <th valign="top"><?php esc_html_e('Images per page','nggallery') ?></th>
484
- <td><input type="number" step="1" min="0" class="small-text" name="galImages" value="<?php echo $ngg->options['galImages']; ?>" />
485
- <label for="galImages">images</label>
486
- <p class="description"><?php esc_html_e('0 will disable pagination, all images on one page','nggallery') ?></p>
 
487
  </td>
488
  </tr>
489
  <tr>
490
- <th valign="top"><?php esc_html_e('Columns','nggallery'); ?></th>
491
- <td><input type="number" step="1" min="0" class="small-text" name="galColumns" value="<?php echo $ngg->options['galColumns']; ?>" />
492
- <label for="galColumns">columns per page</label>
493
- <p class="description"><?php esc_html_e('0 will display as much columns as possible. This is normally only required for captions below the images.','nggallery') ?></p>
 
494
  </td>
495
  </tr>
496
  <tr>
497
- <th valign="top"><?php esc_html_e('Slideshow','nggallery'); ?></th>
498
- <td><input name="galShowSlide" type="checkbox" value="true" <?php checked(true, $ngg->options['galShowSlide']); ?> /> <?php esc_html_e('Enable slideshow','nggallery'); ?><br/><?php esc_html_e('Text to show:','nggallery'); ?>
499
- <input type="text" class="regular-text" name="galTextSlide" value="<?php echo $ngg->options['galTextSlide'] ?>" />
500
- <input type="text" name="galTextGallery" value="<?php echo $ngg->options['galTextGallery'] ?>" class="regular-text"/>
501
- <p class="description"> <?php esc_html_e('This is the text the visitors will have to click to switch between display modes.','nggallery'); ?></p>
 
 
 
 
 
 
 
 
502
  </td>
503
  </tr>
504
  <tr>
505
- <th valign="top"><?php esc_html_e('Show first','nggallery'); ?></th>
506
- <td><label><input name="galShowOrder" type="radio" value="gallery" <?php checked('gallery', $ngg->options['galShowOrder']); ?> /> <?php esc_html_e('Thumbnails', 'nggallery') ;?></label><br />
507
- <label><input name="galShowOrder" type="radio" value="slide" <?php checked('slide', $ngg->options['galShowOrder']); ?> /> <?php esc_html_e('Slideshow', 'nggallery') ;?></label>
508
- <p class="description">Choose what the visitors will see first.</p>
 
 
 
 
 
 
 
 
 
 
509
  </td>
510
  </tr>
511
  <tr>
512
- <th valign="top"><?php esc_html_e('ImageBrowser','nggallery'); ?></th>
513
- <td><input name="galImgBrowser" type="checkbox" value="true" <?php checked(true, $ngg->options['galImgBrowser']); ?> />
514
- <?php esc_html_e('Use ImageBrowser instead of another effect.', 'nggallery'); ?>
 
 
 
515
  </td>
516
  </tr>
517
  <tr>
518
- <th valign="top"><?php esc_html_e('Hidden images','nggallery'); ?></th>
519
- <td><input name="galHiddenImg" type="checkbox" value="true" <?php checked(true, $ngg->options['galHiddenImg']); ?> />
520
- <?php esc_html_e('Loads all images for the modal window, when pagination is used (like Thickbox, Lightbox etc.).','nggallery'); ?>
521
- <p class="description"> <?php esc_html_e('Note: this increases the page load (possibly a lot)', 'nggallery'); ?>
 
 
 
522
  </td>
523
  </tr>
524
  <tr>
525
- <th valign="top"><?php esc_html_e('AJAX pagination','nggallery'); ?></th>
526
- <td><input name="galAjaxNav" type="checkbox" value="true" <?php checked(true, $ngg->options['galAjaxNav']); ?> />
527
- <?php esc_html_e('Use AJAX pagination to browse images without reloading the page.','nggallery'); ?>
528
- <p class="description"><?php esc_html_e('Note: works only in combination with the Shutter effect.', 'nggallery'); ?> </p>
 
 
 
529
  </td>
530
  </tr>
531
  </table>
532
- <h3><?php esc_html_e('Sort options','nggallery') ?></h3>
533
  <table class="form-table ngg-options">
534
  <tr>
535
- <th valign="top"><?php esc_html_e('Sort thumbnails','nggallery') ?></th>
536
  <td>
537
- <label><input name="galSort" type="radio" value="sortorder" <?php checked('sortorder', $ngg->options['galSort']); ?> /> <?php esc_html_e('Custom order', 'nggallery') ;?></label><br />
538
- <label><input name="galSort" type="radio" value="pid" <?php checked('pid', $ngg->options['galSort']); ?> /> <?php esc_html_e('Image ID', 'nggallery') ;?></label><br />
539
- <label><input name="galSort" type="radio" value="filename" <?php checked('filename', $ngg->options['galSort']); ?> /> <?php esc_html_e('File name', 'nggallery') ;?></label><br />
540
- <label><input name="galSort" type="radio" value="alttext" <?php checked('alttext', $ngg->options['galSort']); ?> /> <?php esc_html_e('Alt / Title text', 'nggallery') ;?></label><br />
541
- <label><input name="galSort" type="radio" value="imagedate" <?php checked('imagedate', $ngg->options['galSort']); ?> /> <?php esc_html_e('Date / Time', 'nggallery') ;?></label>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
542
  </td>
543
  </tr>
544
  <tr>
545
- <th valign="top"><?php esc_html_e('Sort direction','nggallery') ?></th>
546
- <td><label><input name="galSortDir" type="radio" value="ASC" <?php checked('ASC', $ngg->options['galSortDir']); ?> /> <?php esc_html_e('Ascending', 'nggallery') ;?></label><br />
547
- <label><input name="galSortDir" type="radio" value="DESC" <?php checked('DESC', $ngg->options['galSortDir']); ?> /> <?php esc_html_e('Descending', 'nggallery') ;?></label>
 
 
 
 
 
 
 
548
  </td>
549
  </tr>
550
  </table>
551
- <div class="submit"><input class="button-primary" type="submit" name="updateoption" value="<?php esc_attr_e('Save Changes') ;?>"/></div>
552
  </form>
553
- <?php
554
- }
555
-
556
- function tab_effects() {
557
- global $ngg;
558
- ?>
559
- <!-- Effects settings -->
560
- <h3><?php esc_html_e('Effects','nggallery'); ?></h3>
561
- <form name="effectsform" method="POST" action="<?php echo $this->filepath.'#effects'; ?>" >
562
- <?php wp_nonce_field('ngg_settings') ?>
563
- <input type="hidden" name="page_options" value="thumbEffect,thumbCode" />
564
- <p><?php esc_html_e('Here you can select the thumbnail effect, NextCellent Gallery will integrate the required HTML code in the images. Please note that only the Shutter and Thickbox effect will automatic added to your theme.','nggallery'); ?>
565
- <?php esc_html_e('With the placeholder','nggallery'); ?><strong> %GALLERY_NAME% </strong> <?php esc_html_e('you can activate a navigation through the images (depend on the effect). Change the code line only , when you use a different thumbnail effect or you know what you do.','nggallery'); ?></p>
 
 
 
 
566
  <table class="form-table ngg-options">
567
- <tr valign="top">
568
- <th><?php esc_html_e('JavaScript Thumbnail effect','nggallery') ?></th>
569
  <td>
570
- <select size="1" id="thumbEffect" name="thumbEffect" onchange="insertcode(this.value)">
571
- <option value="none" <?php selected('none', $ngg->options['thumbEffect']); ?> ><?php esc_html_e('None', 'nggallery') ;?></option>
572
- <option value="thickbox" <?php selected('thickbox', $ngg->options['thumbEffect']); ?> ><?php esc_html_e('Thickbox', 'nggallery') ;?></option>
573
- <option value="lightbox" <?php selected('lightbox', $ngg->options['thumbEffect']); ?> ><?php esc_html_e('Lightbox', 'nggallery') ;?></option>
574
- <option value="highslide" <?php selected('highslide', $ngg->options['thumbEffect']); ?> ><?php esc_html_e('Highslide', 'nggallery') ;?></option>
575
- <option value="shutter" <?php selected('shutter', $ngg->options['thumbEffect']); ?> ><?php esc_html_e('Shutter', 'nggallery') ;?></option>
576
- <option value="custom" <?php selected('custom', $ngg->options['thumbEffect']); ?> ><?php esc_html_e('Custom', 'nggallery') ;?></option>
577
- </select>
578
  </td>
579
  </tr>
580
- <tr valign="top">
581
- <th><?php esc_html_e('Link Code line','nggallery') ?></th>
582
- <td><textarea id="thumbCode" name="thumbCode" cols="50" rows="5"><?php echo htmlspecialchars(stripslashes($ngg->options['thumbCode'])); ?></textarea></td>
583
  </tr>
584
  </table>
585
- <div class="submit"><input class="button-primary" type="submit" name="updateoption" value="<?php esc_attr_e('Save Changes') ;?>"/></div>
586
  </form>
 
 
587
 
588
- <?php
589
- }
590
-
591
- function tab_watermark() {
592
-
593
- global $ngg;
594
-
595
- // take the first image as sample
596
- $image_array = nggdb::find_last_images(0, 1);
597
- $ngg_image = $image_array[0];
598
- $imageID = $ngg_image->pid;
599
- $imageURL = $imageURL = '<img src="' . home_url( 'index.php' ) . '?callback=image&amp;pid=' . intval( $imageID ) . '&amp;mode=watermark&amp;width=300&amp;height=250" />';
600
-
601
- ?>
602
- <!-- Watermark settings -->
603
- <h3><?php esc_html_e('Watermark','nggallery'); ?></h3>
604
- <p><?php esc_html_e('Please note : you can only activate the watermark under -> Manage Galleries . This action cannot be undone.', 'nggallery') ?></p>
605
- <form name="watermarkform" method="POST" action="<?php echo $this->filepath.'#watermark'; ?>" >
606
- <?php wp_nonce_field('ngg_settings') ?>
607
- <input type="hidden" name="page_options" value="wmPos,wmXpos,wmYpos,wmType,wmPath,wmFont,wmSize,wmColor,wmText,wmOpaque" />
608
- <div id="wm-preview">
609
- <h3><?php esc_html_e('Preview','nggallery') ?></h3>
610
- <p style="text-align:center;"><?php echo $imageURL; ?></p>
611
- <h3><?php esc_html_e('Position','nggallery') ?></h3>
612
- <div>
613
- <table id="wm-position">
614
- <tr>
615
- <td valign="top">
616
- <strong><?php esc_html_e('Position','nggallery') ?></strong>
617
- <table border="1">
618
- <tr>
619
- <td><input type="radio" name="wmPos" value="topLeft" <?php checked('topLeft', $ngg->options['wmPos']); ?> /></td>
620
- <td><input type="radio" name="wmPos" value="topCenter" <?php checked('topCenter', $ngg->options['wmPos']); ?> /></td>
621
- <td><input type="radio" name="wmPos" value="topRight" <?php checked('topRight', $ngg->options['wmPos']); ?> /></td>
622
- </tr>
623
- <tr>
624
- <td><input type="radio" name="wmPos" value="midLeft" <?php checked('midLeft', $ngg->options['wmPos']); ?> /></td>
625
- <td><input type="radio" name="wmPos" value="midCenter" <?php checked('midCenter', $ngg->options['wmPos']); ?> /></td>
626
- <td><input type="radio" name="wmPos" value="midRight" <?php checked('midRight', $ngg->options['wmPos']); ?> /></td>
627
- </tr>
628
- <tr>
629
- <td><input type="radio" name="wmPos" value="botLeft" <?php checked('botLeft', $ngg->options['wmPos']); ?> /></td>
630
- <td><input type="radio" name="wmPos" value="botCenter" <?php checked('botCenter', $ngg->options['wmPos']); ?> /></td>
631
- <td><input type="radio" name="wmPos" value="botRight" <?php checked('botRight', $ngg->options['wmPos']); ?> /></td>
632
- </tr>
633
- </table>
634
- </td>
635
- <td valign="top">
636
- <strong><?php esc_html_e('Offset','nggallery') ?></strong>
637
- <table border="0">
638
- <tr>
639
- <td>x:</td>
640
- <td><input type="number" step="1" min="0" class="small-text" name="wmXpos" value="<?php echo $ngg->options['wmXpos'] ?>" /><label for="wmXpos">px</label></td>
641
- </tr>
642
- <tr>
643
- <td>y:</td>
644
- <td><input type="number" step="1" min="0" class="small-text" name="wmYpos" value="<?php echo $ngg->options['wmYpos'] ?>" /><label for="wmYpos">px</label></td>
645
- </tr>
646
- </table>
647
- </td>
648
- </tr>
 
 
 
 
 
649
  </table>
650
  </div>
651
- </div>
652
- <h3><label><input type="radio" name="wmType" value="image" <?php checked('image', $ngg->options['wmType']); ?> /> <?php esc_html_e('Use image as watermark','nggallery') ?></label></h3>
653
  <table class="wm-table form-table">
654
  <tr>
655
- <th><?php esc_html_e('URL to file','nggallery') ?></th>
656
- <td><input type="text" size="40" name="wmPath" value="<?php echo $ngg->options['wmPath']; ?>" /><br />
657
- <?php if(!ini_get('allow_url_fopen')) esc_html_e('The accessing of URL files is disabled at your server (allow_url_fopen)','nggallery') ?> </td>
658
  </tr>
659
  </table>
660
- <h3><label><input type="radio" name="wmType" value="text" <?php checked('text', $ngg->options['wmType']); ?> /> <?php esc_html_e('Use text as watermark','nggallery') ?></label></h3>
661
  <table class="wm-table form-table">
662
  <tr>
663
- <th><?php esc_html_e('Font','nggallery') ?></th>
664
- <td><select name="wmFont" size="1"> <?php
665
- $fontlist = ngg_get_TTFfont();
 
 
666
  foreach ( $fontlist as $fontfile ) {
667
- echo "\n".'<option value="'.$fontfile.'" '.ngg_input_selected($fontfile, $ngg->options['wmFont']).' >'.$fontfile.'</option>';
668
  }
669
  ?>
670
- </select><br /><span>
671
- <?php if ( !function_exists('ImageTTFBBox') )
672
- _e('This function will not work, cause you need the FreeType library','nggallery');
673
- else
674
- _e('You can upload more fonts in the folder <strong>nggallery/fonts</strong>','nggallery'); ?>
675
- </span>
 
 
676
  </td>
677
  </tr>
678
  <tr>
679
- <th><?php esc_html_e('Size','nggallery') ?></th>
680
- <td><input type="number" step="1" min="0" class="small-text" name="wmSize" value="<?php echo $ngg->options['wmSize']; ?>"/><label for="wmSize">px</label></td>
681
  </tr>
682
  <tr>
683
- <th><?php esc_html_e('Color','nggallery') ?></th>
684
- <td><input class="picker" type="text" id="wmColor" name="wmColor" value="<?php echo $ngg->options['wmColor'] ?>" />
685
  </tr>
686
  <tr>
687
- <th valign="top"><?php esc_html_e('Text','nggallery') ?></th>
688
- <td><textarea name="wmText" cols="40" rows="4"><?php echo $ngg->options['wmText'] ?></textarea></td>
689
  </tr>
690
  <tr>
691
- <th><?php esc_html_e('Opaque','nggallery') ?></th>
692
- <td><input type="number" step="1" min="0" max="100" class="small-text" name="wmOpaque" value="<?php echo $ngg->options['wmOpaque'] ?>"/><label for="wmOpaque">%</label></td>
693
  </tr>
694
  </table>
695
- <div class="clear"> &nbsp; </div>
696
- <div class="submit"><input class="button-primary" type="submit" name="updateoption" value="<?php esc_attr_e('Save Changes') ;?>"/></div>
697
  </form>
698
- <?php
699
- }
700
-
701
- function tab_slideshow() {
702
-
703
- global $ngg;
704
- ?>
705
- <!-- Slideshow settings -->
706
- <form name="player_options" method="POST" action="<?php echo $this->filepath.'#slideshow'; ?>" >
707
- <?php wp_nonce_field('ngg_settings'); ?>
708
- <input type="hidden" name="page_options" value="irAutoDim,slideFx,irWidth,irHeight,irRotatetime,irLoop,irDrag,irNavigation,irNavigationDots,irAutoplay,irAutoplayTimeout,irAutoplayHover,irNumber,irClick" />
709
- <h3><?php esc_html_e('Slideshow','nggallery'); ?></h3>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
710
  <table class="form-table ngg-options">
711
  <tr>
712
- <th><?php esc_html_e('Fit to space','nggallery') ?></th>
713
- <td><input type="checkbox" name="irAutoDim" value="true" <?php checked( true, $ngg->options['irAutoDim']); ?>" /><label for="irAutoDim"><?php _e( "Let the slideshow fit in the available space.", 'nggallery'); ?></label></td>
 
 
 
714
  </tr>
715
  <tr>
716
- <th><?php esc_html_e('Default size','nggallery') ?></th>
717
  <td>
718
- <label for="irWidth"><?php esc_html_e('Width','nggallery') ?></label>
719
- <input <?php if($ngg->options['irAutoDim']) echo "readonly"; ?> type="number" step="1" min="0" class="small-text" name="irWidth" value="<?php echo $ngg->options['irWidth']; ?>" />
720
- <label for="irHeight"><?php esc_html_e('Height','nggallery') ?></label>
721
- <input <?php if($ngg->options['irAutoDim']) echo "readonly"; ?> type="number" step="1" min="0" class="small-text" name="irHeight" value="<?php echo $ngg->options['irHeight']; ?>" />
722
  </td>
723
  </tr>
724
  <tr>
725
- <th><?php esc_html_e('Transition / Fade effect','nggallery') ?></th>
726
  <td>
727
- <select size="1" name="slideFx"><?php
728
-
729
  $options = array(
730
  __( 'Attention Seekers', 'nggallery' ) => array( "bounce", "flash", "pulse", "rubberBand", "shake", "swing", "tada", "wobble"),
731
  __( 'Bouncing Entrances', 'nggallery' ) => array( "bounceIn", "bounceInDown", "bounceInLeft", "bounceInRight", "bounceInUp" ),
@@ -740,131 +906,121 @@ class nggOptions {
740
  );
741
 
742
  foreach( $options as $option => $val ) {
743
- echo convert_to_optgroup( $val, $option );
744
  }
745
  ?>
746
  </select>
747
- <p class="description"><?php _e("These effects are powered by"); ?> <strong>animate.css</strong>. <a target="_blank" href="http://daneden.github.io/animate.css/"><?php _e("Click here for examples of all effects and to learn more."); ?></a></p>
748
- </td>
 
749
  </tr>
750
- <!-- NEW ONES; TO ADD -->
751
  <tr>
752
- <th><?php esc_html_e('Loop','nggallery') ?></th>
753
- <td><input type="checkbox" name="irLoop" value="true" <?php checked( true, $ngg->options['irLoop']); ?>" /><label for="irLoop"><?php _e( "Infinity loop. Duplicate last and first items to get loop illusion.", 'nggallery'); ?></label></td>
 
 
 
754
  </tr>
755
  <tr>
756
- <th><?php esc_html_e('Mouse/touch drag','nggallery') ?></th>
757
- <td><input type="checkbox" name="irDrag" value="true" <?php checked( true, $ngg->options['irDrag']); ?>" /><label for="irDrag"><?php _e( "Enable dragging with the mouse (or touch).", 'nggallery'); ?></label></td>
 
 
 
758
  </tr>
759
  <tr>
760
- <th><?php esc_html_e('Previous / Next','nggallery') ?></th>
761
- <td><input type="checkbox" name="irNavigation" value="true" <?php checked( true, $ngg->options['irNavigation']); ?> /><label for="irNavigation"><?php _e( "Show next/previous buttons.", 'nggallery'); ?></label></td>
 
 
 
762
  </tr>
763
  <tr>
764
- <th><?php esc_html_e('Show dots','nggallery') ?></th>
765
- <td><input type="checkbox" name="irNavigationDots" value="true" <?php checked( true, $ngg->options['irNavigationDots']); ?> /><label for="irNavigationDots"><?php _e( "Show dots for each image.", 'nggallery'); ?></label></td>
 
 
 
766
  </tr>
767
  <tr>
768
- <th><?php esc_html_e('Autoplay','nggallery') ?></th>
769
- <td><input type="checkbox" name="irAutoplay" value="true" <?php checked( true, $ngg->options['irAutoplay']); ?> /><label for="irAutoplay"><?php _e( "Automatically play the images.", 'nggallery'); ?></label></td>
 
 
 
770
  </tr>
771
  <tr>
772
- <th><?php esc_html_e('Duration','nggallery') ?></th>
773
- <td><input <?php if(!$ngg->options['irAutoplay']) echo "readonly"; ?> type="number" type="number" step="1" min="0" class="small-text" name="irRotatetime" value="<?php echo $ngg->options['irRotatetime'] ?>" /> <label for="irRotatetime"><?php esc_html_e('sec.', 'nggallery') ;?></label></td>
 
 
 
774
  </tr>
775
  <tr>
776
- <th><?php esc_html_e('Pause on hover','nggallery') ?></th>
777
- <td><input <?php if(!$ngg->options['irAutoplay']) echo "readonly"; ?> type="checkbox" name="irAutoplayHover" value="true" <?php checked( true, $ngg->options['irAutoplayHover']); ?> /><label for="irAutoplayHover"><?php _e( "Pause when hovering over the slideshow.", 'nggallery'); ?></label></td>
 
 
 
778
  </tr>
779
  <tr>
780
- <th><?php esc_html_e('Click for next','nggallery') ?></th>
781
- <td><input type="checkbox" name="irClick" value="true" <?php checked( true, $ngg->options['irClick']); ?> /><label for="irClick"><?php _e( "Click to go to the next image.", 'nggallery'); ?></label></td>
 
 
782
  </tr>
783
  <tr>
784
- <th><?php esc_html_e('Number of images','nggallery') ?></th>
785
  <td>
786
- <input type="number" type="number" step="1" min="1" class="small-text" name="irNumber" value="<?php echo $ngg->options['irNumber'] ?>" /> <label for="irNumber"><?php esc_html_e('images', 'nggallery') ;?></label>
 
787
  <p class="description"><?php _e( "Number of images to display when using random or latest.", 'nggallery'); ?></p>
788
  </td>
789
  </tr>
790
- </table>
791
- <div class="submit"><input class="button-primary" type="submit" name="updateoption" value="<?php esc_attr_e('Save Changes') ;?>"/></div>
792
  </form>
793
- <?php
794
- }
795
- }
796
-
797
- function ngg_get_TTFfont() {
798
-
799
- $ttf_fonts = array ();
800
-
801
- // Files in wp-content/plugins/nggallery/fonts directory
802
- $plugin_root = NGGALLERY_ABSPATH . 'fonts';
803
-
804
- $plugins_dir = @ dir($plugin_root);
805
- if ($plugins_dir) {
806
- while (($file = $plugins_dir->read()) !== false) {
807
- if (preg_match('|^\.+$|', $file))
808
- continue;
809
- if (is_dir($plugin_root.'/'.$file)) {
810
- $plugins_subdir = @ dir($plugin_root.'/'.$file);
811
- if ($plugins_subdir) {
812
- while (($subfile = $plugins_subdir->read()) !== false) {
813
- if (preg_match('|^\.+$|', $subfile))
814
- continue;
815
- if (preg_match('|\.ttf$|', $subfile))
816
- $ttf_fonts[] = "$file/$subfile";
817
- }
818
- }
819
- } else {
820
- if (preg_match('|\.ttf$|', $file))
821
- $ttf_fonts[] = $file;
822
- }
823
- }
824
  }
825
 
826
- return $ttf_fonts;
827
- }
 
 
 
 
 
 
 
828
 
829
- /**
830
- * Convert an array of options to a html dropdown group.
831
- * 20150124: To improve: a class calling a function outside the class... should be fixed.
832
- * @param $data array The option values (and display).
833
- * @param $title string (optional) The label of the optgroup.
834
- *
835
- * @return string The output.
836
- */
837
- function convert_to_optgroup( $data, $title = null) {
838
 
839
- global $ngg;
 
 
 
 
840
 
841
- if ( is_null($title) ) {
842
- $out = null;
843
- } else {
844
- $out = '<optgroup label="' . $title . '">';
845
- }
846
 
847
- foreach( $data as $option) {
848
- $out .= '<option value="' . $option . '" ' . selected( $option, $ngg->options['slideFx'] ) . '>' . $option . '</option>';
849
- }
850
 
851
- if ( !is_null( $title ) ) {
852
- $out .= '</optgroup>';
853
  }
854
 
855
- return $out;
856
- }
857
-
858
- /**********************************************************/
859
- // taken from WP Core
860
-
861
- function ngg_input_selected( $selected, $current) {
862
- if ( $selected == $current)
863
- return ' selected="selected"';
864
- }
865
-
866
- function ngg_input_checked( $checked, $current) {
867
- if ( $checked == $current)
868
- return ' checked="checked"';
869
- }
870
- ?>
12
  class ngg_rebuild_unique_slugs {
13
 
14
  function start_rebuild() {
15
+ global $wpdb;
16
 
17
+ $total = array();
18
+ // get the total number of images
19
  $total['images'] = intval( $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->nggpictures") );
20
+ $total['gallery'] = intval( $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->nggallery") );
21
+ $total['album'] = intval( $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->nggalbum") );
22
 
23
  $messages = array(
24
  'images' => __( 'Rebuild image structure : %s / %s images', 'nggallery' ),
25
  'gallery' => __( 'Rebuild gallery structure : %s / %s galleries', 'nggallery' ),
26
+ 'album' => __( 'Rebuild album structure : %s / %s albums', 'nggallery' ),
27
  );
28
 
29
+ foreach ( array_keys( $messages ) as $key ) {
30
 
31
+ $message = sprintf( $messages[ $key ] ,
32
+ "<span class='ngg-count-current'>0</span>",
33
+ "<span class='ngg-count-total'>" . $total[ $key ] . "</span>"
34
+ );
35
 
36
+ echo "<div class='$key updated'><p class='ngg'>$message</p></div>";
37
+ }
38
 
39
  $ajax_url = add_query_arg( 'action', 'ngg_rebuild_unique_slugs', admin_url( 'admin-ajax.php' ) );
40
  ?>
44
  _action = 'images',
45
  images = <?php echo $total['images']; ?>,
46
  gallery = <?php echo $total['gallery']; ?>,
47
+ album = <?php echo $total['album']; ?>,
48
+ total = 0,
49
+ offset = 0,
50
  count = 50;
51
 
52
  var $display = $('.ngg-count-current');
53
+ $('.finished, .gallery, .album').hide();
54
+ total = images;
55
 
56
  function call_again() {
57
  if ( offset > total ) {
58
+ offset = 0;
59
+ // 1st run finished
60
+ if (_action == 'images') {
61
+ _action = 'gallery';
62
+ total = gallery;
63
+ $('.images, .gallery').toggle();
64
+ $display.html(offset);
65
+ call_again();
66
+ return;
67
+ }
68
+ // 2nd run finished
69
+ if (_action == 'gallery') {
70
+ _action = 'album';
71
+ total = album;
72
+ $('.gallery, .album').toggle();
73
+ $display.html(offset);
74
+ call_again();
75
+ return;
76
+ }
77
+ // 3rd run finished, exit now
78
+ if (_action == 'album') {
79
+ $('.ngg')
80
+ .html('<?php esc_html_e( 'Done.', 'nggallery' ); ?>')
81
+ .parent('div').hide();
82
+ $('.finished').show();
83
+ return;
84
+ }
85
  }
86
 
87
  $.post(ajax_url, {'_action': _action, 'offset': offset}, function(response) {
100
  }
101
 
102
  //20150124 FZSM: Suggested rule: no class should call a spaghuetti code directly...
103
+ /**
104
+ * Class nggOptions - the settings page.
105
+ */
106
  class nggOptions {
107
 
108
+ public function __construct() {
 
 
 
 
 
109
 
110
+ // same as $_SERVER['REQUEST_URI'], but should work under IIS 6.0
111
  $this->filepath = admin_url() . 'admin.php?page=' . $_GET['page'];
112
 
113
+ //Look for POST updates
114
+ if ( !empty($_POST) ) {
115
  $this->processor();
116
+ }
117
+ }
118
 
119
  /**
120
  * Save/Load options and add a new hook for plugins
 
 
121
  */
122
+ public function processor() {
123
+
124
+ global $ngg, $nggRewrite;
125
+
126
+ $old_state = $ngg->options['usePermalinks'];
127
+ $old_slug = $ngg->options['permalinkSlug'];
128
+
129
+ if ( isset($_POST['updateoption']) ) {
130
+ check_admin_referer('ngg_settings');
131
+ // get the hidden option fields, taken from WP core
132
+ if ( $_POST['page_options'] )
133
+ $options = explode(',', stripslashes($_POST['page_options']));
134
+
135
+ if ($options) {
136
+ foreach ($options as $option) {
137
+ $option = trim($option);
138
+ $value = false;
139
+ if ( isset( $_POST[ $option ] ) ) {
140
+ $value = trim( $_POST[ $option ] );
141
+ if ($value === "true") {
142
+ $value = true;
143
+ }
144
+
145
+ if ( is_numeric( $value ) ) {
146
+ $value = (int) $value;
147
+ }
148
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
+ $ngg->options[$option] = $value;
151
+ }
152
+
153
+ // do not allow a empty string
154
+ if ( empty ( $ngg->options['permalinkSlug'] ) )
155
+ $ngg->options['permalinkSlug'] = 'nggallery';
156
+
157
+ // the path should always end with a slash
158
+ $ngg->options['gallerypath'] = trailingslashit($ngg->options['gallerypath']);
159
+ $ngg->options['imageMagickDir'] = trailingslashit($ngg->options['imageMagickDir']);
160
 
161
+ // the custom sortorder must be ascending
162
+ $ngg->options['galSortDir'] = ($ngg->options['galSort'] == 'sortorder') ? 'ASC' : $ngg->options['galSortDir'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  }
164
+ // Save options
165
+ update_option('ngg_options', $ngg->options);
166
 
167
+ // Flush Rewrite rules
168
+ if ( $old_state != $ngg->options['usePermalinks'] || $old_slug != $ngg->options['permalinkSlug'] )
169
+ $nggRewrite->flush();
170
+
171
+ nggGallery::show_message(__('Settings updated successfully','nggallery'));
172
+ }
173
+
174
+ if ( isset($_POST['clearcache']) ) {
175
+ check_admin_referer('ngg_settings');
176
+
177
+ $path = WINABSPATH . $ngg->options['gallerypath'] . 'cache/';
178
+
179
+ if (is_dir($path))
180
+ if ($handle = opendir($path)) {
181
+ while (false !== ($file = readdir($handle))) {
182
+ if ($file != '.' && $file != '..') {
183
+ @unlink($path . '/' . $file);
184
+ }
185
+ }
186
+ closedir($handle);
187
+ }
188
+
189
+ nggGallery::show_message(__('Cache cleared','nggallery'));
190
+ }
191
+
192
+ if ( isset($_POST['createslugs']) ) {
193
+ check_admin_referer('ngg_settings');
194
+ ngg_rebuild_unique_slugs::start_rebuild();
195
+ }
196
+
197
+ do_action( 'ngg_update_options_page' );
198
+
199
+ }
200
+
201
+ /**
202
+ * Render the page content
203
+ * 20150124:FZSM: there should be a cleaner way to handle this, instead making dynamic functions and actions.
204
+ */
205
+ public function show_page() {
206
+
207
+ // get list of tabs
208
+ $tabs = $this->get_tabs();
209
+
210
+ ?>
211
+ <div class="wrap">
212
+ <h2><?php _e('Settings', 'nggallery') ?></h2>
213
+ <div id="slider" style="display: none;">
214
+ <ul id="tabs">
215
+ <?php
216
+ foreach($tabs as $tab_key => $tab_name) {
217
+ echo "\n\t\t<li><a class='nav-tab' href='#$tab_key'>$tab_name</a></li>";
218
+ }
219
+ ?>
220
+ </ul>
221
+ <?php
222
+ foreach($tabs as $tab_key => $tab_name) {
223
+ echo "\n\t<div id='$tab_key'>\n";
224
+ // Looks for the internal class function, otherwise enable a hook for plugins
225
+ if ( method_exists( $this, "tab_$tab_key" ))
226
+ call_user_func( array( $this , "tab_$tab_key") );
227
+ else
228
+ do_action( 'ngg_tab_content_' . $tab_key );
229
+ echo "\n\t</div>";
230
+ }
231
+ ?>
232
+ </div>
233
+ </div>
234
+ <?php
235
+ $this->get_javascript();
236
+
237
+ }
238
+
239
+ private function get_javascript() {
240
+ ?>
241
+ <script type="text/javascript">
242
+ function insertcode(value) {
243
+ var effectcode;
244
+ switch (value) {
245
+ case 'none':
246
+ effectcode = "";
247
+ break;
248
+ case "thickbox":
249
+ effectcode = 'class="thickbox" rel="%GALLERY_NAME%"';
250
+ break;
251
+ case "lightbox":
252
+ effectcode = 'rel="lightbox[%GALLERY_NAME%]"';
253
+ break;
254
+ case "highslide":
255
+ effectcode = 'class="highslide" onclick="return hs.expand(this, { slideshowGroup: %GALLERY_NAME% })"';
256
+ break;
257
+ case "shutter":
258
+ effectcode = 'class="shutterset_%GALLERY_NAME%"';
259
+ break;
260
+ default:
261
+ break;
262
+ }
263
+ jQuery("#thumbCode").val(effectcode);
264
+ }
265
+
266
+ jQuery(document).ready( function($) {
267
+ //$('html,body').scrollTop(0);
268
+ //Set tabs.
269
+ $('#slider').tabs({ fxFade: true, fxSpeed: 'fast' }).css('display', 'block');
270
+
271
+ //Set colorpicker.
272
+ $('.picker').wpColorPicker();
273
+
274
+ //Set preview for watermark.
275
+ $('#wm-preview-select').on("nggAutocompleteDone", function() {
276
+ $('#wm-preview-image').attr("src", '<?php echo home_url( 'index.php' ); ?>' + '?callback=image&pid=' + this.value + '&mode=watermark');
277
+ $('#wm-preview-image-url').attr("href", '<?php echo home_url( 'index.php' ); ?>' + '?callback=image&pid=' + this.value + '&mode=watermark');
278
+ });
279
+
280
+ jQuery("#wm-preview-select").nggAutocomplete( {
281
+ type: 'image',domain: "<?php echo home_url('index.php', is_ssl() ? 'https' : 'http'); ?>"
282
+ });
283
+ });
284
+ </script>
285
+ <?php
286
+ }
287
+
288
+ /**
289
+ * Create array for tabs and add a filter for other plugins to inject more tabs
290
+ *
291
+ * @return array $tabs
292
+ */
293
+ private function get_tabs() {
294
+
295
+ $tabs = array();
296
+
297
+ $tabs['general'] = __('General', 'nggallery');
298
+ $tabs['images'] = __('Images', 'nggallery');
299
+ $tabs['gallery'] = __( 'Gallery', 'nggallery' );
300
+ $tabs['effects'] = __('Effects', 'nggallery');
301
+ $tabs['watermark'] = __('Watermark', 'nggallery');
302
+ $tabs['slideshow'] = __('Slideshow', 'nggallery');
303
+
304
+ $tabs = apply_filters('ngg_settings_tabs', $tabs);
305
+
306
+ return $tabs;
307
+
308
+ }
309
+
310
+ /**
311
+ * Show the general options.
312
+ */
313
+ private function tab_general() {
314
+ global $ngg;
315
+ ?>
316
+ <h3><?php _e( 'General settings', 'nggallery' ); ?></h3>
317
  <form name="generaloptions" method="post" action="<?php echo $this->filepath; ?>">
318
+ <?php wp_nonce_field('ngg_settings') ?>
319
+ <input type="hidden" name="page_options" value="gallerypath,silentUpgrade,deleteImg,useMediaRSS,usePicLens,usePermalinks,permalinkSlug,graphicLibrary,imageMagickDir,activateTags,appendType,maxImages" />
320
  <table class="form-table ngg-options">
 
 
 
 
 
321
  <tr>
322
+ <th><label for="gallerypath"><?php _e('Gallery path','nggallery'); ?></label></th>
323
+ <td>
324
+ <input <?php $this->readonly(is_multisite()); ?> type="text" class="regular-text code" name="gallerypath" id="gallerypath" value="<?php echo $ngg->options['gallerypath']; ?>" />
325
+ <p class="description"><?php esc_html_e('This is the default path for all galleries','nggallery') ?></p>
326
+ </td>
327
  </tr>
328
+ <tr>
329
+ <th><?php _e('Silent database upgrade','nggallery'); ?></th>
330
+ <td>
331
+ <input <?php disabled(is_multisite()); ?> type="checkbox" name="silentUpgrade" id="silentUpgrade" value="true" <?php checked( $ngg->options['silentUpgrade']); ?> />
332
+ <label for="silentUpgrade"><?php _e('Update the database without notice.','nggallery') ?></label>
333
+ </td>
334
  </tr>
335
  <tr>
336
+ <th><?php _e('Image files','nggallery'); ?></th>
337
+ <td>
338
+ <input <?php disabled(is_multisite()); ?> type="checkbox" name="deleteImg" id="deleteImg" value="true" <?php checked( $ngg->options['deleteImg']); ?>>
339
+ <label for="deleteImg">
340
+ <?php _e("Delete files when removing a gallery from the database",'nggallery'); ?>
341
+ </label>
342
  </td>
343
  </tr>
344
  <tr>
345
+ <th><?php _e('Select graphic library','nggallery'); ?></th>
346
+ <td>
347
+ <fieldset>
348
+ <label>
349
+ <input name="graphicLibrary" type="radio" value="gd" <?php checked('gd', $ngg->options['graphicLibrary']); ?>>
350
+ <?php _e('GD Library', 'nggallery');?>
351
+ </label><br>
352
+ <label>
353
+ <input name="graphicLibrary" type="radio" value="im" <?php checked('im', $ngg->options['graphicLibrary']); ?>>
354
+ <?php _e('ImageMagick (Experimental)', 'nggallery'); ?>
355
+ </label>
356
+ </fieldset>
357
+ <label>
358
+ <?php _e('Path to the ImageMagick library:', 'nggallery'); ?>
359
+ <input <?php $this->readonly(is_multisite()); ?> type="text" class="regular-text code" name="imageMagickDir" value="<?php echo $ngg->options['imageMagickDir']; ?>">
360
+ </label>
361
+ </td>
362
  </tr>
363
  <tr>
364
+ <th><?php _e('Media RSS feed','nggallery'); ?></th>
365
+ <td>
366
+ <input type="checkbox" name="useMediaRSS" id="useMediaRSS" value="true" <?php checked( $ngg->options['useMediaRSS']); ?>>
367
+ <label for="useMediaRSS"><?php esc_html_e('Add a RSS feed to you blog header. Useful for CoolIris/PicLens','nggallery') ?></label>
368
  </td>
369
  </tr>
370
+ <tr>
371
+ <th><?php _e('PicLens/CoolIris','nggallery'); ?> (<a href="http://www.cooliris.com">CoolIris</a>)</th>
372
+ <td>
373
+ <input type="checkbox" id="usePicLens" name="usePicLens" value="true" <?php checked( $ngg->options['usePicLens']); ?>>
374
+ <label for="usePicLens"><?php _e('Include support for PicLens and CoolIris','nggallery'); ?></label>
375
+ <p class="description"><?php _e('When activated, JavaScript is added to your site footer. Make sure that wp_footer is called in your theme.','nggallery') ?></p>
376
+ </td>
 
377
  </tr>
378
+ </table>
379
+ <h3><?php _e('Permalinks','nggallery') ?></h3>
380
+ <table class="form-table ngg-options">
381
  <tr>
382
+ <th><?php _e('Use permalinks','nggallery'); ?></th>
383
  <td>
384
+ <input type="checkbox" name="usePermalinks" id="usePermalinks" value="true" <?php checked( $ngg->options['usePermalinks']); ?>>
385
+ <label for="usePermalinks"><?php _e('Adds a static link to all images','nggallery'); ?></label>
386
+ <p class="description"><?php _e('When activating this option, you need to update your permalink structure once','nggallery'); ?></p>
387
+ </td>
388
  </tr>
389
  <tr>
390
+ <th><label for="permalinkSlug"><?php _e('Gallery slug:','nggallery'); ?></label></th>
391
+ <td><input type="text" class="regular-text code" name="permalinkSlug" id="permalinkSlug" value="<?php echo $ngg->options['permalinkSlug']; ?>"></td>
392
+ </tr>
393
+ <tr>
394
+ <th><label for="createslugs"><?php _e('Recreate URLs','nggallery'); ?></label></th>
395
+ <td>
396
+ <input type="submit" name="createslugs" id="createslugs" class="button-secondary" value="<?php _e('Start now &raquo;','nggallery') ;?>"/>
397
+ <p class="description"><?php _e( "If you've changed these settings, you'll have to recreate the URLs.",'nggallery'); ?></p>
398
+ </td>
399
  </tr>
400
  </table>
401
+ <h3><?php _e('Related images','nggallery'); ?></h3>
402
  <table class="form-table ngg-options">
403
  <tr>
404
+ <th><?php _e('Add related images','nggallery'); ?></th>
405
+ <td>
406
+ <input name="activateTags" id="activateTags" type="checkbox" value="true" <?php checked( $ngg->options['activateTags']); ?>>
407
+ <label for="activateTags"><?php _e('This will add related images to every post','nggallery'); ?></label>
408
  </td>
409
  </tr>
410
  <tr>
411
+ <th><?php _e('Match with','nggallery'); ?></th>
412
+ <td>
413
+ <fieldset>
414
+ <label>
415
+ <input name="appendType" type="radio" value="category" <?php checked('category', $ngg->options['appendType']); ?>>
416
+ <?php _e('Categories', 'nggallery') ;?>
417
+ </label>
418
+ <br>
419
+ <label>
420
+ <input name="appendType" type="radio" value="tags" <?php checked('tags', $ngg->options['appendType']); ?>>
421
+ <?php _e('Tags', 'nggallery') ;?>
422
+ </label>
423
+ </fieldset>
424
  </td>
425
  </tr>
426
  <tr>
427
+ <th><label for="maxImages"><?php _e('Max. number of images','nggallery'); ?></label></th>
428
+ <td>
429
+ <input name="maxImages" id="maxImages" type="number" step="1" min="1" value="<?php echo $ngg->options['maxImages']; ?>" class="small-text">
430
+ <p class="description"><?php _e('0 will show all images','nggallery'); ?></p>
431
  </td>
432
  </tr>
433
  </table>
434
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ); ?>
435
  </form>
436
+ <?php
437
+ }
438
+
439
+ /**
440
+ * Show the image and thumbnail related options.
441
+ */
442
+ private function tab_images() {
443
+ global $ngg;
444
+ ?>
445
+ <h3><?php _e('Image settings','nggallery'); ?></h3>
446
+ <form name="imagesettings" method="POST" action="<?php echo $this->filepath.'#images'; ?>">
447
+ <?php wp_nonce_field('ngg_settings') ?>
448
+ <input type="hidden" name="page_options" value="imgResize,imgWidth,imgHeight,imgQuality,imgBackup,imgAutoResize,thumbwidth,thumbheight,thumbfix,thumbquality">
449
  <table class="form-table ngg-options">
450
+ <tr>
451
+ <th><?php _e('Resize images','nggallery') ?></th>
452
+ <td>
453
+ <label for="imgWidth"><?php _e('Width','nggallery') ?></label>
454
+ <input type="number" step="1" min="0" class="small-text" name="imgWidth" id="imgWidth" value="<?php echo $ngg->options['imgWidth']; ?>">
455
+ <label for="imgHeight"><?php _e('Height','nggallery') ?></label>
456
+ <input type="number" step="1" min="0" class="small-text" name="imgHeight" id="imgHeight" value="<?php echo $ngg->options['imgHeight']; ?>">
457
+ <p class="description"><?php _e('Width and height (in pixels). NextCellent Gallery will keep the ratio size.','nggallery') ?></p>
458
+ </td>
459
  </tr>
460
+ <tr>
461
+ <th><label for="imgQuality"><?php _e('Image quality','nggallery'); ?></label></th>
462
+ <td><input type="number" step="1" min="0" max="100" class="small-text" name="imgQuality" id="imgQuality" value="<?php echo $ngg->options['imgQuality']; ?>">%</td>
 
463
  </tr>
464
  <tr>
465
+ <th><?php _e('Backup original','nggallery'); ?></th>
466
+ <td>
467
+ <label>
468
+ <input type="checkbox" name="imgBackup" value="true" <?php checked( $ngg->options['imgBackup']); ?>>
469
+ <?php _e('Create a backup for the resized images','nggallery'); ?>
470
+ </label>
471
+ </td>
472
  </tr>
473
  <tr>
474
+ <th><?php _e('Automatically resize','nggallery'); ?></th>
475
+ <td>
476
+ <label>
477
+ <input type="checkbox" name="imgAutoResize" value="1" <?php checked( $ngg->options['imgAutoResize']); ?>>
478
+ <?php _e('Automatically resize images on upload.','nggallery') ?>
479
+ </label>
480
+ </td>
481
  </tr>
482
  </table>
483
+ <h3><?php _e('Thumbnail settings','nggallery'); ?></h3>
484
+ <p><?php _e('Please note: if you change these settings, you need to recreate the thumbnails under -> Manage Gallery .', 'nggallery') ?></p>
 
485
  <table class="form-table ngg-options">
486
+ <tr>
487
+ <th><?php _e('Thumbnail size','nggallery'); ?></th>
488
  <td>
489
+ <label for="thumbwidth"><?php _e('Width','nggallery') ?></label>
490
+ <input type="number" step="1" min="0" class="small-text" name="thumbwidth" id="thumbwidth" value="<?php echo $ngg->options['thumbwidth']; ?>">
491
+ <label for="thumbheight"><?php _e('Height','nggallery') ?></label>
492
+ <input type="number" step="1" min="0" class="small-text" name="thumbheight" id="thumbheight" value="<?php echo $ngg->options['thumbheight']; ?>">
493
+ <p class="description"><?php _e('These values are maximum values.','nggallery'); ?></p>
494
+ </td>
495
  </tr>
496
+ <tr>
497
+ <th><?php _e('Fixed size','nggallery'); ?></th>
498
+ <td>
499
+ <input type="checkbox" name="thumbfix" id="thumbfix" value="true" <?php checked( $ngg->options['thumbfix']); ?>>
500
+ <label for="thumbfix"><?php _e('Ignore the aspect ratio, so no portrait thumbnails.','nggallery') ?></label>
501
+ </td>
502
  </tr>
503
+ <tr>
504
+ <th><label for="thumbquality"><?php _e('Thumbnail quality','nggallery'); ?></label></th>
505
+ <td><input type="number" step="1" min="0" max="100" class="small-text" name="thumbquality" id="thumbquality" value="<?php echo $ngg->options['thumbquality']; ?>">%</td>
506
  </tr>
507
  </table>
508
+ <h3><?php _e('Single picture','nggallery') ?></h3>
509
  <table class="form-table ngg-options">
510
  <tr>
511
+ <th><?php _e('Clear cache folder','nggallery'); ?></th>
512
+ <td><input type="submit" name="clearcache" class="button-secondary" value="<?php _e('Proceed now &raquo;','nggallery') ;?>"/></td>
513
  </tr>
514
  </table>
515
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ); ?>
516
  </form>
517
 
518
+ <?php
519
+ }
520
+
521
+ /**
522
+ * Show gallery related settings
523
+ */
524
+ private function tab_gallery() {
525
+ global $ngg;
526
+ ?>
527
+ <h3><?php _e('Gallery settings','nggallery'); ?></h3>
528
+ <form name="galleryform" method="POST" action="<?php echo $this->filepath.'#gallery'; ?>">
529
+ <?php wp_nonce_field('ngg_settings') ?>
530
+ <input type="hidden" name="page_options" value="galNoPages,galImages,galColumns,galShowSlide,galTextSlide,galTextGallery,galShowOrder,galImgBrowser,galSort,galSortDir,galHiddenImg,galAjaxNav">
531
  <table class="form-table ngg-options">
532
  <tr>
533
+ <th><?php _e('Inline gallery','nggallery') ?></th>
534
+ <td>
535
+ <input name="galNoPages" id="galNoPages" type="checkbox" value="true" <?php checked( $ngg->options['galNoPages']); ?>>
536
+ <label for="galNoPages"><?php _e('Galleries will not be shown on a subpage, but on the same page.','nggallery') ?></label>
537
  </td>
538
  </tr>
539
  <tr>
540
+ <th><label for="galImages"><?php _e('Images per page','nggallery'); ?></label></th>
541
+ <td>
542
+ <input type="number" step="1" min="0" class="small-text" name="galImages" id="galImages" value="<?php echo $ngg->options['galImages']; ?>">
543
+ <?php _e( 'images', 'nggallery'); ?>
544
+ <p class="description"><?php _e('0 will disable pagination and show all images on one page.','nggallery') ?></p>
545
  </td>
546
  </tr>
547
  <tr>
548
+ <th><label for="galColumns"><?php esc_html_e('Columns','nggallery'); ?></label></th>
549
+ <td>
550
+ <input type="number" step="1" min="0" class="small-text" name="galColumns" id="galColumns" value="<?php echo $ngg->options['galColumns']; ?>">
551
+ <?php _e( 'columns per page', 'nggallery'); ?>
552
+ <p class="description"><?php _e('0 will display as much columns as possible. This is normally only required for captions below the images.','nggallery') ?></p>
553
  </td>
554
  </tr>
555
  <tr>
556
+ <th><?php _e('Slideshow','nggallery'); ?></th>
557
+ <td>
558
+ <label>
559
+ <input name="galShowSlide" type="checkbox" value="true" <?php checked( $ngg->options['galShowSlide']); ?>>
560
+ <?php _e('Enable slideshow','nggallery'); ?>
561
+ </label>
562
+ <br>
563
+ <label>
564
+ <?php _e('Text to show:','nggallery'); ?>
565
+ <input type="text" class="regular-text" name="galTextSlide" value="<?php echo $ngg->options['galTextSlide'] ?>">
566
+ </label>
567
+ <input type="text" name="galTextGallery" value="<?php echo $ngg->options['galTextGallery'] ?>" class="regular-text">
568
+ <p class="description"> <?php _e('This is the text the visitors will have to click to switch between display modes.','nggallery'); ?></p>
569
  </td>
570
  </tr>
571
  <tr>
572
+ <th><?php _e('Show first','nggallery'); ?></th>
573
+ <td>
574
+ <fieldset>
575
+ <label>
576
+ <input name="galShowOrder" type="radio" value="gallery" <?php checked('gallery', $ngg->options['galShowOrder']); ?>>
577
+ <?php _e('Thumbnails', 'nggallery') ;?>
578
+ </label>
579
+ <br>
580
+ <label>
581
+ <input name="galShowOrder" type="radio" value="slide" <?php checked('slide', $ngg->options['galShowOrder']); ?>>
582
+ <?php _e('Slideshow', 'nggallery') ;?>
583
+ </label>
584
+ </fieldset>
585
+ <p class="description"><?php _e( 'Choose what visitors will see first.', 'nggallery'); ?></p>
586
  </td>
587
  </tr>
588
  <tr>
589
+ <th><?php _e('ImageBrowser','nggallery'); ?></th>
590
+ <td>
591
+ <label>
592
+ <input name="galImgBrowser" type="checkbox" value="true" <?php checked( $ngg->options['galImgBrowser']); ?>>
593
+ <?php _e('Use ImageBrowser instead of another effect.', 'nggallery'); ?>
594
+ </label>
595
  </td>
596
  </tr>
597
  <tr>
598
+ <th><?php _e('Hidden images','nggallery'); ?></th>
599
+ <td>
600
+ <label>
601
+ <input name="galHiddenImg" type="checkbox" value="true" <?php checked( $ngg->options['galHiddenImg']); ?>>
602
+ <?php _e('Loads all images for the modal window, when pagination is used (like Thickbox, Lightbox etc.).','nggallery'); ?>
603
+ </label>
604
+ <p class="description"> <?php _e('Note: this increases the page load (possibly a lot)', 'nggallery'); ?>
605
  </td>
606
  </tr>
607
  <tr>
608
+ <th><?php _e('AJAX pagination','nggallery'); ?></th>
609
+ <td>
610
+ <label>
611
+ <input name="galAjaxNav" type="checkbox" value="true" <?php checked( $ngg->options['galAjaxNav']); ?>>
612
+ <?php _e('Use AJAX pagination to browse images without reloading the page.','nggallery'); ?>
613
+ </label>
614
+ <p class="description"><?php esc_html_e('Note: works only in combination with the Shutter effect.', 'nggallery'); ?></p>
615
  </td>
616
  </tr>
617
  </table>
618
+ <h3><?php _e('Sort options','nggallery'); ?></h3>
619
  <table class="form-table ngg-options">
620
  <tr>
621
+ <th><?php _e('Sort thumbnails','nggallery'); ?></th>
622
  <td>
623
+ <fieldset>
624
+ <label>
625
+ <input name="galSort" type="radio" value="sortorder" <?php checked('sortorder', $ngg->options['galSort']); ?>>
626
+ <?php _e('Custom order', 'nggallery'); ?>
627
+ </label><br>
628
+ <label>
629
+ <input name="galSort" type="radio" value="pid" <?php checked('pid', $ngg->options['galSort']); ?>>
630
+ <?php _e('Image ID', 'nggallery'); ?>
631
+ </label><br>
632
+ <label>
633
+ <input name="galSort" type="radio" value="filename" <?php checked('filename', $ngg->options['galSort']); ?>>
634
+ <?php _e('File name', 'nggallery') ;?>
635
+ </label><br>
636
+ <label>
637
+ <input name="galSort" type="radio" value="alttext" <?php checked('alttext', $ngg->options['galSort']); ?>>
638
+ <?php _e('Alt / Title text', 'nggallery') ;?>
639
+ </label><br>
640
+ <label>
641
+ <input name="galSort" type="radio" value="imagedate" <?php checked('imagedate', $ngg->options['galSort']); ?>>
642
+ <?php _e('Date / Time', 'nggallery') ;?>
643
+ </label>
644
+ </fieldset>
645
+
646
  </td>
647
  </tr>
648
  <tr>
649
+ <th><?php _e('Sort direction','nggallery') ?></th>
650
+ <td>
651
+ <label>
652
+ <input name="galSortDir" type="radio" value="ASC" <?php checked('ASC', $ngg->options['galSortDir']); ?>>
653
+ <?php _e('Ascending', 'nggallery') ;?>
654
+ </label><br>
655
+ <label>
656
+ <input name="galSortDir" type="radio" value="DESC" <?php checked('DESC', $ngg->options['galSortDir']); ?>>
657
+ <?php _e('Descending', 'nggallery') ;?>
658
+ </label>
659
  </td>
660
  </tr>
661
  </table>
662
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ); ?>
663
  </form>
664
+ <?php
665
+ }
666
+
667
+ /**
668
+ * Show the effect related settings.
669
+ */
670
+ private function tab_effects() {
671
+ global $ngg;
672
+ ?>
673
+ <h3><?php _e('Effects','nggallery'); ?></h3>
674
+ <form name="effectsform" method="POST" action="<?php echo $this->filepath.'#effects'; ?>">
675
+ <?php wp_nonce_field('ngg_settings') ?>
676
+ <input type="hidden" name="page_options" value="thumbEffect,thumbCode">
677
+ <p>
678
+ <?php _e('Here you can select the thumbnail effect, NextCellent Gallery will integrate the required HTML code in the images. Please note that only the Shutter and Thickbox effect will automatic added to your theme.','nggallery'); ?>
679
+ <?php _e('With the placeholder <strong> %GALLERY_NAME% </strong> you can activate a navigation through the images (depend on the effect). Change the code line only , when you use a different thumbnail effect or you know what you do.','nggallery'); ?>
680
+ </p>
681
  <table class="form-table ngg-options">
682
+ <tr>
683
+ <th><label for="thumbEffect"><?php _e('JavaScript Thumbnail effect','nggallery') ?></label></th>
684
  <td>
685
+ <select size="1" id="thumbEffect" name="thumbEffect" onchange="insertcode(this.value)">
686
+ <option value="none" <?php selected('none', $ngg->options['thumbEffect']); ?>><?php _e('None', 'nggallery') ;?></option>
687
+ <option value="thickbox" <?php selected('thickbox', $ngg->options['thumbEffect']); ?>><?php _e('Thickbox', 'nggallery') ;?></option>
688
+ <option value="lightbox" <?php selected('lightbox', $ngg->options['thumbEffect']); ?>><?php _e('Lightbox', 'nggallery') ;?></option>
689
+ <option value="highslide" <?php selected('highslide', $ngg->options['thumbEffect']); ?>><?php _e('Highslide', 'nggallery') ;?></option>
690
+ <option value="shutter" <?php selected('shutter', $ngg->options['thumbEffect']); ?>><?php _e('Shutter', 'nggallery') ;?></option>
691
+ <option value="custom" <?php selected('custom', $ngg->options['thumbEffect']); ?>><?php _e('Custom', 'nggallery') ;?></option>
692
+ </select>
693
  </td>
694
  </tr>
695
+ <tr>
696
+ <th><label for="thumbCode"><?php _e('Link Code line','nggallery'); ?></label></th>
697
+ <td><textarea class="normal-text code" id="thumbCode" name="thumbCode" cols="50" rows="5"><?php echo htmlspecialchars(stripslashes($ngg->options['thumbCode'])); ?></textarea></td>
698
  </tr>
699
  </table>
700
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ) ?>
701
  </form>
702
+ <?php
703
+ }
704
 
705
+ /**
706
+ * Show watermark related settings.
707
+ */
708
+ private function tab_watermark() {
709
+
710
+ global $ngg;
711
+
712
+ // take the first image as sample
713
+ $image_array = nggdb::find_last_images(0, 1);
714
+ $ngg_image = $image_array[0];
715
+ $imageID = $ngg_image->pid;
716
+
717
+ ?>
718
+ <h3><?php _e('Watermark','nggallery'); ?></h3>
719
+ <p><?php _e('Please note : you can only activate the watermark under -> Manage Galleries. This action cannot be undone.', 'nggallery') ?></p>
720
+ <form name="watermarkform" method="POST" action="<?php echo $this->filepath.'#watermark'; ?>">
721
+ <?php wp_nonce_field('ngg_settings') ?>
722
+ <input type="hidden" name="page_options" value="wmPos,wmXpos,wmYpos,wmType,wmPath,wmFont,wmSize,wmColor,wmText,wmOpaque" />
723
+ <div id="wm-preview">
724
+ <h3><?php esc_html_e('Preview','nggallery') ?></h3>
725
+ <label for="wm-preview-select"><?php _e('Select an image','nggallery'); ?></label>
726
+ <select id="wm-preview-select" name="wm-preview-img" style="width: 200px">
727
+ <?php echo '<option value="' . $ngg_image->pid . '">' . $ngg_image->pid . ' - ' . $ngg_image->alttext . '</option>'; ?>
728
+ </select>
729
+ <div id="wm-preview-container">
730
+ <a id="wm-preview-image-url" href="<?php echo home_url( 'index.php' ); ?>?callback=image&pid=<?php echo intval( $imageID ); ?>&mode=watermark" target="_blank" title="<?php _e("View full image", 'nggallery'); ?>">
731
+ <img id="wm-preview-image" src="<?php echo home_url( 'index.php' ); ?>?callback=image&pid=<?php echo intval( $imageID ); ?>&mode=watermark" />
732
+ </a>
733
+ </div>
734
+ <h3><?php _e('Position','nggallery') ?></h3>
735
+ <table id="wm-position">
736
+ <tr>
737
+ <td>
738
+ <strong><?php _e('Position','nggallery') ?></strong>
739
+ <table>
740
+ <tr>
741
+ <td><input type="radio" name="wmPos" value="topLeft" <?php checked('topLeft', $ngg->options['wmPos']); ?> /></td>
742
+ <td><input type="radio" name="wmPos" value="topCenter" <?php checked('topCenter', $ngg->options['wmPos']); ?> /></td>
743
+ <td><input type="radio" name="wmPos" value="topRight" <?php checked('topRight', $ngg->options['wmPos']); ?> /></td>
744
+ </tr>
745
+ <tr>
746
+ <td><input type="radio" name="wmPos" value="midLeft" <?php checked('midLeft', $ngg->options['wmPos']); ?> /></td>
747
+ <td><input type="radio" name="wmPos" value="midCenter" <?php checked('midCenter', $ngg->options['wmPos']); ?> /></td>
748
+ <td><input type="radio" name="wmPos" value="midRight" <?php checked('midRight', $ngg->options['wmPos']); ?> /></td>
749
+ </tr>
750
+ <tr>
751
+ <td><input type="radio" name="wmPos" value="botLeft" <?php checked('botLeft', $ngg->options['wmPos']); ?> /></td>
752
+ <td><input type="radio" name="wmPos" value="botCenter" <?php checked('botCenter', $ngg->options['wmPos']); ?> /></td>
753
+ <td><input type="radio" name="wmPos" value="botRight" <?php checked('botRight', $ngg->options['wmPos']); ?> /></td>
754
+ </tr>
755
+ </table>
756
+ </td>
757
+ <td>
758
+ <strong><?php _e('Offset','nggallery') ?></strong>
759
+ <table border="0">
760
+ <tr>
761
+ <td><label for="wmXpos">x:</label></td>
762
+ <td><input type="number" step="1" min="0" class="small-text" name="wmXpos" id="wmXpos" value="<?php echo $ngg->options['wmXpos'] ?>">px</td>
763
+ </tr>
764
+ <tr>
765
+ <td><label for="wmYpos">y:</label></td>
766
+ <td><input type="number" step="1" min="0" class="small-text" name="wmYpos" id="wmYpos" value="<?php echo $ngg->options['wmYpos'] ?>" />px</td>
767
+ </tr>
768
+ </table>
769
+ </td>
770
+ </tr>
771
  </table>
772
  </div>
773
+ <h3><label><input type="radio" name="wmType" value="image" <?php checked('image', $ngg->options['wmType']); ?>><?php _e('Use image as watermark','nggallery') ?></label></h3>
 
774
  <table class="wm-table form-table">
775
  <tr>
776
+ <th><label for="wmPath"><?php _e('URL to file','nggallery'); ?></label></th>
777
+ <td><input type="text" class="regular-text code" name="wmPath" id="wmPath" value="<?php echo $ngg->options['wmPath']; ?>"><br>
 
778
  </tr>
779
  </table>
780
+ <h3><label><input type="radio" name="wmType" value="text" <?php checked('text', $ngg->options['wmType']); ?>><?php _e('Use text as watermark','nggallery') ?></label></h3>
781
  <table class="wm-table form-table">
782
  <tr>
783
+ <th><?php _e('Font','nggallery') ?></th>
784
+ <td>
785
+ <select name="wmFont" size="1">
786
+ <?php
787
+ $fontlist = $this->get_fonts();
788
  foreach ( $fontlist as $fontfile ) {
789
+ echo "\n".'<option value="'.$fontfile.'" '. selected($fontfile, $ngg->options['wmFont']).' >'.$fontfile.'</option>';
790
  }
791
  ?>
792
+ </select><br>
793
+ <span>
794
+ <?php if ( !function_exists('ImageTTFBBox') ) {
795
+ _e( 'This function will not work, cause you need the FreeType library', 'nggallery' );
796
+ } else {
797
+ _e( 'You can upload more fonts in the folder <strong>nggallery/fonts</strong>', 'nggallery' );
798
+ } ?>
799
+ </span>
800
  </td>
801
  </tr>
802
  <tr>
803
+ <th><label for="wmSize"><?php _e('Size','nggallery'); ?></label></th>
804
+ <td><input type="number" step="1" min="0" class="small-text" name="wmSize" id="wmSize" value="<?php echo $ngg->options['wmSize']; ?>">px</td>
805
  </tr>
806
  <tr>
807
+ <th><label for="wmColor"><?php _e('Color','nggallery'); ?></label></th>
808
+ <td><input class="picker" type="text" id="wmColor" name="wmColor" value="<?php echo $ngg->options['wmColor'] ?>">
809
  </tr>
810
  <tr>
811
+ <th><label for="wmText"><?php _e('Text','nggallery'); ?></label></th>
812
+ <td><textarea name="wmText" id="wmText" cols="50" rows="5" class="normal-text"><?php echo $ngg->options['wmText'] ?></textarea></td>
813
  </tr>
814
  <tr>
815
+ <th><label for="wmOpaque"><?php _e('Opaque','nggallery'); ?></label></th>
816
+ <td><input type="number" step="1" min="0" max="100" class="small-text" name="wmOpaque" id="wmOpaque" value="<?php echo $ngg->options['wmOpaque'] ?>">%</td>
817
  </tr>
818
  </table>
819
+ <div class="clear"></div>
820
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ); ?>
821
  </form>
822
+ <?php
823
+ }
824
+
825
+ /**
826
+ * Get the fonts for the slideshow.
827
+ *
828
+ * @return array The fonts.
829
+ */
830
+ private function get_fonts() {
831
+
832
+ $ttf_fonts = array ();
833
+
834
+ // Files in wp-content/plugins/nggallery/fonts directory
835
+ $plugin_root = NGGALLERY_ABSPATH . 'fonts';
836
+
837
+ $plugins_dir = @ dir($plugin_root);
838
+ if ($plugins_dir) {
839
+ while (($file = $plugins_dir->read()) !== false) {
840
+ if (preg_match('|^\.+$|', $file))
841
+ continue;
842
+ if (is_dir($plugin_root.'/'.$file)) {
843
+ $plugins_subdir = @ dir($plugin_root.'/'.$file);
844
+ if ($plugins_subdir) {
845
+ while (($subfile = $plugins_subdir->read()) !== false) {
846
+ if (preg_match('|^\.+$|', $subfile))
847
+ continue;
848
+ if (preg_match('|\.ttf$|', $subfile))
849
+ $ttf_fonts[] = "$file/$subfile";
850
+ }
851
+ }
852
+ } else {
853
+ if (preg_match('|\.ttf$|', $file))
854
+ $ttf_fonts[] = $file;
855
+ }
856
+ }
857
+ }
858
+
859
+ return $ttf_fonts;
860
+ }
861
+
862
+ /**
863
+ * Show slideshow related settings
864
+ */
865
+ private function tab_slideshow() {
866
+
867
+ global $ngg;
868
+ ?>
869
+ <form name="player_options" method="POST" action="<?php echo $this->filepath.'#slideshow'; ?>">
870
+ <?php wp_nonce_field('ngg_settings'); ?>
871
+ <input type="hidden" name="page_options" value="irAutoDim,slideFx,irWidth,irHeight,irRotatetime,irLoop,irDrag,irNavigation,irNavigationDots,irAutoplay,irAutoplayTimeout,irAutoplayHover,irNumber,irClick" />
872
+ <h3><?php _e('Slideshow','nggallery'); ?></h3>
873
  <table class="form-table ngg-options">
874
  <tr>
875
+ <th><?php _e('Fit to space','nggallery'); ?></th>
876
+ <td>
877
+ <input type="checkbox" name="irAutoDim" id="irAutoDim" value="true" <?php checked( $ngg->options['irAutoDim']); ?>">
878
+ <label for="irAutoDim"><?php _e( "Let the slideshow fit in the available space.", 'nggallery'); ?></label>
879
+ </td>
880
  </tr>
881
  <tr>
882
+ <th><?php _e('Default size','nggallery'); ?></th>
883
  <td>
884
+ <label for="irWidth"><?php _e('Width','nggallery'); ?></label>
885
+ <input <?php $this->readonly($ngg->options['irAutoDim']); ?> type="number" step="1" min="0" class="small-text" name="irWidth" id="irWidth" value="<?php echo $ngg->options['irWidth']; ?>">
886
+ <label for="irHeight"><?php _e('Height','nggallery'); ?></label>
887
+ <input <?php $this->readonly($ngg->options['irAutoDim']); ?> type="number" step="1" min="0" class="small-text" name="irHeight" id="irHeight" value="<?php echo $ngg->options['irHeight']; ?>">
888
  </td>
889
  </tr>
890
  <tr>
891
+ <th><label for="slideFx"><?php _e('Transition / Fade effect','nggallery'); ?></label></th>
892
  <td>
893
+ <select size="1" name="slideFx" id="slideFx">
894
+ <?php
895
  $options = array(
896
  __( 'Attention Seekers', 'nggallery' ) => array( "bounce", "flash", "pulse", "rubberBand", "shake", "swing", "tada", "wobble"),
897
  __( 'Bouncing Entrances', 'nggallery' ) => array( "bounceIn", "bounceInDown", "bounceInLeft", "bounceInRight", "bounceInUp" ),
906
  );
907
 
908
  foreach( $options as $option => $val ) {
909
+ echo $this->convert_fx_to_optgroup( $val, $option );
910
  }
911
  ?>
912
  </select>
913
+ <p class="description">
914
+ <?php _e("These effects are powered by"); ?> <strong>animate.css</strong>. <a target="_blank" href="http://daneden.github.io/animate.css/"><?php _e("Click here for examples of all effects and to learn more."); ?></a></p>
915
+ </td>
916
  </tr>
 
917
  <tr>
918
+ <th><?php _e('Loop','nggallery') ?></th>
919
+ <td>
920
+ <input type="checkbox" name="irLoop" id="irLoop" value="true" <?php checked( $ngg->options['irLoop']); ?>">
921
+ <label for="irLoop"><?php _e( "Infinity loop. Duplicate last and first items to get loop illusion.", 'nggallery'); ?></label>
922
+ </td>
923
  </tr>
924
  <tr>
925
+ <th><?php _e('Mouse/touch drag','nggallery') ?></th>
926
+ <td>
927
+ <input type="checkbox" name="irDrag" id="irDrag" value="true" <?php checked( $ngg->options['irDrag'] ); ?>">
928
+ <label for="irDrag"><?php _e( "Enable dragging with the mouse (or touch).", 'nggallery'); ?></label>
929
+ </td>
930
  </tr>
931
  <tr>
932
+ <th><?php _e('Previous / Next','nggallery') ?></th>
933
+ <td>
934
+ <input type="checkbox" name="irNavigation" id="irNavigation" value="true" <?php checked( $ngg->options['irNavigation'] ); ?>>
935
+ <label for="irNavigation"><?php _e( "Show next/previous buttons.", 'nggallery'); ?></label>
936
+ </td>
937
  </tr>
938
  <tr>
939
+ <th><?php _e('Show dots','nggallery') ?></th>
940
+ <td>
941
+ <input type="checkbox" name="irNavigationDots" id="irNavigationDots" value="true" <?php checked( $ngg->options['irNavigationDots'] ); ?>>
942
+ <label for="irNavigationDots"><?php _e( "Show dots for each image.", 'nggallery'); ?></label>
943
+ </td>
944
  </tr>
945
  <tr>
946
+ <th><?php _e('Autoplay','nggallery') ?></th>
947
+ <td>
948
+ <input type="checkbox" name="irAutoplay" id="irAutoplay" value="true" <?php checked( $ngg->options['irAutoplay'] ); ?>>
949
+ <label for="irAutoplay"><?php _e( "Automatically play the images.", 'nggallery'); ?></label>
950
+ </td>
951
  </tr>
952
  <tr>
953
+ <th><label for="irRotatetime"><?php _e('Duration','nggallery') ?></label></th>
954
+ <td>
955
+ <input <?php $this->readonly( false, $ngg->options['irAutoplay'] ); ?> type="number" step="1" min="0" class="small-text" name="irRotatetime" id="irRotatetime" value="<?php echo $ngg->options['irRotatetime'] ?>">
956
+ <?php _e('sec.', 'nggallery') ;?>
957
+ </td>
958
  </tr>
959
  <tr>
960
+ <th><?php _e('Pause on hover','nggallery') ?></th>
961
+ <td>
962
+ <input <?php disabled(false, $ngg->options['irAutoplay']); ?> type="checkbox" name="irAutoplayHover" id="irAutoplayHover" value="true" <?php checked( $ngg->options['irAutoplayHover']); ?>>
963
+ <label for="irAutoplayHover"><?php _e( "Pause when hovering over the slideshow.", 'nggallery'); ?></label>
964
+ </td>
965
  </tr>
966
  <tr>
967
+ <th><?php _e('Click for next','nggallery') ?></th>
968
+ <td>
969
+ <input type="checkbox" name="irClick" id="irClick" value="true" <?php checked( $ngg->options['irClick']); ?>>
970
+ <label for="irClick"><?php _e( "Click to go to the next image.", 'nggallery'); ?></label></td>
971
  </tr>
972
  <tr>
973
+ <th><?php _e('Number of images','nggallery') ?></th>
974
  <td>
975
+ <input type="number" step="1" min="1" class="small-text" name="irNumber" id="irNumber" value="<?php echo $ngg->options['irNumber'] ?>">
976
+ <label for="irNumber"><?php _e('images', 'nggallery') ;?></label>
977
  <p class="description"><?php _e( "Number of images to display when using random or latest.", 'nggallery'); ?></p>
978
  </td>
979
  </tr>
980
+ </table>
981
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ); ?>
982
  </form>
983
+ <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
984
  }
985
 
986
+ /**
987
+ * Convert an array of slideshow styles to a html dropdown group.
988
+ *
989
+ * @param $data array The option values (and display).
990
+ * @param $title string (optional) The label of the optgroup.
991
+ *
992
+ * @return string The output.
993
+ */
994
+ private function convert_fx_to_optgroup( $data, $title = null ) {
995
 
996
+ global $ngg;
 
 
 
 
 
 
 
 
997
 
998
+ if ( is_null($title) ) {
999
+ $out = null;
1000
+ } else {
1001
+ $out = '<optgroup label="' . $title . '">';
1002
+ }
1003
 
1004
+ foreach( $data as $option) {
1005
+ $out .= '<option value="' . $option . '" ' . selected( $option, $ngg->options['slideFx'] ) . '>' . $option . '</option>';
1006
+ }
 
 
1007
 
1008
+ if ( !is_null( $title ) ) {
1009
+ $out .= '</optgroup>';
1010
+ }
1011
 
1012
+ return $out;
 
1013
  }
1014
 
1015
+ /**
1016
+ * Compare two values and echo readonly if they are.
1017
+ *
1018
+ * @param mixed $current The current value.
1019
+ * @param mixed $other (optional) The other value.
1020
+ */
1021
+ private function readonly($current, $other = true) {
1022
+ if ( $current == $other ) {
1023
+ echo 'readonly="readonly"';
1024
+ }
1025
+ }
1026
+ }
 
 
 
 
admin/style.php CHANGED
@@ -3,11 +3,6 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
3
 
4
  class NGG_Style {
5
 
6
- /**
7
- * nggAddGallery::__construct()
8
- *
9
- * @return void
10
- */
11
  function __construct() {
12
 
13
  // same as $_SERVER['REQUEST_URI'], but should work under IIS 6.0
@@ -23,17 +18,16 @@ class NGG_Style {
23
  *
24
  * @since 1.9.22
25
  *
26
- * @param array Absolute paths to the folders that contain stylesheets.
27
  * @return array Absolute paths to the stylesheets.
28
  */
29
- static function ngg_get_cssfiles($directions) {
30
 
31
- $cssfiles = array ();
32
 
33
  foreach ($directions as $direction) {
34
  $plugins_dir = dir($direction);
35
-
36
- if ($plugins_dir) {
37
  while (($file = $plugins_dir->read()) !== false) {
38
  if (preg_match('|^\.+$|', $file))
39
  continue;
@@ -63,7 +57,7 @@ class NGG_Style {
63
  *
64
  * @since 1.9.22
65
  *
66
- * @param Absolute path to the stylesheet.
67
  * @return array The information about the stylesheet.
68
  */
69
  static function ngg_get_cssfiles_data($plugin_file) {
@@ -87,6 +81,25 @@ class NGG_Style {
87
 
88
  return array ('Name' => $name, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Folder' => $folder );
89
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  /**
92
  * Save, change and move the css files and options.
@@ -246,19 +259,7 @@ class NGG_Style {
246
  <strong><?php _e('Activate and use style sheet:','nggallery') ?></strong>
247
  <input type="checkbox" name="activateCSS" value="1" <?php checked('1', $ngg->options['activateCSS']); ?> />
248
  <select name="css" id="theme" style="margin: 0pt; padding: 0pt;">
249
- <?php
250
- foreach ($csslist as $file) {
251
- $a_cssfile = NGG_Style::ngg_get_cssfiles_data($file);
252
- $css_name = esc_attr( $a_cssfile['Name'] );
253
- $css_folder = esc_attr( $a_cssfile['Folder'] );
254
- if ($file == $act_cssfile) {
255
- $selected = " selected='selected'";
256
- } else {
257
- $selected = '';
258
- }
259
- echo "\n\t<option value=\"$file\" $selected>$css_name ($css_folder)</option>";
260
- }
261
- ?>
262
  </select>
263
  <input class="button" type="submit" name="activate" value="<?php _e('Activate','nggallery') ?> &raquo;" class="button" />
264
  </form>
3
 
4
  class NGG_Style {
5
 
 
 
 
 
 
6
  function __construct() {
7
 
8
  // same as $_SERVER['REQUEST_URI'], but should work under IIS 6.0
18
  *
19
  * @since 1.9.22
20
  *
21
+ * @param array $directions Absolute paths to the folders that contain stylesheets.
22
  * @return array Absolute paths to the stylesheets.
23
  */
24
+ static function ngg_get_cssfiles( $directions ) {
25
 
26
+ $plugin_files = array ();
27
 
28
  foreach ($directions as $direction) {
29
  $plugins_dir = dir($direction);
30
+ if ($plugins_dir) {
 
31
  while (($file = $plugins_dir->read()) !== false) {
32
  if (preg_match('|^\.+$|', $file))
33
  continue;
57
  *
58
  * @since 1.9.22
59
  *
60
+ * @param string $plugin_file Absolute path to the stylesheet.
61
  * @return array The information about the stylesheet.
62
  */
63
  static function ngg_get_cssfiles_data($plugin_file) {
81
 
82
  return array ('Name' => $name, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Folder' => $folder );
83
  }
84
+
85
+ /**
86
+ * Output a set of options for a select element.
87
+ *
88
+ * @since 1.9.26
89
+ *
90
+ * @param array $css_list The paths to the stylesheets.
91
+ * @param string $act_css_file The path to the current active stylesheet.
92
+ */
93
+ static function output_css_files_dropdown( $css_list, $act_css_file ) {
94
+ foreach ( $css_list as $file) {
95
+ $a_cssfile = NGG_Style::ngg_get_cssfiles_data($file);
96
+ $css_name = esc_attr( $a_cssfile['Name'] );
97
+ $css_folder = esc_attr( $a_cssfile['Folder'] );
98
+ if ( $css_name != '' ) {
99
+ echo '<option value="' . $file . '" ' . selected( $file, $act_css_file ) . '>' . $css_name . ' (' . $css_folder . ')</option>';
100
+ }
101
+ }
102
+ }
103
 
104
  /**
105
  * Save, change and move the css files and options.
259
  <strong><?php _e('Activate and use style sheet:','nggallery') ?></strong>
260
  <input type="checkbox" name="activateCSS" value="1" <?php checked('1', $ngg->options['activateCSS']); ?> />
261
  <select name="css" id="theme" style="margin: 0pt; padding: 0pt;">
262
+ <?php self::output_css_files_dropdown($csslist, $act_cssfile); ?>
 
 
 
 
 
 
 
 
 
 
 
 
263
  </select>
264
  <input class="button" type="submit" name="activate" value="<?php _e('Activate','nggallery') ?> &raquo;" class="button" />
265
  </form>
admin/tinymce/window.php CHANGED
@@ -11,20 +11,17 @@ wp_enqueue_script('jquery-ui-core');
11
  wp_enqueue_script('jquery-ui-widget');
12
  wp_enqueue_script('jquery-ui-position');
13
  wp_enqueue_style('wp-admin');
14
- if (!isset($wp_scripts->registered['jquery-ui-autocomplete'])) {
15
- wp_register_script( 'jquery-ui-autocomplete', NGGALLERY_URLPATH .'admin/js/jquery.ui.autocomplete.min.js', array('jquery-ui-core'), '1.8.15');
16
- }
17
- wp_enqueue_script('jquery-ui-autocomplete');
18
  ?>
19
  <html xmlns="http://www.w3.org/1999/xhtml">
20
  <head>
21
  <title>NextCellent</title>
22
- <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
 
23
  <?php wp_print_scripts(); ?>
24
  <script language="javascript" type="text/javascript" src="<?php echo site_url(); ?>/wp-includes/js/tinymce/tiny_mce_popup.js"></script>
25
  <script language="javascript" type="text/javascript" src="<?php echo site_url(); ?>/wp-includes/js/tinymce/utils/mctabs.js"></script>
26
  <script language="javascript" type="text/javascript" src="<?php echo site_url(); ?>/wp-includes/js/tinymce/utils/form_utils.js"></script>
27
- <script language="javascript" type="text/javascript" src="<?php echo NGGALLERY_URLPATH ?>admin/js/ngg.autocomplete.js"></script>
28
  <script language="javascript" type="text/javascript" src="<?php echo NGGALLERY_URLPATH ?>admin/tinymce/tinymce.js"></script>
29
  <?php wp_print_styles(); ?>
30
  <style>
11
  wp_enqueue_script('jquery-ui-widget');
12
  wp_enqueue_script('jquery-ui-position');
13
  wp_enqueue_style('wp-admin');
14
+ wp_enqueue_script( 'ngg-autocomplete', NGGALLERY_URLPATH . 'admin/js/ngg.autocomplete.js', array( 'jquery-ui-autocomplete' ), '1.1' );
 
 
 
15
  ?>
16
  <html xmlns="http://www.w3.org/1999/xhtml">
17
  <head>
18
  <title>NextCellent</title>
19
+ <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>" />
20
+ <meta charset="<?php echo get_option('blog_charset'); ?>">
21
  <?php wp_print_scripts(); ?>
22
  <script language="javascript" type="text/javascript" src="<?php echo site_url(); ?>/wp-includes/js/tinymce/tiny_mce_popup.js"></script>
23
  <script language="javascript" type="text/javascript" src="<?php echo site_url(); ?>/wp-includes/js/tinymce/utils/mctabs.js"></script>
24
  <script language="javascript" type="text/javascript" src="<?php echo site_url(); ?>/wp-includes/js/tinymce/utils/form_utils.js"></script>
 
25
  <script language="javascript" type="text/javascript" src="<?php echo NGGALLERY_URLPATH ?>admin/tinymce/tinymce.js"></script>
26
  <?php wp_print_styles(); ?>
27
  <style>
admin/wpmu.php CHANGED
@@ -1,13 +1,13 @@
1
  <?php
2
  if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You are not allowed to call this page directly.'); }
3
 
4
- function nggallery_wpmu_setup() {
5
 
6
  //to be sure
7
  if ( !is_super_admin() )
8
- die('You are not allowed to call this page.');
9
 
10
- $messagetext = '';
11
 
12
  // get the options
13
  $ngg_options = get_site_option('ngg_options');
@@ -18,28 +18,32 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
18
  if ( $_POST['page_options'] )
19
  $options = explode(',', stripslashes($_POST['page_options']));
20
  if ($options) {
21
- foreach ($options as $option) {
22
- $option = trim($option);
23
- $value = isset($_POST[$option]) ? trim($_POST[$option]) : false;
24
- // $value = sanitize_option($option, $value); // This does strip slashes on those that need it
25
- $ngg_options[$option] = $value;
 
 
 
 
 
 
 
 
 
 
 
26
  }
27
  }
28
 
29
- // the path should always end with a slash
30
- $ngg_options['gallerypath'] = trailingslashit($ngg_options['gallerypath']);
31
  update_site_option('ngg_options', $ngg_options);
32
-
33
- $messagetext = __('Update successfully','nggallery');
34
- }
35
 
36
- // Show donation message only one time.
37
- /*
38
- if (isset ( $_GET['hideSupportInfo']) ) {
39
- $ngg_options['hideSupportInfo'] = true;
40
- update_site_option('ngg_options', $ngg_options);
41
- }
42
- */
43
 
44
  global $ngg;
45
 
@@ -75,72 +79,76 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
75
  <div class="wrap">
76
  <h2><?php _e('Network Options','nggallery'); ?></h2>
77
  <form name="generaloptions" method="post">
78
- <?php wp_nonce_field('ngg_wpmu_settings') ?>
79
- <input type="hidden" name="page_options" value="gallerypath,wpmuQuotaCheck,wpmuZipUpload,wpmuImportFolder,wpmuStyle,wpmuRoles,wpmuCSSfile" />
80
  <table class="form-table">
81
- <tr valign="top">
82
- <th align="left"><?php _e('Gallery path','nggallery') ?></th>
83
- <td><input type="text" size="50" name="gallerypath" value="<?php echo $ngg_options['gallerypath']; ?>" />
84
- <p class="description"><?php _e('This is the default path for all blogs. With the placeholder %BLOG_ID% you can organize the folder structure better.','nggallery') ?>
85
- <?php echo str_replace('%s', '<code>wp-content/blogs.dir/%BLOG_ID%/files/</code>', __('The default setting should be %s', 'nggallery')); ?>.</p>
86
- </td>
 
 
 
 
 
 
 
 
 
 
87
  </tr>
88
  <tr>
89
- <th valign="top"><?php _e('Enable upload quota check','nggallery') ?>:</th>
90
- <td><input name="wpmuQuotaCheck" id="wpmuQuotaCheck" type="checkbox" value="1" <?php checked('1', $ngg_options['wpmuQuotaCheck']); ?> />
91
- <label for="wpmuQuotaCheck"><?php _e('Should work if the gallery is bellow the blog.dir','nggallery') ?></label>
 
92
  </td>
93
  </tr>
94
  <tr>
95
- <th valign="top"><?php _e('Enable zip upload option','nggallery') ?>:</th>
96
- <td><input name="wpmuZipUpload" id="wpmuZipUpload" type="checkbox" value="1" <?php checked('1', $ngg_options['wpmuZipUpload']); ?> />
97
- <label for="wpmuZipUpload"><?php _e('Allow users to upload zip folders.','nggallery') ?></label>
 
98
  </td>
99
  </tr>
100
  <tr>
101
- <th valign="top"><?php _e('Enable import function','nggallery') ?>:</th>
102
- <td><input name="wpmuImportFolder" id="wpmuImportFolder" type="checkbox" value="1" <?php checked('1', $ngg_options['wpmuImportFolder']); ?> />
103
- <label for="wpmuImportFolder"><?php _e('Allow users to import images folders from the server.','nggallery') ?></label>
 
104
  </td>
105
  </tr>
106
  <tr>
107
- <th valign="top"><?php _e('Enable style selection','nggallery') ?>:</th>
108
- <td><input name="wpmuStyle" id="wpmuStyle" type="checkbox" value="1" <?php checked('1', $ngg_options['wpmuStyle']); ?> />
109
- <label for="wpmuStyle"><?php _e('Allow users to choose a style for the gallery.','nggallery') ?></label>
 
110
  </td>
111
  </tr>
112
  <tr>
113
- <th valign="top"><?php _e('Enable roles/capabilities','nggallery') ?>:</th>
114
- <td><input name="wpmuRoles" id="wpmuRoles" type="checkbox" value="1" <?php checked('1', $ngg_options['wpmuRoles']); ?> />
115
- <label for="wpmuRoles"><?php _e('Allow users to change the roles for other blog authors.','nggallery') ?></label>
 
116
  </td>
117
  </tr>
118
  <tr>
119
- <th valign="top"><?php _e('Default style','nggallery') ?>:</th>
120
  <td>
121
- <select name="wpmuCSSfile">
122
- <?php
123
- foreach ($csslist as $file) {
124
- $a_cssfile = NGG_Style::ngg_get_cssfiles_data($file);
125
- $css_name = esc_attr( $a_cssfile['Name'] );
126
- $css_folder = esc_attr( $a_cssfile['Folder'] );
127
- if ($file == $act_cssfile) {
128
- $selected = " selected='selected'";
129
- } else {
130
- $selected = '';
131
- }
132
- echo "\n\t<option value=\"$file\" $selected>$css_name ($css_folder)</option>";
133
- }
134
- ?>
135
  </select>
136
- <p class="description"><?php _e('Choose the default style for the galleries.','nggallery') ?></p>
137
- <p class="description"><?php _e('Note: between brackets is the folder in which the file is.','nggallery') ?></p>
 
 
138
  </td>
139
  </tr>
140
- </table>
141
- <input class="button-primary button" type="submit" name="updateoption" value="<?php _e('Update') ;?>"/>
142
  </form>
143
- </div>
144
-
145
  <?php
146
  }
1
  <?php
2
  if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You are not allowed to call this page directly.'); }
3
 
4
+ function nggallery_wpmu_setup() {
5
 
6
  //to be sure
7
  if ( !is_super_admin() )
8
+ die('You are not allowed to call this page.');
9
 
10
+ $messagetext = '';
11
 
12
  // get the options
13
  $ngg_options = get_site_option('ngg_options');
18
  if ( $_POST['page_options'] )
19
  $options = explode(',', stripslashes($_POST['page_options']));
20
  if ($options) {
21
+ foreach ( $options as $option ) {
22
+ $option = trim( $option );
23
+ $value = false;
24
+ if ( isset( $_POST[ $option ] ) ) {
25
+ $value = trim( $_POST[ $option ] );
26
+ if ( $value === "true" ) {
27
+ $value = true;
28
+ }
29
+
30
+ if ( is_numeric( $value ) ) {
31
+ $value = (int) $value;
32
+ }
33
+ }
34
+
35
+ // $value = sanitize_option($option, $value); // This does stripslashes on those that need it
36
+ $ngg_options[ $option ] = $value;
37
  }
38
  }
39
 
40
+ // the path should always end with a slash
41
+ $ngg_options['gallerypath'] = trailingslashit($ngg_options['gallerypath']);
42
  update_site_option('ngg_options', $ngg_options);
43
+ var_dump($ngg_options);
 
 
44
 
45
+ $messagetext = __('Update successfully','nggallery');
46
+ }
 
 
 
 
 
47
 
48
  global $ngg;
49
 
79
  <div class="wrap">
80
  <h2><?php _e('Network Options','nggallery'); ?></h2>
81
  <form name="generaloptions" method="post">
82
+ <?php wp_nonce_field('ngg_wpmu_settings') ?>
83
+ <input type="hidden" name="page_options" value="silentUpgrade,gallerypath,wpmuQuotaCheck,wpmuZipUpload,wpmuImportFolder,wpmuStyle,wpmuRoles,wpmuCSSfile" />
84
  <table class="form-table">
85
+ <tr>
86
+ <th><label for="gallerypath"><?php _e('Gallery path','nggallery'); ?></label></th>
87
+ <td>
88
+ <input type="text" size="50" name="gallerypath" id="gallerypath" value="<?php echo $ngg_options['gallerypath']; ?>">
89
+ <p class="description">
90
+ <?php _e('This is the default path for all blogs. With the placeholder %BLOG_ID% you can organize the folder structure better.','nggallery'); ?>
91
+ <?php echo sprintf( __('The default setting should be %s.', 'nggallery'), '<code>wp-content/blogs.dir/%BLOG_ID%/files/</code>' ); ?>
92
+ </p>
93
+ </td>
94
+ </tr>
95
+ <tr>
96
+ <th><?php _e('Silent database upgrade','nggallery'); ?></th>
97
+ <td>
98
+ <input type="checkbox" name="silentUpgrade" id="silentUpgrade" value="true" <?php checked( $ngg_options['silentUpgrade'] ); ?>>
99
+ <label for="silentUpgrade"><?php _e('Update the database without notice.','nggallery') ?></label>
100
+ </td>
101
  </tr>
102
  <tr>
103
+ <th><?php _e('Enable upload quota check','nggallery'); ?></th>
104
+ <td>
105
+ <input name="wpmuQuotaCheck" id="wpmuQuotaCheck" type="checkbox" value="true" <?php checked( $ngg_options['wpmuQuotaCheck'] ); ?>>
106
+ <label for="wpmuQuotaCheck"><?php _e('Should work if the gallery is bellow the blog.dir','nggallery') ?></label>
107
  </td>
108
  </tr>
109
  <tr>
110
+ <th><?php _e('Enable zip upload option','nggallery'); ?></th>
111
+ <td>
112
+ <input name="wpmuZipUpload" id="wpmuZipUpload" type="checkbox" value="true" <?php checked( $ngg_options['wpmuZipUpload'] ); ?>>
113
+ <label for="wpmuZipUpload"><?php _e('Allow users to upload zip folders.','nggallery') ?></label>
114
  </td>
115
  </tr>
116
  <tr>
117
+ <th><?php _e('Enable import function','nggallery'); ?></th>
118
+ <td>
119
+ <input name="wpmuImportFolder" id="wpmuImportFolder" type="checkbox" value="true" <?php checked( $ngg_options['wpmuImportFolder'] ); ?>>
120
+ <label for="wpmuImportFolder"><?php _e('Allow users to import images folders from the server.','nggallery'); ?></label>
121
  </td>
122
  </tr>
123
  <tr>
124
+ <th><?php _e('Enable style selection','nggallery'); ?></th>
125
+ <td>
126
+ <input name="wpmuStyle" id="wpmuStyle" type="checkbox" value="true" <?php checked( $ngg_options['wpmuStyle'] ); ?>>
127
+ <label for="wpmuStyle"><?php _e('Allow users to choose a style for the gallery.','nggallery'); ?></label>
128
  </td>
129
  </tr>
130
  <tr>
131
+ <th><?php _e('Enable roles/capabilities','nggallery'); ?></th>
132
+ <td>
133
+ <input name="wpmuRoles" id="wpmuRoles" type="checkbox" value="true" <?php checked( $ngg_options['wpmuRoles'] ); ?>>
134
+ <label for="wpmuRoles"><?php _e('Allow users to change the roles for other blog authors.','nggallery'); ?></label>
135
  </td>
136
  </tr>
137
  <tr>
138
+ <th><label for="wpmuCSSfile"><?php _e('Default style','nggallery'); ?></label></th>
139
  <td>
140
+ <select name="wpmuCSSfile" id="wpmuCSSfile">
141
+ <?php NGG_Style::output_css_files_dropdown($csslist, $act_cssfile); ?>
 
 
 
 
 
 
 
 
 
 
 
 
142
  </select>
143
+ <p class="description">
144
+ <?php _e('Choose the default style for the galleries.','nggallery') ?>
145
+ <?php _e('Note: between brackets is the folder in which the file is.','nggallery') ?>
146
+ </p>
147
  </td>
148
  </tr>
149
+ </table>
150
+ <?php submit_button( __('Save Changes'), 'primary', 'updateoption' ); ?>
151
  </form>
152
+ </div>
 
153
  <?php
154
  }
css/framework-min.css CHANGED
@@ -1,2 +1,2 @@
1
  /* NextCellent CSS Framework */
2
- .ngg-gallery-thumbnail{float:left}.ngg-gallery-thumbnail span{display:block}.ngg-clear{clear:both;float:none}.ngg-navigation{clear:both}.owl-height{-webkit-transition:height 500ms ease-in-out;-moz-transition:height 500ms ease-in-out;-ms-transition:height 500ms ease-in-out;-o-transition:height 500ms ease-in-out;transition:height 500ms ease-in-out}.owl-carousel{display:none;width:100%;-webkit-tap-highlight-color:transparent;position:relative;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0px,0,0)}.owl-carousel .owl-controls .owl-dot,.owl-carousel .owl-controls .owl-nav .owl-next,.owl-carousel .owl-controls .owl-nav .owl-prev{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loaded{display:block}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel .owl-refresh .owl-item{display:none}.owl-carousel .owl-item{position:relative;min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-item img{display:block;width:100%;-webkit-transform-style:preserve-3d}.owl-carousel.owl-text-select-on .owl-item{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.owl-carousel .owl-grab{cursor:move;cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.no-js .owl-carousel{display:block}.owl-carousel .owl-item .owl-lazy{opacity:0;-webkit-transition:opacity 400ms ease;-moz-transition:opacity 400ms ease;-ms-transition:opacity 400ms ease;-o-transition:opacity 400ms ease;transition:opacity 400ms ease}.owl-carousel .owl-item img{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;-webkit-transition:scale 100ms ease;-moz-transition:scale 100ms ease;-ms-transition:scale 100ms ease;-o-transition:scale 100ms ease;transition:scale 100ms ease}.owl-carousel .owl-video-play-icon:hover{-webkit-transition:scale(1.3,1.3);-moz-transition:scale(1.3,1.3);-ms-transition:scale(1.3,1.3);-o-transition:scale(1.3,1.3);transition:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;-webkit-background-size:contain;-moz-background-size:contain;-o-background-size:contain;background-size:contain;-webkit-transition:opacity 400ms ease;-moz-transition:opacity 400ms ease;-ms-transition:opacity 400ms ease;-o-transition:opacity 400ms ease;transition:opacity 400ms ease}.owl-carousel .owl-video-frame{position:relative;z-index:1}.ngg-singlepic{display:block}.ngg-left{float:left}.ngg-right{float:right}.ngg-center{margin-left:auto!important;margin-right:auto!important}.ngg-related-gallery{overflow:hidden}.ngg-related-gallery img{float:left}.brick img{transition:1s;opacity:0;width:100%!important;height:auto!important}.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}
1
  /* NextCellent CSS Framework */
2
+ .ngg-gallery-thumbnail{float:left}.ngg-gallery-thumbnail span{display:block}.ngg-clear{clear:both;float:none}.ngg-navigation{clear:both}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.owl-height{-webkit-transition:height 500ms ease-in-out;-moz-transition:height 500ms ease-in-out;-ms-transition:height 500ms ease-in-out;-o-transition:height 500ms ease-in-out;transition:height 500ms ease-in-out}.owl-carousel{display:none;width:100%;-webkit-tap-highlight-color:transparent;position:relative;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-controls .owl-dot,.owl-carousel .owl-controls .owl-nav .owl-next,.owl-carousel .owl-controls .owl-nav .owl-prev{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loaded{display:block}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel .owl-refresh .owl-item{display:none}.owl-carousel .owl-item{position:relative;min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-item img{display:block;width:100%;-webkit-transform-style:preserve-3d}.owl-carousel.owl-text-select-on .owl-item{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.owl-carousel .owl-grab{cursor:move;cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.no-js .owl-carousel{display:block}.owl-carousel .owl-item .owl-lazy{opacity:0;-webkit-transition:opacity 400ms ease;-moz-transition:opacity 400ms ease;-ms-transition:opacity 400ms ease;-o-transition:opacity 400ms ease;transition:opacity 400ms ease}.owl-carousel .owl-item img{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;-webkit-transition:scale 100ms ease;-moz-transition:scale 100ms ease;-ms-transition:scale 100ms ease;-o-transition:scale 100ms ease;transition:scale 100ms ease}.owl-carousel .owl-video-play-icon:hover{-webkit-transition:scale(1.3,1.3);-moz-transition:scale(1.3,1.3);-ms-transition:scale(1.3,1.3);-o-transition:scale(1.3,1.3);transition:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;-webkit-background-size:contain;-moz-background-size:contain;-o-background-size:contain;background-size:contain;-webkit-transition:opacity 400ms ease;-moz-transition:opacity 400ms ease;-ms-transition:opacity 400ms ease;-o-transition:opacity 400ms ease;transition:opacity 400ms ease}.owl-carousel .owl-video-frame{position:relative;z-index:1}.ngg-singlepic{display:block}.ngg-left{float:left}.ngg-right{float:right}.ngg-center{margin-left:auto!important;margin-right:auto!important}.ngg-related-gallery{overflow:hidden}.ngg-related-gallery img{float:left}.brick img{transition:1s;opacity:0;width:100%!important;height:auto!important}.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(.755,.050,.855,.060);transition-timing-function:cubic-bezier(.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(.755,.050,.855,.060);transition-timing-function:cubic-bezier(.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(.755,.050,.855,.060);transition-timing-function:cubic-bezier(.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(.755,.050,.855,.060);transition-timing-function:cubic-bezier(.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}
css/framework.css CHANGED
@@ -25,6 +25,20 @@ This file is loaded first, so you can easily override it.
25
  clear:both;
26
  }
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  /*
29
  * Owl Carousel - Auto Height Plugin
30
  */
25
  clear:both;
26
  }
27
 
28
+ /**
29
+ * Some jQuery stuff.
30
+ */
31
+ .ui-helper-hidden-accessible {
32
+ border: 0;
33
+ clip: rect(0 0 0 0);
34
+ height: 1px;
35
+ margin: -1px;
36
+ overflow: hidden;
37
+ padding: 0;
38
+ position: absolute;
39
+ width: 1px;
40
+ }
41
+
42
  /*
43
  * Owl Carousel - Auto Height Plugin
44
  */
nggallery.php CHANGED
@@ -5,7 +5,7 @@ Plugin URI: http://www.wpgetready.com/nextcellent-gallery
5
  Description: A Photo Gallery for WordPress providing NextGEN legacy compatibility from version 1.9.13
6
  Author: WPGReady based on Alex Rabe & PhotoCrati work.
7
  Author URI: http://www.wpgetready.com
8
- Version: 1.9.25.3
9
 
10
  Copyright (c) 2007-2011 by Alex Rabe & NextGEN DEV-Team
11
  Copyright (c) 2012 Photocrati Media
@@ -52,7 +52,7 @@ if (!class_exists('nggLoader')) {
52
  */
53
  class nggLoader {
54
 
55
- var $version = '1.9.25.3';
56
  var $dbversion = '1.8.3';
57
  var $minimum_WP = '3.5';
58
  var $options = '';
@@ -554,6 +554,7 @@ if (!class_exists('nggLoader')) {
554
  wp_enqueue_style('NextCellent-Framework', NGGALLERY_URLPATH . 'css/framework-min.css', false, '1.0.1', 'screen');
555
  }
556
 
 
557
  // activate Thickbox
558
  if ($this->options['thumbEffect'] == 'thickbox')
559
  wp_enqueue_style( 'thickbox');
5
  Description: A Photo Gallery for WordPress providing NextGEN legacy compatibility from version 1.9.13
6
  Author: WPGReady based on Alex Rabe & PhotoCrati work.
7
  Author URI: http://www.wpgetready.com
8
+ Version: 1.9.26
9
 
10
  Copyright (c) 2007-2011 by Alex Rabe & NextGEN DEV-Team
11
  Copyright (c) 2012 Photocrati Media
52
  */
53
  class nggLoader {
54
 
55
+ var $version = '1.9.26';
56
  var $dbversion = '1.8.3';
57
  var $minimum_WP = '3.5';
58
  var $options = '';
554
  wp_enqueue_style('NextCellent-Framework', NGGALLERY_URLPATH . 'css/framework-min.css', false, '1.0.1', 'screen');
555
  }
556
 
557
+
558
  // activate Thickbox
559
  if ($this->options['thumbEffect'] == 'thickbox')
560
  wp_enqueue_style( 'thickbox');
nggfunctions.php CHANGED
@@ -166,6 +166,7 @@ function nggShowGallery( $galleryID, $template = '', $images = false ) {
166
  //TODO: Use pagination limits here to reduce memory needs
167
  //20130106:shouldn't call it statically if is not...
168
  //$picturelist = nggdb::get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
 
169
  $picturelist = $nggdb->get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
170
 
171
  if ( !$picturelist )
@@ -650,6 +651,7 @@ function nggShowImageBrowser($galleryID, $template = '') {
650
  // get the pictures
651
  //20140106:shouldn't call it statically if is not...
652
  //$picturelist = nggdb::get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
 
653
  $picturelist = $nggdb->get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
654
 
655
  if ( is_array($picturelist) )
@@ -899,7 +901,7 @@ function nggShowGalleryTags($taglist, $template = '', $sorting = 'ASC') {
899
  *
900
  * @access public
901
  * @param string $taglist list of tags as csv
902
- * @param integer $maxImages (optional) limit the number of images to show
903
  * @return the content
904
  */
905
  function nggShowRelatedGallery($taglist, $maxImages = 0) {
@@ -998,7 +1000,9 @@ function nggShowAlbumTags($taglist, $template='', $sorting = 'ASC') {
998
  * @access public
999
  * @param string $type could be 'tags' or 'category'
1000
  * @param integer $maxImages of images
1001
- * @return the content
 
 
1002
  */
1003
  function nggShowRelatedImages($type = '', $maxImages = 0) {
1004
  $ngg_options = nggGallery::get_option('ngg_options');
@@ -1012,31 +1016,24 @@ function nggShowRelatedImages($type = '', $maxImages = 0) {
1012
 
1013
  switch ($type) {
1014
  case 'tags':
1015
- if (function_exists('get_the_tags')) {
1016
- $taglist = get_the_tags();
1017
-
1018
- if (is_array($taglist)) {
1019
- foreach ($taglist as $tag) {
1020
- $sluglist[] = $tag->slug;
1021
- }
1022
- }
1023
  }
1024
  break;
1025
 
1026
  case 'category':
1027
- $catlist = get_the_category();
1028
-
1029
- if (is_array($catlist)) {
1030
- foreach ($catlist as $cat) {
1031
- $sluglist[] = $cat->category_nicename;
1032
- }
1033
  }
1034
- break;
1035
  }
1036
-
1037
  $sluglist = implode(',', $sluglist);
1038
  $out = nggShowRelatedGallery($sluglist, $maxImages);
1039
-
1040
  return $out;
1041
  }
1042
 
166
  //TODO: Use pagination limits here to reduce memory needs
167
  //20130106:shouldn't call it statically if is not...
168
  //$picturelist = nggdb::get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
169
+ //array of nggImage objects returned
170
  $picturelist = $nggdb->get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
171
 
172
  if ( !$picturelist )
651
  // get the pictures
652
  //20140106:shouldn't call it statically if is not...
653
  //$picturelist = nggdb::get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
654
+ //return array of nggImages
655
  $picturelist = $nggdb->get_gallery($galleryID, $ngg_options['galSort'], $ngg_options['galSortDir']);
656
 
657
  if ( is_array($picturelist) )
901
  *
902
  * @access public
903
  * @param string $taglist list of tags as csv
904
+ * @param integer $maxImages (optional) limit the number of images to show. 0=no limit
905
  * @return the content
906
  */
907
  function nggShowRelatedGallery($taglist, $maxImages = 0) {
1000
  * @access public
1001
  * @param string $type could be 'tags' or 'category'
1002
  * @param integer $maxImages of images
1003
+ * @return related gallery output or empty string if not tags/categories
1004
+ * 20150309: fix: error when no tags in site.
1005
+ * Few simplifications
1006
  */
1007
  function nggShowRelatedImages($type = '', $maxImages = 0) {
1008
  $ngg_options = nggGallery::get_option('ngg_options');
1016
 
1017
  switch ($type) {
1018
  case 'tags':
1019
+ $taglist = get_the_tags(); //Return array of tag objects, false on failure or empty
1020
+ //This is a tag list for posts non Nextcellent tag lists.
1021
+ if (!$taglist) return "";
1022
+ foreach ($taglist as $tag) {
1023
+ $sluglist[] = $tag->slug;
 
 
 
1024
  }
1025
  break;
1026
 
1027
  case 'category':
1028
+ $catlist = get_the_category(); //return array (empty if no categories)
1029
+ if (empty ($catlist)) return "";
1030
+ foreach ($catlist as $cat) {
1031
+ $sluglist[] = $cat->category_nicename;
 
 
1032
  }
1033
+ break;
1034
  }
 
1035
  $sluglist = implode(',', $sluglist);
1036
  $out = nggShowRelatedGallery($sluglist, $maxImages);
 
1037
  return $out;
1038
  }
1039
 
readme.txt CHANGED
@@ -8,13 +8,12 @@ License: GPLv2
8
 
9
  == Description ==
10
 
11
- = 1.9.25.3 - 2015-02-21 - FIX =
12
 
13
  What's in it for you?
14
 
15
- * Missing jQuery UI (again), now included
16
- * find_images_in_list incorrect parameter call causing other plugins to break
17
-
18
 
19
  VERY IMPORTANT: Read ON!
20
  -----------------------
@@ -323,6 +322,9 @@ Yes, since we use Javascript rather than flash, NextCellent Gallery is compatibl
323
  - Many users are creating their respective translations and they will be included, along respective credits. Thanks to them!!!
324
 
325
  == Changelog ==
 
 
 
326
 
327
  = 1.9.25.3 - 06/02/2015 FIX (last round) =
328
  * Missing jQuery UI (again), now included
8
 
9
  == Description ==
10
 
11
+ = 1.9.26 - 2015-03-27 =
12
 
13
  What's in it for you?
14
 
15
+ * Improved Watermark with custom image selection (credits to Niko Strijbol)
16
+ * fix: Albums preview image now correctly shows images from inside the album, not the last uploaded ones.
 
17
 
18
  VERY IMPORTANT: Read ON!
19
  -----------------------
322
  - Many users are creating their respective translations and they will be included, along respective credits. Thanks to them!!!
323
 
324
  == Changelog ==
325
+ = 1.9.26 - 27/03/2015 =
326
+ * Improved Watermark (credits to Niko Strijbol)
327
+ * fix: Albums: preview image now correctly shows images from inside the album, not the last uploaded ones.
328
 
329
  = 1.9.25.3 - 06/02/2015 FIX (last round) =
330
  * Missing jQuery UI (again), now included
xml/json.php CHANGED
@@ -156,7 +156,8 @@ class nggAPI {
156
  if ( empty($this->term) )
157
  $list = $nggdb->find_last_images(0, $this->limit, false);
158
  else
159
- $list = $nggdb->search_for_images($this->term, $this->limit);
 
160
 
161
  if( is_array($list) ) {
162
  foreach($list as $image) {
@@ -167,7 +168,7 @@ class nggAPI {
167
  //TODO : need to rework save/load
168
  $name = stripslashes( htmlspecialchars_decode($name, ENT_QUOTES));
169
  $obj->label = $image->pid . ' - ' . $name;
170
- $obj->value = $name;
171
  $this->result[] = $obj;
172
  }
173
  }
156
  if ( empty($this->term) )
157
  $list = $nggdb->find_last_images(0, $this->limit, false);
158
  else
159
+ //$list = $nggdb->search_for_images($this->term, $this->limit);
160
+ $list = $nggdb->find_images_in_album($this->term);
161
 
162
  if( is_array($list) ) {
163
  foreach($list as $image) {
168
  //TODO : need to rework save/load
169
  $name = stripslashes( htmlspecialchars_decode($name, ENT_QUOTES));
170
  $obj->label = $image->pid . ' - ' . $name;
171
+ $obj->value = $image->pid . ' - ' . $name;
172
  $this->result[] = $obj;
173
  }
174
  }