PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.9.2
Jetpack – WP Security, Backup, Speed, & Growth v13.9.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / shortcodes / presentations.php
jetpack / modules / shortcodes Last commit date
css 2 years ago images 2 years ago img 2 years ago js 2 years ago archiveorg-book.php 5 years ago archiveorg.php 5 years ago archives.php 5 years ago bandcamp.php 3 years ago brightcove.php 5 years ago cartodb.php 5 years ago class.filter-embedded-html-objects.php 2 years ago codepen.php 5 years ago crowdsignal.php 2 years ago dailymotion.php 3 years ago descript.php 4 years ago facebook.php 2 years ago flatio.php 5 years ago flickr.php 2 years ago getty.php 2 years ago gist.php 3 years ago googleapps.php 2 years ago googlemaps.php 2 years ago googleplus.php 5 years ago gravatar.php 2 years ago houzz.php 5 years ago inline-pdfs.php 4 years ago instagram.php 3 years ago kickstarter.php 3 years ago mailchimp.php 3 years ago medium.php 3 years ago mixcloud.php 2 years ago others.php 2 years ago pinterest.php 2 years ago presentations.php 2 years ago quiz.php 4 years ago recipe.php 2 years ago scribd.php 5 years ago sitemap.php 5 years ago slideshare.php 5 years ago slideshow.php 2 years ago smartframe.php 3 years ago soundcloud.php 3 years ago spotify.php 2 years ago ted.php 5 years ago tweet.php 2 years ago twitchtv.php 5 years ago twitter-timeline.php 5 years ago unavailable.php 3 years ago untappd-menu.php 3 years ago upcoming-events.php 3 years ago ustream.php 5 years ago videopress.php 4 years ago vimeo.php 2 years ago vine.php 5 years ago vr.php 2 years ago wordads.php 5 years ago wufoo.php 3 years ago youtube.php 1 year ago
presentations.php
489 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Presentations
4 * Presentations plugin based on the work done by <a href="http://darylkoop.com/">Daryl Koopersmith</a>. Powered by jmpress.js
5 *
6 * HOW TO: How the plugin settings are organized and which features are supported.
7 *
8 * The entire presentation should be wrapped with a [presentation] shortcode, and every
9 * individual slide should be wrapped with a [slide] shortcode. Any settings supported
10 * by [slide] can be set into [presentation], which will apply that setting for the entire
11 * presentation unless overridden by individual slides.
12 *
13 * - [presentation] only settings:
14 * - duration: transition durations, default is one second.
15 * - height: content height, default is 400px
16 * - width: content width, default is 550px
17 * - autoplay: delay between transitions in seconds, default 3s
18 * when set the presentation will automatically transition between slides
19 * as long as the presentation remains in focus
20 *
21 * - [slide] settings:
22 * - transition: specifies where the next slide will be placed relative
23 * to the last one before it. Supported values are "up", "down"
24 * "left", "right", or "none". Default value is "down".
25 *
26 * - scale: scales the content relative to other slides, default value is one
27 *
28 * - rotate: rotates the content by the specified degrees, default is zero
29 *
30 * - fade: slides will fade in and out during transition. Values of "on" or
31 * "true" will enable fading, while values of "no" or "false" will
32 * disable it. Default value is "on"
33 *
34 * - bgcolor: specifies a background color for the slides. Any CSS valid value
35 * is permitted. Default color is transparent.
36 *
37 * - bgimg: specifies an image url which will fill the background. Image is
38 * set to fill the background 100% width and height
39 *
40 * - fadebullets: any html <li> tags will start out with an opacity of 0 and any
41 * subsequent slide transitions will show the bullets one by one
42 *
43 * Known issues:
44 *
45 * - IE 7/8 are not supported by jmpress and presentations will not work
46 * - IE 9 will not animate transitions at all, though it's possible to at least
47 * switch between slides.
48 * - Infinite Scroll themes will not load presentations properly unless the post
49 * happens to be on the first loaded page. The permalink page will function
50 * properly, however.
51 * - Exiting fullscreen mode will not properly reset the scroll locations in Safari
52 *
53 * @package automattic/jetpack
54 */
55
56 use Automattic\Jetpack\Assets;
57
58 if ( ! class_exists( 'Presentations' ) ) :
59 /**
60 * Create a shortcode to display Presentations and slides.
61 */
62 class Presentations {
63
64 /**
65 * Presentation settings.
66 *
67 * @var array
68 */
69 private $presentation_settings;
70 /**
71 * Do we have a Presentation shortcode to be displayed.
72 *
73 * @var bool
74 */
75 private $presentation_initialized;
76 /**
77 * Were scripts and styles enqueued already.
78 *
79 * @var bool
80 */
81 private $scripts_and_style_included;
82
83 /**
84 * Constructor
85 */
86 public function __construct() {
87 $this->presentation_initialized = false;
88 $this->scripts_and_style_included = false;
89
90 // Registers shortcodes.
91 add_action( 'wp_head', array( $this, 'add_scripts' ), 1 );
92
93 add_shortcode( 'presentation', array( $this, 'presentation_shortcode' ) );
94 add_shortcode( 'slide', array( $this, 'slide_shortcode' ) );
95 }
96
97 /**
98 * Enqueue all scripts and styles.
99 */
100 public function add_scripts() {
101 $this->scripts_and_style_included = false;
102
103 if ( empty( $GLOBALS['posts'] ) || ! is_array( $GLOBALS['posts'] ) ) {
104 return;
105 }
106
107 foreach ( $GLOBALS['posts'] as $p ) {
108 if ( isset( $p->post_content ) && has_shortcode( $p->post_content, 'presentation' ) ) {
109 $this->scripts_and_style_included = true;
110 break;
111 }
112 }
113
114 if ( ! $this->scripts_and_style_included ) {
115 return;
116 }
117
118 $plugin = plugin_dir_url( __FILE__ );
119 // Add CSS.
120 wp_enqueue_style( 'presentations', $plugin . 'css/style.css', array(), JETPACK__VERSION );
121 // Add JavaScript.
122 wp_enqueue_script( 'jquery' );
123 wp_enqueue_script(
124 'jmpress',
125 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/jmpress.min.js', 'modules/shortcodes/js/jmpress.js' ),
126 array( 'jquery' ),
127 JETPACK__VERSION,
128 true
129 );
130 wp_enqueue_script(
131 'presentations',
132 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/main.min.js', 'modules/shortcodes/js/main.js' ),
133 array( 'jquery', 'jmpress' ),
134 JETPACK__VERSION,
135 true
136 );
137 }
138
139 /**
140 * Main Presentation shortcode.
141 *
142 * @param array $atts Shortcode attributes.
143 * @param string $content Post content.
144 */
145 public function presentation_shortcode( $atts, $content = '' ) {
146 // Mark that we've found a valid [presentation] shortcode.
147 $this->presentation_initialized = true;
148
149 $atts = shortcode_atts(
150 array(
151 'duration' => '',
152 'height' => '',
153 'width' => '',
154 'bgcolor' => '',
155 'bgimg' => '',
156 'autoplay' => '',
157
158 // Settings.
159 'transition' => '',
160 'scale' => '',
161 'rotate' => '',
162 'fade' => '',
163 'fadebullets' => '',
164 ),
165 $atts,
166 'presentation'
167 );
168
169 $this->presentation_settings = array(
170 'transition' => 'down',
171 'scale' => 1,
172 'rotate' => 0,
173 'fade' => 'on',
174 'fadebullets' => 0,
175 'last' => array(
176 'x' => 0,
177 'y' => 0,
178 'scale' => 1,
179 'rotate' => 0,
180 ),
181 );
182
183 // Set the presentation-wide settings.
184 if ( '' !== trim( $atts['transition'] ) ) {
185 $this->presentation_settings['transition'] = $atts['transition'];
186 }
187
188 if ( '' !== trim( $atts['scale'] ) ) {
189 $this->presentation_settings['scale'] = (float) $atts['scale'];
190 }
191
192 if ( '' !== trim( $atts['rotate'] ) ) {
193 $this->presentation_settings['rotate'] = (float) $atts['rotate'];
194 }
195
196 if ( '' !== trim( $atts['fade'] ) ) {
197 $this->presentation_settings['fade'] = $atts['fade'];
198 }
199
200 if ( '' !== trim( $atts['fadebullets'] ) ) {
201 $this->presentation_settings['fadebullets'] = $atts['fadebullets'];
202 }
203
204 // Set any settings the slides don't care about.
205 if ( '' !== trim( $atts['duration'] ) ) {
206 $duration = (float) $atts['duration'] . 's';
207 } else {
208 $duration = '1s';
209 }
210
211 // Autoplay durations are set in milliseconds.
212 if ( '' !== trim( $atts['autoplay'] ) ) {
213 $autoplay = (float) $atts['autoplay'] * 1000;
214 } else {
215 $autoplay = 0;
216 } // No autoplay
217
218 // Set the presentation size as specified or with some nicely sized dimensions.
219 if ( '' !== trim( $atts['width'] ) ) {
220 $this->presentation_settings['width'] = (int) $atts['width'];
221 } else {
222 $this->presentation_settings['width'] = 480;
223 }
224
225 if ( '' !== trim( $atts['height'] ) ) {
226 $this->presentation_settings['height'] = (int) $atts['height'];
227 } else {
228 $this->presentation_settings['height'] = 370;
229 }
230
231 // Hide the content by default in case the scripts fail.
232 $style = 'display: none; width: ' . $this->presentation_settings['width'] . 'px; height: ' . $this->presentation_settings['height'] . 'px;';
233
234 /*
235 * Check for background color XOR background image
236 * Use a white background if nothing specified
237 */
238 if ( preg_match( '/https?\:\/\/[^\'"\s]*/', $atts['bgimg'], $matches ) ) {
239 $style .= ' background-image: url("' . esc_url( $matches[0] ) . '");';
240 } elseif ( '' !== trim( $atts['bgcolor'] ) ) {
241 $style .= ' background-color: ' . esc_attr( $atts['bgcolor'] ) . ';';
242 } else {
243 $style .= ' background-color: #fff;';
244 }
245
246 // Not supported message style is inlined incase the style sheet doesn't get included.
247 $out = "<section class='presentation-wrapper'>";
248 $out .= "<p class='not-supported-msg' style='display: inherit; padding: 25%; text-align: center;'>";
249 $out .= __( 'This slideshow could not be started. Try refreshing the page or viewing it in another browser.', 'jetpack' ) . '</p>';
250
251 $out .= sprintf(
252 '<div class="presentation" duration="%s" data-autoplay="%s" style="%s">',
253 esc_attr( $duration ),
254 esc_attr( $autoplay ),
255 esc_attr( $style )
256 );
257 $out .= "<div class='nav-arrow-left'></div>";
258 $out .= "<div class='nav-arrow-right'></div>";
259 $out .= "<div class='nav-fullscreen-button'></div>";
260
261 if ( $autoplay ) {
262 $out .= '<div class="autoplay-overlay" style="display: none;"><p class="overlay-msg">';
263 $out .= __( 'Click to autoplay the presentation!', 'jetpack' );
264 $out .= '</p></div>';
265 }
266
267 $out .= do_shortcode( $content );
268
269 $out .= '</section>';
270
271 $this->presentation_initialized = false;
272
273 return $out;
274 }
275
276 /**
277 * Slide shortcode.
278 *
279 * @param array $atts Shortcode attributes.
280 * @param string $content Post content.
281 */
282 public function slide_shortcode( $atts, $content = '' ) {
283 // Bail out unless wrapped by a [presentation] shortcode.
284 if ( ! $this->presentation_initialized ) {
285 return $content;
286 }
287
288 $atts = shortcode_atts(
289 array(
290 'transition' => '',
291 'scale' => '',
292 'rotate' => '',
293 'fade' => '',
294 'fadebullets' => '',
295 'bgcolor' => '',
296 'bgimg' => '',
297 ),
298 $atts,
299 'slide'
300 );
301
302 // Determine positioning based on transition.
303 if ( '' === trim( $atts['transition'] ) ) {
304 $atts['transition'] = $this->presentation_settings['transition'];
305 }
306
307 // Setting the content scale.
308 if ( '' === trim( $atts['scale'] ) ) {
309 $atts['scale'] = $this->presentation_settings['scale'];
310 }
311
312 if ( '' === trim( $atts['scale'] ) ) {
313 $scale = 1;
314 } else {
315 $scale = (float) $atts['scale'];
316 }
317
318 if ( $scale < 0 ) {
319 $scale *= -1;
320 }
321
322 // Setting the content rotation.
323 if ( '' === trim( $atts['rotate'] ) ) {
324 $atts['rotate'] = $this->presentation_settings['rotate'];
325 }
326
327 if ( '' === trim( $atts['rotate'] ) ) {
328 $rotate = 0;
329 } else {
330 $rotate = (float) $atts['rotate'];
331 }
332
333 // Setting if the content should fade.
334 if ( '' === trim( $atts['fade'] ) ) {
335 $atts['fade'] = $this->presentation_settings['fade'];
336 }
337
338 if ( 'on' === $atts['fade'] || 'true' === $atts['fade'] ) {
339 $fade = 'fade';
340 } else {
341 $fade = '';
342 }
343
344 // Setting if bullets should fade on step changes.
345 if ( '' === trim( $atts['fadebullets'] ) ) {
346 $atts['fadebullets'] = $this->presentation_settings['fadebullets'];
347 }
348
349 if ( 'on' === $atts['fadebullets'] || 'true' === $atts['fadebullets'] ) {
350 $fadebullets = 'fadebullets';
351 } else {
352 $fadebullets = '';
353 }
354
355 $coords = $this->get_coords(
356 array(
357 'transition' => $atts['transition'],
358 'scale' => $scale,
359 'rotate' => $rotate,
360 )
361 );
362
363 $x = $coords['x'];
364 $y = $coords['y'];
365
366 /*
367 * Check for background color XOR background image
368 * Use a white background if nothing specified
369 */
370 if ( preg_match( '/https?\:\/\/[^\'"\s]*/', $atts['bgimg'], $matches ) ) {
371 $style = 'background-image: url("' . esc_url( $matches[0] ) . '");';
372 } elseif ( '' !== trim( $atts['bgcolor'] ) ) {
373 $style = 'background-color: ' . esc_attr( $atts['bgcolor'] ) . ';';
374 } else {
375 $style = '';
376 }
377
378 // Put everything together and let jmpress do the magic!
379 $out = sprintf(
380 '<div class="step %s %s" data-x="%s" data-y="%s" data-scale="%s" data-rotate="%s" style="%s">',
381 esc_attr( $fade ),
382 esc_attr( $fadebullets ),
383 esc_attr( $x ),
384 esc_attr( $y ),
385 esc_attr( $scale ),
386 esc_attr( $rotate ),
387 esc_attr( $style )
388 );
389
390 $out .= '<div class="slide-content">';
391 $out .= do_shortcode( $content );
392 $out .= '</div></div>';
393
394 return $out;
395 }
396
397 /**
398 * Determines the position of the next slide based on the position and scaling of the previous slide.
399 *
400 * @param array $args {
401 * Array of key-value pairs.
402 *
403 * @type string $transition: the transition name, "up", "down", "left", or "right".
404 * @type float $scale: the scale of the next slide (used to determine the position of the slide after that).
405 * }
406 *
407 * @return array with the 'x' and 'y' coordinates of the slide.
408 */
409 private function get_coords( $args ) {
410 if ( 0 === $args['scale'] ) {
411 $args['scale'] = 1;
412 }
413
414 $width = $this->presentation_settings['width'];
415 $height = $this->presentation_settings['height'];
416 $last = $this->presentation_settings['last'];
417 $scale = $last['scale'];
418
419 $next = array(
420 'x' => $last['x'],
421 'y' => $last['y'],
422 'scale' => $args['scale'],
423 'rotate' => $args['rotate'],
424 );
425
426 // All angles are measured from the vertical axis, so everything is backwards!
427 $diag_angle = atan2( $width, $height );
428 $diagonal = sqrt( pow( $width, 2 ) + pow( $height, 2 ) );
429
430 /*
431 * We offset the angles by the angle formed by the diagonal so that
432 * we can multiply the sines directly against the diagonal length
433 */
434 $theta = deg2rad( $last['rotate'] ) - $diag_angle;
435 $phi = deg2rad( $next['rotate'] ) - $diag_angle;
436
437 // We start by displacing by the slide dimensions.
438 $total_horiz_disp = $width * $scale;
439 $total_vert_disp = $height * $scale;
440
441 /*
442 * If the previous slide was rotated, we add the incremental offset from the rotation
443 * Namely the difference between the regular dimension (no rotation) and the component
444 * of the diagonal for that angle
445 */
446 $total_horiz_disp += ( ( ( abs( sin( $theta ) ) * $diagonal ) - $width ) / 2 ) * $scale;
447 $total_vert_disp += ( ( ( abs( cos( $theta ) ) * $diagonal ) - $height ) / 2 ) * $scale;
448
449 /*
450 * Similarly, we check if the current slide has been rotated and add whatever additional
451 * offset has been added. This is so that two rotated corners don't clash with each other.
452 * Note: we are checking the raw angle relative to the vertical axis, NOT the diagonal angle.
453 */
454 if ( 0 !== $next['rotate'] % 180 ) {
455 $total_horiz_disp += ( abs( ( sin( $phi ) * $diagonal ) - $width ) / 2 ) * $next['scale'];
456 $total_vert_disp += ( abs( ( cos( $phi ) * $diagonal ) - $height ) / 2 ) * $next['scale'];
457 }
458
459 switch ( trim( $args['transition'] ) ) {
460 case 'none':
461 break;
462
463 case 'left':
464 $next['x'] -= $total_horiz_disp;
465 break;
466
467 case 'right':
468 $next['x'] += $total_horiz_disp;
469 break;
470
471 case 'up':
472 $next['y'] -= $total_vert_disp;
473 break;
474
475 case 'down':
476 default:
477 $next['y'] += $total_vert_disp;
478 break;
479 }
480
481 $this->presentation_settings['last'] = $next;
482
483 return $next;
484 }
485 }
486
487 $GLOBALS['presentations'] = new Presentations();
488 endif;
489