%PDF- %PDF-
| Direktori : /home/lightco1/public_html/plugins/content/sigplus/engines/rotator/ |
| Current File : /home/lightco1/public_html/plugins/content/sigplus/engines/rotator/slideplus.php |
<?php
/**
* @file
* @brief sigplus Image Gallery Plus slideplus image rotator engine
* @author Levente Hunyadi
* @version 1.5.0
* @remarks Copyright (C) 2009-2017 Levente Hunyadi
* @remarks Licensed under GNU/GPLv3, see http://www.gnu.org/licenses/gpl-3.0.html
* @see http://hunyadi.info.hu/projects/sigplus
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
/**
* Support class for the slideplus rotator engine, written in plain JavaScript.
* @see http://hunyadi.info.hu/projects/slideplus/
*/
class SigPlusNovoSlidePlusRotatorEngine extends SigPlusNovoRotatorEngine {
public function getIdentifier() {
return 'slideplus';
}
public function isCaptionSupported() {
return true;
}
private static function cssCalc($values) {
$values = array_filter($values, 'strlen'); // removes all NULL, FALSE and empty strings but leaves 0 (zero) values
switch (count($values)) {
case 0:
return false;
case 1:
$total_length = reset($values);
return "{$total_length}";
default:
$total_length = implode(' + ', $values); // spaces around plus sign are mandatory in CSS
return "calc({$total_length})";
}
}
private static function cssPadding($padding) {
// check if some elements are missing
if ($padding['top'] === false || $padding['bottom'] === false || $padding['left'] === false || $padding['right'] === false) {
$css = array();
if ($padding['top'] !== false) {
$css['padding-top'] = $padding['top'];
}
if ($padding['bottom'] !== false) {
$css['padding-bottom'] = $padding['bottom'];
}
if ($padding['left'] !== false) {
$css['padding-left'] = $padding['left'];
}
if ($padding['right'] !== false) {
$css['padding-right'] = $padding['right'];
}
return $css;
}
// all values are set
if ($padding['left'] == $padding['right']) {
if ($padding['top'] == $padding['bottom']) {
if ($padding['top'] == $padding['left']) {
// all four values are equal
return array('padding' => $padding['top']);
} else {
// top and bottom, and left and right values are pairwise equal
return array('padding' => "{$padding['top']} {$padding['left']}");
}
} else {
// left and right values are equal
return array('padding' => "{$padding['top']} {$padding['left']} {$padding['bottom']}");
}
} else {
return array('padding' => "{$padding['top']} {$padding['right']} {$padding['bottom']} {$padding['left']}");
}
}
public function addStyles($selector, SigPlusNovoGalleryParameters $params) {
// add main stylesheet
parent::addStyles($selector, $params);
$css = array();
// preferred width for items
$css["{$selector} .slideplus-slot"] = array('width' => $params->preview_width.'px');
// scalable component of item height
$scalable_size = (100*$params->preview_height/$params->preview_width).'%'; // length proportional to image dimensions
// caption height does not affect image aspect unless caption is shown above or below image
$caption_height_above = false;
$caption_height_below = false;
switch ($params->caption_position) {
case 'above':
$caption_height_above = $params->caption_height;
break;
case 'below':
$caption_height_below = $params->caption_height;
break;
}
// aspect space allocation calculated in terms of preferred width, taking into account fixed-size length components
$aspect_padding = array(
// value for CSS padding top includes space reserved for captions above images
'top' => self::cssCalc(array($params->preview_border_width, $params->preview_padding, $caption_height_above)),
// value for CSS padding bottom includes artificial height to help maintain image aspect ratio and space reserved for captions below images
'bottom' => self::cssCalc(array($params->preview_border_width, $params->preview_padding, $scalable_size, $caption_height_below)),
'left' => self::cssCalc(array($params->preview_border_width, $params->preview_padding)),
'right' => self::cssCalc(array($params->preview_border_width, $params->preview_padding))
);
$css["{$selector} .slideplus-aspect"] = self::cssPadding($aspect_padding);
// navigation buttons
if (!$params->rotator_buttons) {
$css["{$selector} .slideplus-viewport .slideplus-previous"] = array('display' => 'none');
$css["{$selector} .slideplus-viewport .slideplus-next"] = array('display' => 'none');
}
switch ($params->rotator_navigation) {
case 'top':
$css["{$selector} .slideplus-navigation.slideplus-bottom"] = array('display' => 'none');
break;
case 'bottom':
$css["{$selector} .slideplus-navigation.slideplus-top"] = array('display' => 'none');
break;
case 'none':
$css["{$selector} .slideplus-navigation.slideplus-top, {$selector} .slideplus-navigation.slideplus-bottom"] = array('display' => 'none');
break;
case 'both':
break;
}
// navigation paging
if (!$params->rotator_links) {
$css["{$selector} .slideplus-pager"] = array('display' => 'none');
}
// item alignment
$alignment = array();
$horzalign = false;
switch ($params->rotator_alignment) {
case 'w': case 'c': case 'e': $horzalign = 'center'; break;
case 'nw': case 'w': case 'sw': $horzalign = 'flex-start'; break;
case 'ne': case 'e': case 'se': $horzalign = 'flex-end'; break;
}
if ($horzalign !== false) {
$alignment['justify-content'] = $horzalign;
}
$vertalign = false;
switch ($params->rotator_alignment) {
case 'w': case 'c': case 'e': $vertalign = 'center'; break;
case 'nw': case 'n': case 'ne': $vertalign = 'flex-start'; break;
case 'sw': case 's': case 'se': $vertalign = 'flex-end'; break;
}
if ($vertalign !== false) {
$alignment['align-items'] = $vertalign;
}
if ($params->caption_height !== false) {
switch ($params->caption_position) {
case 'above':
$alignment['padding-top'] = $params->caption_height;
break;
case 'below':
$alignment['padding-bottom'] = $params->caption_height;
break;
}
}
if (!empty($alignment)) {
$css["{$selector} .slideplus-content"] = $alignment;
}
// caption visibility
$caption_attributes = array();
switch ($params->caption_visibility) {
case 'none':
$caption_attributes['display'] = 'none';
break;
case 'always':
$caption_attributes['visibility'] = 'visible';
break;
}
if ($params->caption_height !== false) {
$caption_attributes['height'] = $params->caption_height;
}
if (!empty($caption_attributes)) {
$css["{$selector} .slideplus-caption"] = $caption_attributes;
}
// transition animation
$animation = array();
if ($params->rotator_duration > 0) {
$animation['animation-duration'] = $params->rotator_duration.'ms';
}
$easing = false;
switch ($params->rotator_transition) {
case 'linear':
$easing = 'linear'; break;
case 'quad': // http://easings.net/#easeInOutQuad
$easing = 'cubic-bezier(0.455, 0.03, 0.515, 0.955)'; break;
case 'cubic': // http://easings.net/#easeInOutCubic
$easing = 'cubic-bezier(0.645, 0.045, 0.355, 1)'; break;
case 'quart': // http://easings.net/#easeInOutQuart
$easing = 'cubic-bezier(0.77, 0, 0.175, 1)'; break;
case 'quint': // http://easings.net/#easeInOutQuint
$easing = 'cubic-bezier(0.86, 0, 0.07, 1)'; break;
case 'expo': // http://easings.net/#easeInOutExpo
$easing = 'cubic-bezier(1, 0, 0, 1)'; break;
case 'circ': // http://easings.net/#easeInOutCirc
$easing = 'cubic-bezier(0.785, 0.135, 0.15, 0.86)'; break;
case 'sine': // http://easings.net/#easeInOutSine
$easing = 'cubic-bezier(0.445, 0.05, 0.55, 0.95)'; break;
case 'back': // http://easings.net/#easeInOutBack
$easing = 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'; break;
case 'bounce': // not supported in CSS
case 'elastic': // not supported in CSS
default:
break;
}
if ($easing !== false) {
$animation['animation-timing-function'] = $easing;
}
$css["{$selector} .slideplus-stripe"] = $animation;
$instance = SigPlusNovoEngineServices::instance();
$instance->addStyles($css);
}
/**
* Adds script references to the HTML head element.
* @param {string} $selector A CSS selector.
* @param $params Gallery parameters.
*/
public function addScripts($selector, SigPlusNovoGalleryParameters $params) {
// add main script
parent::addScripts($selector, $params);
// get engine helper
$instance = SigPlusNovoEngineServices::instance();
// set rotator engine options
$jsparams = array();
$jsparams['rows'] = $params->rows;
$jsparams['cols'] = $params->cols;
$jsparams['loop'] = $params->loop;
$jsparams['orientation'] = $params->rotator_orientation;
$jsparams['step'] = $params->rotator_step;
$jsparams['links'] = $params->rotator_links;
$jsparams['delay'] = $params->rotator_delay;
if ($params->sort_criterion == SIGPLUS_SORT_RANDOM) {
$jsparams['random'] = true;
}
$caption_position = $params->caption_position;
switch ($caption_position) { // map some position constants
case 'overlay-bottom': $caption_position = 'bottom'; break;
case 'overlay-top': $caption_position = 'top'; break;
}
$jsparams['captions'] = $caption_position;
$jsparams['protection'] = $params->protection;
$language = JFactory::getLanguage();
$jsparams['dir'] = $language->isRtl() ? 'rtl' : 'ltr';
$jsparams = array_merge($jsparams, $params->rotator_params);
$jsparams = json_encode($jsparams);
$selector = json_encode("{$selector} ul");
$script = "new SlidePlusSlider(document.querySelector({$selector}), {$jsparams}, function (el) { return el.querySelector('.sigplus-image').getAttribute('data-title') || el.querySelector('.sigplus-image img').alt; });";
$instance->addOnReadyScript($script);
}
}