PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.0.3
Jetpack – WP Security, Backup, Speed, & Growth v12.0.3
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 4 years ago images 12 years ago img 13 years ago js 4 years ago archiveorg-book.php 5 years ago archiveorg.php 5 years ago archives.php 5 years ago bandcamp.php 5 years ago brightcove.php 5 years ago cartodb.php 5 years ago class.filter-embedded-html-objects.php 3 years ago codepen.php 5 years ago crowdsignal.php 3 years ago dailymotion.php 3 years ago descript.php 4 years ago facebook.php 3 years ago flatio.php 5 years ago flickr.php 5 years ago getty.php 3 years ago gist.php 5 years ago googleapps.php 3 years ago googlemaps.php 5 years ago googleplus.php 5 years ago gravatar.php 3 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 3 years ago others.php 3 years ago pinterest.php 5 years ago presentations.php 3 years ago quiz.php 4 years ago recipe.php 3 years ago scribd.php 5 years ago sitemap.php 5 years ago slideshare.php 5 years ago slideshow.php 3 years ago smartframe.php 4 years ago soundcloud.php 3 years ago spotify.php 4 years ago ted.php 5 years ago tweet.php 5 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 3 years ago vine.php 5 years ago vr.php 3 years ago wordads.php 5 years ago wufoo.php 3 years ago youtube.php 3 years ago
presentations.php
490 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 use Automattic\Jetpack\Assets;
4
5 /**
6 * Presentations
7 * Presentations plugin based on the work done by <a href="http://darylkoop.com/">Daryl Koopersmith</a>. Powered by jmpress.js
8 *
9 * HOW TO: How the plugin settings are organized and which features are supported.
10 *
11 * The entire presentation should be wrapped with a [presentation] shortcode, and every
12 * individual slide should be wrapped with a [slide] shortcode. Any settings supported
13 * by [slide] can be set into [presentation], which will apply that setting for the entire
14 * presentation unless overridden by individual slides.
15 *
16 * - [presentation] only settings:
17 * - duration: transition durations, default is one second.
18 * - height: content height, default is 400px
19 * - width: content width, default is 550px
20 * - autoplay: delay between transitions in seconds, default 3s
21 * when set the presentation will automatically transition between slides
22 * as long as the presentation remains in focus
23 *
24 * - [slide] settings:
25 * - transition: specifies where the next slide will be placed relative
26 * to the last one before it. Supported values are "up", "down"
27 * "left", "right", or "none". Default value is "down".
28 *
29 * - scale: scales the content relative to other slides, default value is one
30 *
31 * - rotate: rotates the content by the specified degrees, default is zero
32 *
33 * - fade: slides will fade in and out during transition. Values of "on" or
34 * "true" will enable fading, while values of "no" or "false" will
35 * disable it. Default value is "on"
36 *
37 * - bgcolor: specifies a background color for the slides. Any CSS valid value
38 * is permitted. Default color is transparent.
39 *
40 * - bgimg: specifies an image url which will fill the background. Image is
41 * set to fill the background 100% width and height
42 *
43 * - fadebullets: any html <li> tags will start out with an opacity of 0 and any
44 * subsequent slide transitions will show the bullets one by one
45 *
46 * Known issues:
47 *
48 * - IE 7/8 are not supported by jmpress and presentations will not work
49 * - IE 9 will not animate transitions at all, though it's possible to at least
50 * switch between slides.
51 * - Infinite Scroll themes will not load presentations properly unless the post
52 * happens to be on the first loaded page. The permalink page will function
53 * properly, however.
54 * - Exiting fullscreen mode will not properly reset the scroll locations in Safari
55 *
56 * @package automattic/jetpack
57 */
58
59 if ( ! class_exists( 'Presentations' ) ) :
60 /**
61 * Create a shortcode to display Presentations and slides.
62 */
63 class Presentations {
64
65 /**
66 * Presentation settings.
67 *
68 * @var array
69 */
70 private $presentation_settings;
71 /**
72 * Do we have a Presentation shortcode to be displayed.
73 *
74 * @var bool
75 */
76 private $presentation_initialized;
77 /**
78 * Were scripts and styles enqueued already.
79 *
80 * @var bool
81 */
82 private $scripts_and_style_included;
83
84 /**
85 * Constructor
86 */
87 public function __construct() {
88 $this->presentation_initialized = false;
89 $this->scripts_and_style_included = false;
90
91 // Registers shortcodes.
92 add_action( 'wp_head', array( $this, 'add_scripts' ), 1 );
93
94 add_shortcode( 'presentation', array( $this, 'presentation_shortcode' ) );
95 add_shortcode( 'slide', array( $this, 'slide_shortcode' ) );
96 }
97
98 /**
99 * Enqueue all scripts and styles.
100 */
101 public function add_scripts() {
102 $this->scripts_and_style_included = false;
103
104 if ( empty( $GLOBALS['posts'] ) || ! is_array( $GLOBALS['posts'] ) ) {
105 return;
106 }
107
108 foreach ( $GLOBALS['posts'] as $p ) {
109 if ( isset( $p->post_content ) && has_shortcode( $p->post_content, 'presentation' ) ) {
110 $this->scripts_and_style_included = true;
111 break;
112 }
113 }
114
115 if ( ! $this->scripts_and_style_included ) {
116 return;
117 }
118
119 $plugin = plugin_dir_url( __FILE__ );
120 // Add CSS.
121 wp_enqueue_style( 'presentations', $plugin . 'css/style.css', array(), JETPACK__VERSION );
122 // Add JavaScript.
123 wp_enqueue_script( 'jquery' );
124 wp_enqueue_script(
125 'jmpress',
126 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/jmpress.min.js', 'modules/shortcodes/js/jmpress.js' ),
127 array( 'jquery' ),
128 JETPACK__VERSION,
129 true
130 );
131 wp_enqueue_script(
132 'presentations',
133 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/main.min.js', 'modules/shortcodes/js/main.js' ),
134 array( 'jquery', 'jmpress' ),
135 JETPACK__VERSION,
136 true
137 );
138 }
139
140 /**
141 * Main Presentation shortcode.
142 *
143 * @param array $atts Shortcode attributes.
144 * @param string $content Post content.
145 */
146 public function presentation_shortcode( $atts, $content = '' ) {
147 // Mark that we've found a valid [presentation] shortcode.
148 $this->presentation_initialized = true;
149
150 $atts = shortcode_atts(
151 array(
152 'duration' => '',
153 'height' => '',
154 'width' => '',
155 'bgcolor' => '',
156 'bgimg' => '',
157 'autoplay' => '',
158
159 // Settings.
160 'transition' => '',
161 'scale' => '',
162 'rotate' => '',
163 'fade' => '',
164 'fadebullets' => '',
165 ),
166 $atts,
167 'presentation'
168 );
169
170 $this->presentation_settings = array(
171 'transition' => 'down',
172 'scale' => 1,
173 'rotate' => 0,
174 'fade' => 'on',
175 'fadebullets' => 0,
176 'last' => array(
177 'x' => 0,
178 'y' => 0,
179 'scale' => 1,
180 'rotate' => 0,
181 ),
182 );
183
184 // Set the presentation-wide settings.
185 if ( '' !== trim( $atts['transition'] ) ) {
186 $this->presentation_settings['transition'] = $atts['transition'];
187 }
188
189 if ( '' !== trim( $atts['scale'] ) ) {
190 $this->presentation_settings['scale'] = (float) $atts['scale'];
191 }
192
193 if ( '' !== trim( $atts['rotate'] ) ) {
194 $this->presentation_settings['rotate'] = (float) $atts['rotate'];
195 }
196
197 if ( '' !== trim( $atts['fade'] ) ) {
198 $this->presentation_settings['fade'] = $atts['fade'];
199 }
200
201 if ( '' !== trim( $atts['fadebullets'] ) ) {
202 $this->presentation_settings['fadebullets'] = $atts['fadebullets'];
203 }
204
205 // Set any settings the slides don't care about.
206 if ( '' !== trim( $atts['duration'] ) ) {
207 $duration = (float) $atts['duration'] . 's';
208 } else {
209 $duration = '1s';
210 }
211
212 // Autoplay durations are set in milliseconds.
213 if ( '' !== trim( $atts['autoplay'] ) ) {
214 $autoplay = (float) $atts['autoplay'] * 1000;
215 } else {
216 $autoplay = 0;
217 } // No autoplay
218
219 // Set the presentation size as specified or with some nicely sized dimensions.
220 if ( '' !== trim( $atts['width'] ) ) {
221 $this->presentation_settings['width'] = (int) $atts['width'];
222 } else {
223 $this->presentation_settings['width'] = 480;
224 }
225
226 if ( '' !== trim( $atts['height'] ) ) {
227 $this->presentation_settings['height'] = (int) $atts['height'];
228 } else {
229 $this->presentation_settings['height'] = 370;
230 }
231
232 // Hide the content by default in case the scripts fail.
233 $style = 'display: none; width: ' . $this->presentation_settings['width'] . 'px; height: ' . $this->presentation_settings['height'] . 'px;';
234
235 /*
236 * Check for background color XOR background image
237 * Use a white background if nothing specified
238 */
239 if ( preg_match( '/https?\:\/\/[^\'"\s]*/', $atts['bgimg'], $matches ) ) {
240 $style .= ' background-image: url("' . esc_url( $matches[0] ) . '");';
241 } elseif ( '' !== trim( $atts['bgcolor'] ) ) {
242 $style .= ' background-color: ' . esc_attr( $atts['bgcolor'] ) . ';';
243 } else {
244 $style .= ' background-color: #fff;';
245 }
246
247 // Not supported message style is inlined incase the style sheet doesn't get included.
248 $out = "<section class='presentation-wrapper'>";
249 $out .= "<p class='not-supported-msg' style='display: inherit; padding: 25%; text-align: center;'>";
250 $out .= __( 'This slideshow could not be started. Try refreshing the page or viewing it in another browser.', 'jetpack' ) . '</p>';
251
252 $out .= sprintf(
253 '<div class="presentation" duration="%s" data-autoplay="%s" style="%s">',
254 esc_attr( $duration ),
255 esc_attr( $autoplay ),
256 esc_attr( $style )
257 );
258 $out .= "<div class='nav-arrow-left'></div>";
259 $out .= "<div class='nav-arrow-right'></div>";
260 $out .= "<div class='nav-fullscreen-button'></div>";
261
262 if ( $autoplay ) {
263 $out .= '<div class="autoplay-overlay" style="display: none;"><p class="overlay-msg">';
264 $out .= __( 'Click to autoplay the presentation!', 'jetpack' );
265 $out .= '</p></div>';
266 }
267
268 $out .= do_shortcode( $content );
269
270 $out .= '</section>';
271
272 $this->presentation_initialized = false;
273
274 return $out;
275 }
276
277 /**
278 * Slide shortcode.
279 *
280 * @param array $atts Shortcode attributes.
281 * @param string $content Post content.
282 */
283 public function slide_shortcode( $atts, $content = '' ) {
284 // Bail out unless wrapped by a [presentation] shortcode.
285 if ( ! $this->presentation_initialized ) {
286 return $content;
287 }
288
289 $atts = shortcode_atts(
290 array(
291 'transition' => '',
292 'scale' => '',
293 'rotate' => '',
294 'fade' => '',
295 'fadebullets' => '',
296 'bgcolor' => '',
297 'bgimg' => '',
298 ),
299 $atts,
300 'slide'
301 );
302
303 // Determine positioning based on transition.
304 if ( '' === trim( $atts['transition'] ) ) {
305 $atts['transition'] = $this->presentation_settings['transition'];
306 }
307
308 // Setting the content scale.
309 if ( '' === trim( $atts['scale'] ) ) {
310 $atts['scale'] = $this->presentation_settings['scale'];
311 }
312
313 if ( '' === trim( $atts['scale'] ) ) {
314 $scale = 1;
315 } else {
316 $scale = (float) $atts['scale'];
317 }
318
319 if ( $scale < 0 ) {
320 $scale *= -1;
321 }
322
323 // Setting the content rotation.
324 if ( '' === trim( $atts['rotate'] ) ) {
325 $atts['rotate'] = $this->presentation_settings['rotate'];
326 }
327
328 if ( '' === trim( $atts['rotate'] ) ) {
329 $rotate = 0;
330 } else {
331 $rotate = (float) $atts['rotate'];
332 }
333
334 // Setting if the content should fade.
335 if ( '' === trim( $atts['fade'] ) ) {
336 $atts['fade'] = $this->presentation_settings['fade'];
337 }
338
339 if ( 'on' === $atts['fade'] || 'true' === $atts['fade'] ) {
340 $fade = 'fade';
341 } else {
342 $fade = '';
343 }
344
345 // Setting if bullets should fade on step changes.
346 if ( '' === trim( $atts['fadebullets'] ) ) {
347 $atts['fadebullets'] = $this->presentation_settings['fadebullets'];
348 }
349
350 if ( 'on' === $atts['fadebullets'] || 'true' === $atts['fadebullets'] ) {
351 $fadebullets = 'fadebullets';
352 } else {
353 $fadebullets = '';
354 }
355
356 $coords = $this->get_coords(
357 array(
358 'transition' => $atts['transition'],
359 'scale' => $scale,
360 'rotate' => $rotate,
361 )
362 );
363
364 $x = $coords['x'];
365 $y = $coords['y'];
366
367 /*
368 * Check for background color XOR background image
369 * Use a white background if nothing specified
370 */
371 if ( preg_match( '/https?\:\/\/[^\'"\s]*/', $atts['bgimg'], $matches ) ) {
372 $style = 'background-image: url("' . esc_url( $matches[0] ) . '");';
373 } elseif ( '' !== trim( $atts['bgcolor'] ) ) {
374 $style = 'background-color: ' . esc_attr( $atts['bgcolor'] ) . ';';
375 } else {
376 $style = '';
377 }
378
379 // Put everything together and let jmpress do the magic!
380 $out = sprintf(
381 '<div class="step %s %s" data-x="%s" data-y="%s" data-scale="%s" data-rotate="%s" style="%s">',
382 esc_attr( $fade ),
383 esc_attr( $fadebullets ),
384 esc_attr( $x ),
385 esc_attr( $y ),
386 esc_attr( $scale ),
387 esc_attr( $rotate ),
388 esc_attr( $style )
389 );
390
391 $out .= '<div class="slide-content">';
392 $out .= do_shortcode( $content );
393 $out .= '</div></div>';
394
395 return $out;
396 }
397
398 /**
399 * Determines the position of the next slide based on the position and scaling of the previous slide.
400 *
401 * @param array $args {
402 * Array of key-value pairs.
403 *
404 * @type string $transition: the transition name, "up", "down", "left", or "right".
405 * @type float $scale: the scale of the next slide (used to determine the position of the slide after that).
406 * }
407 *
408 * @return array with the 'x' and 'y' coordinates of the slide.
409 */
410 private function get_coords( $args ) {
411 if ( 0 === $args['scale'] ) {
412 $args['scale'] = 1;
413 }
414
415 $width = $this->presentation_settings['width'];
416 $height = $this->presentation_settings['height'];
417 $last = $this->presentation_settings['last'];
418 $scale = $last['scale'];
419
420 $next = array(
421 'x' => $last['x'],
422 'y' => $last['y'],
423 'scale' => $args['scale'],
424 'rotate' => $args['rotate'],
425 );
426
427 // All angles are measured from the vertical axis, so everything is backwards!
428 $diag_angle = atan2( $width, $height );
429 $diagonal = sqrt( pow( $width, 2 ) + pow( $height, 2 ) );
430
431 /*
432 * We offset the angles by the angle formed by the diagonal so that
433 * we can multiply the sines directly against the diagonal length
434 */
435 $theta = deg2rad( $last['rotate'] ) - $diag_angle;
436 $phi = deg2rad( $next['rotate'] ) - $diag_angle;
437
438 // We start by displacing by the slide dimensions.
439 $total_horiz_disp = $width * $scale;
440 $total_vert_disp = $height * $scale;
441
442 /*
443 * If the previous slide was rotated, we add the incremental offset from the rotation
444 * Namely the difference between the regular dimension (no rotation) and the component
445 * of the diagonal for that angle
446 */
447 $total_horiz_disp += ( ( ( abs( sin( $theta ) ) * $diagonal ) - $width ) / 2 ) * $scale;
448 $total_vert_disp += ( ( ( abs( cos( $theta ) ) * $diagonal ) - $height ) / 2 ) * $scale;
449
450 /*
451 * Similarly, we check if the current slide has been rotated and add whatever additional
452 * offset has been added. This is so that two rotated corners don't clash with each other.
453 * Note: we are checking the raw angle relative to the vertical axis, NOT the diagonal angle.
454 */
455 if ( 0 !== $next['rotate'] % 180 ) {
456 $total_horiz_disp += ( abs( ( sin( $phi ) * $diagonal ) - $width ) / 2 ) * $next['scale'];
457 $total_vert_disp += ( abs( ( cos( $phi ) * $diagonal ) - $height ) / 2 ) * $next['scale'];
458 }
459
460 switch ( trim( $args['transition'] ) ) {
461 case 'none':
462 break;
463
464 case 'left':
465 $next['x'] -= $total_horiz_disp;
466 break;
467
468 case 'right':
469 $next['x'] += $total_horiz_disp;
470 break;
471
472 case 'up':
473 $next['y'] -= $total_vert_disp;
474 break;
475
476 case 'down':
477 default:
478 $next['y'] += $total_vert_disp;
479 break;
480 }
481
482 $this->presentation_settings['last'] = $next;
483
484 return $next;
485 }
486 }
487
488 $GLOBALS['presentations'] = new Presentations();
489 endif;
490