????JFIF??x?x????'
| Server IP : 79.136.114.73 / Your IP : 216.73.216.217 Web Server : Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.29 OpenSSL/1.0.1f System : Linux b8009 3.13.0-170-generic #220-Ubuntu SMP Thu May 9 12:40:49 UTC 2019 x86_64 User : www-data ( 33) PHP Version : 5.5.9-1ubuntu4.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /var/www/www.astacus.eu/wp-content/plugins/LayerSlider/static/admin/js/ |
Upload File : |
// Stores the database ID of
// currently editing slider.
var LS_sliderID = 0,
// Store the indexes of currently
// selected items on the interface.
LS_activeSlideIndex = 0,
LS_activeLayerIndexSet = [],
LS_activeLayerPageIndex = 0,
LS_activeLayerTransitionTab = 0,
LS_activeScreenType = 'desktop',
LS_lastSelectedLayerIndex = 0,
// Stores all preview items using an object
// to easily add and modify items.
//
// NOTE: it's not a jQuery collection, but a
// collection of jQuery-enabled elements.
LS_previewItems = [],
// Object references, pointing to the currently selected
// slide/layer data. These are not working copies, any
// change made will affect the main data object. This makes
// possible to avoid issues caused by inconsistent data.
LS_activeSlideData = {},
LS_activeLayerDataSet = [],
LS_activeStaticLayersDataSet = [],
// These objects will be filled with the default slide/layer
// properties when needed. They purpose as a caching mechanism
// for bulk slide/layer creation.
LS_defaultSliderData = {},
LS_defaultSlideData = {},
LS_defaultLayerData = {},
// Stores all previous editing sessions
// to cache results and speed up operations.
LS_editorSessions = [],
// Flag for unsaved changes on site.
// We use this to display a warning
// for the user when leaving the page.
LS_editorIsDirty = false,
// Flag for transformed layers due to
// combo box preview, which needs to
// be updated after closing the combo box.
LS_comboBoxIsDirty = false,
// Flag for dragging operations to better
// handle layer selection in a group-select
// scenario.
LS_layerWasDragged = false,
// Stores default UI settings of
// editing sessions.
LS_defaultEditorSession = {
slideIndex: LS_activeSlideIndex,
layerIndex: LS_activeLayerIndexSet,
zoomSlider: 100,
zoomAutoFit: true
},
// Stores temporary data for all
// copy & pate operations.
LS_clipboard = {},
// Stores the main UI elements
LS_previewZoom = 1,
LS_previewArea,
LS_previewHolder,
LS_previewWrapper,
// Context menu
LS_contextMenuTop = 10,
LS_contextMenuLeft = 10,
LS_transformStyles = [
'rotation',
'rotationX',
'rotationY',
'scaleX',
'scaleY',
'skewX',
'skewY'
];
var $lasso = jQuery();
// Utility functions to perform
// commonly used tasks.
var LS_Utils = {
convertDateToUTC: function(date) {
return new Date(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds()
);
},
jsTimeZoneID: function() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
},
dataURItoBlob: function( dataURI, type ) {
type = type || 'image/png';
var binary = atob(dataURI.split(',')[1]);
var array = [];
for(var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], { type: type });
},
moveArrayItem: function(array, from, to) {
if( to === from ) return;
var target = array[from];
var increment = to < from ? -1 : 1;
for(var k = from; k != to; k += increment){
array[k] = array[k + increment];
}
array[to] = target;
},
toAbsoluteURL: function(url) {
// Handle absolute URLs (with protocol-relative prefix)
// Example: //domain.com/file.png
if (url.search(/^\/\//) != -1) {
return window.location.protocol + url;
}
// Handle absolute URLs (with explicit origin)
// Example: http://domain.com/file.png
if (url.search(/:\/\//) != -1) {
return url;
}
// Handle absolute URLs (without explicit origin)
// Example: /file.png
if (url.search(/^\//) != -1) {
return window.location.origin + url;
}
// Handle relative URLs
// Example: file.png
var base = window.location.href.match(/(.*\/)/)[0];
return base + url;
},
// credits: http://phpjs.org/functions/strip_tags/
stripTags: function(input, allowed) {
allowed = (((allowed || '') + '')
.toLowerCase()
.match(/<[a-z][a-z0-9]*>/g) || [])
.join('');
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
return input.replace(commentsAndPhpTags, '')
.replace(tags, function($0, $1) {
return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
});
},
// credits: http://phpjs.org/functions/nl2br/
nl2br: function(str, is_xhtml) {
var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br ' + '/>' : '<br>'; // Adjust comment to avoid issue on phpjs.org display
return (str + '')
.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
},
// credits: http://stackoverflow.com/questions/3169786/clear-text-selection-with-javascript
removeTextSelection: function() {
var selection = window.getSelection ? window.getSelection() : document.selection ? document.selection : null;
if(!!selection) selection.empty ? selection.empty() : selection.removeAllRanges();
},
// credits: http://locutus.io/php/stripslashes/
stripslashes: function(str) {
return (str + '')
.replace(/\\(.?)/g, function (s, n1) {
switch (n1) {
case '\\':
return '\\'
case '0':
return '\u0000'
case '':
return ''
default:
return n1
}
});
},
// credits: http://locutus.io/php/parse_url/
parse_url: function(str, component) {
var query;
var mode = (typeof require !== 'undefined' ? require('../info/ini_get')('locutus.parse_url.mode') : undefined) || 'php';
var key = [
'source',
'scheme',
'authority',
'userInfo',
'user',
'pass',
'host',
'port',
'relative',
'path',
'directory',
'file',
'query',
'fragment'
];
// For loose we added one optional slash to post-scheme to catch file:/// (should restrict this)
var parser = {
php: new RegExp([
'(?:([^:\\/?#]+):)?',
'(?:\\/\\/()(?:(?:()(?:([^:@\\/]*):?([^:@\\/]*))?@)?([^:\\/?#]*)(?::(\\d*))?))?',
'()',
'(?:(()(?:(?:[^?#\\/]*\\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)'
].join('')),
strict: new RegExp([
'(?:([^:\\/?#]+):)?',
'(?:\\/\\/((?:(([^:@\\/]*):?([^:@\\/]*))?@)?([^:\\/?#]*)(?::(\\d*))?))?',
'((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)'
].join('')),
loose: new RegExp([
'(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?',
'(?:\\/\\/\\/?)?',
'((?:(([^:@\\/]*):?([^:@\\/]*))?@)?([^:\\/?#]*)(?::(\\d*))?)',
'(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))',
'(?:\\?([^#]*))?(?:#(.*))?)'
].join(''))
};
var m = parser[mode].exec(str);
var uri = {};
var i = 14;
while (i--) {
if (m[i]) {
uri[key[i]] = m[i];
}
}
if (component) {
return uri[component.replace('PHP_URL_', '').toLowerCase()];
}
if (mode !== 'php') {
var name = (typeof require !== 'undefined' ? require('../info/ini_get')('locutus.parse_url.queryKey') : undefined) || 'queryKey';
parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
uri[name] = {};
query = uri[key[12]] || '';
query.replace(parser, function ($0, $1, $2) {
if ($1) {
uri[name][$1] = $2;
}
});
}
delete uri.source;
return uri;
}
};
var LS_GUI = {
updateImagePicker: function( $picker, image, updateProperties ) {
updateProperties = updateProperties || {};
if( typeof $picker === 'string' ) {
$picker = jQuery('input[name="'+$picker+'"]').next();
}
if( image === 'useCurrent' ) {
image = $picker.find('img').attr('src');
}
if( image && image.indexOf('blank.gif') !== -1 ) {
if( ! updateProperties.fromPost ) {
image = false;
}
}
$picker
.removeClass('has-image not-set')
.addClass( image ? 'has-image' : 'not-set' )
.find('img').attr('src', image || lsTrImgPath+'/blank.gif' );
},
updateLinkPicker: function( $input ) {
if( typeof $input === 'string' ) {
$input = jQuery('input[name="'+$input+'"]');
}
// Do nothing if no input found. Revisions and other pages
// might load the Slider Builder script without an active
// editor session in place.
if( ! $input.length ) { return; }
var $holder = $input.closest('.ls-slide-link'),
inputName = $input.attr('name'),
inputVal = $input.val(),
isSlide = $holder.closest('.ls-slide-options').length,
dataArea = isSlide ? LS_activeSlideData.properties : LS_activeLayerDataSet[0],
$linkIdInput = $holder.find('input[name="linkId"]'),
$linkNameInput = $holder.find('input[name="linkName"]'),
$linkTypeInput = $holder.find('input[name="linkType"]'),
linkId = $linkIdInput.val(),
linkName = $linkNameInput.val(),
linkType = $linkTypeInput.val(),
l10nKey;
// Normalize HTML entities
linkName = jQuery('<textarea>').html(linkName).text();
// Smart Link
if( linkName && ( ( linkId && '#' === linkId.substr(0, 1) ) || ( inputVal && '#' === inputVal.substr(0, 1) ) ) ) {
var placeholder = LS_l10n.SBLinkSmartAction.replace( '%s', linkName );
$holder.addClass('has-link');
// If linkId is not yet set, copy the input field value
if( ! linkId.length ) {
$linkIdInput.val( inputVal );
}
$input.val( placeholder ).prop('disabled', true);
// URL from Dynamic Layer
} else if( ( linkId && '[post-url]' === linkId ) || ( inputVal && '[post-url]' === inputVal ) ) {
$holder.addClass('has-link');
$input.val( LS_l10n.SBLinkPostDynURL ).prop('disabled', true);
$linkIdInput.val('[post-url]');
// Specific WP Post/Page
} else if( linkId && linkName && linkType ) {
l10nKey = 'SBLinkText'+ucFirst( linkType );
$holder.addClass('has-link');
$input.val( LS_l10n[l10nKey].replace('%s', linkName) ).prop('disabled', true);
// No formatted link
} else {
$holder.removeClass('has-link');
$input.prop('disabled', false);
}
// Update data source
dataArea[ inputName ] = $input.val();
dataArea.linkId = $linkIdInput.val();
dataArea.linkName = $linkNameInput.val();
dataArea.linkType = $linkTypeInput.val();
},
deeplinkSection: function() {
var hash = document.location.hash.replace('#', ''),
$target = jQuery('[data-deeplink="'+hash+'"]');
if( $target.length ) {
$target.click();
}
}
};
// Slide specific undo & redo operations.
// Uses callbacks to run any code stored by
// other methods. Supports custom parameters.
var LS_UndoManager = {
index: -1,
stack: [],
limit: 50,
add: function(cmd, name, updateInfo) {
// Invalidate items higher on the stack when
// called from an undo-ed position
this.stack.splice(this.index + 1, this.stack.length - this.index);
this.index = this.stack.length - 1;
// Maintain stack limit
if(this.stack.length > this.limit) {
this.stack.shift();
}
// Verify 'history' object in slide
if(!LS_activeSlideData.hasOwnProperty('history')) {
LS_activeSlideData.history = [];
}
// Prepare updateInfo
this.prepareUpdateInfo( updateInfo );
// Add item
this.stack.push({
cmd: cmd,
name: name,
updateInfo: updateInfo
});
// Maintain buttons and stack index
this.index = this.stack.length - 1;
this.maintainButtons();
// Mark unsaved changes on page
LS_editorIsDirty = true;
},
// Replace this.stack when switching slides
// to support slide-specific history.
update: function() {
// Verify 'history' object in slide
if(!LS_activeSlideData.hasOwnProperty('history')) {
LS_activeSlideData.history = [];
}
this.stack = LS_activeSlideData.history;
this.index = this.stack.length - 1;
if( LS_activeSlideData.meta && LS_activeSlideData.meta.undoStackIndex ) {
this.index = LS_activeSlideData.meta.undoStackIndex;
}
this.maintainButtons();
},
// Merges new changes into the last item in
// the UndoManager stack.
merge: function( cmd, name, updateInfo ) {
var lastItem = this.stack[ this.stack.length - 1 ];
this.prepareUpdateInfo( updateInfo );
jQuery.extend(true, lastItem.updateInfo, updateInfo);
},
// Empties the current slide's history and reset
// every UndoManager-related properties
empty: function() {
LS_activeSlideData.history = [];
if( LS_activeSlideData.meta && LS_activeSlideData.meta.undoStackIndex ) {
LS_activeSlideData.meta.undoStackIndex = -1;
}
this.update();
},
undo: function() {
if(this.stack[this.index]) {
this.execute('undo', this.stack[this.index], this.stack[this.index-1]);
this.index--;
this.maintainButtons();
}
},
redo: function() {
if(this.stack[this.index+1]) {
this.index++;
this.execute('redo', this.stack[this.index], this.stack[this.index+1]);
this.maintainButtons();
}
},
prepareUpdateInfo: function( updateInfo ) {
if( updateInfo && typeof updateInfo === 'object') {
jQuery.each(updateInfo, function(key, val) {
if( typeof val === 'object') {
LS_UndoManager.prepareUpdateInfo( val );
return true;
}
if( val === null || typeof val === 'undefined') {
updateInfo[key] = '';
}
});
}
},
maintainButtons: function(itemIndex) {
var undoButton = jQuery('.ls-editor-undo'),
redoButton = jQuery('.ls-editor-redo');
LS_activeSlideData.meta.undoStackIndex = this.index;
if(this.index !== -1) { undoButton.removeClass('disabled'); }
else { undoButton.addClass('disabled'); }
if(this.index < this.stack.length-1) { redoButton.removeClass('disabled'); }
else { redoButton.addClass('disabled'); }
},
execute: function(action, item, followingItem) {
var layerIndexSet = [];
// Convert object to array to easily
// handle multi-action steps.
if( jQuery.type(item.updateInfo) === 'object' ) {
item.updateInfo = [item.updateInfo];
}
// Iterate through actions in step.
for(var c = 0; c < item.updateInfo.length; c++) {
this.executeItem(
item.cmd,
item.updateInfo[c].itemIndex,
item.updateInfo[c][action],
item.updateInfo[c]
);
layerIndexSet.push( item.updateInfo[c].itemIndex );
}
this.restoreSelection( action, layerIndexSet, followingItem );
},
restoreSelection: function(action, layerIndexSet, followingItem) {
if( followingItem && action === 'undo' ) {
var followingIndexSet = [];
if( jQuery.type(followingItem.updateInfo) === 'object' ) {
followingItem.updateInfo = [followingItem.updateInfo];
}
for(var c = 0; c < followingItem.updateInfo.length; c++) {
followingIndexSet.push( followingItem.updateInfo[c].itemIndex );
}
}
// Re-select affected layers if the selection has changed
if( JSON.stringify( followingIndexSet || layerIndexSet) !== JSON.stringify(LS_activeLayerIndexSet) ) {
if( LS_activeSlideData.sublayers.length-1 < Math.max.apply(Math, followingIndexSet || layerIndexSet) ) {
LayerSlider.selectLayer( [ LS_activeSlideData.sublayers.length-1] );
} else {
LayerSlider.selectLayer( followingIndexSet || layerIndexSet );
}
}
},
executeItem: function(command, itemIndex, updateInfo, item) {
switch(command) {
case 'slide.general':
this.updateOptions(LS_activeSlideData.properties, itemIndex, updateInfo, 'slide');
LayerSlider.updateSlidePreviews();
LayerSlider.updateSlideInterfaceItems();
LayerSlider.generatePreview();
break;
case 'slide.layers':
if(jQuery.isEmptyObject(updateInfo.data)) {
LayerSlider.removeLayer(itemIndex, { histroyEvent: true, requireConfirmation: false });
} else {
LayerSlider.addLayer(updateInfo.data, itemIndex, { histroyEvent: true });
LayerSlider.selectLayer( item.selectIndex );
}
LS_DataSource.buildLayersList();
LayerSlider.generatePreview();
break;
case 'layer.order':
LS_Utils.moveArrayItem(LS_activeSlideData.sublayers, updateInfo.from, updateInfo.to);
LS_DataSource.buildLayersList();
LayerSlider.generatePreview();
break;
case 'layer.general':
this.updateOptions(LS_activeSlideData.sublayers[itemIndex], itemIndex, updateInfo);
LayerSlider.updateLayerInterfaceItems(itemIndex);
LayerSlider.generatePreviewItem(itemIndex);
LayerSlider.updatePreviewSelection();
break;
case 'layer.transition':
this.updateOptions(LS_activeSlideData.sublayers[itemIndex].transition, itemIndex, updateInfo);
LayerSlider.generatePreviewItem(itemIndex);
break;
case 'layer.style':
this.updateOptions(LS_activeSlideData.sublayers[itemIndex].styles, itemIndex, updateInfo);
LayerSlider.generatePreviewItem(itemIndex);
LayerSlider.updatePreviewSelection();
break;
}
},
// Iterates over the updateInfo object,
// overrides the keys in the provided
// data object.
updateOptions: function( data, index, updateInfo, area ) {
area = area || 'layers';
var parent = (area === 'slide') ? '.ls-slide-options' : '.ls-layers-table';
jQuery.each(updateInfo, function(key, val) {
//if( data.hasOwnProperty(key) ) {
if( typeof val === 'object' ) {
LS_UndoManager.updateOptions( data[key], index, updateInfo[key], area);
return true;
}
// Update data
data[key] = val;
// Handle UI if it's the active layer
if( area === 'slide' || (LS_activeLayerIndexSet.length == 1 && index == LS_activeLayerIndexSet[0]) ) {
var $target = jQuery(parent+' '+'[name="'+key+'"]'),
eventType = 'input';
if( ! $target.is(':checkbox') ) {
$target.val(val).trigger('input').trigger('keyup');
}
if($target.is(':checkbox')) {
if(val) {
$target.prop('checked', true);
$target.next().addClass('on').removeClass('off');
} else {
$target.prop('checked', false);
$target.next().addClass('off').removeClass('on');
}
return;
} else if($target.is('select')) {
eventType = 'change';
}
var jqEvent = jQuery.Event(eventType, { target: $target[0], UndoManagerAction: true });
jQuery('#ls-layers').triggerHandler(jqEvent);
}
//}
});
},
saveOriginalInputValues: function( $input ) {
var prevVals = [],
type = null,
optionName = $input.attr('name'),
optionValue = $input.is(':checkbox') ? ! $input.prop('checked') : $input.val();
// Save input value as a generic solution
$input.data('prevVal', optionValue );
// Override saved data if it's a layer option
if( $input.closest('.ls-sublayer-pages').length ) {
if( $input.hasClass('sublayerprop') ) { type = 'transition'; }
else if( $input.hasClass('auto') ) { type = 'styles'; }
jQuery.each(LS_activeLayerDataSet, function(item, layerData) {
var area = layerData;
if( type ) { area = area[type]; }
prevVals.push( area[optionName] );
});
$input.data('prevVal', prevVals );
}
},
trackInputs: function( event, element ) {
event = event || { type: 'change' };
if( event.UndoManagerAction ) { return false; }
var $input = jQuery(element),
cmd, name, index;
if( event.type.toLowerCase() == 'click' && $input.is('input,textarea') ) {
return;
}
if( event.type.toLowerCase() !== 'change' ) {
this.saveOriginalInputValues( $input );
return;
} else if( event.type.toLowerCase() === 'change' && $input.is(':checkbox') ) {
this.saveOriginalInputValues( $input );
}
// Skip colorpickers, as they rapidly send change events
if( $input.hasClass('ls-colorpicker') ) {
return;
}
if( $input.closest('.ls-sublayer-pages').length ) {
cmd = 'layer.general';
name = LS_l10n.SBUndoLayer;
index = LS_activeLayerIndexSet[0];
if($input.hasClass('sublayerprop')) { cmd = 'layer.transition'; }
else if($input.hasClass('auto')) { cmd = 'layer.style'; }
} else if( $input.closest('.ls-slide-options').length ) {
cmd = 'slide.general';
name = LS_l10n.SBUndoSlide;
index = LS_activeSlideIndex;
} else {
return true;
}
var updateInfo = [],
optionName = $input.attr('name'),
optionValue = $input.is(':checkbox') ? $input.prop('checked') : $input.val(),
prevValue = $input.data('prevVal'),
action = $input.hasClass('undomanager-merge') ? 'merge': 'add';
if( ! optionName ) {
return false;
}
// Layer option change, handle multiple
// selection (if any).
if( typeof prevValue === 'object' ) {
jQuery.each(LS_activeLayerIndexSet, function( index, layerIndex ) {
var undo = {}, redo = {};
undo[ optionName ] = prevValue[ index ];
redo[ optionName ] = optionValue;
if( prevValue[ index ] !== optionValue ) {
updateInfo.push({
itemIndex: layerIndex,
undo: undo,
redo: redo
});
}
});
// Slide option change
} else {
if( prevValue !== optionValue ) {
var undo = {}, redo = {};
undo[ optionName ] = prevValue;
redo[ optionName ] = optionValue;
updateInfo.push({
itemIndex: index,
undo: undo,
redo: redo
});
}
}
LS_UndoManager[action](cmd, name, updateInfo);
}
};
var LayerSlider = {
uploadInput: null,
dragIndex: 0,
timeout: 0,
mediaCheckTimeout: 0,
isSlidePreviewActive: false,
isLayerPreviewActive: false,
selectableTimeout: 0,
getSliderSize: function() {
var sliderProps = window.lsSliderData.properties, width, height;
if( sliderProps.type && sliderProps.type === 'popup' ) {
width = sliderProps.popupWidth || 640;
height = sliderProps.popupHeight || 360;
} else {
width = parseInt(sliderProps.sublayercontainer) || sliderProps.width || 1280;
height = sliderProps.height || 720;
}
return {
width: parseInt(width),
height: parseInt(height)
};
},
sliderIsEmpty: function( length ) {
var isEmpty = true;
jQuery.each(window.lsSliderData.layers, function(slideKey, slide) {
if( jQuery.trim( slide.properties.background ) ) {
isEmpty = false; return false;
}
jQuery.each(slide.sublayers, function(layerKey, layer) {
// Has image
if( layer.media === 'img' ) {
if( layer.image ) {
isEmpty = false; return false;
}
// Has textual content
} else if( layer.html ) {
isEmpty = false; return false;
// Has visual content
} else if( layer.styles.width || layer.styles.height ) {
if( layer.html || layer.styles.background ) {
isEmpty = false; return false;
} else if( layer.styles['border-top'] || layer.styles['border-right'] || layer.styles['border-bottom'] || layer.styles['border-left'] ) {
isEmpty = false; return false;
}
}
});
if( length && length === slideKey+1 ) {
return false;
}
});
return isEmpty;
},
selectMainTab: function(el) {
var $tab = jQuery(el);
// Select new tab
$tab.addClass('active').siblings().removeClass('active');
// Show new tab contents
jQuery('#ls-pages .ls-page').removeClass('active');
jQuery('#ls-pages .ls-page').eq( $tab.index() ).addClass('active');
// Make sure to properly resize the transition options
if( $tab.hasClass('layers') ) {
kmUI.smartResize.set();
}
// Init CodeMirror
if($tab.hasClass('callbacks')) {
if(jQuery('.ls-callback-page .CodeMirror-code').length === 0) {
LS_CodeMirror.init({ mode: 'javascript', autofocus : false, styleActiveLine : false });
jQuery(window).scrollTop(0);
}
}
},
selectSettingsTab: function(li) {
var $li = jQuery( li ),
index = $li.index();
if( $li.hasClass('locked') ) {
return false;
}
$li.addClass('active').siblings().removeClass('active');
jQuery('div.ls-settings-contents > table > tbody.active').removeClass('active');
jQuery('div.ls-settings-contents > table > tbody').eq(index).addClass('active');
// Make sure that the Slider Settings section is selected
jQuery('#ls-main-nav-bar .settings').click();
// Update hash for deeplinking
document.location.hash = jQuery(li).data('deeplink');
},
addSlide: function( slideData, addProperties ) {
var defaultProperties = {
atIndex: window.lsSliderData.layers.length,
selectSlide: true
};
addProperties = jQuery.extend( true, defaultProperties, addProperties );
var hasSlideData = slideData ? true : false;
if( ! slideData ) {
// Get default data objects for slides and layers
var slideData = jQuery.extend(true, {}, LS_DataSource.getDefaultSlideData());
slideData = {
properties: slideData,
sublayers: []
};
}
// Add new slide data to data source
window.lsSliderData.layers.splice(
addProperties.atIndex, 0, slideData
);
// Add new slide tab
var $tab = jQuery( jQuery('#tmpl-slide-tab').text() ).appendToWithIndex('#ls-slide-tabs', addProperties.atIndex);
if( hasSlideData && slideData.properties.title ) {
$tab.find('.ls-slide-name input').val( slideData.properties.title );
}
if( hasSlideData && slideData.properties.skip ) {
$tab.addClass('skip');
}
// Name new slide properly
LayerSlider.updateSlidePreviews();
LayerSlider.addSlideSortables();
LS_activeLayerPageIndex = 0;
LS_editorIsDirty = true;
TweenLite.fromTo($tab[0], 0.4, {
scale: 0
},{
scale: 1,
onComplete: function() {
// Show new slide, re-initialize
// interactive features
if( addProperties.selectSlide ) {
$tab.children('.ls-slide-preview').click();
LayerSlider.addLayerSortables();
}
}
});
},
removeSlide: function( el ) {
if( confirm( LS_l10n.SBRemoveSlide ) ) {
// Get tab and menu item index
var $tab = jQuery(el).closest('.ls-slide-tab'),
$newTab = null,
index = $tab.index(),
transitionDuration;
// Open next or prev layer
if( $tab.next('.ls-slide-tab').length > 0 ) {
$newTab = $tab.next();
} else if( $tab.prev().length > 0 ) {
$newTab = $tab.prev();
}
transitionDuration = window.lsSliderData.layers.length-1 < 1 ? 0 : 0.4;
TweenLite.to($tab[0], transitionDuration, {
scale: 0,
ease:Power1.easeIn,
onComplete: function() {
setTimeout( function() {
// Remove tab
$tab.remove();
// Remove tab and slide data
window.lsSliderData.layers.splice( index, 1 );
// Create a new slide if the last one
// was removed
if( window.lsSliderData.layers < 1 ) {
LayerSlider.addSlide();
return true;
}
if( $newTab && LS_activeSlideIndex === index ) {
$newTab.children('.ls-slide-preview').click();
}
}, 30);
}
});
}
},
selectSlide: function(slideIndex, selectProperties) {
// Set selectProperties to an empty object by default
selectProperties = selectProperties || {};
// Bail out early if it's the currently active layer
if( !selectProperties.forceSelect && LS_activeSlideIndex === slideIndex) { return false; }
// Set active slide, highlight new tab
jQuery('#ls-slide-tabs')
.children()
.eq(slideIndex)
.addClass('active')
.siblings()
.removeClass('active');
// Stop live preview
LayerSlider.stopSlidePreview();
LayerSlider.stopLayerPreview();
// Set new slide index & data
LS_activeSlideIndex = slideIndex;
LS_activeSlideData = window.lsSliderData.layers[ slideIndex ];
// Create the 'meta' object if not set
if(!LS_activeSlideData.meta) {
LS_activeSlideData.meta = {};
}
// Make sure to include new slide options in all cases
var defaults = jQuery.extend( true, {}, LS_DataSource.getDefaultSlideData() );
LS_activeSlideData.properties = jQuery.extend( true, defaults, LS_activeSlideData.properties );
// Set active layer index set
LS_activeLayerIndexSet = LS_activeSlideData.meta.activeLayers || [];
LS_lastSelectedLayerIndex = LS_activeLayerIndexSet[0];
// Add static layers
LS_activeStaticLayersDataSet = LayerSlider.staticLayersForSlide( slideIndex );
// Build slide
LS_DataSource.buildSlide();
LayerSlider.generatePreview();
LayerSlider.selectLayer(LS_activeLayerIndexSet);
LayerSlider.updatePreviewSelection();
LS_UndoManager.update();
},
showSlideActions: function( el ) {
var $slide = jQuery( el ).closest('.ls-slide-tab'),
$controls = $slide.children(':not(.ls-slide-preview, .ls-slide-actions-sheet)'),
$sheet = $slide.children('.ls-slide-actions-sheet');
$slide.addClass('slide-actions-opened');
$controls.addClass('ls-hidden');
$sheet.removeClass('ls-hidden');
TweenLite.to($sheet[0], 0.3, {
y: 0
});
},
hideSlideActions: function( ) {
var $slide = jQuery('.ls-slide-tab.slide-actions-opened');
if( $slide.length ) {
var $sheet = $slide.children('.ls-slide-actions-sheet'),
$controls = $slide.children(':not(.ls-slide-preview, .ls-slide-actions-sheet)');
$slide.removeClass('slide-actions-opened');
$controls.removeClass('ls-hidden');
TweenLite.to($sheet[0], 0.3, {
y: -80
});
}
},
renameSlide: function( input ) {
var $input = jQuery(input),
$slide = $input.closest('.ls-slide-tab'),
slideData = window.lsSliderData.layers[ $slide.index() ];
slideData.properties.title = $input.val();
},
duplicateSlide: function( el ) {
// Duplicate slide by using jQuery.extend()
// to make sure it's a copy instead of an
// object reference.
var slideIndex = jQuery( el ).closest('.ls-slide-tab').index(),
slideData = window.lsSliderData.layers[ slideIndex ],
newSlideData = jQuery.extend( true, {}, slideData );
// Assign new UUID
newSlideData.properties.uuid = LS_DataSource.generateUUID();
// Rename slide
if( !! newSlideData.properties.title) {
newSlideData.properties.title += ' copy';
}
LayerSlider.addSlide( newSlideData, {
atIndex: slideIndex + 1
} );
},
toggleSlideVisibility: function( el ) {
var $tab = jQuery( el ).closest( '.ls-slide-tab' ),
slideData = window.lsSliderData.layers[ $tab.index() ];
// Current hidden, show it
if( slideData.properties.skip ) {
slideData.properties.skip = false;
$tab.removeClass('skip');
// Hide it
} else {
slideData.properties.skip = true;
$tab.addClass('skip');
}
},
setCustomSlideProperties: function( event, element ) {
var $tr = jQuery(element).closest('tr'),
$inputs = jQuery('input', $tr );
if( ! $inputs.eq(0).val() && ! $inputs.eq(1).val() ) {
$tr.remove();
}
var properties = LS_activeSlideData.properties.customProperties = {};
jQuery('.ls-custom-slide-properties tr:not(:last-child)').each(function() {
var $key = jQuery('td:first-child input', this),
$val = jQuery('td:last-child input', this),
key = $key.val(),
val = $val.val();
if( key && /^[a-zA-Z]([a-zA-Z0-9_-]+)$/.test( key ) ) {
$key.removeClass('error');
properties[ key ] = val;
} else {
$key.addClass('error');
}
});
},
updateCustomSlideProperties: function( ) {
var slideData = LS_activeSlideData.properties;
slideData.customProperties = slideData.customProperties || {};
var properties = LS_activeSlideData.properties.customProperties || {},
$customProps = jQuery('.ls-custom-slide-properties');
// Sort keys
Object.keys( properties ).sort().forEach( function( key ) {
var value = properties[ key ];
delete properties[ key ];
properties[ key ] = value;
});
// Reset custom properties fields
jQuery('tr:not(:last-child)', $customProps).remove();
// Fill in custom properties
jQuery.each(properties, function(key, val) {
jQuery('tr:last-child input:eq(0)', $customProps).val( key );
jQuery('tr:last-child input:eq(1)', $customProps).val( val ).trigger('keyup');
});
},
toggleAdvancedSlideOptions: function( el ) {
var $el = jQuery(el),
$target = jQuery('.ls-slide-options tr.ls-advanced');
if( $el.hasClass('ls-opened') ) {
$el.removeClass('ls-opened');
$target.addClass('ls-hidden');
} else {
$el.addClass('ls-opened');
$target.removeClass('ls-hidden');
}
},
setPreviewZoom: function( value ) {
LS_previewZoom = value;
jQuery('.ls-editor-slider-val').text(''+Math.round(value * 100)+'%');
jQuery( '.ls-preview-transform' ).css({
transform: 'scale('+value+')'
}).parent().trigger('zoom');
var sliderSize = LayerSlider.getSliderSize();
jQuery( '.ls-preview-size' ).css({
width: sliderSize.width * value,
height: sliderSize.height * value
});
LayerSlider.updatePreviewSelection();
},
addPreviewSlider: function(target, value) {
jQuery(target).slider({
value: value, min: 0.5, max: 1.5, step: 0.01,
range: 'min', orientation: 'horizontal',
slide: function(event, ui) {
// Disable auto-fit when resizing manually
if( jQuery('#zoom-fit').prop('checked') ){
jQuery('#zoom-fit').next().click();
}
LayerSlider.setPreviewZoom(ui.value);
// Restart previews (if any)
if( LayerSlider.isSlidePreviewActive ) {
LayerSlider.stopSlidePreview( );
}
if( LayerSlider.isLayerPreviewActive ) {
LayerSlider.stopLayerPreview( true );
}
},
change: function(event, ui) {
LS_previewZoom = ui.value;
LayerSlider.updatePreviewSelection();
}
});
// Resize preview on page load
if( jQuery('#zoom-fit').prop('checked') ) {
LayerSlider.autoFitPreview(target);
// Slide value on page load
} else if(typeof value != "undefined" && value != 1 ) {
jQuery(target).slider('value', parseInt(value));
LayerSlider.setPreviewZoom(value);
}
jQuery(document).on('click','#zoom-fit',function(){
if( jQuery(this).prop('checked') ){
LayerSlider.autoFitPreview(target, 0.75);
}
});
jQuery(window).resize(function( event ){
if( event.target === window ) {
LayerSlider.autoFitPreview(target);
}
});
jQuery('#collapse-menu').click(function() {
LayerSlider.autoFitPreview(target);
});
},
autoFitPreview: function(target, duration){
if( jQuery('#zoom-fit').prop('checked') ){
var sliderSize = LayerSlider.getSliderSize(),
width = sliderSize.width,
height = sliderSize.height,
// 905(px) is the minimum width to keep the slider settings table organized
smallestRatio = 916 / width > 0.5 ? 916 / width : 0.5,
padding = (document.location.href.indexOf('ls-revisions') !== -1) ? 0 : 32,
ratio = ( jQuery('.wrap').eq(0).outerWidth() - padding ) / width;
if( ratio < smallestRatio ){
ratio = smallestRatio;
} else if( ratio > 1 ){
ratio = 1;
}
jQuery(target).slider('value', ratio );
LayerSlider.setPreviewZoom( ratio );
// jQuery('.ls-editor-slider-val').text(ratio+'%');
// if( duration ){
// TweenLite.to(
// jQuery('#ls-preview-layers')[0],
// duration,
// {
// parseTransform: true,
// scale: ratio/100,
// ease: 'Quint.easeInOut',
// onUpdate: function() {
// jQuery('.ls-preview-td').trigger('zoom');
// LayerSlider.updatePreviewSelection();
// }
// }
// );
// TweenLite.to(
// [LS_previewHolder, LS_previewWrapper],
// duration,
// {
// width: width * ratio / 100,
// height: height * ratio / 100,
// ease: 'Quint.easeInOut'
// }
// );
// }else{
// LayerSlider.setPreviewZoom( ratio );
// }
}
},
addLayer: function(layerDataSet, atIndexSet, addProperties) {
var c, len, selectIndexSet = [], updateInfo = [], emptyData, emptyIndex;
// Set removeProperties to an empty object by default
addProperties = addProperties || { selectLayer: true };
// Get default layer data if not provided
emptyData = !layerDataSet;
layerDataSet = layerDataSet || jQuery.extend(true, {}, LS_DataSource.getDefaultLayerData() );
layerDataSet = jQuery.makeArray( layerDataSet );
c = layerDataSet.length;
// Add layer to the top if
// not specified otherwise.
emptyIndex = ! atIndexSet;
atIndexSet = ! emptyIndex ? atIndexSet : [].fill(0, c);
atIndexSet = jQuery.makeArray( atIndexSet );
// Iterate backwards to keep indexes consistent throughout
// the sequence. Don't use .revert() on data sets reference,
// as it will change the original set as well.
while(c--) {
// Add new layer data to data source
LS_activeSlideData.sublayers.splice(atIndexSet[c], 0, layerDataSet[c]);
// Offsetting indexes to follow data storage
// changes in case of multiple additions.
selectIndexSet.push( atIndexSet[c] + c );
// UndoManager
updateInfo.push({
itemIndex: atIndexSet[c],
selectIndex: selectIndexSet[c],
undo: { data: {} },
redo: { data: layerDataSet[c] }
});
}
// Maintain undoManager
if( ! addProperties.histroyEvent) {
LS_UndoManager.add(
'slide.layers',
updateInfo.length > 1 ? LS_l10n.SBUndoNewLayers : LS_l10n.SBUndoNewLayer,
updateInfo
);
}
// Update layers list and preview
LS_DataSource.buildLayersList();
LayerSlider.generatePreview();
// Select new layers
if( addProperties.selectLayer ) {
if( addProperties.hasOwnProperty('selectPage') ) {
LS_activeLayerPageIndex = addProperties.selectPage;
}
LayerSlider.selectLayer( selectIndexSet );
if( emptyData && updateInfo.length === 1 ) {
jQuery('.ls-sublayers li.active .ls-sublayer-title').focus().select();
}
}
},
addFormattedLayer: function( el, layerProperties ) {
// Hide add layer modal
jQuery('body').off('click.ls-layer-types');
jQuery('.ls-empty-layer-notification').removeClass('ls-hidden');
TweenLite.to( jQuery('.ls-layer-types'), 0.3, {
y: -330,
onComplete: function() {
jQuery('.ls-layer-types-wrapper').hide();
}
});
var layerType = jQuery(el).data('type'),
layerData;
if( layerType === 'import' ) {
LS_ImportLayer.open();
return;
}
// Get default layer data
layerData = jQuery.extend(true, {}, LS_DataSource.getDefaultLayerData() );
// Set layer type
layerData.media = layerType;
// Set font size to 18 pixels for text based layers
if( ['text', 'html', 'post'].indexOf( layerType ) !== -1 ) {
jQuery.extend( layerData.styles, {
'font-size': 18
});
}
switch( layerType ) {
case 'text':
layerData.html = LS_l10n.SBPreviewTextPlaceholder;
break;
case 'html':
layerData.html = LS_l10n.SBPreviewHTMLPlaceholder;
break;
case 'icon':
jQuery.extend( layerData.styles, {
'font-size': 64
});
break;
case 'button':
layerData.html = LS_l10n.SBPreviewButtonPlaceholder;
jQuery.extend( layerData.styles, {
'padding-top': 15,
'padding-right': 60,
'padding-bottom': 15,
'padding-left': 60,
'font-family': 'Arial, sans-serif',
'font-size': 14,
'font-weight': 700,
'background': '#1b9af7',
'color': '#fff',
'border-radius': 50
});
break;
case 'post':
layerData.html = LS_l10n.SBPreviewPostPlaceholder;
break;
}
// Merge provided layer properties (if any)
if( layerProperties ) {
jQuery.extend(true, layerData, layerProperties);
}
// Add formatted layer
LayerSlider.addLayer( layerData, null, {
selectLayer: true,
selectPage: 0
});
// Choose icon after adding
if( layerType === 'icon' ) {
LS_InsertIcons.showIcons();
// Choose icon after adding
} else if( layerType === 'media' ) {
LS_InsertMedia.open();
// Bring up Media Library when adding
// image layer
} else if( layerType === 'img') {
jQuery('.ls-layer-image').click();
}
},
selectLayer: function(layerIndexSet, selectProperties) {
// Bail out early if the current slide has no layers
if( ! LS_activeSlideData.sublayers.length ) {
jQuery('.ls-timeline-switch, .ls-sublayer-nav').hide();
jQuery('.ls-sublayer-pages').empty();
jQuery('.ls-empty-layer-notification').show();
return false;
} else {
jQuery('.ls-timeline-switch, .ls-sublayer-nav').show();
jQuery('.ls-empty-layer-notification').hide();
}
// Bail out early if there's no active layer selection
if( ! layerIndexSet || ! layerIndexSet.length ) { return false; }
// Bail out if the new selection exceeds array range
if( LS_activeSlideData.sublayers.length-1 < Math.max.apply(Math, layerIndexSet) ) {
return;
}
// Bail out early if the current selection is the same
// if( layerIndexSet.length == LS_activeLayerIndexSet.length ) {
// if( layerIndexSet.every(function(v,i) { return v === LS_activeLayerIndexSet[i];}) ) {
// return false;
// }
// }
// Set removeProperties to an empty object by default
selectProperties = selectProperties || {};
// Bail out early if it's already a selected layer
// if( !selectProperties.forceSelect &&
// LS_activeLayerIndexSet.indexOf(layerIndex) !== -1 ) {
// return false;
// }
var $layersList = jQuery('.ls-sublayers li'),
$layerOptions = jQuery('.ls-sublayer-pages-wrapper');
// Stop layer preview session (if any)
LayerSlider.stopLayerPreview();
// Update stored data & preview based on
// the passed selection index set.
LS_activeLayerIndexSet = [];
LS_activeLayerDataSet = [];
$layersList.removeClass('active');
jQuery('#ls-preview-layers > *').removeClass('ui-selected');
jQuery.each(layerIndexSet, function(idx, layerIndex) {
LS_activeLayerIndexSet.push(layerIndex);
LS_activeLayerDataSet.push(
LS_activeSlideData.sublayers[layerIndex]
);
LS_previewItems[layerIndex].addClass('ui-selected');
$layersList.eq(layerIndex).addClass('active');
});
jQuery.each(LS_activeLayerDataSet, function(index, layerData) {
if( ! layerData.meta) {
layerData.meta = {};
}
});
// Show/Hide layer options depending on
// the number of selected layers
if(LS_activeLayerIndexSet.length > 1) {
LayerSlider.startMultipleSelection();
} else {
LayerSlider.stopMultipleSelection();
}
// Build new layer ...
if(LS_activeLayerIndexSet.length === 1) {
LS_DataSource.buildLayer();
LS_lastSelectedLayerIndex = LS_activeLayerIndexSet[0];
}
// Store selection
LS_Utils.removeTextSelection();
LayerSlider.updatePreviewSelection();
LS_activeSlideData.meta.activeLayers = LS_activeLayerIndexSet;
jQuery('.ls-timeline-switch, .ls-sublayer-nav').show();
jQuery('.ls-empty-layer-notification').hide();
// Create layer transition preview animations
layerTransitionPreview.create();
},
startMultipleSelection: function() {
var $layerOptions = jQuery('.ls-sublayer-pages-wrapper'),
$layerNav = jQuery('.ls-sublayer-nav'),
$contentTab = $layerNav.children().eq(0);
// Hide 'Content' and select the 'Transitions'
// layer tab if needed.
$contentTab.hide();
if( $contentTab.hasClass('active') ) {
$contentTab.next().click();
}
jQuery('#ls-layers-settings-popout').addClass('ls-multiple-selection');
// Reset input field
jQuery('input,textarea', $layerOptions).filter('.sublayerprop,.auto').val('');
jQuery('.ls-sublayer-pages .minicolors-swatch-color').css('background', 'transparent');
// Prepend empty option to select fields
jQuery('select:not(.ls-multi-selected)', $layerOptions)
.filter('.sublayerprop,.auto')
.add( jQuery('.ls-slide-link select', $layerOptions) )
.addClass('ls-multi-selected')
.prepend('<option></option>');
// Select the empty option in select fields
jQuery('select', $layerOptions)
.filter('.sublayerprop,.auto')
.add( jQuery('.ls-slide-link select', $layerOptions) )
.children().prop('selected', false)
.eq(0).prop('selected', true);
// Reset checkboxes
jQuery('.ls-checkbox', $layerOptions)
.removeClass('on off')
.addClass('indeterminate');
// Reset transition selection
jQuery('#ls-transition-selector-table .active').removeClass('active');
jQuery('#ls-layer-transitions .ls-h-button .ls-checkbox').removeClass('on');
// Reset links
jQuery('.ls-slide-link input', $layerOptions)
.val('')
.prop('disabled', false)
.closest('.ls-slide-link')
.removeClass('has-link');
// Reset custom attributes field
jQuery('.ls-sublayer-custom-attributes tr:not(:last-child)').remove();
},
stopMultipleSelection: function() {
var $layerOptions = jQuery('.ls-sublayer-pages-wrapper'),
$layerNav = jQuery('.ls-sublayer-nav');
// Show the Content layer tab
$layerNav.children().eq(0).show();
jQuery('#ls-layers-settings-popout').removeClass('ls-multiple-selection');
},
selectLayerPage: function(pageIndex) {
// Select new tab
jQuery('.ls-sublayer-nav a').removeClass('active')
.eq(pageIndex).addClass('active');
// Show the corresponding page
jQuery('#ls-layers .ls-sublayer-page').removeClass('active')
.eq( pageIndex ).addClass('active');
// Store lastly selected layer page
LS_activeLayerPageIndex = pageIndex;
// SET: styles
kmUI.smartResize.set();
},
selectTransitionPage: function( td ) {
var $td = jQuery(td),
index = ($td.index() - 1) / 2,
$target = jQuery('#ls-layer-transitions').children().eq(index);
$target.addClass('active').siblings().removeClass('active');
$td.addClass('selected').siblings().removeClass('selected');
jQuery( '#ls-transition-selector' ).val( index );
LS_activeLayerTransitionTab = index;
$target.removeClass('disabled');
if( ! $target.find('.ls-h-button input').prop('checked') ) {
$target.addClass('disabled');
}
},
enableTransitionPage: function( input ) {
LayerSlider.reorderTransitionProperties(
jQuery( input ).closest('section').index()
);
LayerSlider.checkForOpeningTransition();
},
checkForOpeningTransition: function() {
// Don't show the warning in multi-select
if( LS_activeLayerIndexSet.length === 1 ) {
$table = jQuery('#ls-transition-selector-table');
$transitions = jQuery('.ls-opening-transition.active', $table);
$warning = jQuery('#ls-transition-warning');
$warning[ $transitions.length ? 'removeClass' : 'addClass' ]('visible');
}
},
reorderTransitionProperties: function( sectionIndex ) {
// if( LS_activeLayerIndexSet.length > 1) {
// return;
// }
var media = LS_activeLayerDataSet[0].media || '',
index,
$sections = jQuery('#ls-layer-transitions').children(),
$section,
$input,
$td;
if( typeof sectionIndex !== 'undefined' ) {
$sections = $sections.eq( sectionIndex );
}
$sections.each(function() {
$section = jQuery(this);
index = $section.index();
$input = $section.find('input.toggle').eq(0);
$td = jQuery('#ls-transition-selector-table td:not(.ls-padding)').eq( index );
// Disabled
if( ! $input.prop('checked') ) {
$td.removeClass('active');
$section.addClass('disabled');
$section.find(':input').each(function() {
var $this = jQuery(this),
name = $this.attr('name'),
value = $this.is(':checkbox') ? $this.prop('checked') : $this.val();
if( name && ! $this.is('.toggle') ) {
$this.data('value', value );
delete LS_activeLayerDataSet[0].transition[ name ];
}
});
// Active
} else {
$td.addClass('active');
$section.removeClass('disabled');
$section.find(':input').each(function() {
var $this = jQuery(this),
name = $this.attr('name'),
value = $this.data('value');
if( name && ! $this.is('.toggle') ) {
LS_activeLayerDataSet[0].transition[ name ] = value;
}
});
}
});
},
removeLayer: function(layerIndexSet, removeProperties) {
// Set removeProperties to an empty object by default
removeProperties = removeProperties || { requireConfirmation: true };
// Require confirmation from user
// if it's not a history event.
if( removeProperties.requireConfirmation ) {
if( !confirm( LS_l10n.SBRemoveLayer ) ) {
return false;
}
}
// Get active layers if no index was provided
if( ! layerIndexSet && layerIndexSet !== 0 ) {
layerIndexSet = LS_activeLayerIndexSet;
// Convert a single index to an index set
} else if( typeof layerIndexSet === 'number') {
layerIndexSet = [layerIndexSet];
}
// Get layer(s)
var c = layerIndexSet.length, $layers = jQuery('.ls-sublayers li'),
updateInfo = [], $layer, $newLayer, layerIndex, layerData;
// Iterate backwards to keep indexes consistent throughout the sequence.
// Don't use .revert() on a LS_activeLayerIndexSet reference, as it will
// change the original set as well.
while(c--) {
layerIndex = layerIndexSet[c];
$layer = $layers.eq(layerIndex);
layerData = jQuery.extend(true, {}, LS_activeSlideData.sublayers[layerIndex]);
// Get the next or prev layer
if($layer.next().length > 0) { $newLayer = $layer.next(); }
else if($layer.prev().length > 0) { $newLayer = $layer.prev(); }
// Setup UndoManager updateInfo object
updateInfo.push({
itemIndex: layerIndex,
undo: { data: layerData },
redo: { data: {} }
});
// Remove layer from data source and UI
LS_activeSlideData.sublayers.splice(layerIndex, 1);
$layer.remove();
}
// Empty slide, hide UI items
if( ! LS_activeSlideData.sublayers.length ) {
jQuery('.ls-timeline-switch, .ls-sublayer-nav').hide();
jQuery('.ls-multi-select-notice').hide();
jQuery('.ls-sublayer-pages').empty();
jQuery('.ls-empty-layer-notification').show();
LS_activeLayerIndexSet = [];
// Update UI otherwise
// Select new layer. The .click() event will
// maintain the active layer index and data.
} else if( $newLayer ) {
LayerSlider.selectLayer( [ $newLayer.index() ] );
LayerSlider.reindexLayers();
}
// Update preview
LayerSlider.generatePreview();
LayerSlider.updatePreviewSelection();
// Maintain undoManager only if
// it wasn't a history action
if( !removeProperties.histroyEvent && updateInfo.length) {
LS_UndoManager.add('slide.layers', LS_l10n.SBUndoRemoveLayer, updateInfo);
}
},
hideLayer: function( el ) {
var layerIndexSet = LS_activeLayerIndexSet,
layerDataSet = LS_activeLayerDataSet,
updateInfo = [],
layerData,
$control;
// Get layer data if provided
if( el ) {
layerIndexSet = [ jQuery(el).closest('li').index() ];
layerDataSet = [ LS_activeSlideData.sublayers[ layerIndexSet[0] ] ];
}
jQuery.each( layerIndexSet, function( index, layerIndex ) {
layerData = layerDataSet[ index ];
$control = jQuery('.ls-sublayers .ls-icon-eye').eq(layerIndex);
updateInfo.push({
itemIndex: layerIndex,
undo: { skip: !!layerData.skip },
redo: { skip: !layerData.skip }
});
// Hide/show layer
layerData.skip = !layerData.skip;
if( layerData.skip ) { $control.addClass('disabled'); }
else { $control.removeClass('disabled'); }
// Update preview
LayerSlider.generatePreviewItem( layerIndex );
});
// Maintain history
LS_UndoManager.add('layer.general', LS_l10n.SBUndoHideLayer, updateInfo);
},
lockLayer: function(el) {
var layerIndexSet = LS_activeLayerIndexSet,
layerDataSet = LS_activeLayerDataSet,
updateInfo = [],
layerData,
$previewItem,
$control;
// Get layer data if provided
if( el ) {
layerIndexSet = [ jQuery(el).closest('li').index() ];
layerDataSet = [ LS_activeSlideData.sublayers[ layerIndexSet[0] ] ];
}
jQuery.each( layerIndexSet, function( index, layerIndex ) {
layerData = layerDataSet[ index ];
$previewItem = LayerSlider.previewItemAtIndex( layerIndex );
$control = jQuery('.ls-sublayers .ls-icon-lock').eq(layerIndex);
updateInfo.push({
itemIndex: layerIndex,
undo: { locked: !!layerData.locked },
redo: { locked: !layerData.locked }
});
// Lock layer
layerData.locked = !layerData.locked;
if( layerData.locked ) {
$control.removeClass('disabled');
$previewItem.addClass('disabled');
$lasso.hide();
// Unlock layer
} else {
$control.addClass('disabled');
$previewItem.removeClass('disabled');
}
// Update preview
LayerSlider.generatePreviewItem( layerIndex );
});
// Maintain history
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLockLayer, updateInfo);
},
setLayerMedia: function(mediaType, $mediaEl, layerData) {
switch(mediaType) {
case 'img':
var src = layerData.imageThumb || pluginPath+'admin/img/blank.gif',
classes = layerData.imageThumb ? '' : ' dashicons dashicons-format-image';
$mediaEl.attr('class', 'ls-sublayer-thumb'+classes).html('<img src="'+(layerData.imageThumb || pluginPath+'admin/img/blank.gif')+'">');
break;
case 'html':
$mediaEl.addClass('dashicons dashicons-editor-code');
break;
case 'button':
$mediaEl.addClass('dashicons dashicons-marker');
break;
case 'icon':
$mediaEl.addClass('dashicons dashicons-flag');
break;
case 'media':
$mediaEl.addClass('dashicons dashicons-video-alt3');
break;
case 'post':
$mediaEl.addClass('dashicons dashicons-admin-post');
break;
default:
$mediaEl.addClass('dashicons dashicons-text');
break;
}
},
setLayerAttributes: function( event, element ) {
if( event.type === 'change' && ! jQuery(element).is(':checkbox') ) {
return;
}
var $tr = jQuery(element).closest('tr'),
$inputs = jQuery('input', $tr );
if( ! $inputs.eq(0).val() && ! $inputs.eq(1).val() ) {
$tr.remove();
}
jQuery.each(LS_activeLayerDataSet, function(index, layerData) {
var innerAttrs = layerData.innerAttributes = {},
outerAttrs = layerData.outerAttributes = {};
jQuery('.ls-sublayer-custom-attributes tr:not(:last-child)').each(function() {
var $key = jQuery('td.first input', this),
$val = jQuery('td.second input', this),
$chb = jQuery('td.third input', this),
key = $key.val(),
val = $val.val();
if( key && /^[a-zA-Z]([a-zA-Z0-9_-]+)$/.test( key ) ) {
$key.removeClass('error');
if( $chb.prop('checked') ) {
outerAttrs[ key ] = val;
} else {
innerAttrs[ key ] = val;
}
} else {
$key.addClass('error');
}
});
});
},
updateLayerBackgroundNotification: function() {
var layerBG = LS_activeLayerDataSet[0].layerBackground;
jQuery('#ls-background-notification')[ layerBG ? 'removeClass' : 'addClass' ]('ls-hidden');
},
updateLayerAttributes: function( layerData ) {
// Make sure to have objects for data
layerData.innerAttributes = layerData.innerAttributes || {};
layerData.outerAttributes = layerData.outerAttributes || {};
var customAttrs = jQuery.extend( {}, layerData.innerAttributes, layerData.outerAttributes),
$customAttributes = jQuery('.ls-sublayer-custom-attributes');
// Sort keys
Object.keys(customAttrs).sort().forEach(function(key) {
var value = customAttrs[key];
delete customAttrs[key];
customAttrs[key] = value;
});
jQuery.each(customAttrs, function(key, val) {
jQuery('tr:last-child input:eq(2)', $customAttributes).prop('checked', key in layerData.outerAttributes );
jQuery('tr:last-child input:eq(1)', $customAttributes).val( val );
jQuery('tr:last-child input:eq(0)', $customAttributes).val( key ).trigger('keyup');
});
},
updateLayerBorderPadding: function(el) {
var $input = jQuery(el),
value = parseInt( $input.val() ),
type = ($input.parent().index() === 1) ? 'border' : 'padding',
edge = $input.closest('tr').data('edge');
sel = '.ls-'+type+'-'+edge+'-value';
jQuery(sel).text( value || 'ā' );
},
// Iterate through all slides and their layers to
// find the ones appearing on the target slide.
staticLayersForSlide: function( targetSlideIndex ) {
var staticLayers = [];
jQuery.each(window.lsSliderData.layers, function(slideIndex, slideData) {
jQuery.each(slideData.sublayers, function(layerIndex, layerData) {
if( layerData.transition.static ) {
var staticOut = layerData.transition.static;
if( ( staticOut > targetSlideIndex || staticOut === 'forever' ) && slideIndex < targetSlideIndex ) {
staticLayers.push({
slideIndex: slideIndex,
slideData: slideData,
layerIndex: layerIndex,
layerData: layerData
});
}
}
});
});
return staticLayers;
},
reindexStaticLayers: function() {
jQuery.each(window.lsSliderData.layers, function(slideIndex, slideData) {
jQuery.each(slideData.sublayers, function(layerIndex, layerData) {
if( layerData.transition.staticUUID ) {
var staticOut = LS_DataSource.slideForUUID( layerData.transition.staticUUID );
if( staticOut ) {
layerData.transition.static = staticOut + 1;
}
}
});
});
},
setupStaticLayersChooser: function( select ) {
var $select = jQuery(select);
// Remove previously added options
$select.children('[value="forever"]').nextAll().remove();
// Gather slide data
var sliderData = window.lsSliderData,
slideCount = sliderData.layers ? sliderData.layers.length : 0,
markup = '<option value="-2" disabled>ā</option>',
slideName;
// Generate markup
for( var s = 0; s < slideCount; s++) {
slideName = sliderData.layers[s].properties.title;
slideName = slideName ? ' ('+slideName+')' : '';
markup += '<option value="'+(s+1)+'">'+LS_l10n.SBStaticUntil.replace('%d', (s+1))+' '+slideName+'</option>';
}
// Append select options
$select.append(markup);
var staticVal = parseInt( LS_activeLayerDataSet[0].transition.static );
if( staticVal ) {
$select.children('[value="'+staticVal+'"]').prop('selected', true)
.siblings().prop('selected', false);
}
},
revealStaticLayer: function( el ) {
var $target = jQuery(el).closest('li'),
index = $target.index(),
data = LS_activeStaticLayersDataSet[ index ];
LayerSlider.selectSlide( data.slideIndex );
LayerSlider.selectLayer( [data.layerIndex] );
},
addColorPicker: function(el) {
jQuery(el).minicolors({
opacity: true,
changeDelay: 100,
position: 'bottom right',
change: function(hex, opacity) {
//LayerSlider.willGeneratePreview();
}
}).blur(function( event ) {
event.stopImmediatePropagation();
jQuery(this)
.removeClass('ls-colorpicker')
.trigger('change')
.addClass('ls-colorpicker');
});
},
duplicateLayer: function( ) {
this.pasteLayer( this.copyLayer( false).layers );
},
copyLayer: function(useStorage, layerDataSet, layerIndexSet, copyProperties) {
// Defaults
useStorage = useStorage || true;
layerDataSet = layerDataSet || LS_activeLayerDataSet;
layerIndexSet = layerIndexSet || LS_activeLayerIndexSet;
copyProperties = copyProperties || { shiftLayers: true };
// Iterate over the data set, clone objects and
// make some visual adjustments on items
var clipboardData = [];
jQuery.each(layerDataSet, function(key, item) {
// Copy layer data object
var copy = jQuery.extend(true, {}, item);
copy.subtitle += ' copy';
// Add copy to the new set
clipboardData.push(copy);
});
// Build clipboard data
clipboardData = {
layers: clipboardData,
sliderID: copyProperties.sliderID || LS_sliderID,
slideIndex: copyProperties.slideIndex || LS_activeSlideIndex,
layerIndexSet: layerIndexSet
};
// Save to storage and return copies
useStorage && localStorage.setObject('ls-layer-clipboard', clipboardData);
return clipboardData;
},
pasteLayer: function(layerDataSet, layerIndexSet, pasteProperties) {
// Check for provided data, fetch from clipboard if not
var isDataProvided = layerDataSet ? true : false,
clipboardData = localStorage.getObject('ls-layer-clipboard'),
addIndexSet;
if( ! clipboardData ) {
alert(LS_l10n.SBPasteLayerError);
return;
}
layerDataSet = layerDataSet || clipboardData.layers;
layerIndexSet = layerIndexSet || clipboardData.layerIndexSet;
// Warn users when there's nothing on the clipboard
// and halt execution.
if( ! layerDataSet ) {
alert(LS_l10n.SBPasteLayerError);
return;
}
// Set pasteProperties to an empty object by default
pasteProperties = pasteProperties || {};
// If the layer is from the same slide, then
// find the uppermost selected layer index
// and insert everything into that position.
// Otherwise insert at the beginning of the layers list.
// -
// Trying to insert layers before their parents
// individually is complex, and it will fragment
// dupe selection.
if(clipboardData.sliderID !== LS_sliderID || clipboardData.slideIndex !== LS_activeSlideIndex) {
addIndexSet = [].fill( 0, layerIndexSet.length);
} else {
addIndexSet = [].fill( Math.min.apply(Math, layerIndexSet), layerIndexSet.length);
}
// Generate UUIDs for the new layers
jQuery.each( layerDataSet, function( index, layerData ) {
layerData.uuid = LS_DataSource.generateUUID();
});
// Insert new layers
LayerSlider.addLayer(layerDataSet, addIndexSet, { selectLayer: true } );
// Copy pasted layer to make a new reference
// and update settings like position and name
if( ! isDataProvided) {
this.copyLayer(true, layerDataSet, layerIndexSet, {
sliderID: clipboardData.sliderID,
slideIndex: clipboardData.slideIndex
});
}
},
selectMediaType: function(el, layerIndex) {
// Gather layer data
layerIndex = layerIndex ? layerIndex : LS_activeLayerIndexSet;
layerIndex = (typeof layerIndex === 'object') ? layerIndex[0] : layerIndex;
var layerData = LS_activeSlideData.sublayers[layerIndex],
layer = jQuery(el).closest('.ls-sublayer-page'),
$layerItem = jQuery('.ls-sublayers li').eq(layerIndex),
section = jQuery(el).data('section'),
placeholder = jQuery(el).data('placeholder'),
sections = jQuery('.ls-layer-sections', layer).children();
// Set active class
jQuery(el).addClass('active').siblings().removeClass('active');
// Store selection
if( section ) {
layerData.media = section;
}
// Show the corresponding sections
sections.hide().removeClass('ls-hidden');
jQuery('.ls-sublayer-element', layer).hide().removeClass('ls-hidden');
jQuery('.ls-html-code .ls-options, .ls-html-code .ls-open-media-modal-button, .ls-html-code .ls-button-options, .ls-html-code .ls-icon-options', layer).addClass('ls-hidden');
jQuery('.ls-html-code .ls-insert-icon', layer).removeClass('ls-hidden');
jQuery('.ls-html-code .ls-replace-icon-button', layer).addClass('ls-hidden');
jQuery('.ls-html-code .ls-html-textarea', layer).removeClass('ls-hidden');
switch(section) {
case 'img':
sections.eq(0).show();
var src = layerData.imageThumb || pluginPath+'admin/img/blank.gif',
classes = layerData.imageThumb ? '' : ' dashicons dashicons-format-image';
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb'+classes).html('<img src="'+(layerData.imageThumb || pluginPath+'admin/img/blank.gif')+'">');
break;
case 'text':
sections.eq(1).show();
layer.find('.ls-sublayer-element').show();
jQuery('.ls-html-code textarea').attr('placeholder', placeholder );
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb dashicons dashicons-text').html('');
break;
case 'icon':
sections.eq(1).show();
jQuery('.ls-html-code .ls-options, .ls-html-code .ls-html-textarea', layer).addClass('ls-hidden');
jQuery('.ls-html-code .ls-icon-options', layer).removeClass('ls-hidden');
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb dashicons dashicons-flag').html('');
break;
case 'button':
sections.eq(1).show();
jQuery('.ls-html-code .ls-options, .ls-html-code .ls-open-media-modal-button', layer).addClass('ls-hidden');
jQuery('.ls-html-code .ls-button-options', layer).removeClass('ls-hidden');
jQuery('.ls-html-code .ls-replace-icon-button', layer).removeClass('ls-hidden');
jQuery('.ls-html-code textarea').attr('placeholder', placeholder );
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb dashicons dashicons-marker').html('');
break;
case 'html':
sections.eq(1).show();
jQuery('.ls-html-code .ls-options, .ls-html-code .ls-open-media-modal-button', layer).addClass('ls-hidden');
jQuery('.ls-html-code textarea').attr('placeholder', placeholder );
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb dashicons dashicons-editor-code').html('');
break;
case 'media':
sections.eq(1).show();
jQuery('.ls-html-code .ls-options, .ls-html-code .ls-open-media-modal-button', layer).removeClass('ls-hidden');
jQuery('.ls-html-code .ls-insert-icon', layer).addClass('ls-hidden');
jQuery('.ls-html-code textarea').attr('placeholder', placeholder );
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb dashicons dashicons-video-alt3').html('');
break;
case 'post':
sections.eq(1).show();
sections.eq(2).show();
jQuery('.ls-html-code textarea').attr('placeholder', placeholder );
jQuery('.ls-sublayer-thumb', $layerItem).attr('class', 'ls-sublayer-thumb dashicons dashicons-admin-post').html('');
break;
}
if( section === 'img' || section === 'media' ) {
jQuery('#ls-layer-transitions .ls-text-transition .ls-checkbox.toggle.on').click();
}
jQuery('.ls-sublayer-pages-wrapper').attr('class', 'ls-sublayer-pages-wrapper ls-layer-type-' + layerData.media);
// Remove previous placeholder <li> (if any)
jQuery('.ls-layer-kind ul .placeholder').remove();
// Prepend placeholder <li>
jQuery(el)
.clone()
.removeClass('active')
.addClass('placeholder')
.prependTo('.ls-layer-kind ul');
},
selectElementType: function(el, layerIndex) {
// Layer and properties
layerIndex = layerIndex ? layerIndex : LS_activeLayerIndexSet;
layerIndex = (typeof layerIndex === 'object') ? layerIndex[0] : layerIndex;
var layerData = LS_activeSlideData.sublayers[layerIndex],
layer = jQuery(el).closest('.ls-sublayer-page'),
element = jQuery(el).data('element');
// Set active class
jQuery(el).siblings().removeClass('active');
jQuery(el).addClass('active');
// Store selection
if( element ) {
layerData.type = element;
}
},
copyLayerSettings: function(el) {
var $el = jQuery(el),
$wrapper = $el.closest('[data-storage]'),
storage = $wrapper.attr('data-storage'),
data = { styles: {}, transition: {} };
// Iterate over options, store values
$wrapper.find(':input').each(function() {
if(this.name) {
var $item = jQuery(this),
area = $item.hasClass('sublayerprop') ? 'transition' : 'styles';
data[area][this.name] = $item.is(':checkbox') ? $item.prop('checked') : $item.val();
}
});
// Add data to clipboard
var LS_clipboard = localStorage.getObject('ls-options-clipboard') || {};
LS_clipboard[ storage ] = {
timestamp: Math.floor(Date.now() / 1000),
data: data
};
localStorage.setObject('ls-options-clipboard', LS_clipboard);
// Send feedback to users
$el.css('color', '#fcd116');
setTimeout(function() {
$el.css('color', '#00a0d2');
}, 1000);
},
pasteLayerSettings: function(el) {
var $el = jQuery(el),
$wrapper = $el.closest('[data-storage]'),
storage = $wrapper.attr('data-storage'),
updateInfo = [];
// Don't allow pasting options when the corresponding
// transition sections is disabled
if( $wrapper.closest('#ls-layer-transitions').length ) {
if( ! $wrapper.find('.ls-h-button input').prop('checked') ) {
$wrapper.find('.overlay').click();
return;
}
}
// Get clipboard data
var LS_clipboard = localStorage.getObject('ls-options-clipboard') || {},
clipboard = LS_clipboard[storage],
timestamp = Math.floor(Date.now() / 1000);
// Validate clipboard data
if( ! clipboard || jQuery.isEmptyObject(clipboard.data) || clipboard.timestamp < timestamp - 60 * 60 * 3 ) {
alert(LS_l10n.SBPasteError);
return false;
}
// Iterate over all selected layers
jQuery.each(LS_activeLayerIndexSet, function(index, layerIndex) {
var layerData = LS_activeLayerDataSet[ index ],
undoObj = {},
redoObj = {};
// Iterate over options, set new values
$wrapper.find(':input').each(function() {
if(this.name && this.name != 'top' && this.name != 'left') { // !!! don't paste left & top style
var $this = jQuery(this),
area = $this.hasClass('sublayerprop') ? 'transition' : 'styles',
data = layerData[area];
curVal = layerData[area][this.name],
newVal = clipboard.data[area][this.name];
if( this.name === 'style' ) { curVal = layerData[this.name]; }
if( curVal != newVal ) {
if( ! undoObj[ area ] ) { undoObj[ area ] = {}; }
if( ! redoObj[ area ] ) { redoObj[ area ] = {}; }
undoObj[ area ][ this.name ] = curVal;
redoObj[ area ][ this.name ] = newVal;
}
// Handle custom CSS field separately
if( this.name === 'style' ) { layerData.style = newVal; }
else { data[this.name] = newVal; }
}
});
updateInfo.push({
itemIndex: layerIndex,
undo: undoObj,
redo: redoObj
});
LS_DataSource.buildLayer();
// Update affected layer in preview
// in case of style changes
if( storage === 'ls-styles' ) {
LayerSlider.generatePreviewItem( layerIndex );
}
});
// Add UndoManager action
LS_UndoManager.add('layer.general', LS_l10n.SBUndoPasteSettings, updateInfo);
$el.css('color', '#90ca77');
setTimeout(function() { $el.css('color', '#00a0d2'); }, 1000);
},
updateSlideInterfaceItems: function() {
var slideData = LS_activeSlideData.properties,
imgSrc = slideData.backgroundThumb || slideData.background;
LS_GUI.updateImagePicker( 'background', imgSrc );
LS_GUI.updateLinkPicker('layer_link');
},
updateLayerInterfaceItems: function(layerIndex) {
var $layer = jQuery('.ls-sublayer-pages'),
$layerItem = jQuery('.ls-sublayers li').eq(layerIndex),
layerData = LS_activeSlideData.sublayers[layerIndex];
if( ! layerData ) { return; }
// Image previews
LS_GUI.updateImagePicker( 'image', layerData.imageThumb || layerData.image );
LS_GUI.updateImagePicker( 'poster', layerData.posterThumb || layerData.poster );
LS_GUI.updateImagePicker( 'layerBackground', layerData.layerBackgroundThumb || layerData.layerBackground );
// Linking field
LS_GUI.updateLinkPicker( 'url' );
// Select layer and media type
if(typeof layerData.media == 'undefined') {
switch(layerData.type) {
case 'img': layerData.media = 'img'; break;
case 'div': layerData.media = 'html'; break;
default: layerData.media = 'text';
}
}
LayerSlider.selectMediaType( $layer.find('.ls-layer-kind li[data-section="'+layerData.media+'"]').eq(0), layerIndex );
LayerSlider.selectElementType( $layer.find('.ls-sublayer-element > li[data-element="'+layerData.type+'"]'), layerIndex );
// Skip
if(layerData.skip) { jQuery('.ls-icon-eye', $layerItem).addClass('disabled'); }
else { jQuery('.ls-icon-eye', $layerItem).removeClass('disabled'); }
if(layerData.locked) { jQuery('.ls-icon-lock', $layerItem).removeClass('disabled'); }
else { jQuery('.ls-icon-lock', $layerItem).addClass('disabled'); }
},
changeLayerScreenType: function( $button, updateLayer ) {
jQuery('.ls-set-screen-types button').each(function() {
var layerData = LS_activeLayerDataSet[0],
$item = jQuery(this),
type = $item.data('type');
if( $button && $button.is( $item ) ) {
layerData['hide_on_'+type] = ! layerData['hide_on_'+type];
}
$item[ layerData['hide_on_'+type] ? 'removeClass' : 'addClass' ]('playing');
});
if( updateLayer ) {
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
setTimeout(function() {
LS_DataSource.buildLayersListItem( LS_activeLayerIndexSet[0] );
}, 200);
}
},
changeVideoType: function( event ) {
var $input = jQuery('.ls-sublayer-basic input.bgvideo'),
$options = jQuery('.ls-sublayer-basic .ls-media-options');
$notification = jQuery('.ls-sublayer-basic .ls-bgvideo-options');
if( $input.prop('checked') ) {
$options.find('td').hide().filter('.volume,.overlay, .muted,.loop').show();
$notification.show();
} else {
$options.find('td').show().filter('.overlay').hide();
$notification.hide();
}
if( event && event.type === 'change' ) {
LS_activeLayerDataSet[0].locked = $input.prop('checked') ? true : false;
LS_DataSource.buildLayersListItem( LS_activeLayerIndexSet[0] );
}
},
validateCustomCSS: function( $textarea ) {
var keys = ['mix-blend-mode', 'filter'];
for(var c = 0; c < keys.length; c++) {
if( $textarea.val().indexOf(keys[c]) !== -1 ) {
$textarea.val( $textarea.val().replace( new RegExp(keys[c], 'gi'), '') );
TweenMax.to( jQuery('.ls-sublayer-style :input[name="'+keys[c]+'"]')[0], 0.15, {
yoyo: true,
repeat: 3,
ease: Quad.easeInOut,
scale: 1.2,
backgroundColor: 'rgba(255, 0, 0, 0.2)'
});
}
}
},
willGeneratePreview: function() {
clearTimeout(LayerSlider.timeout);
LayerSlider.timeout = setTimeout(function() {
LayerSlider.generatePreview();
}, 1000);
},
generatePreview: function() {
// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
// READ-ONLY BLOCK
//
// Group DOM read/access operations together,
// so the browser can cache and apply them in a
// in a single pass, triggering only one reflow.
// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
// Slider data sets
var sliderProps = window.lsSliderData.properties,
sliderSize = LayerSlider.getSliderSize(),
slideIndex = LS_activeSlideIndex,
slideData = LS_activeSlideData,
slideProps = slideData.properties,
layers = slideData.sublayers,
$settings = jQuery('.ls-settings'),
// Preview data
width = sliderSize.width,
height = sliderSize.height,
bgColor = sliderProps.backgroundcolor,
bgImage = sliderProps.backgroundimage,
yourLogo = sliderProps.yourlogo,
yourLogoStyle = sliderProps.yourlogostyle,
posts = window.lsPostsJSON || [],
postOffset = slideProps.post_offset,
slideBG = slideProps.background,
slideBGSize = slideProps.bgsize,
slideBGPos = slideProps.bgposition,
post;
// --- Adjust default values ---
height = (height.indexOf('%') !== -1) ? 400 : parseInt(height);
postOffset = (postOffset == -1) ? slideIndex : postOffset;
post = posts[ postOffset ] || {};
// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
// WRITE-ONLY BLOCK
//
// Use only DOM write operations after this comment,
// so the browser can cache and apply them in a
// in a single pass, triggering only one reflow.
// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
// --- Set preview canvas size ---
LS_previewArea.css({
width : width,
height : height
}).empty();
jQuery('.ls-preview-size').css({
width : width * LS_previewZoom,
height : height * LS_previewZoom
});
// Make sure to follow preview area size changes
jQuery('.ls-ruler').trigger('resize');
LayerSlider.autoFitPreview();
// --- Set global background ---
LS_previewHolder.css({
backgroundColor : bgColor || 'transparent',
backgroundImage : bgImage ? 'url('+bgImage+')' : 'none',
backgroundRepeat: sliderProps.globalBGRepeat,
backgroundAttachment: sliderProps.globalBGAttachment,
backgroundPosition: sliderProps.globalBGPosition,
backgroundSize: sliderProps.globalBGSize
});
// Empty preview items list, so we don't include beyond
// array bounds objects from previous slide in case of
// slide change.
LS_previewItems = [];
// Handle post content
if(slideBG == '[image-url]') {
slideBG = post['image-url'];
LS_GUI.updateImagePicker( 'background', post['image-url'], { fromPost: true });
}
// -- Set slide background && empty previous content ---
if( ! slideBGSize || slideBGSize === 'inherit') {
slideBGSize = sliderProps.slideBGSize;
}
if( ! slideBGPos || slideBGPos === 'inherit') {
slideBGPos = sliderProps.slideBGPosition;
}
LS_previewArea.css({
backgroundImage: slideBG ? 'url('+slideBG+')' : 'none',
backgroundSize: slideBGSize || 'auto',
backgroundPosition: slideBGPos || 'center center',
backgroundColor: slideProps.bgcolor || 'transparent',
backgroundRepeat: 'no-repeat'
});
if( sliderProps.sliderclass ) {
LS_previewArea.addClass( sliderProps.sliderclass );
}
// -- Set background on slide tab
slideBG = slideBG || pluginPath+'admin/img/blank.gif';
jQuery('#ls-slide-tabs')
.find('.ls-slide-tab:eq('+slideIndex+') .ls-slide-preview')
.css('background-image', slideBG);
// --- Setup yourLogo ---
LS_previewHolder.parent().find('.yourlogo').remove();
if( yourLogo ) {
var logo = jQuery('<img src="'+yourLogo+'" class="yourlogo">').prependTo( LS_previewHolder );
logo.attr('style', yourLogoStyle);
var oL, oR, oT, oB,
logoLeft, logoRight, logoTop, logoBottom;
oL = oR = oT = oB = 'auto';
if( logo.css('left') != 'auto' ){
logoLeft = logo[0].style.left;
}
if( logo.css('right') != 'auto' ){
logoRight = logo[0].style.right;
}
if( logo.css('top') != 'auto' ){
logoTop = logo[0].style.top;
}
if( logo.css('bottom') != 'auto' ){
logoBottom = logo[0].style.bottom;
}
if( logoLeft && logoLeft.indexOf('%') != -1 ){
oL = width / 100 * parseInt( logoLeft ) - logo.width() / 2;
}else{
oL = parseInt( logoLeft );
}
if( logoRight && logoRight.indexOf('%') != -1 ){
oR = width / 100 * parseInt( logoRight ) - logo.width() / 2;
}else{
oR = parseInt( logoRight );
}
if( logoTop && logoTop.indexOf('%') != -1 ){
oT = height / 100 * parseInt( logoTop ) - logo.height() / 2;
}else{
oT = parseInt( logoTop );
}
if( logoBottom && logoBottom.indexOf('%') != -1 ){
oB = height / 100 * parseInt( logoBottom ) - logo.height() / 2;
}else{
oB = parseInt( logoBottom );
}
logo.css({
left : oL,
right : oR,
top : oT,
bottom : oB
});
}
// --- Setup layers ---
for(var c = 0, len = layers.length; c < len; c++) {
LayerSlider.generatePreviewItem( c, post);
}
// --- Setup static layers ---
LayerSlider.generateStaticPreview();
},
generateStaticPreview: function() {
LS_previewArea.children('.ls-static-layer').remove();
jQuery.each(LS_activeStaticLayersDataSet, function(idx, data) {
LayerSlider.generatePreviewItem( idx, false, {
$targetArea: LS_previewArea,
$layerItem: LS_previewArea.children('.ls-static-layer').eq(idx),
layerData: data.layerData,
isStatic: true
});
});
},
willGeneratePreviewItem: function(layerIndex) {
clearTimeout(LayerSlider.timeout);
LayerSlider.timeout = setTimeout(function() {
LayerSlider.generatePreviewItem(layerIndex);
}, 200);
},
generateSelectedPreviewItems: function() {
jQuery.each(LS_activeLayerIndexSet, function(index, layerIndex) {
LayerSlider.generatePreviewItem( layerIndex );
});
},
generatePreviewItem: function(layerIndex, post, generateProperties) {
if( jQuery.type( layerIndex ) === 'array' ) {
layerIndex = layerIndex[0];
}
generateProperties = generateProperties || {};
generateProperties = jQuery.extend({}, {
$targetArea: LS_previewArea,
$layerItem: LS_previewItems[layerIndex],
layerData: LS_activeSlideData.sublayers[layerIndex],
isStatic: false
}, generateProperties);
// Don't update the editor while live previews are active
if( LayerSlider.isLayerPreviewActive ) { return false; }
// Remove affected item to replace with an updated one
if( generateProperties.$layerItem ) {
generateProperties.$layerItem.remove();
}
// Get layer data sets
var layerData = generateProperties.layerData,
layerCount = LS_activeSlideData.sublayers ? LS_activeSlideData.sublayers.length : 0,
// Get layer attributes
item,
type = layerData.type,
html = layerData.html,
id = layerData.id,
// Get style settings
top = layerData.styles.top,
left = layerData.styles.left,
innerAttrs = layerData.innerAttributes || {},
outerAttrs = layerData.outerAttributes || {};
if( generateProperties.isStatic ) {
layerIndex = layerCount + layerIndex;
}
switch( layerData.media ) {
case 'img':
type = 'img';
break;
case 'button':
case 'icon':
type = 'span';
break;
case 'media':
case 'html':
type = 'div';
break;
case 'post':
type = 'post';
break;
}
// Get post content if not passed
if( ! post ) {
var posts = window.lsPostsJSON || [],
postOffset = LS_activeSlideData.properties.post_offset;
if( postOffset == -1 ) {
postOffset = LS_activeSlideIndex;
}
post = posts[postOffset] || {};
}
// Hidden layer
if(layerData.skip || layerData['hide_on_'+LS_activeScreenType] ) {
item = jQuery('<div class="ls-l">').appendToWithIndex(generateProperties.$targetArea, layerIndex).hide();
if( ! generateProperties.isStatic ) {
LS_previewItems[layerIndex] = item;
}
return true;
}
// Append element
if(type == 'img') {
var url = layerData.image;
if(url == '[image-url]') {
url = post['image-url'] || '';
LS_GUI.updateImagePicker( 'image', post['image-url'], { fromPost: true } );
}
var tmpContent = url ? '<img src="'+url+'">' : '<div class="ls-layer-placeholder ls-image-placeholder"><span class="dashicons dashicons-format-image"></span><span>'+LS_l10n.SBPreviewImagePlaceholder+'</span></div>';
item = jQuery(tmpContent).hide().appendToWithIndex(generateProperties.$targetArea, layerIndex);
} else if(type == 'post') {
var textlength = layerData.post_text_length;
for(var key in post) {
if(html && html.indexOf('['+key+']') !== -1) {
var postVal = post[key];
if( (key == 'title' || key == 'content' || key == 'excerpt') && textlength > 0) {
postVal = LS_Utils.stripTags(postVal).substr(0, textlength);
postVal = LS_Utils.nl2br(postVal);
}
html = html.replace('['+key+']', postVal);
}
}
// Test for html wrapper
html = jQuery.trim(html);
var first = html.substr(0, 1),
last = html.substr(html.length-1, 1);
if(first == '<' && last == '>') {
html = html.replace(/(\r\n|\n|\r)/gm,"");
item = jQuery(html).appendToWithIndex(generateProperties.$targetArea, layerIndex);
} else {
item = jQuery('<div>').html(html).appendToWithIndex(generateProperties.$targetArea, layerIndex);
}
} else {
// Empty media placeholder layer
if( layerData.media === 'media' && ! html ) {
item = jQuery('<div class="ls-layer-placeholder ls-media-placeholder"><span class="dashicons dashicons-video-alt3"></span><span>'+LS_l10n.SBPreviewMediaPlaceholder+'</span></div>').appendToWithIndex(generateProperties.$targetArea, layerIndex);
// Empty icon placeholder layer
} else if( layerData.media === 'icon' && ! html ) {
item = jQuery('<div class="ls-layer-placeholder ls-icon-placeholder"><span class="dashicons dashicons-flag"></span><span>'+LS_l10n.SBPreviewIconPlaceholder+'</span></div>').appendToWithIndex(generateProperties.$targetArea, layerIndex);
} else {
item = jQuery('<'+type+'>').appendToWithIndex(generateProperties.$targetArea, layerIndex);
if(html !== '') { item.html(html); }
}
}
// Transition properties
var transforms = {}, trKey, trVal, defVal;
for( trKey in layerData.transition) {
if( LS_transformStyles.indexOf( trKey ) !== -1) {
trVal = layerData.transition[trKey];
if( ! trVal && trVal !== 0 ) { continue; }
trVal = trVal.toString();
defVal = ( trKey.indexOf('scale') !== -1 ) ? 1 : 0;
if( parseInt(trVal) !== defVal ) {
transforms[ trKey ] = parseFloat( trVal );
}
}
}
// Styles
var styles = { 'z-index': (100 + layerCount) - layerIndex };
for(var sKey in layerData.styles) {
var cssVal = layerData.styles[sKey];
if( ( ! cssVal && cssVal !== 0 ) || cssVal === 'unset' ) { continue; }
cssVal = cssVal.toString();
if( cssVal.slice(-1) == ';' ) { cssVal = cssVal.substring(0, cssVal.length - 1); }
styles[sKey] = isNumber(cssVal) ? cssVal + 'px' : cssVal;
if( ['z-index', 'font-weight', 'opacity'].indexOf( sKey ) !== -1 ) {
styles[sKey] = cssVal;
}
}
// Background
if( layerData.layerBackground ) {
if( layerData.layerBackground === '[image-url]') {
LS_GUI.updateImagePicker( 'layerBackground', post['image-url'], { fromPost: true } );
styles['background-image'] = 'url("'+post['image-url']+'")';
} else {
styles['background-image'] = 'url("'+layerData.layerBackground+'")';
}
}
// Locked layer
layerData.hasTransforms = ! jQuery.isEmptyObject( transforms );
// Apply style settings and attributes
item.attr( jQuery.extend({}, innerAttrs, outerAttrs) ).attr({
id: id,
style: layerData.style,
}).css(styles).css({
whiteSpace: !layerData.styles.wordwrap ? 'nowrap' : 'normal',
}).addClass(layerData['class']);
// Restore selection
if( ! generateProperties.isStatic ) {
LS_previewItems[layerIndex] = item;
if(LS_activeLayerIndexSet.indexOf(layerIndex) !== -1) {
item.addClass('ui-selected');
} else {
item.removeClass('ui-selected');
}
}
// Add ls-l or static layer classes
item.addClass( generateProperties.isStatic ? 'disabled ls-static-layer' : 'ls-l' );
if( layerData.locked ) { item.addClass('disabled'); }
if( layerData.hasTransforms ) { item.addClass('transformed'); }
if( document.location.href.indexOf('ls-revisions') !== -1 ) {
item.addClass('disabled');
}
// Iframes &Ā media embeds
var $iframe = item.children('iframe,video').eq(0);
if( $iframe.length ) {
if( layerData.transition.backgroundvideo ) {
item.addClass('disabled bgvideo').css({
pointerEvents: 'none'
}).children('video').prop('controls', false);
if( layerData.transition.overlay ) {
if( layerData.transition.overlayer !== 'disabled' ) {
jQuery('<div>', {
'class': 'video-overlay',
'style': 'background-image: url('+layerData.transition.overlay+')'
}).appendTo( item );
}
}
// Exit script
LayerSlider.updatePreviewSelection();
return;
} else {
var width = parseInt( $iframe.attr('width') ) || $iframe.width(),
height = parseInt( $iframe.attr('height') ) || $iframe.height();
if( ! layerData.styles.width ) {
item.width( width );
}
if( ! layerData.styles.height ) {
item.height( height );
}
}
}
// Make sure to override controls for media elements if set by media settings.
if( layerData.media === 'media' && item.children('audio,video').length ) {
if( layerData.transition.controls === 'enabled' ) {
item.children('audio,video').prop('controls', true);
} else if( layerData.transition.controls === 'disabled' ) {
item.children('audio,video').prop('controls', false);
}
}
if( item.is('img') ) {
item.on( 'load', function(){
LayerSlider.setPositions(item, top, left);
LayerSlider.updatePreviewSelection();
clearTimeout(LayerSlider.selectableTimeout);
LayerSlider.selectableTimeout = setTimeout(function() {
LayerSlider.updatePreviewSelection();
}, 100);
}).attr('src',item.attr('src') );
}else{
LayerSlider.setPositions(item, top, left);
LayerSlider.updatePreviewSelection();
}
// DO TRANSFORMS
transforms.transformPerspective = 500;
transforms.transformOrigin = layerData.transition.transformoriginin || '50% 50% 0';
if( transforms.transformOrigin.indexOf( 'slider') !== -1 ){
var sliderSize = LayerSlider.getSliderSize(),
sliderWidth = sliderSize.width,
sliderHeight = sliderSize.height,
itemLeft = parseFloat( item[0].style.left ),
itemTop = parseFloat( item[0].style.top ),
itemWidth = item.outerWidth(),
itemHeight = item.outerHeight();
transforms.transformOrigin = transforms.transformOrigin
.replace( 'sliderleft', -itemLeft + 'px' )
.replace( 'sliderright', sliderWidth - itemLeft + 'px' )
.replace( 'slidercenter', sliderWidth / 2 - itemLeft + 'px' )
.replace( 'slidermiddle', sliderHeight / 2 - itemTop + 'px' )
.replace( 'slidertop', -itemTop + 'px' )
.replace( 'sliderbottom', sliderHeight - itemTop + 'px' );
}
TweenMax.set( item[0], transforms );
// Add draggable
LayerSlider.addDraggable();
},
setPositions: function(item, top, left, returnOnly) {
item.show();
var cssTop = top ? parseInt(top) : 0,
cssLeft = left ? parseInt(left) : 0,
style = item[0].style,
marginLeft = parseInt( style.marginLeft ) || 0,
marginTop = parseInt( style.marginTop ) || 0;
// Position the element
if( top && top.indexOf('%') !== -1 ) {
if( cssTop === 0 ) {
cssTop = 0 + marginTop;
} else if( cssTop === 100 ) {
cssTop = LS_previewArea.height() - item.outerHeight() + marginTop;
} else {
cssTop = LS_previewArea.height() / 100 * cssTop - item.outerHeight() / 2 + marginTop;
}
} else if( LS_activeLayerIndexSet.length === 1 ) {
cssLeft += marginLeft;
}
if( left && left.indexOf('%') !== -1 ) {
if( cssLeft === 0 ) {
cssLeft = 0 + marginLeft;
} else if( cssLeft === 100 ) {
cssLeft = LS_previewArea.width() - item.outerWidth() + marginLeft;
} else {
cssLeft = LS_previewArea.width() / 100 * cssLeft - item.outerWidth() / 2 + marginLeft;
}
} else if( LS_activeLayerIndexSet.length === 1 ) {
cssTop += marginTop;
}
if( returnOnly ) {
return {
top: cssTop,
left: cssLeft
};
}
item.css({ top: cssTop, left: cssLeft });
},
previewItemAtIndex: function(index) {
return LS_previewArea.children('.ls-l').eq(index);
},
updatePreviewSelection: function() {
// Hide lasso and stop execution
// if there's no selected layers
if( ! LS_activeLayerIndexSet.length ||
! LS_activeSlideData.sublayers.length ||
jQuery('.ls-editing').length) {
$lasso.hide();
return;
}
if( LS_activeLayerIndexSet.length === 1 ) {
var layerData = LS_activeLayerDataSet[0];
if ( layerData && ( layerData.hasTransforms || layerData.locked ) ) {
$lasso.hide();
return;
}
}
var a = { left: Infinity, top: Infinity },
b = { left: -Infinity, top: -Infinity };
jQuery.each(LS_activeLayerIndexSet, function(idx, layerIndex) {
var $item = LS_previewItems[layerIndex];
if($item) {
var p = $item.position(),
q = {
top: p.top + $item.outerHeight() * LS_previewZoom,
left: p.left + $item.outerWidth() * LS_previewZoom
};
if( p.left < a.left ){ a.left = p.left; }
if( p.top < a.top ){ a.top = p.top; }
if( q.left > b.left ){ b.left = q.left; }
if( q.top > b.top ){ b.top = q.top; }
}
});
a.width = b.left - a.left;
a.height = b.top - a.top;
$lasso.css(a).show();
if( ! $lasso.hasClass('ls-resizable-disabled') ) {
$lasso.removeClass('ui-resizable-disabled').css(a).show();
}
if( LS_activeLayerIndexSet.length === 1 ) {
var layerIndex = LS_activeLayerIndexSet[0];
if( LS_previewItems[layerIndex] ) {
if( LS_previewItems[layerIndex].hasClass('ls-layer-placeholder') ) {
$lasso.addClass('ui-resizable-disabled');
}
}
}
// Mark the position of 0x0 px selection
if( ! a.width || ! a.height ) {
$lasso.addClass('ui-resizable-disabled');
}
},
hidePreviewSelection: function() {
jQuery('.ls-preview-wrapper').addClass('hide-selection');
},
showPreviewSelection: function() {
jQuery('.ls-preview-wrapper').removeClass('hide-selection');
},
openMediaLibrary: function() {
jQuery(document).on('click', '.ls-upload', function(e) {
e.preventDefault();
uploadInput = this;
// Get library type
var type = jQuery(this).hasClass('ls-insert-media') ? ['video', 'audio'] : ['image'];
var multiple = jQuery(this).hasClass('ls-bulk-upload');
// Media Library params
var frame = wp.media({
title : 'image' === type[0] ? LS_l10n.SBMediaLibraryImage : LS_l10n.SBMediaLibraryMedia,
multiple : multiple,
library : { type: type },
button : { text: 'Insert' }
});
// Runs on select
frame.on('select',function() {
// Get attachment(s) data
var attachment = frame.state().get('selection').first().toJSON(),
attachments = frame.state().get('selection').toJSON(),
updateInfo = [],
previewImg, newLayerData;
// Slide image upload
// -------------------------------------
if(jQuery(uploadInput).hasClass('ls-slide-image') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Add action to UndoManager
LS_UndoManager.add('slide.general', LS_l10n.SBUndoSlideImage, {
itemIndex: LS_activeSlideIndex,
undo: {
background: LS_activeSlideData.properties.background,
backgroundId: LS_activeSlideData.properties.backgroundId,
backgroundThumb: LS_activeSlideData.properties.backgroundThumb
},
redo: {
background: attachment.url,
backgroundId: attachment.id,
backgroundThumb: previewImg
}
});
// Set current layer image
LS_activeSlideData.properties.background = attachment.url;
LS_activeSlideData.properties.backgroundId = attachment.id;
LS_activeSlideData.properties.backgroundThumb = previewImg;
// Set other images
for(c = 1; c < attachments.length; c++) {
// Get preview image url
previewImg = !typeof attachments[c].sizes.medium ? attachments[c].sizes.medium.url : attachments[c].sizes.full.url;
// Build new slide
var newSlideData = jQuery.extend(true, {}, LS_DataSource.getDefaultSlideData());
newSlideData.background = attachments[c].url;
newSlideData.backgroundId = attachments[c].id;
newSlideData.backgroundThumb = previewImg;
newSlideData = {
properties: newSlideData,
sublayers: []
};
LayerSlider.addSlide( newSlideData, {
selectSlide: false,
atIndex: LS_activeSlideIndex + c
} );
}
LayerSlider.updateSlidePreviews();
// Slide thumbnail upload
// -------------------------------------
} else if(jQuery(uploadInput).hasClass('ls-slide-thumbnail') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Set current layer image
LS_activeSlideData.properties.thumbnail = attachment.url;
LS_activeSlideData.properties.thumbnailId = attachment.id;
LS_activeSlideData.properties.thumbnailThumb = previewImg;
LayerSlider.updateSlidePreviews();
// Layer image upload
// -------------------------------------
} else if(jQuery(uploadInput).hasClass('ls-layer-image') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.thumbnail ? attachment.sizes.thumbnail.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Add action to UndoManager
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayerImage, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
image: LS_activeLayerDataSet[0].image,
imageId: LS_activeLayerDataSet[0].imageId,
imageThumb: LS_activeLayerDataSet[0].imageThumb
},
redo: {
image: attachment.url,
imageId: attachment.id,
imageThumb: previewImg
}
});
// Set current layer image
LS_activeLayerDataSet[0].image = attachment.url;
LS_activeLayerDataSet[0].imageId = attachment.id;
LS_activeLayerDataSet[0].imageThumb = previewImg;
// Set other images
for(c = 1; c < attachments.length; c++) {
// Get preview image url
previewImg = !typeof attachments[c].sizes.thumbnail ? attachments[c].sizes.thumbnail.url : attachments[c].sizes.full.url;
// Build new layer
newLayerData = jQuery.extend(true, {}, LS_DataSource.getDefaultLayerData());
newLayerData.image = attachments[c].url;
newLayerData.imageId = attachments[c].id;
newLayerData.imageThumb = previewImg;
newLayerData.styles.top = (10*c)+'px';
newLayerData.styles.left = (10*c)+'px';
// Add new layer
LS_activeSlideData.sublayers.unshift(newLayerData);
updateInfo.push({
itemIndex: 0,
undo: { data: {} },
redo: { data: newLayerData }
});
}
// Rebuild layers list
LS_DataSource.buildLayersList();
// Maintain UndoManager
if(updateInfo.length) {
LS_UndoManager.add('slide.layers', LS_l10n.SBUndoNewLayers, updateInfo);
}
// Media (video/audio) image upload
// -------------------------------------
} else if( jQuery(uploadInput).hasClass('ls-media-image') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Add action to UndoManager
LS_UndoManager.add('layer.general', LS_l10n.SBUndoVideoPoster, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
poster: LS_activeLayerDataSet[0].poster,
posterId: LS_activeLayerDataSet[0].posterId,
posterThumb: LS_activeLayerDataSet[0].posterThumb
},
redo: {
poster: attachment.url,
posterId: attachment.id,
posterThumb: previewImg
}
});
// Set current layer poster
LS_activeLayerDataSet[0].poster = attachment.url;
LS_activeLayerDataSet[0].posterId = attachment.id;
LS_activeLayerDataSet[0].posterThumb = previewImg;
// Layer background upload
// -------------------------------------
} else if( jQuery(uploadInput).hasClass('ls-layer-background-image') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Add action to UndoManager
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayerBackground, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
poster: LS_activeLayerDataSet[0].layerBackground,
layerBackgroundId: LS_activeLayerDataSet[0].layerBackgroundId,
layerBackgroundThumb: LS_activeLayerDataSet[0].layerBackgroundThumb
},
redo: {
layerBackground: attachment.url,
layerBackgroundId: attachment.id,
layerBackgroundThumb: previewImg
}
});
// Set current layer background
LS_activeLayerDataSet[0].layerBackground = attachment.url;
LS_activeLayerDataSet[0].layerBackgroundId = attachment.id;
LS_activeLayerDataSet[0].layerBackgroundThumb = previewImg;
LayerSlider.updateLayerBackgroundNotification();
// Global slider background
// -------------------------------------
} else if( jQuery(uploadInput).hasClass('ls-global-background') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Store changes and update the preview
window.lsSliderData.properties.backgroundimage = attachment.url;
window.lsSliderData.properties.backgroundimageId = attachment.id;
// YourLogo
// -------------------------------------
} else if( jQuery(uploadInput).hasClass('ls-yourlogo-upload') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Store changes and update the preview
window.lsSliderData.properties.yourlogo = attachment.url;
window.lsSliderData.properties.yourlogoId = attachment.id;
// Slider Preview
// -------------------------------------
} else if( jQuery(uploadInput).hasClass('ls-slider-preview') ) {
// Set image chooser preview
previewImg = !typeof attachment.sizes.medium ? attachment.sizes.medium.url : attachment.sizes.full.url;
LS_GUI.updateImagePicker( jQuery(uploadInput), previewImg);
// Make sure that the meta object exits
if( ! window.lsSliderData.meta ) {
window.lsSliderData.meta = {};
}
// Store changes and update the preview
window.lsSliderData.meta.preview = attachment.url;
window.lsSliderData.meta.previewId = attachment.id;
// Multimedia HTML
} else if( jQuery(uploadInput).hasClass('ls-insert-media')) {
var hasVideo = false,
hasAudio = false,
videos = [],
audios = [],
url = '',
mediaHTML = '';
// Iterate over selected items
for(c = 0; c < attachments.length; c++) {
url = '/' + attachments[c].url.split('/').slice(3).join('/');
if(attachments[c].type === 'video') {
hasVideo = true;
videos.push({ url: url, mime: attachments[c].mime });
} else if(attachments[c].type === 'audio') {
hasAudio = true;
audios.push({ url: url, mime: attachments[c].mime });
}
}
// Insert multimedia
if(hasVideo) {
mediaHTML += '<video width="640" height="360" preload="metadata" controls>\r\n';
for(c = 0; c < videos.length; c++) {
mediaHTML += '\t<source src="'+videos[c].url+'" type="'+videos[c].mime+'">\r\n';
}
mediaHTML += '</video>';
}
if(hasAudio) {
if(hasVideo) { mediaHTML += '\r\n\r\n'; }
mediaHTML += '<audio preload="metadata" nocontrols>\r\n';
for(c = 0; c < audios.length; c++) {
mediaHTML += '\t<source src="'+audios[c].url+'" type="'+audios[c].mime+'">\r\n';
}
mediaHTML += '</audio>';
}
// Set up undoManager action
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayer, {
itemIndex: LS_activeLayerIndexSet[0],
undo: { html: jQuery('.ls-html-textarea textarea').val() },
redo: { html: mediaHTML }
});
// Save new value to DataStore
LS_activeLayerDataSet[0].html = mediaHTML;
jQuery('.ls-html-textarea textarea').val(mediaHTML);
// Image with input field
} else {
jQuery(uploadInput).val( attachment.url );
if(jQuery(uploadInput).is('input[name="image"]')) {
jQuery(uploadInput).prev().attr('src', attachment.url);
}
}
// Generate preview
LayerSlider.generatePreview();
});
// Open ML
frame.open();
});
},
loadImageEditor: function() {
},
openImageEditor: function( imageURL ) {
// Editor is ready, just open the image
if( window.pixieEditor ) {
pixieEditor.resetAndOpenEditor('image', imageURL );
// Editor needs to be loaded first
} else {
jQuery('<pixie-editor></pixie-editor>').prependTo('body');
jQuery('<link>').appendTo('head').attr({
type: 'text/css',
rel: 'stylesheet',
href: pixieCSSFile
});
jQuery.getScript( pixieJSFile ).done( function() {
window.pixieEditor = new Pixie({
crossOrigin: true,
urls: {
assets: pluginPath+'pixie/'
},
tools: {
stickers: {
replaceDefault: true,
items: []
}
},
ui: {
mode: 'overlay',
theme: 'dark',
openImageDialog: false,
toolbar: {
hideOpenButton: true
},
nav: {
position: 'top',
replaceDefault: true,
items: [
{name: 'filter', icon: 'filter-custom', action: 'filter'},
{type: 'separator'},
{name: 'resize', icon: 'resize-custom', action: 'resize'},
{name: 'crop', icon: 'crop-custom', action: 'crop'},
{name: 'transform', icon: 'transform-custom', action: 'rotate'},
{type: 'separator'},
{name: 'draw', icon: 'pencil-custom', action: 'draw'},
{name: 'text', icon: 'text-box-custom', action: 'text'},
{name: 'shapes', icon: 'polygon-custom', action: 'shapes'},
{name: 'frame', icon: 'frame-custom', action: 'frame'},
{type: 'separator'},
{name: 'corners', icon: 'rounded-corner-custom', action: 'round'},
{name: 'background', icon: 'background-custom', action: 'background'},
{name: 'merge', icon: 'merge-custom', action: 'merge'},
]
},
},
onLoad: function() {
pixieEditor.resetAndOpenEditor('image', imageURL );
},
onOpen: function() {
// Hide any open tooltips
kmUI.popover.close();
setTimeout( function() {
kmUI.popover.close();
}, 300 );
},
onClose: function( ) {
jQuery('#pixie-current-image').removeAttr('id');
},
onSave: function( imgData, dirtyName ) {
// Display saving notification
kmUI.notify.show({
icon: 'dashicons-admin-appearance',
iconColor: '#f9a241',
iconSize: 36,
text: LS_l10n.notifyPixieSave
});
// Introduce a little delay, so the
// saving notification can render properly
// before we try to do any thread-heavy thing.
setTimeout( function() {
// Begin image upload
LayerSlider.uploadImageEditorPic( imgData, function() {
// Success, hide the notification and
// close the image editor
kmUI.notify.hide();
window.pixieEditor.close();
});
}, 1000 );
}
});
});
}
},
uploadImageEditorPic: function( imgData, callback ) {
var $image = jQuery('#pixie-current-image').removeAttr('id');
$parent = $image.closest('.ls-image'),
imgName = 'pixie_'+Date.now()+'.png',
imgBlob = LS_Utils.dataURItoBlob( imgData );
imgBlob.lastModifiedDate = new Date();
imgBlob.name = imgName;
imgBlob.filename = imgName;
LayerSlider.uploadImageToMediaLibrary(imgBlob, function(data) {
$image.attr('src', data.url);
if( $parent.hasClass('ls-slide-image') ) {
// Add action to UndoManager
LS_UndoManager.add('slide.general', LS_l10n.SBUndoSlideImage, {
itemIndex: LS_activeSlideIndex,
undo: {
background: LS_activeSlideData.properties.background,
backgroundId: LS_activeSlideData.properties.backgroundId,
backgroundThumb: LS_activeSlideData.properties.backgroundThumb
},
redo: {
background: data.url,
backgroundId: data.id,
backgroundThumb: data.url
}
});
LS_activeSlideData.properties.background = data.url;
LS_activeSlideData.properties.backgroundId = data.id;
LS_activeSlideData.properties.backgroundThumb = data.url;
LayerSlider.updateSlidePreviews();
LayerSlider.generatePreview();
} else if( $parent.hasClass('ls-slide-thumbnail') ) {
LS_activeSlideData.properties.thumbnail = data.url;
LS_activeSlideData.properties.thumbnailId = data.id;
LS_activeSlideData.properties.thumbnailThumb = data.url;
LayerSlider.updateSlidePreviews();
} else if( $parent.hasClass('ls-layer-image') ) {
// Add action to UndoManager
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayerImage, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
image: LS_activeLayerDataSet[0].image,
imageId: LS_activeLayerDataSet[0].imageId,
imageThumb: LS_activeLayerDataSet[0].imageThumb
},
redo: {
image: data.url,
imageId: data.id,
imageThumb: data.url
}
});
LS_activeLayerDataSet[0].image = data.url;
LS_activeLayerDataSet[0].imageId = data.id;
LS_activeLayerDataSet[0].imageThumb = data.url;
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
} else if( $parent.hasClass('ls-media-image') ) {
// Add action to UndoManager
LS_UndoManager.add('layer.general', LS_l10n.SBUndoVideoPoster, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
poster: LS_activeLayerDataSet[0].poster,
posterId: LS_activeLayerDataSet[0].posterId,
posterThumb: LS_activeLayerDataSet[0].posterThumb
},
redo: {
poster: data.url,
posterId: data.id,
posterThumb: data.url
}
});
LS_activeLayerDataSet[0].poster = data.url;
LS_activeLayerDataSet[0].posterId = data.id;
LS_activeLayerDataSet[0].posterThumb = data.url;
} else if( $parent.hasClass('ls-layer-background-image') ) {
// Add action to UndoManager
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayerBackground, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
background: LS_activeLayerDataSet[0].layerBackground,
layerBackgroundId: LS_activeLayerDataSet[0].layerBackgroundId,
layerBackgroundThumb: LS_activeLayerDataSet[0].layerBackgroundThumb
},
redo: {
layerBackground: data.url,
layerBackgroundId: data.id,
layerBackgroundThumb: data.url
}
});
LS_activeLayerDataSet[0].layerBackground = data.url;
LS_activeLayerDataSet[0].layerBackgroundId = data.id;
LS_activeLayerDataSet[0].layerBackgroundThumb = data.url;
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
LayerSlider.updateLayerBackgroundNotification();
}
if( callback ) {
callback();
}
});
},
handleDroppedImages: function(event) {
var oe = event.originalEvent,
files = oe.dataTransfer.files,
p = LS_previewArea.offset(),
x = (jQuery(window).scrollLeft() + oe.clientX - p.left) / LS_previewZoom,
y = (jQuery(window).scrollTop() + oe.clientY - p.top) / LS_previewZoom,
updateInfo = [],
layerDataSet = [],
layerIndexSet = [],
counter = 1;
// Iterate over the dropped files
jQuery.each(files, function(index, file) {
LayerSlider.uploadImageToMediaLibrary(file, function(data) {
// Build new layer
var layerData = jQuery.extend(true, {}, LS_DataSource.getDefaultLayerData());
layerData.image = data.url;
layerData.imageId = data.id;
layerData.imageThumb = data.sizes.thumbnail ? data.sizes.thumbnail.url : data.url;
layerData.subtitle = file.name;
layerData.styles.left = x+'px';
layerData.styles.top = y+'px';
layerIndexSet.push(0);
layerDataSet.push(layerData);
// Increase next layer offsets
x += 20;
y += 20;
// Add new layers when every image
// has been uploaded
if(counter++ === files.length) {
LayerSlider.addLayer( layerDataSet, layerIndexSet );
}
});
});
},
uploadImageToMediaLibrary: function(file, callback) {
if(file.type.indexOf('image') === 0) {
// Build FormData object
var formData = new FormData();
formData.append('action', 'upload-attachment');
formData.append('async-upload', file, file.name);
formData.append('name', file.name);
formData.append('_wpnonce', _wpPluploadSettings.defaults.multipart_params._wpnonce);
jQuery.ajax({
url: ajaxurl.replace('admin-ajax', 'async-upload'),
method: 'POST',
data: formData,
dataType: 'json',
processData: false,
contentType: false,
error: function(jqXHR, textStatus, errorThrown) {
alert( LS_l10n.SBUploadErrorMessage.replace('%s', errorThrown) );
},
success: function(resp) {
if(!resp || !resp.success) {
alert(LS_l10n.SBUploadError);
return;
}
if(typeof callback != "undefined") {
callback(resp.data);
}
}
});
}
},
addLayerSortables: function() {
// Bind sortable function
jQuery('.ls-sublayer-sortable').sortable({
handle : 'span.ls-sublayer-sortable-handle',
containment : 'parent',
tolerance : 'pointer',
axis : 'y',
start: function() {
LayerSlider.dragIndex = jQuery('.ui-sortable-placeholder').index() - 1;
},
change: function() {
jQuery('.ui-sortable-helper').addClass('moving');
},
stop: function(event, ui) {
// Get indexes
var oldIndex = LayerSlider.dragIndex;
var index = jQuery('.moving').removeClass('moving').index();
LS_UndoManager.add('layer.order', LS_l10n.SBUndoSortLayers, {
itemIndex: null,
undo: { from: index, to: oldIndex },
redo: { from: oldIndex, to: index }
});
if( index > -1 ){
LS_Utils.moveArrayItem(LS_activeSlideData.sublayers, oldIndex, index);
}
// Update active layer index
LS_activeLayerIndexSet = [];
jQuery('.ls-sublayers li.active').each(function() {
LS_activeLayerIndexSet.push( jQuery(this).index() );
});
// Reindex layers
LayerSlider.reindexLayers();
LayerSlider.generatePreview();
}
});
},
addSlideSortables: function() {
if( document.location.href.indexOf('section=revisions') !== -1 ) {
return;
}
jQuery('#ls-slide-tabs').sortable({
containment: 'parent',
tolerance: 'pointer',
handle: '.ls-slide-preview',
items: '.ls-slide-tab',
cancel: '.unsortable',
distance: 3,
start: function() {
LayerSlider.dragIndex = jQuery('.ui-sortable-placeholder').index() - 1;
},
change: function() {
jQuery('.ui-sortable-helper').addClass('moving');
},
stop: function(event, ui) {
// Get indexes
var oldIndex = LayerSlider.dragIndex,
index = jQuery('.moving').removeClass('moving').index();
if( index > -1 ){
LS_Utils.moveArrayItem(window.lsSliderData.layers, oldIndex, index);
}
// Update active slide index
LS_activeSlideIndex = jQuery('#ls-slide-tabs .ls-slide-tab.active').index();
// Add static layers
LS_activeStaticLayersDataSet = LayerSlider.staticLayersForSlide( LS_activeSlideIndex );
// Reindex slides
LayerSlider.reindexStaticLayers();
LayerSlider.generateStaticPreview();
LS_DataSource.buildLayersList();
}
});
},
addDraggable: function() {
// Add dragables and update settings
// while and after dragging
LS_previewArea.children('.ls-l').draggable({
snap: true,
snapTolerance: 10,
cancel: '.disabled,.transformed',
start: function(e, ui) {
// Fix for deselect
if( !ui.helper.hasClass('ui-selected') ){
ui.helper.addClass('ui-selected').trigger('selectablestop.ls');
}
// Store selected layers & lasso originalPosition
$lasso.data('originalPosition', $lasso.position());
jQuery('.ls-preview .ui-selected').each(function() {
var pos = jQuery(this).position();
jQuery(this).data('originalPosition', {
'top': pos.top / LS_previewZoom,
'left': pos.left / LS_previewZoom,
});
});
},
drag: function(event, ui) {
LayerSlider.dragging(ui);
},
stop: function(event, ui) {
var updateInfo = [];
LayerSlider.dragging(ui);
jQuery('.ls-preview .ui-selected').each(function() {
var $layer = jQuery(this),
index = $layer.index(),
position = $layer.position(),
newTop = Math.round( position.top / LS_previewZoom ) +'px',
newLeft = Math.round( position.left / LS_previewZoom ) +'px',
origPosition = $layer.data('originalPosition');
// Maintain changes in data source
LS_activeSlideData.sublayers[index].styles.top = newTop;
LS_activeSlideData.sublayers[index].styles.left = newLeft;
// Gather changes for undoing
updateInfo.push({
itemIndex: index,
undo: { left: origPosition.left+'px', top: origPosition.top+'px' },
redo: { left: newLeft, top: newTop }
});
});
// Add changes to undoManager
LS_UndoManager.add('layer.style', LS_l10n.SBUndoLayerPosition, updateInfo.reverse());
}
});
},
dragging: function(ui) {
// Fix positions when zoomed
ui.position.top = Math.round(ui.position.top / LS_previewZoom );
ui.position.left = Math.round(ui.position.left / LS_previewZoom );
var index = ui.helper.index(),
top = Math.round( ui.position.top ),
left = Math.round( ui.position.left );
// Update input field values if it's visible
if(LS_activeLayerIndexSet.length === 1) {
// Update input fields
jQuery('.ls-sublayer-style input[name="top"]').val( ui.helper.position().top / LS_previewZoom + 'px');
jQuery('.ls-sublayer-style input[name="left"]').val( ui.helper.position().left / LS_previewZoom + 'px');
}
},
resizing: function(e, ui) {
var rh = ui.size.height / ui.originalSize.height,
rw = ui.size.width / ui.originalSize.width,
uiRatio = ui.originalSize.width / ui.originalSize.height,
tagNames = [], layer, $layer, layerIndex, layerData, width,
height, op, os, r;
if( !$lasso.data( 'dragDirection') ){
$lasso.data( 'dragDirection', rh === 1 ? 'horizontal' : 'vertical' );
}
// Update layer data
jQuery('.ls-preview .ui-selected').each(function() {
layer = this;
$layer = jQuery(this);
layerIndex = $layer.index();
layerData = LS_activeSlideData.sublayers[layerIndex];
tagNames.push( layer.tagName.toLowerCase() );
op = $layer.data('originalPosition');
os = $layer.data('originalSize');
layerData.styles.top = layer.style.top = Math.round( (op.top - Math.round( ui.originalPosition.top / LS_previewZoom ) ) * rh + Math.round( ui.position.top / LS_previewZoom ) ) + 'px';
layerData.styles.left = layer.style.left = Math.round( (op.left - Math.round( ui.originalPosition.left / LS_previewZoom ) ) * rw + Math.round( ui.position.left / LS_previewZoom ) ) + 'px';
width = Math.round(os.width * rw) + 'px';
height = Math.round(os.height * rh) + 'px';
if( layerData.styles.width || $layer.is('img,div') ) {
layerData.styles.width = width;
}
if( layerData.styles.height || $layer.is('img,div') ) {
layerData.styles.height = height;
}
$layer.outerWidth(width);
$layer.outerHeight(height);
// Font-size only
if( ! $layer.is( 'img, iframe, video, audio' ) ) {
r = ui.size.width / ui.originalSize.width;
layerData.styles['font-size'] = layer.style.fontSize = Math.round( r * os.fontSize ) +'px';
if( os.lineHeight ) {
layerData.styles['line-height'] = layer.style.lineHeight = Math.round( r * os.lineHeight ) +'px';
}
}
if(LS_activeLayerIndexSet.length === 1) {
if( layerData.styles.width || $layer.is('img,div') ) {
jQuery('.ls-sublayer-style input[name="width"]').val( layer.style.width);
}
if( layerData.styles.height || $layer.is('img,div') ) {
jQuery('.ls-sublayer-style input[name="height"]').val( layer.style.height);
}
jQuery('.ls-sublayer-style input[name="top"]').val( layer.style.top);
jQuery('.ls-sublayer-style input[name="left"]').val( layer.style.left);
jQuery('.ls-sublayer-style input[name="font-size"]').val(layerData.styles['font-size']);
if( os.lineHeight ) {
jQuery('.ls-sublayer-style input[name="line-height"]').val( layerData.styles['line-height']+'px' );
}
}
});
if( tagNames.indexOf('img') === -1 && tagNames.indexOf('div') === -1 ) {
switch( $lasso.data( 'dragDirection') ){
case 'horizontal':
ui.size.height = ui.size.width / uiRatio;
break;
case 'vertical':
ui.size.width = ui.size.height * uiRatio;
break;
}
}
// Update lasso size info
$lasso.attr({
'data-info-0': 'w: ' + Math.round(ui.size.width) + 'px',
'data-info-1': 'h: ' + Math.round(ui.size.height) + 'px'
});
},
contextMenu: function(e) {
// Bail out if preview is active or when using Revisions
if( LayerSlider.isSlidePreviewActive || LayerSlider.isLayerPreviewActive || document.location.href.indexOf('ls-revisions') !== -1 ) {
return;
}
// Vars to hold overlapping elements
// and mouse position
var items = [],
mt = e.pageY;
ml = e.pageX;
LS_contextMenuTop = e.pageY - LS_previewArea.offset().top;
LS_contextMenuLeft = e.pageX - LS_previewArea.offset().left;
// Loop through layers list
LS_previewArea.children('.ls-l').each(function(layerIndex) {
// Get layer item and data
var $layer = jQuery(this),
layerData = LS_activeSlideData.sublayers[ $layer.index() ],
// Get layer positions and dimensions
t = LS_previewArea.offset().top + $layer.position().top,
l = LS_previewArea.offset().left + $layer.position().left,
w = $layer.outerWidth() * LS_previewZoom,
h = $layer.outerHeight() * LS_previewZoom;
if( (mt > t && mt < t+h) && (ml > l && ml < l+w) ) {
items.push({ index: layerIndex, data: layerData });
}
});
// Attempt to find the contextmenu instance.
var $contextMenu = jQuery('.ls-preview-context-menu');
// Create new contextmenu instance if it wasn't
// added to the document previously.
if( ! $contextMenu.length ) {
$contextMenu = jQuery( jQuery('#tmpl-ls-preview-context-menu').text() ).hide().prependTo('body');
}
// Reset the contextmenu and position it to its new location
$contextMenu.find('.ls-context-overlapping-layers ul').empty();
$contextMenu.find('li').show();
$contextMenu
.stop( true, true )
.css({ top: mt, left: ml })
.fadeIn( 100 );
// Close event
jQuery('body').on('mousedown.ls-context-menu', function(e) {
var $target = jQuery( e.target );
// Prevent closing the context menu by default if
// the event target was within it and the action
// should depend on the clicked item.
if( $target.closest('.ls-preview-context-menu').length ) {
// Clicked item is not a group list and has an action
// to be executed. Close the context menu with a bit of
// delay, so the event handler can be triggered before the
// item becomes hidden, which can cause issues to browsers.
if( ! $target.is('li.group') ) {
setTimeout(function() {
LayerSlider.closeContextMenu();
}, 150 );
}
// The event target has nothing to do with the context
// menu, so it can be closed right away.
} else {
LayerSlider.closeContextMenu();
}
});
// Loop through intersecting elements (if any)
if( items.length > 1 ) {
jQuery.each( items, function( idx, data ) {
var layerIndex = data.index,
layerData = data.data,
$li = jQuery('<li><p></p><span>'+layerData.subtitle+'</span></li>').appendTo( $contextMenu.find('.ls-context-overlapping-layers ul') );
$li.data('layerIndex', layerIndex);
LayerSlider.setLayerMedia( layerData.media, jQuery('p', $li), layerData );
});
} else {
$contextMenu.find('.ls-context-overlapping-layers').hide();
}
// Empty slide, no layers
if( ! LS_activeSlideData.sublayers.length ) {
$contextMenu.find(' > ul > li').not(':first-child, .ls-context-menu-paste-layer').hide();
}
},
closeContextMenu: function() {
jQuery('body').off('mousedown.ls-context-menu');
jQuery('.ls-preview-context-menu').fadeOut( 100 );
},
highlightPreviewItem: function(el) {
// Get layer related data
var layerIndex = jQuery(el).data('layerIndex');
var $previewItem = LS_previewArea.children('.ls-l').eq(layerIndex);
// Highlight item
$previewItem.addClass('highlighted').siblings().addClass('lowlighted');
},
selectPreviewItem: function( layerIndex, event ) {
// Remove layer highlights (if any)
LS_previewArea.children().removeClass('highlighted lowlighted');
if( ! event.ctrlKey && ! event.metaKey ) {
if( JSON.stringify(LS_activeLayerIndexSet) !== '['+layerIndex+']' ) {
return LayerSlider.selectLayer( [ layerIndex ] );
}
} else {
// Get layer
var $previewItem = LS_previewArea.children().eq( layerIndex );
// Select layer
LS_previewHolder.triggerHandler(
jQuery.Event('mousedown.ls', {
target: $previewItem[0],
which: 1,
shiftKey: event.shiftKey,
ctrlKey: event.ctrlKey,
metaKey: event.metaKey
})
);
}
},
editLayerToggle: function() {
if(LS_activeLayerIndexSet.length === 1) {
var $editing = jQuery('.ls-editing'),
$layer = LS_previewItems[ LS_activeLayerIndexSet[0] ];
if(!$editing.length) {
this.editLayerStart($layer);
} else {
this.editLayerEnd($editing);
}
}
},
editLayerStart: function( $layer ) {
// Bring up the Media Library in case of image layer
if( $layer.is('img') || LS_activeLayerDataSet[0].media === 'img' ) {
jQuery('.ls-layer-image').click();
return false;
// Bring up the Icon Chooser in case of an icon layer
} else if( LS_activeLayerDataSet[0].media === 'icon' ) {
jQuery('.ls-replace-icon').last().click();
return false;
// Do nothing with media layers
} else if( LS_activeLayerDataSet[0].media === 'media' ) {
LS_InsertMedia.open();
return false;
}
LayerSlider.selectLayer( [$layer.index() ] );
// Get layer data
var layerData = LS_activeLayerDataSet[0];
// Bail out early if it's a locked layer
if( $layer.hasClass('disabled') || layerData.locked) { return false; }
// Enable editing
$layer.addClass('disabled ls-editing')
.prop('contenteditable', true)
.focus();
// Hide selectable/resizable
$lasso.addClass('ui-resizable-disabled').hide();
// Save current value for undoManager
jQuery('.ls-html-code textarea').data('prevVal',layerData.html);
// Select all text
document.execCommand('selectAll');
// End editing when clicking away
jQuery(document).on('click.ls-editing', function(event) {
if(!jQuery(event.target).hasClass('ls-editing')) {
LayerSlider.editLayerEnd( jQuery('.ls-editing') );
}
});
},
editLayer: function(e) {
if((e.metaKey || e.ctrlKey || e.altKey) && e.which === 13) {
e.preventDefault();
document.execCommand('insertHTML', false, '\r\n ');
}
},
editLayerUpdate: function(layer) {
var content = layer.textContent,
$textarea = jQuery('.ls-html-code textarea'),
styles = LS_activeLayerDataSet[0].styles;
$textarea.val(content);
LS_activeLayerDataSet[0].html = content;
LayerSlider.setPositions( jQuery(layer), styles.top, styles.left);
},
editLayerPaste: function(event) {
event.preventDefault();
document.execCommand('insertHTML', false,
event.originalEvent.clipboardData.getData('text/plain')
);
},
editLayerEnd: function($layer) {
jQuery(document).off('click.ls-editing');
$layer.prop('contenteditable', false).removeClass('disabled ls-editing');
jQuery('.ls-html-code textarea').trigger('change');
LayerSlider.updatePreviewSelection();
},
reindexLayers: function(el) {
var layerCount = LS_activeSlideData.sublayers.length;
layerCount = layerCount ? layerCount : 0;
// Reindex default layers' title
jQuery('#ls-layers .ls-sublayers > li').each(function(index) {
var layerTitle = jQuery(this).find('.ls-sublayer-title').val(),
pattern = LS_l10n.SBLayerTitle.substring(0, LS_l10n.SBLayerTitle.length-2);
if( layerTitle.indexOf(pattern) != -1 && layerTitle.indexOf('copy') == -1) {
jQuery(this).find('.ls-sublayer-title').val( LS_l10n.SBLayerTitle.replace('%d', (layerCount-index) ) );
}
});
},
updateSlidePreviews: function() {
jQuery('#ls-slide-tabs .ls-slide-tab').each( function( index ) {
var $slide = jQuery( this ),
$preview = $slide.children('.ls-slide-preview'),
slideIndex = $slide.index(),
slideData = window.lsSliderData.layers[ slideIndex ],
slideProps = slideData.properties;
if( slideProps.thumbnail ) {
$preview.css('background-image', 'url('+slideProps.thumbnail+')' );
$slide.removeClass('empty');
} else if( slideProps.background ) {
$preview.css('background-image', 'url('+slideProps.background+')' );
$slide.removeClass('empty');
} else {
$preview.css('background-image', 'none');
$slide.addClass('empty');
}
});
},
rebuildSlides: function() {
var $tab;
jQuery.each(window.lsSliderData.layers, function(slideKey, slideData) {
// Try to locate a preview tab and update it if exists
$tab = jQuery('#ls-slide-tabs').children().eq( slideKey );
// Create a new tab if needed
if( ! $tab.length ) {
$tab = jQuery( jQuery('#tmpl-slide-tab').text() ).appendTo('#ls-slide-tabs');
}
// Update title
if( slideData.properties.title ) {
$tab.find('.ls-slide-name input').val( slideData.properties.title );
}
});
// Remove additional and unnecessary tabs (if any)
$tab.nextAll().remove();
// Restore active selection
jQuery('#ls-slide-tabs')
.children()
.removeClass('active')
.eq( LS_activeSlideIndex )
.addClass('active');
LayerSlider.updateSlidePreviews();
},
checkMediaAutoPlay: function( $textarea, prop, val ) {
clearTimeout( LayerSlider.mediaCheckTimeout );
LayerSlider.mediaCheckTimeout = setTimeout( function() {
if( val.indexOf('autoplay') !== -1 ) {
var $media = jQuery(val).filter('iframe'),
autoplayDetected = false;
if( $media.is('iframe') ) {
var URL = $media.attr('src').split('?'),
targetIndex = -1;
if( URL[1] ) {
params = URL[1].split('&');
jQuery.each(params, function(index, item) {
if( item.indexOf('autoplay') !== -1 ) {
autoplayDetected = true;
targetIndex = index;
}
});
if( targetIndex > -1 ) {
params.splice(targetIndex, 1);
}
}
if( typeof params !== 'undefined' ) {
$media.attr('src', URL[0]+'?'+params.join('&') );
}
} else if( $media.is('video') || $media.is('audio') ) {
autoplayDetected = true;
$media.removeAttr('autoplay');
}
if( autoplayDetected ) {
$textarea.val( $media[0].outerHTML );
$autoplay = jQuery('select[name="autoplay"]');
jQuery('option', $autoplay)
.prop('selected', false)
.eq(1).prop('selected', true);
TweenLite.to($autoplay[0], 0.2, {
css: { scale: 1.3 },
onComplete: function() {
TweenLite.to($autoplay[0], 0.2, {
css: { scale: 1 }
});
}
});
}
}
}, 100, $textarea, prop, val);
},
startSlidePreview: function( sliderOptions ) {
// Stop **layer** preview if it's currently running
// to prevent simultaneous instances
this.stopLayerPreview(true);
// Stop slide preview if it's currently running
if(this.isSlidePreviewActive) {
LayerSlider.stopSlidePreview();
return true;
}
this.isSlidePreviewActive = true;
sliderOptions = sliderOptions || {};
// Get slider settings and preview container
var sliderProps = window.lsSliderData.properties,
sliderSize = LayerSlider.getSliderSize(),
plugins = [];
// Switch between preview and editor
var $slider = jQuery('#ls-layers .ls-real-time-preview').show();
$slider = jQuery('<div id="ls-preview-timeline" class="ls-wp-container">').appendTo( $slider );
if( sliderProps.sliderclass ) {
$slider.addClass( sliderProps.sliderclass );
}
jQuery('#ls-layers .ls-preview').hide();
jQuery('#ls-layers .ls-preview-button').html('Stop').addClass('playing');
LayerSlider.hidePreviewSelection();
// Empty the preview area to avoid ID collisions
LS_previewArea.empty();
// Append slides & layers
this.populateSliderPreview( $slider, plugins );
// Handle plugins
if( sliderOptions && sliderOptions.plugins ) {
sliderOptions.plugins = jQuery.merge(sliderOptions.plugins, plugins);
}
var sliderDefaults = {
type: 'responsive',
width: sliderSize.width,
height: sliderSize.height,
skin: 'v6',
skinsPath: pluginPath + 'layerslider/skins/',
firstSlide: LS_activeSlideIndex + 1,
autoStart: true,
pauseOnHover: false,
startInViewport: false,
autoPlayVideos: sliderProps.autoplayvideos ? true : false,
slideBGSize: sliderProps.slideBGSize,
slideBGPosition: sliderProps.slideBGPosition,
globalBGColor: sliderProps.backgroundcolor,
globalBGImage: sliderProps.backgroundimage,
globalBGAttachment: sliderProps.globalBGAttachment,
globalBGRepeat: sliderProps.globalBGRepeat,
globalBGPosition: sliderProps.globalBGPosition,
globalBGSize: sliderProps.globalBGSize,
parallaxScrollReverse: sliderProps.parallaxScrollReverse,
playByScroll: sliderProps.playByScroll ? true : false,
playByScrollStart: sliderProps.playByScrollStart ? true : false,
playByScrollSkipSlideBreaks: sliderProps.playByScrollSkipSlideBreaks ? true : false,
playByScrollSpeed: sliderProps.playByScrollSpeed || 1,
navButtons: false,
navStartStop: false,
forceLayersOutDuration: sliderProps.forceLayersOutDuration || 750,
allowRestartOnResize: sliderProps.allowRestartOnResize ? true : false,
preferBlendMode: sliderProps.preferBlendMode,
plugins: plugins
};
if( sliderProps.maxRatio ) {
sliderDefaults.maxRatio = sliderProps.maxRatio;
}
// Init layerslider
$slider.layerSlider(
jQuery.extend( true, sliderDefaults, sliderOptions )
).on('slideTimelineDidComplete', function( event, slider ) {
// if( jQuery('.ls-timeline-switch li').eq(0).hasClass('active') ) {
// slider.api('replay');
// return false;
// }
}).on( 'slideTimelineDidCreate', function(){
jQuery( '.ls-slidebar-slider' ).attr({
'data-help': LS_l10n.SBDragMe,
'data-km-ui-popover-once': 'true',
'data-km-ui-popover-theme': 'red',
'data-km-ui-popover-autoclose': 3,
'data-km-ui-popover-distance': 20
}).trigger( 'mouseenter' );
});
},
stopSlidePreview: function() {
if( this.isSlidePreviewActive ) {
this.isSlidePreviewActive = false;
// Show the editor
jQuery('#ls-layers .ls-preview').show();
// Stop LayerSlider and empty the preview contents
var layersliders = jQuery('#ls-layers .ls-real-time-preview');
layersliders.find('.ls-container').layerSlider( 'destroy', true );
layersliders.hide();
// Rewrote the Preview button text
var btnText = document.location.href.indexOf('ls-revisions') !== -1 ? LS_l10n.SBPreviewSlide : LS_l10n.slideNoun;
jQuery('#ls-layers .ls-preview-button').text( btnText ).removeClass('playing');
kmUI.popover.close();
LayerSlider.generatePreview();
LayerSlider.showPreviewSelection();
LayerSlider.updatePreviewSelection();
// Remove timeline
jQuery('.ls-timeline-switch li:first-child').click();
// SET: layer editor size
kmUI.smartResize.set();
}
},
startPopupPreview: function( sliderOptions, button ) {
// Stop both layer & slide preview if they are active
this.stopLayerPreview(true);
this.stopSlidePreview();
sliderOptions = sliderOptions || {};
// Prevent pressing the Preview button multiple times
jQuery(button).prop('disabled', true);
setTimeout(function() {
jQuery(button).prop('disabled', false);
}, 1000);
// Get slider settings and preview container
var sliderProps = window.lsSliderData.properties,
width = parseInt(sliderProps.popupWidth),
height = parseInt(sliderProps.popupHeight),
sliderCSS = sliderProps.sliderstyle,
circleTimer = sliderProps.circletimer ? true : false,
plugins = ['popup'];
// Append live preview element
var $slider = jQuery('<div id="ls-popup-preview" class="ls-wp-container">').appendTo('body');
if( sliderCSS ) {
$slider.attr('style', sliderCSS);
}
if( sliderProps.sliderclass ) {
$slider.addClass( sliderProps.sliderclass );
}
// Get popup init options
jQuery('.ls-settings-popup .popup-prop').each(function() {
if( this.name ) { sliderOptions[ this.name ] = window.lsSliderData.properties[ this.name ]; }
});
// Append slides & layers
if( LayerSlider.sliderIsEmpty( 1 ) ) {
$slider.html( jQuery('#tmpl-popup-example-slider').text() );
width = 700;
height = 500;
circleTimer = false;
sliderOptions.popupCloseButtonStyle = 'top: 20px; left: 40px;';
sliderOptions.popupPositionHorizontal = 'center';
sliderOptions.popupPositionVertical = 'middle';
sliderOptions.popupFitWidth = false;
sliderOptions.popupFitHeight = false;
} else {
this.populateSliderPreview( $slider, plugins );
}
// Handle plugins
if( sliderOptions && sliderOptions.plugins ) {
sliderOptions.plugins = jQuery.merge(sliderOptions.plugins, plugins);
}
var sliderDefaults = {
type: 'popup',
width: width,
height: height,
popupWidth: width,
popupHeight: height,
skin: sliderProps.skin,
skinsPath: pluginPath + 'layerslider/skins/',
autoStart: sliderProps.autostart ? true : false,
pauseOnHover: sliderProps.pauseonhover,
firstSlide: sliderProps.firstlayer,
shuffleSlideshow: sliderProps.randomslideshow ? true : false,
navPrevNext: sliderProps.navprevnext ? true : false,
hoverPrevNext: sliderProps.hoverprevnext ? true : false,
navStartStop: sliderProps.navstartstop ? true : false,
navButtons: sliderProps.navbuttons ? true : false,
hoverBottomNav: sliderProps.hoverbottomnav ? true : false,
showBarTimer: sliderProps.bartimer ? true : false,
showCircleTimer: circleTimer,
thumbnailNavigation: sliderProps.thumb_nav,
tnContainerWidth: sliderProps.thumb_container_width,
tnWidth: sliderProps.thumb_width,
tnHeight: sliderProps.thumb_height,
tnActiveOpacity: sliderProps.thumb_active_opacity,
tnInactiveOpacity: sliderProps.thumb_inactive_opacity,
startInViewport: false,
autoPlayVideos: sliderProps.autoplayvideos ? true : false,
slideBGSize: sliderProps.slideBGSize,
slideBGPosition: sliderProps.slideBGPosition,
globalBGColor: sliderProps.backgroundcolor,
globalBGImage: sliderProps.backgroundimage,
globalBGAttachment: sliderProps.globalBGAttachment,
globalBGRepeat: sliderProps.globalBGRepeat,
globalBGPosition: sliderProps.globalBGPosition,
globalBGSize: sliderProps.globalBGSize,
parallaxScrollReverse: sliderProps.parallaxScrollReverse,
forceLayersOutDuration: sliderProps.forceLayersOutDuration || 750,
allowRestartOnResize: sliderProps.allowRestartOnResize ? true : false,
preferBlendMode: sliderProps.preferBlendMode,
plugins: plugins,
// Popup Settings
popupShowOnce: true,
popupShowOnTimeout: 0.01,
popupDisableOverlay: false,
popupOverlayClickToClose: true
};
if( sliderProps.maxRatio ) {
sliderDefaults.maxRatio = sliderProps.maxRatio;
}
// Init layerslider
$slider.layerSlider( jQuery.extend( true, sliderDefaults, sliderOptions ) );
},
populateSliderPreview: function( $slider, plugins ) {
var sliderProps = window.lsSliderData.properties,
callbacks = window.lsSliderData.callbacks,
posts = window.lsPostsJSON || [];
// Iterate over the slides
jQuery.each(window.lsSliderData.layers, function(slideIndex, slideData) {
// Slide data
var slideProps = slideData.properties,
layers = slideData.sublayers.reverse();
// Get post content if any
var postOffset = slideProps.post_offset;
if(postOffset == -1) { postOffset = slideIndex; }
var post = posts[postOffset];
// Slide attributes
var properties = '', sKey, sVal;
for( sKey in slideProps) {
sVal = slideProps[ sKey ];
if( sVal !== '' && sVal !== 'null' ) {
// Slide BG inheritance
if( sKey === 'bgsize' && sVal === 'inherit' ) {
sVal = sliderProps.slideBGSize;
} else if( sKey === 'bgposition' && sVal === 'inherit' ) {
sVal = sliderProps.slideBGPosition;
}
if( sKey === 'transitionorigami' && sVal ) {
if(plugins.indexOf('origami') === -1) {
plugins.push('origami');
}
}
properties += sKey+':'+sVal+';';
}
}
// Build the Slide
var layer = jQuery('<div class="ls-slide">')
.attr('data-ls', properties)
.appendTo( $slider );
// Get background
var background = slideProps.background;
if(background === '[image-url]') {
background = post['image-url'];
}
// Add background
if(background) {
jQuery('<img src="'+background+'" class="ls-bg">').appendTo(layer);
}
// Get selected transitions
var tr2d = slideProps['2d_transitions'],
tr3d = slideProps['3d_transitions'],
tr2dcustom = slideProps.custom_2d_transitions,
tr3dcustom = slideProps.custom_3d_transitions;
// Apply transitions
if(tr2d) layer.attr('data-ls', layer.attr('data-ls') + ' transition2d: '+tr2d+'; ');
if(tr3d) layer.attr('data-ls', layer.attr('data-ls') + ' transition3d: '+tr3d+'; ');
if(tr2dcustom) layer.attr('data-ls', layer.attr('data-ls') + ' customtransition2d: '+tr2dcustom+'; ');
if(tr3dcustom) layer.attr('data-ls', layer.attr('data-ls') + ' customtransition3d: '+tr3dcustom+'; ');
// Iterate over layers
jQuery.each(layers, function(layerKey, layerData) {
LayerSlider.appendLivePreviewItem(layerKey, layerData, layer, post);
});
// Revert back to original layer order, as the reversed
// layers list is only a visual thing on the admin UI.
slideData.sublayers.reverse();
});
// Apply API events (if any)
if( callbacks ) {
for( var key in callbacks ) {
var callback = callbacks[ key ],
startIndex = callback.indexOf('{') + 1,
endIndex = callback.length - 1;
body = callback.substring(startIndex, endIndex);
$slider.on(key, new Function('event', 'slider', body));
}
}
},
startLayerPreview: function(button, forceStop) {
// Stop **slide** preview if it's currently running
// to prevent simultaneous instances
this.stopSlidePreview();
// Stop or restart current preview session (if any)
if(this.isLayerPreviewActive){
LayerSlider.stopLayerPreview(forceStop);
if( !!forceStop ){
return;
}
}
// Check for Multi-Select
if( LS_activeLayerDataSet.length > 1 ) {
alert(LS_l10n.SBLayerPreviewMultiSelect);
return;
}
// Change preview state
this.isLayerPreviewActive = true;
jQuery(button).addClass('playing').text( LS_l10n.stop );
// Hide other layers
LayerSlider.hidePreviewSelection();
LS_previewArea.children().addClass('ls-transparent');
// Create container element
var $wrapper = jQuery('<div>').addClass('ls-layer-preview-wrapper').appendTo('.ls-preview-wrapper');
// Slide properties
var sliderProps = window.lsSliderData.properties,
slideProps = LS_activeSlideData.properties,
postOffset = slideProps.post_offset;
if(postOffset == -1) { postOffset = LS_activeSlideIndex; }
var posts = window.lsPostsJSON || [];
var post = posts[postOffset];
// Slide attributes
var properties = '', sKey, sVal;
for( sKey in slideProps) {
sVal = slideProps[ sKey ];
// Don't allow empty values & force auto slide duration
if( sVal !== '' && sVal !== 'null' && sKey !== 'slidedelay' ) {
properties += sKey+':'+sVal+';';
}
}
if( sliderProps.sliderclass ) {
$wrapper.addClass( sliderProps.sliderclass );
}
// Add slide
$s1 = jQuery('<div>').attr({
'class': 'ls-slide',
'data-ls': properties
}).appendTo($wrapper);
// Get layer data
var item = LS_activeLayerDataSet[0],
layerData = jQuery.extend(true, {}, item);
layerData.transition.delayin = 100;
LayerSlider.appendLivePreviewItem(0, layerData, $s1, post);
item.skip = true;
LS_previewItems[ LS_activeLayerIndexSet[0] ].addClass('ls-invisible');
var sliderSize = LayerSlider.getSliderSize();
// Initialize slider
$wrapper.layerSlider({
type: 'responsive',
width: sliderSize.width,
height: sliderSize.height,
skin: 'v6',
skinsPath: pluginPath + 'layerslider/skins/',
pauseOnHover: false,
autoPlayVideos: false,
startInViewport: false,
keybNav: false,
navButtons: false,
navStartStop: false,
navPrevNext: false
}).on('slideTimelineDidComplete', function( event, slider ) {
if( jQuery('.ls-timeline-switch li').eq(0).hasClass('active') ) {
slider.api('replay');
return false;
}
});
},
stopLayerPreview: function(forceStop){
if(this.isLayerPreviewActive) {
// Change preview state
this.isLayerPreviewActive = false;
LayerSlider.showPreviewSelection();
jQuery('.ls-layer-preview-button').removeClass('playing').text( LS_l10n.layer );
jQuery.each(LS_activeLayerDataSet, function(index, item) {
item.skip = false;
});
kmUI.popover.close();
// Restore editing area
// LS_activeLayerDataSet.skip = false;
if( forceStop ) {
LayerSlider.generateSelectedPreviewItems();
}
jQuery('.ls-layer-preview-wrapper').layerSlider( 'destroy', true );
LS_previewArea.children().removeClass('ls-transparent');
}
},
appendLivePreviewItem: function(layerKey, layerData, $slide, post) {
// Skip sublayer?
if( !!layerData.skip || layerData['hide_on_'+LS_activeScreenType] ) {
return true;
}
// Gather sublayer data
var type = layerData.type;
switch( layerData.media ) {
case 'img':
type = 'img';
break;
case 'button':
case 'icon':
type = 'span';
break;
case 'html':
case 'media':
type = 'div';
break;
case 'post':
type = 'post';
break;
}
var image = layerData.image,
html = layerData.html,
style = layerData.style,
top = layerData.styles.top,
left = layerData.styles.left,
skip = layerData.hasOwnProperty('skip'),
url = layerData.url,
id = layerData.id,
classes = layerData['class'],
innerAttrs = layerData.innerAttributes || {},
outerAttrs = layerData.outerAttributes || {};
// Transition properties
var sublayerprops = '', trKey, trVal;
for( trKey in layerData.transition) {
trVal = layerData.transition[ trKey ];
if( trKey.indexOf('perspective') !== -1 && trVal.toString() === '500') {
continue;
}
if( trKey === 'backgroundvideo' && ! trVal ) {
continue;
}
if( trVal !== '' && trVal !== null && trVal !== 'null' && trVal !== 'inherit' ) {
sublayerprops += trKey+':'+trVal+';';
}
}
// Styles
var styles = {}, cssProp, cssVal;
for( cssProp in layerData.styles ) {
cssVal = layerData.styles[cssProp];
if( ( ! cssVal && cssVal !== 0 ) || cssVal === 'unset' ) { continue; }
cssVal = cssVal.toString();
if(cssVal.slice(-1) == ';' ) {
cssVal = cssVal.substring(0, cssVal.length - 1);
}
if (cssVal) { // !! fix for unused styles don't override Custom CSS
styles[cssProp] = isNumber(cssVal) ? cssVal + 'px' : cssVal;
if( ['z-index', 'font-weight', 'opacity'].indexOf( cssProp ) !== -1 ) {
styles[cssProp] = cssVal;
}
}
}
// Background
if( layerData.layerBackground ) {
styles['background-image'] = 'url("'+layerData.layerBackground+'")';
}
// Build the sublayer
var sublayer;
if(type == 'img') {
if(!image) { return true; }
if(image == '[image-url]') { image = post['image-url']; }
sublayer = jQuery('<img src="'+image+'" class="ls-l">').appendTo($slide);
} else if(type == 'post') {
// Parse post placeholders
var textlength = layerData.post_text_length;
for(var key in post) {
if(html.indexOf('['+key+']') !== -1) {
if( (key == 'title' || key == 'content' || key == 'excerpt') && textlength > 0) {
post[key] = post[key].substr(0, textlength);
}
html = html.replace('['+key+']', post[key]);
}
}
// Test html
html = jQuery.trim(html);
var first = html.substr(0, 1);
var last = html.substr(html.length-1, 1);
if(first == '<' && last == '>') {
html = html.replace(/(\r\n|\n|\r)/gm,"");
sublayer = jQuery(html).appendTo($slide).addClass('ls-l');
} else {
sublayer = jQuery('<div>').appendTo($slide).html(html).addClass('ls-l');
}
} else {
sublayer = jQuery('<'+type+'>').appendTo($slide).html(html).addClass('ls-l');
// Rewrite Youtube/Vimeo iframe src to data-src
var $video = sublayer.find('iframe[src*="youtube-nocookie.com"], iframe[src*="youtube.com"], iframe[src*="youtu.be"], iframe[src*="player.vimeo"]');
if( $video.length ) {
$video.attr('data-src', $video.attr('src') ).removeAttr('src');
}
}
// Apply styles
sublayer
.attr({ 'id': id, 'style': style })
.css(styles)
.css('white-space', !layerData.styles.wordwrap ? 'nowrap' : 'normal')
.addClass(classes);
// Apply attributes
for( var iaKey in innerAttrs ) {
if( iaKey.toLowerCase() === 'class' ) {
sublayer.addClass( innerAttrs[iaKey] );
continue;
}
sublayer[0].setAttribute(iaKey, innerAttrs[iaKey]);
}
// Position the element
if(top.indexOf('%') != -1) { sublayer.css({ top : top });
} else { sublayer.css({ top : parseInt(top) }); }
if(left.indexOf('%') != -1) { sublayer.css({ left : left });
} else { sublayer.css({ left : parseInt(left) }); }
if( url ) {
if( layerData.linkId ) {
if( '#' === layerData.linkId.substr(0, 1) ) {
url = layerData.linkId;
} else if( '[post-url]' === layerData.linkId ) {
url = post['post-url'];
} else {
url = '#';
}
}
if( '[post-url]' === url ) {
url = post['post-url'];
}
var linkNotification = '';
if( '#' === url && layerData.linkId ) {
linkNotification = ' data-help="'+LS_l10n.SBPreviewLinkNotAvailable.replace('%s', layerData.linkName)+'" data-help-delay="1"';
}
var anchor = jQuery('<a href="'+url+'"'+linkNotification+' target="_blank"></a>');
anchor.attr( outerAttrs );
sublayer.wrap( anchor );
} else {
// Apply attributes
for( var oaKey in outerAttrs ) {
if( oaKey.toLowerCase() === 'class' ) {
sublayer.addClass( outerAttrs[oaKey] );
continue;
}
sublayer[0].setAttribute(oaKey, outerAttrs[oaKey]);
}
}
sublayer.attr('data-ls', sublayerprops);
},
updatePopupNotifications: function() {
var $wrapper = jQuery('#ls-popup-notifications'),
$layout = jQuery('.ls-popup-layout-notification', $wrapper),
$trigger = jQuery('.ls-popup-trigger-notification', $wrapper),
sliderProps = window.lsSliderData.properties,
layoutCond = sliderProps.type !== 'popup',
triggerCond = jQuery.trim(sliderProps.popupShowOnTimeout) || jQuery.trim(sliderProps.popupShowOnIdle) || jQuery.trim(sliderProps.popupShowOnScroll) || sliderProps.popupShowOnLeave || jQuery.trim(sliderProps.popupShowOnClick);
$layout[ layoutCond ? 'removeClass' : 'addClass' ]('ls-hidden');
$trigger[ ! triggerCond ? 'removeClass' : 'addClass' ]('ls-hidden');
$wrapper.children(':not(.ls-hidden):first').removeClass('ls-hidden').siblings().addClass('ls-hidden');
},
updatePopupPositionGrid: function() {
var vPos = window.lsSliderData.properties.popupPositionVertical,
hPos = window.lsSliderData.properties.popupPositionHorizontal;
jQuery('.ls-popup-position td[data-move="'+vPos+' '+hPos+'"]').click();
},
updatePopupPreview: function() {
var fitWidth = window.lsSliderData.properties.popupFitWidth,
fitHeight = window.lsSliderData.properties.popupFitHeight,
vPos = window.lsSliderData.properties.popupPositionVertical,
hPos = window.lsSliderData.properties.popupPositionHorizontal,
$preview = jQuery('.ls-settings-popup .ls-popup-layout-preview .ls-popup-layout-inner');
$preview.attr('class', 'ls-popup-layout-inner ls-popup-'+vPos+' ls-popup-'+hPos);
if( fitWidth ) { $preview.addClass('ls-popup-fitwidth'); }
if( fitHeight ) { $preview.addClass('ls-popup-fitheight'); }
},
updateLayerPreview: function() {
var $slider = jQuery('.ls-real-time-preview .ls-container'),
$layer = jQuery('.ls-layer', $slider);
$slider.layerSlider( 'updateLayerData', $layer, 'scalein: 2; rotatein: 360; scaleout: 2; rotateout: 360; rotate: -45;' );
},
openTransitionGallery: function() {
kmw.modal.open({
content: '#tmpl-ls-transition-modal',
minWidth: 980,
maxWidth: 980,
maxHeight: '100%',
onBeforeClose: function() {
if( window.lsHideTransition ) {
window.lsHideTransition();
}
}
});
// Append transitions
LayerSlider.appendTransition(0, '', '2d_transitions', layerSliderTransitions.t2d);
LayerSlider.appendTransition(1, '', '3d_transitions', layerSliderTransitions.t3d);
// Append custom transitions
if(typeof layerSliderCustomTransitions != "undefined") {
if(layerSliderCustomTransitions.t2d.length) {
LayerSlider.appendTransition(2, '', 'custom_2d_transitions', layerSliderCustomTransitions.t2d);
}
if(layerSliderCustomTransitions.t3d.length) {
LayerSlider.appendTransition(3, '', 'custom_3d_transitions', layerSliderCustomTransitions.t3d);
}
}
jQuery('#ls-transition-window .ls-select-special-transition').each(function() {
var $this = jQuery(this),
name = $this.data('name');
$this.addClass( LS_activeSlideData.properties[ name ] ? 'on' : 'off' );
});
// Select proper tab
jQuery('#ls-transition-window .filters li.active').click();
},
appendTransition: function(index, title, tbodyclass, transitions) {
// Append new section
var section = jQuery( '#ls-transitions-list section:eq('+index+') div' ).empty();
// Get checked transitions
var checked = LS_activeSlideData.properties[tbodyclass];
checked = checked ? checked.split(',') : [];
if( transitions && transitions.length ) {
for( c = 0; c < transitions.length; c++ ){
var addClass = '';
if(checked.indexOf(''+(c+1)+'') != -1 || checked == 'all') {
addClass = 'added';
}
section.append( jQuery( '<div class="tr-item '+addClass+'"data-key="' + ( c + 1 ) + '"><span><i>' + ( c + 1 ) + '</i><i class="dashicons dashicons-yes"></i></span><span>' + transitions[c].name + '</span></div>' ) );
}
}
},
selectAllTransition: function(index, check) {
// Get checkbox and transition type
var checkbox = jQuery('#transitiongallery-header i:last'),
type = jQuery('#ls-transitions-list section').eq(index).data('tr-type');
if(check) {
jQuery( '#ls-transitions-list section:eq('+index+')' ).find('.tr-item').addClass('added');
checkbox.attr('class', 'on').text( LS_l10n.deselectAll );
LS_activeSlideData.properties[ type ] = 'all';
} else {
jQuery( '#ls-transitions-list section:eq('+index+')' ).find('.tr-item').removeClass('added');
checkbox.attr('class', 'off').text( LS_l10n.selectAll);
LS_activeSlideData.properties[ type ] = '';
}
},
toggleTransition: function(el) {
var $item = jQuery(el),
$section = $item.closest('section'),
$trs = $section.find('.tr-item'),
type = $section.data('tr-type');
// Toggle addded class
$item.toggleClass('added');
// All selected
if($trs.filter('.added').length == $trs.length) {
LayerSlider.selectAllTransition( $section.index(), true );
return;
// Uncheck select all
} else {
// Check the checkbox
jQuery('#transitiongallery-header i:last').attr('class', 'off').text( LS_l10n.selectAll );
}
// Gather checked selected transitions
var checked = [];
$trs.filter('.added').each(function() {
checked.push( jQuery(this).data('key') );
});
// Set data
LS_activeSlideData.properties[ type ] = checked.join(',');
},
save: function( saveProperties ) {
saveProperties = saveProperties || {};
// Bring all layers back in,
// as it can mess with saving.
this.stopLayerPreview(true);
// Get the slider data
var sliderData = jQuery.extend(true, {}, window.lsSliderData);
// Temporary disable submit button
jQuery('.ls-publish').addClass('saving').find('button').text( LS_l10n.saving ).attr('disabled', true);
// Serialize slider settings to prevent jQuery form converting form data
sliderData.properties = JSON.stringify(sliderData.properties);
// 1. Iterate over the slides and encode them
// to workaround PHP's array size limitation.
//
// 2. Iterate over the styles object of layers
// to remove empty values added mistakenly.
//
// 3. Also check whether they use dynamic content.
//
// 4. Generate UUIDs on save for every layer for WPML
// and other purposes that requires a persistent ID.
jQuery.each(sliderData.layers, function(slideIndex, slideData) {
slideData.properties.post_content = false;
jQuery.each(slideData.sublayers, function(layerIndex, layerData) {
if( layerData.styles ) {
jQuery.each(layerData.styles, function(cssIndex, cssVal) {
if( cssVal === '' ) {
delete layerData.styles[cssIndex];
}
});
}
layerData.transition = JSON.stringify(layerData.transition);
layerData.styles = JSON.stringify(layerData.styles);
if(slideData.properties.post_content === false && layerData.media == 'post') {
slideData.properties.post_content = true;
}
var uuid = LS_DataSource.uuidForLayer( layerIndex, slideIndex);
sliderData.layers[ slideIndex ].sublayers[ layerIndex ].uuid = uuid;
});
// Reverse the list of layers, as it is only
// a visual thing on the admin UI.
slideData.sublayers.reverse();
sliderData.layers[slideIndex] = JSON.stringify(slideData);
});
// Save slider
jQuery.ajax({
type: 'POST', url: ajaxurl, dataType: 'text',
data: {
_wpnonce: jQuery('#ls-slider-form input[name="_wpnonce"]').val(),
_wp_http_referer: jQuery('#ls-slider-form input[name="_wp_http_referer"]').val(),
action: 'ls_save_slider',
id: LS_sliderID,
sliderData: sliderData
},
error: function(jqXHR, textStatus, errorThrown) {
jQuery('.ls-publish').removeClass('saving').addClass('failed').find('button').text( LS_l10n.error );
setTimeout(function() {
alert( LS_l10n.SBSaveError.replace('%s', errorThrown ) );
}, 100);
},
success: function(jqXHR, textStatus) {
// Consider the editor as "clean", do not show
// unsaved changes warning when leaving the page.
LS_editorIsDirty = false;
// Button feedback
jQuery('.ls-publish').removeClass('saving').addClass('saved').find('button').text( LS_l10n.saved );
// Display on screen notification when save
// was initiated by a keyboard shortcut.
if( saveProperties.usedShortcut && typeof lsScreenOptions !== 'undefined' && lsScreenOptions.useNotifyOSD === 'true' ) {
kmUI.notify.show({
icon: 'dashicons-yes',
iconColor: '#7eb917',
text: LS_l10n.notifySliderSaved
});
}
},
complete: function(data) {
setTimeout(function() {
jQuery('.ls-publish').removeClass('saved failed').find('button').text( LS_l10n.save ).attr('disabled', false);
kmUI.notify.hide();
}, 2000);
}
});
},
};
var LS_InsertIcons = {
timeout: null,
init: function() {
jQuery('#ls-layers').on('click', '.ls-insert-icon', function(e) {
e.preventDefault();
LS_InsertIcons.showIcons();
});
jQuery('#ls-layers').on('click', '.ls-replace-icon', function(e) {
e.preventDefault();
var $textarea = jQuery('.ls-sublayer-page textarea[name="html"]');
$textarea.val('');
LS_InsertIcons.showIcons();
});
jQuery(document).on('click', '#ls-insert-icons-modal-window section div', function(e) {
e.preventDefault();
LS_InsertIcons.insert( this );
});
jQuery(document).on('input change', '#ls-insert-icons-modal-window input', function(e) {
e.preventDefault();
LS_InsertIcons.search( jQuery(this).val() );
});
},
showIcons: function() {
kmw.modal.open({
content: '#tmpl-insert-icons-modal',
maxWidth: 930,
minWidth: 400,
maxHeight: '100%'
});
},
search: function( term ) {
// No search term.
// Make sure to display everything.
if( ! term || term.length < 2 ) {
jQuery('#ls-insert-icons-modal-window section').show().prev().show();
jQuery('#ls-insert-icons-modal-window section div').show();
// Filter
} else {
clearTimeout( LS_InsertIcons.timeout );
LS_InsertIcons.timeout = setTimeout(function() {
jQuery('#ls-insert-icons-modal-window section').each(function() {
var hasMatch = false;
jQuery('div', this).each(function() {
if( jQuery(this).data('help').indexOf( term ) !== -1 ) {
hasMatch = true;
} else {
jQuery(this).hide();
}
});
// Hide the section if there are no matches
if( ! hasMatch ) {
jQuery(this).hide().prev().hide();
}
});
}, 200);
}
},
insert: function( icon ) {
var $icon = jQuery( icon ),
text = '<i class="fa fa-'+$icon.data('help')+'"></i>',
element = jQuery('.ls-sublayer-page textarea[name="html"]')[0];
element.value += ' '+text;
jQuery(element).trigger('input').trigger('change');
LS_InsertIcons.close();
},
close: function() {
setTimeout(function() {
kmUI.popover.close();
}, 500);
kmw.modal.close();
}
};
var LS_InsertMedia = {
init: function() {
jQuery('#ls-layers').on('click', '.ls-open-media-modal-button', function(e) {
e.preventDefault();
LS_InsertMedia.open();
});
jQuery(document).on('input', '#tmpl-insert-media-modal-window input, #tmpl-insert-media-modal-window textarea', function() {
LS_InsertMedia.preview( jQuery( this ) );
});
jQuery(document).on('click', '#tmpl-insert-media-modal-window button.ls-html5-button', function(e) {
e.preventDefault();
kmw.modal.close( false, {
onClose: function() {
jQuery('.ls-sublayer-pages .ls-insert-media').click();
}
});
});
jQuery(document).on('click', '#tmpl-insert-media-modal-window button.ls-insert', function(e) {
e.preventDefault();
LS_InsertMedia.insert( jQuery( this ) );
});
},
open: function() {
kmw.modal.open({
content: '#tmpl-insert-media-modal',
minWidth: 980,
maxWidth: 980
});
},
parseURL: function() {
},
preview: function( $input ) {
var $preview = jQuery('#tmpl-insert-media-modal-window .ls-media-preview'),
inputVal = $input.val(),
videoID,
$media;
// Empty field, reset preview
if( '' === inputVal ) {
$preview.html('');
return;
}
// Insert from URL
if( $input.is('input') ) {
// Vimeo
if( -1 !== inputVal.indexOf('vimeo') ) {
videoID = LS_InsertMedia.parseVimeoURL( inputVal );
if( videoID ) {
$preview.html('<iframe src="https://player.vimeo.com/video/'+videoID+'" width="240" height="240" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>')
}
// YouTube
} else if( -1 !== inputVal.indexOf('youtu') ) {
videoID = LS_InsertMedia.parseYouTubeURL( inputVal );
if( videoID ) {
$preview.html('<iframe width="240" height="240" src="https://www.youtube.com/embed/'+videoID+'" frameborder="0" allowfullscreen></iframe>')
}
}
// Embed code
} else {
try {
$media = jQuery( inputVal );
$media.attr({ width: 240, height: 240 });
$preview.html( $media );
} catch (e) {
$preview.html('');
}
}
},
parseYouTubeURL: function( url ) {
var matches = url.match(/^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/);
if( matches && matches[1] ) {
return matches[1];
}
return false;
},
parseVimeoURL: function( url ) {
var matches = url.match(/^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?([0-9]+)/);
if( matches && matches[5] ) {
return matches[5];
}
return false;
},
insert: function( $button ) {
var $target = jQuery('.ls-sublayer-pages .ls-html-code textarea'),
targetVal = $target.val(),
mediaVal = $button.prev().val(),
success = false;
// Insert from URL
if( $button.prev().is('input') ) {
// Vimeo
if( -1 !== mediaVal.indexOf('vimeo') ) {
videoID = LS_InsertMedia.parseVimeoURL( mediaVal );
if( videoID ) {
success = true;
$target.val('<iframe src="https://player.vimeo.com/video/'+videoID+'" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>')
}
// YouTube
} else if( -1 !== mediaVal.indexOf('youtu') ) {
videoID = LS_InsertMedia.parseYouTubeURL( mediaVal );
if( videoID ) {
success = true;
$target.val('<iframe width="560" height="315" src="https://www.youtube.com/embed/'+videoID+'" frameborder="0" allowfullscreen></iframe>')
}
}
// Embed code
} else {
success = true;
$target.val( mediaVal );
}
if( success ) {
// Set up undoManager action
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayer, {
itemIndex: LS_activeLayerIndexSet[0],
undo: { html: targetVal },
redo: { html: $target.val() }
});
// Save new value to DataStore
LS_activeLayerDataSet[0].html = $target.val();
// Generate preview and close modal
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
LS_InsertMedia.close();
}
},
close: function() {
kmw.modal.close();
}
};
var LS_ButtonPresets = {
init: function() {
jQuery('#ls-layers').on('click', '.ls-choose-button-preset', function(e) {
e.preventDefault();
LS_ButtonPresets.open();
});
jQuery(document).on('click', '#tmpl-button-presets-modal-window li', function() {
LS_ButtonPresets.apply( this );
});
},
open: function() {
kmw.modal.open({
content: '#tmpl-button-presets',
maxWidth: 980,
minWidth: 980
});
},
apply: function( li ) {
var data = jQuery( li ).data('options'),
layerStyles = LS_activeLayerDataSet[0].styles,
undoObj = {},
redoObj = {};
data = typeof data === 'object' ? data : JSON.parse( data );
data = jQuery.extend( true, {}, data );
// Make sure to maintain layer position
data.top = layerStyles.top;
data.left = layerStyles.left;
// Make sure to empty custom CSS
LS_activeLayerDataSet[0].style = '';
// Gather changes for UndoManager
jQuery.each(data, function( prop, val ) {
if( prop === 'html' ) {
LS_activeLayerDataSet[0].html = val;
} else if( prop === 'style' ) {
LS_activeLayerDataSet[0].style = val;
}
if( layerStyles[ prop ] != val ) {
undoObj[ prop ] = layerStyles[ prop ] || '';
redoObj[ prop ] = val;
}
});
// Apply preset data
LS_activeLayerDataSet[0].styles = data;
// Add to UndoManager
LS_UndoManager.add('layer.style', LS_l10n.SBUndoLayerStyles, {
itemIndex: LS_activeLayerIndexSet[0],
undo: undoObj,
redo: redoObj
});
LS_DataSource.buildLayer( LS_activeLayerIndexSet[0] );
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
LS_ButtonPresets.close();
},
close: function() {
kmw.modal.close();
}
};
var LS_ImportSlide = {
init: function() {
jQuery(document).on('click', '#ls-import-slide', function(e) {
e.preventDefault();
LS_ImportSlide.open( );
});
jQuery(document).on('click', '#tmpl-import-slide-modal-window .ls-import-layer-sliders .slider-item', function() {
LS_ImportLayer.selectSlider( this );
});
jQuery(document).on('click', '#tmpl-import-slide-modal-window .ls-import-layer-slides .slider-item', function() {
LS_ImportSlide.selectSlide( this );
});
},
open: function() {
kmw.modal.open({
content: '#tmpl-import-slide',
maxWidth: 980,
minWidth: 980,
maxHeight: '100%'
});
setTimeout(function() {
kmUI.popover.close();
LS_ImportLayer.loadSliders();
}, 300);
},
selectSlide: function( item ) {
var $item = jQuery(item);
$item.addClass('added');
LayerSlider.addSlide( $item.data('slide-data') );
}
};
var LS_ImportLayer = {
init: function() {
jQuery(document).on('click', '#tmpl-import-layer-modal-window .ls-import-layer-sliders .slider-item', function() {
LS_ImportLayer.selectSlider( this );
});
jQuery(document).on('click', '#tmpl-import-layer-modal-window .ls-import-layer-slides .slider-item', function() {
LS_ImportLayer.selectSlide( this );
});
jQuery(document).on('click', '#tmpl-import-layer-modal-window .ls-import-layer-layers .layer-item', function() {
LS_ImportLayer.selectLayer( this );
});
},
open: function() {
kmw.modal.open({
content: '#tmpl-import-layer',
minWidth: 980,
maxWidth: 980,
maxHeight: '100%'
});
setTimeout(function() {
LS_ImportLayer.loadSliders();
}, 300);
},
loadSliders: function() {
jQuery.getJSON( ajaxurl, { action: 'ls_get_mce_sliders' }, function( data ) {
var $target = jQuery('.ls-import-layer-sliders');
if( ! data || ! data.length ) {
$target.html(LS_l10n.SBImportLayerNoSlider);
return;
}
$target.empty();
jQuery.each(data, function(index, item) {
var $item = jQuery('<div class="slider-item">\
<div class="slider-item-wrapper">\
<div class="preview">\
<div class="no-preview">\
<h5>'+LS_MCE_l10n.MCENoPreview+'</h5>\
</div>\
</div>\
<div class="info">\
<div class="name"></div>\
</div>\
</div>\
</div>');
$item.data({
'id': item.id,
'slug': item.slug
});
if( item.preview ) {
jQuery('.preview', $item).empty().css({
'background-image': 'url('+item.preview+')'
});
}
jQuery('.name', $item).html( item.name );
$item.appendTo( $target );
});
});
},
selectSlider: function( item ) {
var $item = jQuery(item);
$item.addClass('selected').siblings().removeClass('selected');
jQuery('.ls-import-layer-layers').html( LS_l10n.SBImportLayerSelectSlide );
LS_ImportLayer.loadSlides( $item.data('id') );
},
loadSlides: function( sliderID ) {
jQuery.getJSON( ajaxurl, { action: 'ls_get_mce_slides', sliderID: sliderID }, function( data ) {
var $target = jQuery('.ls-import-layer-slides');
if( ! data || ! data.length ) {
$target.html(LS_l10n.SBImportLayerNoSlide);
return;
}
$target.empty();
jQuery.each(data, function(index, item) {
if( ! item || ! item.properties ) {
return true;
}
var $item = jQuery('<div class="slider-item">\
<div class="slider-item-wrapper">\
<div class="preview">\
<div class="no-preview">\
<h5>'+LS_MCE_l10n.MCENoPreview+'</h5>\
</div>\
</div>\
<div class="info">\
<div class="name"></div>\
</div>\
</div>\
</div>');
$item.data('slide-data', item);
if( item.properties.background || item.properties.thumbnail ) {
var img = item.properties.thumbnail || item.properties.background;
jQuery('.preview', $item).empty().css({
'background-image': 'url('+img+')'
});
}
jQuery('.name', $item).html( item.properties.title );
$item.appendTo( $target );
});
});
},
selectSlide: function( item ) {
var $item = jQuery(item);
$item.addClass('selected').siblings().removeClass('selected');
LS_ImportLayer.loadLayers( $item.data('slide-data') );
},
loadLayers: function( slideData ) {
var $holder = jQuery('.ls-import-layer-layers');
if( ! slideData || ! slideData.sublayers || ! slideData.sublayers.length ) {
$holder.html(LS_l10n.SBImportLayerNoLayer);
return;
}
$holder.html('<table><tbody></tbody></table>');
var $target = jQuery('.ls-import-layer-layers table tbody');
jQuery.each(slideData.sublayers, function(index, item) {
var $item = jQuery('<tr class="layer-item">\
<td class="preview">\
<i class="dashicons"></i>\
</td>\
<td class="type"></td>\
<td class="name">\
<div>\
<span></span>\
<i class="dashicons dashicons-yes"></i>\
</div>\
</td>\
</tr>');
$item.data('layer-data', item);
var mediaIcons = {
img: 'dashicons-format-image',
icon: 'dashicons-flag',
text: 'dashicons-text',
button: 'dashicons-marker',
media: 'dashicons-video-alt3',
html: 'dashicons-editor-code',
post: 'dashicons-admin-post'
};
var mediaTypes = {
img: LS_l10n.SBLayerTypeImg,
icon: LS_l10n.SBLayerTypeIcon,
text: LS_l10n.SBLayerTypeText,
button: LS_l10n.SBLayerTypeButton,
media: LS_l10n.SBLayerTypeMedia,
html: LS_l10n.SBLayerTypeHTML,
post: LS_l10n.SBLayerTypePost
};
jQuery('.preview .dashicons', $item).addClass( mediaIcons[ item.media ] );
jQuery('.type', $item).html( mediaTypes[ item.media ] );
jQuery('.name span', $item).html( item.subtitle );
if( item.media === 'img' && item.image ) {
jQuery('.preview', $item).html('<img src="'+item.image+'">');
}
$item.appendTo( $target );
});
},
selectLayer: function( tr ) {
$tr = jQuery( tr );
// Highlight row
$tr.addClass('added');
// Add layer
LayerSlider.addLayer( [ $tr.data('layer-data') ] );
},
close: function() {
kmw.modal.close();
}
};
var LS_PostOptions = {
init: function() {
jQuery('#ls-layers').on('click', '.ls-configure-posts', function(e) {
e.preventDefault(); LS_PostOptions.open(this);
});
jQuery('#ls-post-options select:not(.ls-post-taxonomy, .post_offset)').change(function() {
window.lsSliderData.properties[ jQuery(this).attr('name') ] = jQuery(this).val();
LS_PostOptions.change(this);
});
jQuery('#ls-post-options select.offset').change(function() {
LS_activeSlideData.properties.post_offset = jQuery(this).val();
LayerSlider.willGeneratePreview();
});
jQuery('#ls-post-options select.ls-post-taxonomy').change(function() {
window.lsSliderData.properties.post_taxonomy = jQuery(this).val();
LS_PostOptions.getTaxonoies(this);
});
jQuery('#ls-layers').on('click', '.ls-post-placeholders li', function() {
LS_PostOptions.insertPlaceholder(this);
});
},
open: function(el) {
kmw.modal.open({
id: 'ls-post-options-window',
content: jQuery('#ls-post-options'),
minWidth: 880,
maxWidth: 880
});
// Get slide's post offset
var offset = parseInt(LS_activeSlideData.properties.post_offset) + 1;
// Show modal window
var modal = jQuery('#ls-post-options').show();
modal.find('select.offset option').prop('selected', false).eq(offset).prop('selected', true);
// First open?
if(modal.find('.ls-post-previews ul').children().length === 0) {
LS_PostOptions.change( modal.find('select')[0] );
}
},
getTaxonoies: function(select) {
var target = jQuery(select).next().empty();
if(jQuery(select).val() == 0) {
LS_PostOptions.change(select);
} else {
jQuery.post(ajaxurl, jQuery.param({ action : 'ls_get_taxonomies', taxonomy : jQuery(select).val() }), function(data) {
data = jQuery.parseJSON(data);
for(c = 0; c < data.length; c++) {
target.append( jQuery('<option>', { 'value' : data[c].term_id, 'text' : data[c].name }));
}
});
}
},
change: function(el) {
// Get options
var items = {};
jQuery('#ls-post-options').find('select').each(function() {
items[ jQuery(this).data('param') ] = jQuery(this).val();
});
jQuery.post(ajaxurl, jQuery.param({ action: 'ls_get_post_details', params : items }), function(data) {
// Handle data
var parsed = jQuery.parseJSON(data);
window.lsPostsJSON = parsed;
// Update preview
LayerSlider.willGeneratePreview();
LS_PostOptions.update(el, parsed );
});
},
update: function(el, data) {
var preview = jQuery('#ls-post-options').find('.ls-post-previews ul').empty();
if(data.length === 0) {
preview.append( jQuery('<li>')
.append( jQuery('<h4>', { 'text' : LS_l10n.SBPostFilterWarning }) )
);
} else {
for(c = 0; c < data.length; c++) {
var content = data[c].content;
if( content ) {
content = content.replace(/<br>/g, '');
content = content.replace(/<br \/>/g, '');
}
preview.append( jQuery('<li>')
.append( jQuery('<span>', { 'class' : 'counter', 'text' : ''+(c+1)+'. ' }))
.append( jQuery('<img>', { 'src' : data[c]['thumbnail-url'] } ))
.append( jQuery('<h3>', { 'html' : data[c].title } ))
.append( jQuery('<div>', { 'class': 'content', 'html' : content } ))
.append( jQuery('<span>', { 'class' : 'author', 'text' : data[c]['date-published']+' by '+data[c].author } ))
);
}
}
},
close: function() {
kmw.modal.close();
},
insertPlaceholder: function(el) {
var element = jQuery(el).closest('.ls-sublayer-page').find('textarea[name="html"]')[0];
var text = (typeof jQuery(el).data('placeholder') != "undefined") ? jQuery(el).data('placeholder') : jQuery(el).children().text();
if (document.selection) {
element.focus();
var sel = document.selection.createRange();
sel.text = text;
element.focus();
} else if (element.selectionStart || element.selectionStart === 0) {
var startPos = element.selectionStart;
var endPos = element.selectionEnd;
var scrollTop = element.scrollTop;
element.value = element.value.substring(0, startPos) + text + element.value.substring(endPos, element.value.length);
element.focus();
element.selectionStart = startPos + text.length;
element.selectionEnd = startPos + text.length;
element.scrollTop = scrollTop;
} else {
element.value += text;
element.focus();
}
jQuery(element).trigger('input').trigger('change');
}
};
var LS_PostChooser = {
timeout: null,
data: null,
opened: null,
init: function() {
jQuery('#ls-layers').on('click', '.ls-slide-link a.post', function(e) {
e.preventDefault();
LS_PostChooser.opener = this;
LS_PostChooser.open();
});
jQuery(document).on('click', '#ls-post-chooser-modal-window li', function(e) {
e.preventDefault();
LS_PostChooser.select( jQuery(this) );
});
jQuery(document).on('keyup', '#ls-post-chooser-modal-window input', function(e) {
LS_PostChooser.search();
}).on('change', '#ls-post-chooser-modal-window select', function(e) {
LS_PostChooser.search(1);
}).on('submit', '#ls-post-chooser-modal-window form', function(e) {
e.preventDefault();
LS_PostChooser.search(1);
});
},
open: function() {
kmw.modal.open({
content: '#tmpl-post-chooser',
minWidth: 720,
maxWidth: 930,
maxHeight: '100%'
});
this.search();
},
search: function( timeout ) {
timeout = timeout || 300;
clearTimeout( LS_PostChooser.timeout );
LS_PostChooser.timeout = setTimeout(function() {
var $form = jQuery('#ls-post-chooser-modal-window form');
jQuery.getJSON( ajaxurl, $form.serialize(), function( data ) {
LS_PostChooser.data = data;
jQuery('#ls-post-chooser-modal-window .ls-post-previews ul').empty();
jQuery.each( data, function( index, item ) {
jQuery('<li>\
<img src="'+item['image-url']+'">\
<h3>'+item.title+'</h3>\
<div>'+item.content.substr(0, 200)+'</div>\
<span class="author">'+item['date-published']+' by '+item.author+'</span>\
</li>').appendTo('#ls-post-chooser-modal-window .ls-post-previews ul');
});
});
}, timeout);
},
select: function( $li ) {
var item = LS_PostChooser.data[ $li.index() ],
l10nKey = 'SBLinkText'+ucFirst(item['post-type']),
$holder = jQuery(LS_PostChooser.opener).closest('.ls-slide-link'),
$input = jQuery('input.url', $holder);
// Normalize HTML entities
item.title = jQuery('<textarea>').html( item.title ).text();
// Set link properties
$input.val( LS_l10n[l10nKey].replace('%s', item.title) )
.prop('disabled', true)
.next()
.val( item['post-id'] )
.next()
.val( item.title )
.next()
.val( item['post-type'] );
// UndoManager action name
var isSlide = $holder.closest('.ls-slide-options').length,
linkData = isSlide ? LS_activeSlideData.properties : LS_activeLayerDataSet[0],
undoText = isSlide ? LS_l10n.SBUndoSlide : LS_l10n.SBUndoLayer,
undoArea = isSlide ? 'slide.general' : 'layer.general',
undoIndex = isSlide ? LS_activeSlideIndex : LS_activeLayerIndexSet[0],
urlField = isSlide ? 'layer_link' : 'url';
// Add link change to UndoManager
LS_UndoManager.add( undoArea, undoText, {
itemIndex: undoIndex,
undo: {
[urlField]: linkData[urlField] || '',
linkId: linkData.linkId || '',
linkName: linkData.linkName || '',
linkType: linkData.linkType || ''
},
redo: {
[urlField]: LS_l10n[l10nKey].replace('%s', item.title),
linkId: item['post-id'],
linkName: item.title,
linkType: item['post-type']
}
});
// Set link placeholder & push data to datastore
$holder.addClass('has-link').find('input').trigger( 'input' );
kmw.modal.close();
}
};
var LS_DataSource = {
buildSlide: function() {
var $slide = jQuery('#ls-layers .ls-layer-box');
var $slideOptions = $slide.find('.ls-slide-options');
// Reset checkboxes
$slideOptions.find('.ls-checkbox').remove();
$slideOptions.find('input:checkbox').prop('checked', false);
// Get default slide options
var defaults = LS_DataSource.getDefaultSlideData();
// Loop through slide option form items
var $formItems = jQuery($slideOptions.find('input,textarea,select'));
LS_DataSource.setFormItemValues($formItems, LS_activeSlideData.properties, defaults);
// Set checboxes and color picker
$slideOptions.find('input:checkbox').customCheckbox();
LayerSlider.addColorPicker( $slideOptions.find('.ls-colorpicker') );
// Set image placeholders
LS_GUI.updateImagePicker( 'background', LS_activeSlideData.properties.backgroundThumb );
LS_GUI.updateImagePicker( 'thumbnail', LS_activeSlideData.properties.thumbnailThumb );
LS_GUI.updateLinkPicker('layer_link');
LayerSlider.updateCustomSlideProperties();
this.buildLayersList();
},
buildLayersList: function( buildProperties ) {
buildProperties = buildProperties || { updateLayer: true };
// Get the layer list and empty it (if any)
var $layersList = jQuery('#ls-layers .ls-sublayers').empty();
// Build layers
var numOfLayers = !LS_activeSlideData.sublayers ? 0 : LS_activeSlideData.sublayers.length;
var $template = jQuery(jQuery('#ls-layer-item-template').html());
for(var c = 0; c < numOfLayers; c++) {
var layerData = LS_activeSlideData.sublayers[c];
var $layer = $template.clone();
$layer.find('.ls-sublayer-number').text(c+1);
$layer.find('.ls-sublayer-title').val(layerData.subtitle);
// Hidden layer
if(layerData.skip) { $layer.find('.ls-icon-eye').addClass('disabled'); }
// Locked layer
if(layerData.locked) { $layer.find('.ls-icon-lock').removeClass('disabled'); }
// Not visible on current screen type
$layer[ layerData['hide_on_'+LS_activeScreenType] ? 'addClass' : 'removeClass' ]('dim');
LayerSlider.setLayerMedia( layerData.media, jQuery('.ls-sublayer-thumb', $layer), layerData );
$layersList.append($layer);
}
// Reset static layers
jQuery('.ls-layers-list .subheader').hide();
jQuery('.ls-static-sublayers').empty();
jQuery('.ls-sublayer-wrapper').removeClass('has-static-layers');
// Add static layers (if any)
if( LS_activeStaticLayersDataSet.length ) {
jQuery('.ls-layers-list .subheader').show();
jQuery('.ls-sublayer-wrapper').addClass('has-static-layers');
$template = jQuery( jQuery('#ls-static-layer-item-template').html() );
jQuery.each(LS_activeStaticLayersDataSet, function(idx, data) {
var layerData = data.layerData,
$layer = $template.clone();
$layer.find('.ls-sublayer-number').text(idx+1);
$layer.find('.ls-sublayer-title').text(layerData.subtitle);
LayerSlider.setLayerMedia( layerData.media, jQuery('.ls-sublayer-thumb', $layer), layerData );
$layer.appendTo('.ls-static-sublayers');
});
}
// Select first layer
jQuery.each(LS_activeLayerIndexSet, function(index, layerIndex) {
$layersList.children().eq( layerIndex ).addClass('active');
});
if( buildProperties.updateLayer ) {
this.buildLayer();
}
},
buildLayersListItem: function( layerIndex ) {
var layerData = LS_activeSlideData.sublayers[ layerIndex ],
$template = jQuery(jQuery('#ls-layer-item-template').html()),
$target = jQuery('#ls-layers .ls-sublayers li').eq( layerIndex );
$layer = $template.clone();
$layer.find('.ls-sublayer-number').text(layerIndex+1);
$layer.find('.ls-sublayer-title').val(layerData.subtitle);
// Hidden layer
if(layerData.skip) { $layer.find('.ls-icon-eye').addClass('disabled'); }
// Locked layer
if(layerData.locked) { $layer.find('.ls-icon-lock').removeClass('disabled'); }
// Not visible on current screen type
$layer[ layerData['hide_on_'+LS_activeScreenType] ? 'addClass' : 'removeClass' ]('dim');
// Active?
if( LS_activeLayerIndexSet[0] === $target.index() ) {
$layer.addClass('active');
}
LayerSlider.setLayerMedia( layerData.media, jQuery('.ls-sublayer-thumb', $layer), layerData );
$target.replaceWith( $layer );
},
buildLayer: function() {
// Bail out early if there's no layers on slide
if( ! LS_activeLayerDataSet.length ||
! LS_activeSlideData.sublayers.length) {
return false;
}
// Find active layer
var $layerItem = jQuery('#ls-layers .ls-sublayers li.active'),
$layer = jQuery('.ls-sublayer-pages'),
layerIndex = LS_activeLayerIndexSet[0],
layerData = LS_activeLayerDataSet[0];
// Empty earlier layers and add new
jQuery('.ls-sublayer-pages').empty();
jQuery('.ls-sublayer-pages').html( jQuery('#ls-layer-template').html() );
// Reset checkboxes
// $layer.find('.ls-checkbox').remove();
// $layer.find('input:checkbox:not(.noreset)').prop('checked', false);
var $formItems = jQuery('input,textarea,select', $layer).filter(':not(.auto,.sublayerprop)'),
$styleItems = jQuery('input,textarea,select', $layer).filter('.auto'),
$transitionItems = jQuery('input,textarea,select', $layer).filter('.sublayerprop');
LS_DataSource.setFormItemValues($formItems, layerData);
LS_DataSource.setFormItemValues($styleItems, layerData.styles);
jQuery('.ls-border-padding input').each(function() {
LayerSlider.updateLayerBorderPadding( this );
});
// Backwards compatibility: put transitions settings into
// the 'transition' object within the layer data
if( ! layerData.transition || jQuery.isEmptyObject(layerData.transition) ) {
this.restoreOldTransitionSettings( $transitionItems );
}
LS_DataSource.setFormItemValues($transitionItems, layerData.transition);
LayerSlider.updateLayerAttributes( layerData );
LayerSlider.updateLayerInterfaceItems(layerIndex);
// Set image placeholder
LS_GUI.updateImagePicker('image', layerData.imageThumb );
LS_GUI.updateImagePicker('poster', layerData.posterThumb );
// Set link placeholder
LS_GUI.updateLinkPicker('url');
// Set static layer chooser
LayerSlider.setupStaticLayersChooser( $layer.find('.ls-sublayer-options select[name="static"]')[0] );
// Layer background notification:
LayerSlider.updateLayerBackgroundNotification();
// Init custom interface plugins
$layer.find(':checkbox:not(.noreplace)').customCheckbox();
LayerSlider.addColorPicker( $layer.find('.ls-colorpicker') );
LayerSlider.changeLayerScreenType();
LayerSlider.changeVideoType();
jQuery('#ls-layer-transitions section .ls-h-button input').each(function() {
var $input = jQuery(this),
$section = $input.closest('section'),
index = $section.index(),
$target = jQuery('#ls-transition-selector-table td:not(.ls-padding)');
if( $input.prop('checked') && layerData.transition[ $input.attr('name') ] !== false ) {
$target.eq( index ).addClass('active');
} else if( $input.prop('checked') ) {
$input.prop('checked', false);
$input.next().removeClass('on');
}
});
jQuery('#ls-transition-selector-table td:not(.ls-padding)').eq(LS_activeLayerTransitionTab).click();
LayerSlider.checkForOpeningTransition();
// Select lastly viewed subpage
LayerSlider.selectLayerPage(LS_activeLayerPageIndex);
if( LS_activeLayerIndexSet.length > 1 ) {
LayerSlider.startMultipleSelection();
}
},
setFormItemValues: function($items, values, defaults) {
// Bail out early if no value was specified
if( ! $items || ! values || jQuery.isEmptyObject( values ) ) { return false; }
// Iterate over items
for(var itemIndex = 0; itemIndex < $items.length; itemIndex++) {
var $item = jQuery($items[itemIndex]),
value = values[ $item.attr('name') ];
if( ! $item.attr('name') ) { continue; }
if( ! value && value !== false ) {
if( typeof defaults == 'undefined' ) {
continue;
}
value = defaults[$item.attr('name')];
}
// Checkboxes
if($item.is(':checkbox')) {
$item.prop('checked', Boolean(value)).data('value', Boolean(value));
// Input, textarea
} else if($item.is('input,textarea')) {
$item.val(value).data('value', value);
// Select
} else if($item.is('select')) {
$item.children().prop('selected', false);
$item.children('[value="'+value+'"]').prop('selected', true);
$item.data('value', value);
}
}
},
readSliderSettings: function() {
// Return previously stored data whenever it's possible
if( !jQuery.isEmptyObject(LS_defaultSliderData) ) {
return LS_defaultSliderData;
}
var settings = {};
jQuery('.ls-slider-settings').find('input,textarea,select').each(function() {
var item = jQuery(this),
prop = item.attr('name'),
val = item.is(':checkbox') ? item.prop('checked') : item.val();
if(prop && val !== false) { settings[ prop ] = val; }
});
return settings;
},
parseSliderSetting: function() {
var settings = window.lsSliderData.properties,
key,
val;
for( key in settings ) {
switch( settings[key] ) {
case 'on':
case 'true':
settings[key] = true;
break;
case 'off':
case 'false':
settings[key] = false;
break;
}
}
},
getDefaultSlideData: function() {
// Return previously stored data whenever it's possible
if( ! jQuery.isEmptyObject(LS_defaultSlideData)) {
return LS_defaultSlideData;
}
// Get slide template
var $template = jQuery( jQuery('#ls-slide-template').text() );
// Iterate over form items and add their values to LS_defaultSlideData
jQuery('.ls-slide-options', $template).find('input, textarea, select').each(function() {
var item = jQuery(this),
prop = item.attr('name'),
val = item.is(':checkbox') ? item.prop('checked') : item.val();
if( prop ) { LS_defaultSlideData[ prop ] = val; }
});
return LS_defaultSlideData;
},
getDefaultLayerData: function() {
// Build the default data object if there's no
// stored copy yet
if( jQuery.isEmptyObject( LS_defaultLayerData ) ) {
var $template = jQuery( jQuery('#ls-layer-template').text() ),
$inputs = jQuery();
// Transition and style options will be stored in a sub-object
LS_defaultLayerData.transition = {};
LS_defaultLayerData.styles = {};
$template.each(function() {
var $this = jQuery(this);
if( $this.hasClass('ls-sublayer-options') ) {
jQuery('section .toggle', this).filter(':checkbox:checked').each(function() {
$inputs = $inputs.add( jQuery('input, textarea, select', jQuery(this).closest('section') ) );
});
} else {
$inputs = $inputs.add( jQuery('input, textarea, select', $this) );
}
});
// Iterate over form items and add their values to LS_defaultLayerData
$inputs.each(function() {
var item = jQuery(this),
prop = item.attr('name'),
val = item.is(':checkbox') ? item.prop('checked') : item.val();
if( prop ) {
if( item.hasClass('sublayerprop') ) {
LS_defaultLayerData.transition[prop] = val;
} else if( item.hasClass('auto') ) {
if( val !== '' ) {
LS_defaultLayerData.styles[prop] = val;
}
} else {
LS_defaultLayerData[prop] = val;
}
}
});
}
// Make sure to always override the layer title in the stored copy
// to avoid name collisions and weird behaviors.
var layerCount = LS_activeSlideData.sublayers ? LS_activeSlideData.sublayers.length : 0,
layerName = LS_l10n.SBLayerTitle.replace('%d', layerCount+1);
LS_defaultLayerData.subtitle = layerName;
return LS_defaultLayerData;
},
uuidForSlide: function( slideIndex ) {
slideIndex = slideIndex || LS_activeSlideIndex;
return this.uuidForObject(
window.lsSliderData.layers[slideIndex].properties
);
},
slideForUUID: function( uuid ) {
var slideIndex;
jQuery.each(window.lsSliderData.layers, function(index, slide) {
if( slide.properties.uuid && slide.properties.uuid == uuid ) {
slideIndex = index;
return false;
}
});
return slideIndex;
},
uuidForLayer: function( layerIndex, slideIndex ) {
if( typeof layerIndex === 'undefined' ) {
layerIndex = LS_activeLayerIndexSet[0];
}
if( typeof slideIndex === 'undefined' ) {
slideIndex = LS_activeSlideIndex;
}
var slideData = window.lsSliderData.layers[ slideIndex ];
return this.uuidForObject( slideData.sublayers[ layerIndex ] );
},
layerForUUID: function( uuid ) {
},
uuidForObject: function( data ) {
if( ! data.uuid || ! data.uuid.length ) {
data.uuid = this.generateUUID();
}
return data.uuid;
},
generateUUID: function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
},
// Backwards compatibility: put transitions settings into
// the 'transition' object within the layer data
restoreOldTransitionSettings: function($inputs) {
// Get transition option names
var options = [];
for(var i=0;typeof($inputs[i])!='undefined';options.push($inputs[i++].getAttribute('name')));
jQuery.each(window.lsSliderData.layers, function(slideKey, slideData) {
jQuery.each(slideData.sublayers, function(layerKey, layerData) {
for(var l = 0; l < options.length; l++) {
if(layerData[ options[l] ]) {
layerData.transition[ options[l] ] = layerData[ options[l] ];
delete layerData[ options[l] ];
}
}
});
});
}
};
var initSliderBuilder = function() {
// Collapse sidebar while editing
if( typeof lsScreenOptions !== 'undefined' && lsScreenOptions.collapseSidebar === 'true' ) {
jQuery('body').addClass('folded');
}
// Expand sidebar on hover
var sidebarTimeout = null;
jQuery('#adminmenumain').hover(
function() {
if( typeof lsScreenOptions !== 'undefined' && lsScreenOptions.expandSidebarOnHover === 'true' ) {
sidebarTimeout = setTimeout(function() {
jQuery('body').removeClass('folded').addClass('ls-add-fold');
}, 100 );
}
},
function() {
if( typeof lsScreenOptions !== 'undefined' && lsScreenOptions.collapseSidebar === 'true' ) {
clearTimeout( sidebarTimeout );
setTimeout(function() {
jQuery('body').addClass('folded');
}, 120);
}
}
);
jQuery('.km-tabs').kmTabs();
// Set the DB ID of currently editing slider
if( ! LS_sliderID ) {
LS_sliderID = jQuery('#ls-slider-form input[name="slider_id"]').val();
}
LS_previewArea = jQuery('#ls-preview-layers');
LS_previewHolder = LS_previewArea.parent();
LS_previewWrapper = LS_previewHolder.parent();
// Set a small delay to prevent unintentional
// dragging operations when a user clicks on
// tabs or Preview items
jQuery.ui.draggable.prototype.options.distance = 3;
jQuery.ui.sortable.prototype.options.distance = 3;
// Add default slide data to data source if it's a new slider
if(window.lsSliderData.properties.new) {
window.lsSliderData.properties = LS_DataSource.readSliderSettings();
window.lsSliderData.properties.createdWith = jQuery('input[name="sliderVersion"]').val();
window.lsSliderData.layers = [{
properties: jQuery.extend(true, {}, LS_DataSource.getDefaultSlideData()),
sublayers: []
}];
// Extend existing slider data with defaults,
// so we can guarantee that new options added in
// future updates will always be present in the
// data source object.
} else {
window.lsSliderData.properties = jQuery.extend( {},
LS_DataSource.readSliderSettings(),
window.lsSliderData.properties
);
}
// Set callbacks
var callbacks = window.lsSliderData.callbacks;
jQuery('.ls-callback-box textarea:not([readonly])').each(function() {
var $textarea = jQuery(this),
name = $textarea.attr('name'),
useData = $textarea.data('event-data');
if( callbacks && callbacks[name] ) {
$textarea.val( LS_Utils.stripslashes( callbacks[name] ) );
}
});
LS_GUI.updateImagePicker( 'yourlogo', 'useCurrent' );
LS_GUI.updateImagePicker( 'backgroundimage', 'useCurrent' );
LS_GUI.updateImagePicker( 'preview', 'useCurrent' );
LayerSlider.selectSlide(LS_activeSlideIndex, { forceSelect: true });
// URL rewrite after creating slider
if( history.replaceState ) {
if(document.location.href.indexOf('&showsettings=1') != -1) {
var url = document.location.href.replace('&showsettings=1', '');
history.replaceState(null, document.title, url);
}
}
// Show "unsaved changes" warning
jQuery( window ).on('beforeunload', function(e) {
if( LS_editorIsDirty ) {
var dialogText = LS_l10n.SBUnsavedChanges;
e.returnValue = dialogText;
return dialogText;
}
});
// Main tab bar page select
jQuery('#ls-main-nav-bar a:not(.unselectable)').click(function(e) {
LayerSlider.selectMainTab( this );
if( jQuery(this).hasClass('layers') ) {
$ruler.trigger('resize.lsRuler');
LayerSlider.generatePreview();
LayerSlider.updatePreviewSelection();
}
});
// Settings sidebar
jQuery('ul.ls-settings-sidebar > li').click(function() {
LayerSlider.selectSettingsTab(this);
});
// Deeplink Slider Settings
if( document.location.hash ) { LS_GUI.deeplinkSection(); }
jQuery(window).on('hashchange', function() {
LS_GUI.deeplinkSection();
});
// Settings: checkboxes
jQuery('.ls-settings :checkbox, .ls-layer-box :checkbox:not(.noreplace)').customCheckbox();
// Settings: datepicker
var datePickerInterval = 0,
datepicker = jQuery('.ls-settings .ls-datepicker-input').datepicker({
inline: true,
classes: 'ls-datepicker',
language: 'en',
dateFormat: 'yyyy-mm-dd',
timeFormat: 'hh:ii:00',
todayButton: new Date(),
clearButton: true,
timepicker: true,
keyboardNav: false,
range: false,
onSelect: function(formattedDate, date, inst) {
inst.$el.prev().fadeOut(200);
inst.$el.trigger('input');
}
}).on('input', function() {
var $this = jQuery(this);
val = jQuery.trim( $this.val() );
$this.prev().fadeOut(200);
clearTimeout(datePickerInterval);
datePickerInterval = setTimeout(function() {
if( val.length > 2 && ! val.match(/^\d{4}-\d{2}-\d{2}/) ) {
jQuery.getJSON( ajaxurl, { action: 'ls_parse_date', date: val }, function(data) {
if( ! data.errorCountĀ && data.dateStr != '' ) {
$this.prev().fadeIn(200).removeClass('error').children('span').text( data.dateStr );
} else {
$this.prev().fadeIn(200).addClass('error').children('span').text( LS_l10n.SBInvalidFormat );
}
});
}
}, 1000);
}).each(function() {
var $this = jQuery(this),
key = jQuery(this).data('schedule-key');
if( window.lsSliderData.properties[ key ] ) {
var date = window.lsSliderData.properties[ key ] +''+ LS_Utils.jsTimeZoneID()
startDate = new Date( date );
$this.data('datepicker').selectDate( startDate );
$this.trigger('keyup');
}
});
// Settings: Popup Presets
jQuery('.ls-settings-popup').on('click', '#tmpl-popup-presets-button', function(e) {
e.preventDefault();
kmw.modal.open({
content: '#tmpl-popup-presets-window',
minWidth: 930,
maxWidth: 930
});
// Settings: Popup Include Pages
}).on('click', '.ls-popup-include-all-pages', function() {
var $switch = jQuery(this),
$targets = jQuery('.ls-popup-include-pages span:not(:first-child), .ls-popup-include-custom-pages');
if( $switch.hasClass('on') ) {
$targets.removeClass('ls-hidden');
} else {
$targets.addClass('ls-hidden');
}
// Settings: Popup Preview
}).on('click', '.ls-popup-preview-button', function(e) {
e.preventDefault();
LayerSlider.startPopupPreview({}, this);
// Settings: Popup Position
}).on('click', '.ls-popup-position td', function(e) {
var $td = jQuery(this),
$table = $td.closest('table'),
moves = $td.data('move').split(' ');
// Update UI
$table.find('td').removeClass('active');
$td.addClass('active');
// Update settings
jQuery('input[name="popupPositionVertical"]').val( moves[0] );
jQuery('input[name="popupPositionHorizontal"]').val( moves[1] );
window.lsSliderData.properties.popupPositionVertical = moves[0];
window.lsSliderData.properties.popupPositionHorizontal = moves[1];
// Update preview
LayerSlider.updatePopupPreview();
}).on('click', '.ls-popup-fit-width, .ls-popup-fit-height', function() {
setTimeout(function() {
LayerSlider.updatePopupPreview();
}, 100);
}).on('keyup change', '.ls-popup-triggers :input', function() {
setTimeout(function() {
LayerSlider.updatePopupNotifications();
}, 100);
});
if( jQuery('.ls-popup-include-all-pages').hasClass('on') ) {
jQuery('.ls-popup-include-pages span:not(:first-child), .ls-popup-include-custom-pages').addClass('ls-hidden');
}
LayerSlider.updatePopupPositionGrid();
LayerSlider.updatePopupPreview();
// Settings: Popup presets
jQuery(document).on('click', '#ls-popup-presets-modal-window .ls-layout-illustration-grid', function() {
var $item = jQuery(this),
$options = jQuery('.ls-settings-popup :input'),
data = $item.data('options');
if( typeof data === 'string' ) {
data = JSON.parse( data );
}
for( var key in data ) {
window.lsSliderData.properties[ key ] = data[key];
var $input = $options.filter('[name="'+key+'"]');
// Handle checkboxes
if( typeof data[key] === 'boolean' ) {
if( data[key] != $input.prop('checked') ) {
$input.next().click();
}
} else {
$input.val( data[key] );
}
}
// Update settings
LayerSlider.updatePopupPositionGrid();
LayerSlider.updatePopupPreview();
// Close modal
kmw.modal.close();
});
// Uploads
LayerSlider.openMediaLibrary();
kmComboBox.init();
// Clear uploaded image button
jQuery(document).on({
mouseenter: function() {
if( jQuery(this).hasClass('has-image') ) {
jQuery(this).addClass('hover');
}
},
mouseleave: function() {
jQuery(this).removeClass('hover');
}
}, '.ls-image');
jQuery(document).on('click', '.ls-image a.pixie', function(e) {
e.preventDefault();
e.stopPropagation();
// Set ID on the currently editing image
var $parent = jQuery(this).parent(),
$image = $parent.find('img').attr('id', 'pixie-current-image'),
imageURL;
// Prevent popover to become visible after opening the editor
jQuery('body').addClass('hidepopover');
// Find image URL
if( $parent.hasClass('ls-slide-image') ) {
imageURL = LS_activeSlideData.properties.background;
} else if( $parent.hasClass('ls-slide-thumbnail') ) {
imageURL = LS_activeSlideData.properties.thumbnail;
} else if( $parent.hasClass('ls-layer-image') ) {
imageURL = LS_activeLayerDataSet[0].image;
} else if( $parent.hasClass('ls-media-image') ) {
imageURL = LS_activeLayerDataSet[0].poster;
} else if( $parent.hasClass('ls-layer-background-image') ) {
imageURL = LS_activeLayerDataSet[0].layerBackground;
}
// Open image editor
LayerSlider.openImageEditor( LS_Utils.toAbsoluteURL( imageURL ) );
});
// Clear uploads
jQuery(document).on('click', '.ls-image .dashicons-dismiss', function(e) {
e.preventDefault();
e.stopPropagation();
var $parent = jQuery(this).parent();
$parent.removeClass('hover');
$parent.prev().val('').prev().val('');
LS_GUI.updateImagePicker( $parent, '' );
// Global background
if( $parent.hasClass('ls-global-background') ) {
window.lsSliderData.properties.backgroundimage = '';
window.lsSliderData.properties.backgroundimageId = '';
window.lsSliderData.properties.backgroundimageThumb = '';
} else if( $parent.hasClass('ls-yourlogo-upload') ) {
window.lsSliderData.properties.yourlogo = '';
window.lsSliderData.properties.yourlogoId = '';
window.lsSliderData.properties.yourlogoThumb = '';
} else if( $parent.hasClass('ls-slider-preview') ) {
window.lsSliderData.meta.preview = '';
window.lsSliderData.meta.previewId = '';
} else if( $parent.hasClass('ls-slide-image') ) {
LS_UndoManager.add('slide.general', LS_l10n.SBUndoRemoveSlideImage, {
itemIndex: LS_activeSlideIndex,
undo: {
background: LS_activeSlideData.properties.background,
backgroundId: LS_activeSlideData.properties.backgroundId,
backgroundThumb: LS_activeSlideData.properties.backgroundThumb
},
redo: {
background: '',
backgroundId: '',
backgroundThumb: ''
}
});
LS_activeSlideData.properties.background = '';
LS_activeSlideData.properties.backgroundId = '';
LS_activeSlideData.properties.backgroundThumb = '';
LayerSlider.updateSlidePreviews();
} else if( $parent.hasClass('ls-slide-thumbnail') ) {
LS_activeSlideData.properties.thumbnail = '';
LS_activeSlideData.properties.thumbnailId = '';
LS_activeSlideData.properties.thumbnailThumb = '';
LayerSlider.updateSlidePreviews();
} else if( $parent.hasClass('ls-layer-image') ) {
LS_UndoManager.add('layer.general', LS_l10n.SBUndoRemoveLayerImage, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
image: LS_activeLayerDataSet[0].image,
imageId: LS_activeLayerDataSet[0].imageId,
imageThumb: LS_activeLayerDataSet[0].imageThumb
},
redo: {
image: '',
imageId: '',
imageThumb: ''
}
});
LS_activeLayerDataSet[0].image = '';
LS_activeLayerDataSet[0].imageId = '';
LS_activeLayerDataSet[0].imageThumb = '';
jQuery('.ls-sublayers li').eq(LS_activeLayerIndexSet[0])
.find('.ls-sublayer-thumb').addClass('dashicons dashicons-format-image')
.find('img').remove();
} else if( $parent.hasClass('ls-media-image') ) {
LS_UndoManager.add('layer.general', LS_l10n.SBUndoRemoveVideoPoster, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
poster: LS_activeLayerDataSet[0].poster,
posterId: LS_activeLayerDataSet[0].posterId,
posterThumb: LS_activeLayerDataSet[0].posterThumb
},
redo: {
poster: '',
posterId: '',
posterThumb: ''
}
});
LS_activeLayerDataSet[0].poster = '';
LS_activeLayerDataSet[0].posterId = '';
LS_activeLayerDataSet[0].posterThumb = '';
} else if( $parent.hasClass('ls-layer-background-image') ) {
LS_UndoManager.add('layer.general', LS_l10n.SBUndoRemoveLayerBG, {
itemIndex: LS_activeLayerIndexSet[0],
undo: {
poster: LS_activeLayerDataSet[0].layerBackground,
layerBackgroundId: LS_activeLayerDataSet[0].layerBackgroundId,
layerBackgroundThumb: LS_activeLayerDataSet[0].layerBackgroundThumb
},
redo: {
layerBackground: '',
layerBackgroundId: '',
layerBackgroundThumb: ''
}
});
LS_activeLayerDataSet[0].layerBackground = '';
LS_activeLayerDataSet[0].layerBackgroundId = '';
LS_activeLayerDataSet[0].layerBackgroundThumb = '';
LayerSlider.updateLayerBackgroundNotification();
}
LayerSlider.generatePreview();
}).on('click', '.ls-timeline-switch li', function(e) {
e.preventDefault();
// Bail out early if it's the active menu item
if( jQuery(this).hasClass('active') ) { return false; }
var $item = jQuery(this),
$layerList = jQuery('.ls-sublayers');
// Toogle switch
$item.addClass('active').siblings().removeClass('active');
if( $item.index() == 1 ){
jQuery('.ls-layers-table').hide().next().show();
jQuery('.ls-add-sublayer').hide();
LayerSlider.startSlidePreview({
autoStart: false,
pauseLayers: true,
plugins: [{
namespace: 'timeline',
js: 'timeline/layerslider.timeline.js',
css: 'timeline/layerslider.timeline.css',
settings: {
showLayersInfo: true
}
}]
});
} else {
jQuery('.ls-layers-table').show().next().hide();
jQuery('.ls-add-sublayer').show();
LayerSlider.stopSlidePreview();
}
// Select layer type
}).on('click', '.ls-layer-types li', function() {
LayerSlider.addFormattedLayer( this );
}).on('click', '.ls-context-add-layer li', function() {
LayerSlider.addFormattedLayer( this, {
styles: {
top: LS_contextMenuTop / LS_previewZoom,
left: LS_contextMenuLeft / LS_previewZoom
}
});
}).on('click', '.ls-context-menu-duplicate', function() {
LayerSlider.duplicateLayer();
}).on('click', '.ls-context-menu-remove', function() {
LayerSlider.removeLayer();
}).on('click', '.ls-context-menu-hide', function() {
LayerSlider.hideLayer();
}).on('click', '.ls-context-menu-lock', function() {
LayerSlider.lockLayer();
}).on('click', '.ls-context-menu-copy-styles', function() {
LayerSlider.copyLayerSettings( jQuery('.ls-sublayer-style .ls-h-actions .copy') );
}).on('click', '.ls-context-menu-paste-styles', function() {
LayerSlider.pasteLayerSettings( jQuery('.ls-sublayer-style .ls-h-actions .paste') );
}).on('click', '.ls-context-menu-copy-layer', function() {
LayerSlider.copyLayer( );
}).on('click', '.ls-context-menu-paste-layer', function() {
LayerSlider.pasteLayer( );
});
// Settings: store any form element change in data source
jQuery('.ls-slider-settings').on('input change click', 'input,textarea,select', function(event) {
// Bail out early if there was a click event
// fired on a non-checkbox form item
if(event.type === 'click') {
if( !jQuery(this).is(':checkbox') ) {
return false;
}
}
// Get option data
var item = jQuery(this),
prop = item.attr('name'),
val = item.is(':checkbox') ? item.prop('checked') : item.val();
if( prop === 'width' || prop === 'height' ) {
if( val && ! val.toString().match(/^\d+$/) ) {
val = parseInt(val) || '';
item.val( val );
}
}
// Set new setting
window.lsSliderData.properties[ prop ] = val;
// Mark unsaved changes on page
LS_editorIsDirty = true;
// Update preview
if(item.is('select, :checkbox')) {
LayerSlider.generatePreview();
} else {
LayerSlider.willGeneratePreview();
}
});
// Settings: init slider size chooser
jQuery('.ls-slider-dimensions').on('click', 'div', function(e) {
var $this = jQuery(this),
type = $this.data('type');
if( $this.hasClass('locked') ) {
return;
}
$this.siblings('input[type="hidden"]').val( type );
$this.addClass('active').siblings().removeClass('active');
// Reset rows
jQuery('.ls-settings-contents .ls-popup-hide').show();
jQuery('.full-width-row, .full-size-row, .popup-row', jQuery('.ls-settings-contents')).hide();
switch( type ) {
case 'fullwidth':
jQuery('.ls-settings-contents .full-width-row').css('display', 'table-row');
break;
case 'fullsize':
jQuery('.ls-settings-contents .full-size-row').css('display', 'table-row');
break;
case 'popup':
jQuery('.ls-settings-contents .ls-popup-hide').hide();
jQuery('.ls-settings-contents .popup-row').css('display', 'table-row');
break;
}
// Update data source & reload preview
window.lsSliderData.properties.type = type;
LayerSlider.updatePopupNotifications();
LayerSlider.generatePreview();
});
// Select slider type
jQuery('.ls-slider-dimensions div[data-type="'+window.lsSliderData.properties.type+'"]').click();
// if ($dim.find('input[name=fullpage]:checked').length) {
// $dim.find('.full-screen').click();
// } else if ($dim.find('input[name=forceresponsive]:checked').length) {
// $dim.find('.full-width').click();
// } else if ($dim.find('input[name=responsive]:checked').length) {
// $dim.find('.responsive').click();
// } else {
// $dim.find('.non-responsive').click();
// }
// Settings: update slider height for full-screen
jQuery('#container-height').on('change', function() {
jQuery('#slider-height').val(this.value).change();
});
// Settings: reset button
jQuery(document).on('click', '.ls-reset', function() {
// Empty field
jQuery(this).prev().val('');
// Generate preview
LayerSlider.generatePreview();
});
// Callbacks: store any form element change in data source
jQuery('.ls-callback-page').on('updated.ls', 'textarea:not([readonly])', function( event, cm ) {
if( typeof window.lsSliderData.callbacks !== 'object' ) {
window.lsSliderData.callbacks = {};
}
var key = jQuery(this).attr('name'),
val = jQuery(this).val(),
test = val.match(/\{([\s\S]*)\}/m)[1].replace(/(\r\n|\n|\r)/gm, '');
if( jQuery.trim( test ).length ) {
window.lsSliderData.callbacks[ key ] = val;
} else {
delete window.lsSliderData.callbacks[ key ];
}
});
// Add slide
jQuery('#ls-add-slide').click(function(e) {
e.preventDefault(); LayerSlider.addSlide();
});
// Select slide
jQuery('#ls-slide-tabs').on('click', '.ls-slide-preview', function( ) {
var $tab = jQuery(this).closest('.ls-slide-tab');
if( ! $tab.hasClass('active') ) {
LayerSlider.selectSlide( $tab.index(), { forceSelect: true } );
}
// Rename slide
}).on('input', '.ls-slide-name input', function( ) {
LayerSlider.renameSlide( this );
// Show slide actions
}).on('click', '.ls-slide-actions', function() {
LayerSlider.showSlideActions( this );
}).on('contextmenu', '.ls-slide-preview', function( e ) {
if( document.location.href.indexOf('section=revisions') === -1 ) {
e.preventDefault();
LayerSlider.showSlideActions( this );
}
// Hide slide actions
}).on('mouseleave', '.ls-slide-actions-sheet', function() {
LayerSlider.hideSlideActions( );
// Duplicate slide
}).on('click', '.ls-slide-duplicate', function() {
LayerSlider.hideSlideActions();
LayerSlider.duplicateSlide( this );
// Remove slide
}).on('click', '.ls-slide-remove', function() {
LayerSlider.hideSlideActions();
LayerSlider.removeSlide( this );
}).on('click', '.ls-slide-visibility', function() {
LayerSlider.hideSlideActions();
LayerSlider.toggleSlideVisibility( this );
});
// Custom Slide Properties
jQuery('#ls-layers').on('keyup', '.ls-custom-slide-properties tr:last-child input', function() {
if( jQuery(this).val() ) {
var $tr = jQuery(this).closest('tr').removeClass('ls-hidden');
$tr.clone().insertAfter( $tr ).find('input').val('');
}
// Custom Slide Properties
}).on('keyup', '.ls-custom-slide-properties tr:not(:last-child) input', function( event ) {
LayerSlider.setCustomSlideProperties(event, this);
});
// Open popout editor
jQuery( document ).on( 'click', '#ls-open-popout-editor', function( e ){
e.preventDefault();
jQuery('body').addClass('ls-popout-editor-open');
var $popoutEditor = jQuery( '#ls-layers-settings-popout' ),
$parent = jQuery( '.ls-sublayer-wrapper' );
$popoutEditor.removeClass( 'ls-layers-settings-normal' ).addClass( 'ls-layers-settings-floating' ).draggable({
handle: '#ls-layers-settings-popout-handler',
containment: '#ls-slider-form',
scroll: false
}).resizable({
minHeight: 450,
minWidth: 350,
maxWidth: 1500,
create: function(){
kmUI.smartResize.set();
},
resize: function(){
kmUI.smartResize.set();
}
});
// Position Popout editor to the center of the screen
// if the "remember last location" flag is not present.
if( ! $popoutEditor.data( 'km-remember-position' ) ) {
var editorWidth = $popoutEditor.width(),
editorHeight = $popoutEditor.height(),
parentWidth = $parent.width(),
windowScrollTop = jQuery( window ).scrollTop(),
windowHeight = jQuery( window ).height(),
offsetTop = $parent.offset().top;
$popoutEditor.data( 'km-remember-position', true ).css({
top: (windowScrollTop - offsetTop) + ( ( windowHeight - editorHeight ) / 2 ),
left: ( parentWidth / 2 ) - ( editorWidth / 2)
});
}
jQuery( '#ls-layers-settings-popout-handler' ).trigger( 'mouseenter' );
jQuery( '.ls-preview-wrapper' ).addClass( 'ls-forceto-left' );
// Close popout editor
}).on( 'click', '#ls-close-popout-editor,#ls-popout-desc button', function( e ){
e.preventDefault();
jQuery('body').removeClass('ls-popout-editor-open');
var $popoutEditor = jQuery( '#ls-layers-settings-popout' );
// User clicked on the "Restore Editor" button,
// so we should reset position and other data.
if( jQuery( e.target ).is('#ls-popout-desc button') ) {
$popoutEditor.removeData( 'km-remember-position' );
}
$popoutEditor
.addClass( 'ls-layers-settings-normal' )
.removeClass( 'ls-layers-settings-floating' )
.draggable( 'destroy' )
.resizable( 'destroy' );
jQuery( '.ls-preview-wrapper' ).removeClass( 'ls-forceto-left' );
kmUI.smartResize.set();
});
// Enter URL
jQuery('#ls-layers').on('click', '.ls-url-prompt', function(e){
e.preventDefault();
var url = prompt( LS_l10n.SBEnterImageURL );
if( ! url ) { return false; }
var $el = jQuery(this),
$target = $el.parent().prev();
// Slide image
if($target.hasClass('ls-slide-image')) {
LS_activeSlideData.properties.background = url;
LS_activeSlideData.properties.backgroundId = '';
LS_activeSlideData.properties.backgroundThumb = url;
// Slide thumbnail
} else if($target.hasClass('ls-slide-thumbnail')) {
LS_activeSlideData.properties.thumbnail = url;
LS_activeSlideData.properties.thumbnailId = '';
LS_activeSlideData.properties.thumbnailThumb = url;
// Image layer
} else if($target.hasClass('ls-layer-image')) {
LS_activeLayerDataSet[0].image = url;
LS_activeLayerDataSet[0].imageId = '';
LS_activeLayerDataSet[0].imageThumb = url;
// Media image
} else if($el.hasClass('ls-media-prompt')) {
$target = jQuery('.ls-image.ls-media-image');
LS_activeLayerDataSet[0].poster = url;
LS_activeLayerDataSet[0].posterId = '';
LS_activeLayerDataSet[0].posterThumb = url;
// Layer background
} else if($target.hasClass('ls-layer-background-image')) {
LS_activeLayerDataSet[0].layerBackground = url;
LS_activeLayerDataSet[0].layerBackgroundId = '';
LS_activeLayerDataSet[0].layerBackgroundThumb = url;
LayerSlider.updateLayerBackgroundNotification();
}
LS_GUI.updateImagePicker( $target, url );
LayerSlider.generatePreview();
}).on('click', '.ls-capture-slide', function( event ) {
event.preventDefault();
if( typeof lsScreenOptions !== 'undefined' && lsScreenOptions.useNotifyOSD === 'true' ) {
kmUI.notify.show({
icon: 'dashicons-camera',
iconColor: '#f9a241',
text: LS_l10n.notifyCaptureSlide
});
}
// Hide preview selection and live slide UI elements
LayerSlider.hidePreviewSelection();
jQuery('.ls-gui-element:visible').addClass('ls-hidden');
// html2canvas freezes the browser completely,
// not even animations will occur. Using setTimeout
// to first render user feedback, then start the capture.
setTimeout(function() {
var $target = LayerSlider.isSlidePreviewActive ? jQuery('.ls-real-time-preview') : LS_previewHolder;
html2canvas( $target[0], {
// backgroundColor: null,
scale: 1
}).then(function( canvas ) {
// Restore preview selection and slider UI elements
LayerSlider.showPreviewSelection();
jQuery('.ls-gui-element.ls-hidden').removeClass('ls-hidden');
var imgName = 'ls-slider-'+LS_sliderID+'-slide-'+(LS_activeSlideIndex+1)+'.png',
imgData = canvas.toDataURL( 'image/jpeg', 0.92 ),
imgBlob = LS_Utils.dataURItoBlob( imgData, 'image/jpeg' );
imgBlob.lastModifiedDate = new Date();
imgBlob.name = imgName;
imgBlob.filename = imgName;
LayerSlider.uploadImageToMediaLibrary(imgBlob, function(data) {
// Save to data store
LS_activeSlideData.properties.thumbnail = data.url;
LS_activeSlideData.properties.thumbnailId = data.id;
LS_activeSlideData.properties.thumbnailThumb = data.url;
// Update UI
LS_GUI.updateImagePicker( 'thumbnail', data.url );
LayerSlider.updateSlidePreviews();
kmUI.notify.hide();
});
});
}, 1000);
});
// Slide options: input, textarea, select
jQuery('#ls-layers').on('input change click', '.ls-slide-options input, .ls-slide-options textarea, .ls-slide-options select', function(event) {
// Bail out early if there was a click event
// fired on a non-checkbox form item
if(event.type === 'click') {
if( !jQuery(this).is(':checkbox') ) {
return false;
}
}
var item = jQuery(this),
prop = item.attr('name'),
val = item.is(':checkbox') ? item.prop('checked') : item.val();
LS_activeSlideData.properties[prop] = val;
// Update preview when setting properties
// related to the background image
var updateKeys = [
'bgsize', 'bgposition', 'bgcolor'
];
if( updateKeys.indexOf(prop) !== -1 ) {
LayerSlider.generatePreview();
}
});
// Open Transition gallery
jQuery('#ls-layers').on('click', '.ls-select-transitions', function(e) {
e.preventDefault();
LayerSlider.openTransitionGallery();
});
// Origami banner
jQuery(document).on('click', '#tryorigami', function() {
jQuery('#transitionmenu li:last').click();
// Enable/disable special effects
}).on('click', '#ls-transition-window .ls-select-special-transition', function(e) {
var $item = jQuery(this),
checked;
if( $item.hasClass('locked') ) {
return true;
}
// Turn off
if( $item.hasClass('on') ) {
$item.removeClass('on').addClass('off');
checked = false;
// Turn on
} else {
$item.removeClass('off').addClass('on');
checked = true;
}
LS_activeSlideData.properties[ $item.data('name') ] = checked;
// Add/Remove layer transitions
}).on('click', '#ls-transitions-list section .tr-item', function(e) {
e.preventDefault();
LayerSlider.toggleTransition(this);
// Select/Deselect all transitions
}).on('click', '#transitiongallery-header i:last', function(e) {
var check = jQuery(this).hasClass('off') ? true : false;
jQuery('#ls-transitions-list section.active').each(function() {
LayerSlider.selectAllTransition( jQuery(this).index(), check );
});
// Apply on others
}).on('click', '#transitiongallery-header i:not(:last)', function(e) {
// Confirmation
if( ! confirm( LS_l10n.SBTransitionApplyOthers ) ) {
return false;
}
// Dim color briefly
var button = jQuery(this);
button.css('opacity', '.5');
setTimeout(function() {
button.css('opacity', '1');
}, 2000);
// Apply to other slides
jQuery.each(window.lsSliderData.layers, function(slideIndex, slideData) {
slideData.properties['3d_transitions'] = LS_activeSlideData.properties['3d_transitions'];
slideData.properties['2d_transitions'] = LS_activeSlideData.properties['2d_transitions'];
slideData.properties.custom_3d_transitions = LS_activeSlideData.properties.custom_3d_transitions;
slideData.properties.custom_2d_transitions = LS_activeSlideData.properties.custom_2d_transitions;
slideData.properties.transitionorigami = LS_activeSlideData.properties.transitionorigami;
});
}).on('click', '#ls-more-slide-options', function() {
LayerSlider.toggleAdvancedSlideOptions( this );
// Show/Hide transition
}).on('mouseenter', '#ls-transitions-list section .tr-item', function() {
lsShowTransition( this );
}).on('mouseleave', '#ls-transitions-list section .tr-item', function() {
lsHideTransition( this );
});
// Add slide
jQuery('#ls-layers').on('click', '.ls-add-sublayer', function(e) {
e.preventDefault();
// Show pointer and append overlay
jQuery('body').off('click.ls-layer-types');
jQuery('.ls-empty-layer-notification').addClass('ls-hidden');
jQuery('.ls-layer-types-wrapper').show();
TweenLite.to( jQuery('.ls-layer-types'), 0.3, {
y: 0
});
setTimeout(function() {
jQuery('body').one('click.ls-layer-types', function() {
jQuery('.ls-empty-layer-notification').removeClass('ls-hidden');
TweenLite.to( jQuery('.ls-layer-types'), 0.3, {
y: -330,
onComplete: function() {
jQuery('.ls-layer-types-wrapper').hide();
}
});
});
}, 200);
// Select layer
}).on('click', '.ls-sublayers li', function( event ) {
// Range Select
if( event.shiftKey && LS_activeLayerDataSet.length === 1 ) {
var val1 = LS_lastSelectedLayerIndex || LS_activeLayerIndexSet[0],
val2 = jQuery(this).index(),
start = Math.min(val1, val2),
end = Math.max(val1, val2),
indexes = [];
for(var i = start; i <= end; i++) {
indexes.push(i);
}
LayerSlider.selectLayer( indexes );
// Manual select
} else {
LayerSlider.selectPreviewItem( jQuery(this).index(), event );
}
}).on('keyup', 'input[name="subtitle"]', function() {
var index = jQuery(this).closest('li').index();
LS_activeSlideData.sublayers[index].subtitle = jQuery(this).val();
// Layer pages
}).on('click', '.ls-sublayer-nav a', function(e) {
e.preventDefault(); LayerSlider.selectLayerPage( jQuery(this).index() );
// Remove layer
}).on('click', '.ls-sublayers a.remove', function(e) {
e.preventDefault(); e.stopPropagation();
LayerSlider.removeLayer( jQuery(this).closest('li').index() );
// Duplicate layer
}).on('click', '.ls-sublayers a.duplicate', function(e) {
e.preventDefault(); e.stopPropagation();
LayerSlider.duplicateLayer();
}).on('click', '.ls-set-screen-types button', function(e) {
e.preventDefault();
LayerSlider.changeLayerScreenType( jQuery(this), true );
// Layer media type
}).on('click', '.ls-layer-kind li:not(:first-child)', function(e) {
e.preventDefault();
var $item = jQuery(this);
if( ! $item.hasClass('active') ) {
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayerMedia, {
itemIndex: LS_activeLayerIndexSet[0],
undo: { media: LS_activeLayerDataSet[0].media },
redo: { media: $item.data('section') }
});
LayerSlider.selectMediaType(this);
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
jQuery('.ls-layer-kind').removeClass('hover');
}
// Change layer media type
}).on('click', '.ls-layer-kind li:first-child', function(e) {
e.preventDefault();
jQuery(this).closest('.ls-layer-kind').addClass('opened');
setTimeout(function() {
jQuery('html').one('click', function() {
jQuery('.ls-layer-kind').removeClass('opened');
});
}, 100);
}).on('mouseenter', '.ls-layer-kind', function() {
jQuery(this).addClass('hover');
// Layer element type
}).on('click', '.ls-sublayer-element > li', function(e) {
e.preventDefault();
var $item = jQuery(this);
LS_UndoManager.add('layer.general', LS_l10n.SBUndoLayerType, {
itemIndex: LS_activeLayerIndexSet[0],
undo: { type: LS_activeLayerDataSet[0].type },
redo: { type: $item.data('element') }
});
LayerSlider.selectElementType(this);
LayerSlider.generatePreviewItem( LS_activeLayerIndexSet[0] );
// Layer options: input, textarea, select
}).on('input change click', '.ls-sublayer-pages input, .ls-sublayer-pages textarea, .ls-sublayer-pages select', function(event) {
// Ignore events triggered by UndoManager
if(event.UndoManagerAction) { return false; }
// Bail out early if there was a click event
// fired on a non-checkbox form item
if(event.type === 'click' && ! jQuery(this).is(':checkbox')) {
return false;
}
// Prevent triggering the change event
// on non-select form items
if(event.type === 'change' && ! jQuery(this).is('select')) {
return false;
}
var $item = jQuery(this),
defVal = $item.attr('data-value'),
prop = $item.attr('name'),
val = $item.is(':checkbox') ? $item.prop('checked') : $item.val(),
posVal = (prop == 'top' || prop == 'left') ? true : false;
// Boolean conversion
if( val === 'true' ) { val = true; }
if( val === 'false' ) { val = false; }
jQuery.each(LS_activeLayerDataSet, function(index, layerData) {
var layerIndex = LS_activeLayerIndexSet[ index ],
area = layerData;
if( $item.hasClass('sublayerprop') ) { area = area.transition; }
else if( $item.hasClass('auto') ) { area = area.styles; }
// Null values indicate empty option.
// We should remove them entirely from data source.
if( ! posVal && ( val === null || val === 'null' || val === '' ) ) {
delete area[ prop ];
// Exclude saving style properties where the default value
// is the same that the user provides.
} else if( ! posVal && ( $item.hasClass('auto') && typeof defVal !== 'undefined' && defVal.toString() === val.toString() ) ) {
delete area[ prop ];
} else {
area[ prop ] = val;
}
LayerSlider.generatePreviewItem( layerIndex );
});
if( $item.closest('.ls-sublayer-style').length ) {
LayerSlider.updatePreviewSelection();
}
if( LS_activeLayerDataSet.length === 1 ) {
// Check if media embed code contains autoplay setting
if( prop === 'html' && LS_activeLayerDataSet[0].media === 'media' ) {
LayerSlider.checkMediaAutoPlay( $item, prop, val );
}
// Restart layer preview
if( LayerSlider.isLayerPreviewActive ){
LayerSlider.startLayerPreview( jQuery('.ls-layer-preview-button') );
}
}
// startAt
var $li = $item.closest('.start-at-wrapper'),
$ul = $li.parent();
if( $li.length && ! $item.is('.start-at-calc') ) {
var timing = jQuery('.start-at-timing', $ul).val(),
operator = jQuery('.start-at-operator', $ul).val(),
value = jQuery('.start-at-value', $ul).val(),
$calcInput = jQuery('.start-at-calc', $ul);
$calcInput.data('prevVal', $calcInput.val() );
setTimeout(function() {
$calcInput.val( timing +' '+ operator +' '+ value).trigger('input');
LS_UndoManager.trackInputs( null, $calcInput );
}, 100);
}
}).on('change', '.ls-sublayer-basic input.bgvideo', function( event ) {
LayerSlider.changeVideoType(event );
}).on('input', '.ls-sublayer-style textarea.style', function() {
LayerSlider.validateCustomCSS( jQuery(this) );
// Active transition sections
}).on('click', '#ls-transition-selector-table td:not(.ls-padding)', function(event) {
LayerSlider.selectTransitionPage( this );
}).on('change', '#ls-transition-selector', function(event) {
jQuery( '#ls-transition-selector-table td:not(.ls-padding)' ).eq( jQuery(this).val() ).click();
}).on('change', '#ls-layer-transitions .ls-h-button input', function(event) {
LayerSlider.enableTransitionPage( this );
}).on('click', '#ls-layer-transitions .overlay', function(event) {
var $this = jQuery(this),
$section = $this.closest('section'),
$checkbox = $section.find('.ls-h-button .ls-checkbox.toggle');
if( $checkbox.hasClass('off') ) {
if( $checkbox.data( 'tl' ) ){
$checkbox.data( 'tl' ).progress(1).kill();
}
var tl = new TimelineMax();
tl.to( $checkbox[0], 0.12, {
yoyo: true,
repeat: 3,
ease: Quad.easeInOut,
scale: 1.5,
backgroundColor: '#ff1d1d'
});
$checkbox.data( 'tl', tl );
}
// Copy transition settings
}).on('click', '.ls-h-actions .copy', function(event) {
event.preventDefault();
event.stopPropagation();
LayerSlider.copyLayerSettings(this);
// Paste transition settings
}).on('click', '.ls-h-actions .paste', function(event) {
event.preventDefault();
event.stopPropagation();
LayerSlider.pasteLayerSettings(this);
jQuery('.ls-border-padding input').each(function() {
LayerSlider.updateLayerBorderPadding( this );
});
// Static select
}).on('mouseenter', '.ls-sublayer-options select[name="static"]', function() {
LayerSlider.setupStaticLayersChooser( this );
}).on('keyup', '.ls-sublayer-custom-attributes tr:last-child input', function() {
if( jQuery(this).val() ) {
var $tr = jQuery(this).closest('tr').removeClass('ls-hidden');
$tr.clone().insertAfter( $tr ).find('input').val('');
}
}).on('keyup change', '.ls-sublayer-custom-attributes tr:not(:last-child) input', function( event ) {
LayerSlider.setLayerAttributes(event, this);
}).on('input', '.ls-border-padding input', function() {
LayerSlider.updateLayerBorderPadding( this );
// Pick static layer
}).on('change', '.ls-sublayer-options select[name="static"]', function() {
var $select = jQuery(this),
value = $select.val(),
index = parseInt( jQuery(this).val() ),
uuid;
if( value === 'null' || value === null || index === 0 ) {
delete LS_activeLayerDataSet[0].transition.static;
delete LS_activeLayerDataSet[0].transition.staticUUID;
return;
}
if(index && index > 0) {
uuid = LS_DataSource.uuidForSlide( index - 1 );
LS_activeLayerDataSet[0].transition.staticUUID = uuid;
}
// Pick transformOrigin
}).on('click', '#ls-layer-transitions .dashicons-search:not(.active)', function(event) {
event.stopPropagation();
var $this = jQuery(this).addClass('active'),
$origin = $this.next(),
$picker = jQuery('<div>').addClass('ls-origin-picker').appendTo('.ls-preview-wrapper');
$picker.on('click', function(e) {
var o = $picker.offset();
x = e.pageX - o.left,
y = e.pageY - o.top,
$layer = LS_previewItems[ LS_activeLayerIndexSet[0] ],
p = $layer.position(),
ox = (x - p.left) / ( $layer.outerWidth() * LS_previewZoom ),
oy = (y - p.top) / ( $layer.outerHeight() * LS_previewZoom ),
$origin.val([
Math.round(ox * 1000) / 10 + '%',
Math.round(oy * 1000) / 10 + '%',
$origin.val().split(/\s+/)[2] || ''
].join(' ').trim());
$origin.trigger('input');
});
jQuery(document).one('click', function() {
jQuery('.ls-origin-picker').remove();
jQuery('.dashicons-search.active').removeClass('active');
});
var origin = $origin.attr('name');
jQuery.each(LS_previewItems, function(i, $sl) {
var layerTransition = LS_activeSlideData.sublayers[i].transition;
if( layerTransition && layerTransition[origin] ) {
var o = layerTransition[origin].split(/\s+/),
$layer = LS_previewItems[ LS_activeLayerIndexSet[0] ];
if( o.length > 1 ) {
var x = o[0] == 'left' ? '0' : (o[0] == 'right' ? '100%' : o[0]),
y = o[1] == 'top' ? '0' : (o[1] == 'bottom' ? '100%' : o[1]),
p = $sl.position();
x = x.indexOf('%') < 0 ? parseInt(x) : parseFloat(x) / 100 * $sl.outerWidth();
y = y.indexOf('%') < 0 ? parseInt(y) : parseFloat(y) / 100 * $sl.outerHeight();
if ( ! isNaN( x ) && ! isNaN( y ) ) {
jQuery('<div>')
.addClass('ls-origin-point' + ($sl.is( $layer ) ? ' ls-origin-active' : ''))
.css({
left: p.left + (x * LS_previewZoom),
top: p.top + (y * LS_previewZoom)
}).appendTo($picker);
}
}
}
});
});
// Sublayer: sortables, draggable, etc
LayerSlider.addSlideSortables();
LayerSlider.addLayerSortables();
LayerSlider.addDraggable();
// Slide(r) Preview
jQuery('#ls-layers').on('click', '.ls-preview-button', function(e) {
e.preventDefault();
LayerSlider.startSlidePreview();
});
// Animate Layer
jQuery('#ls-layers').on('click', '.ls-layer-preview-button', function(e) {
e.preventDefault(); LayerSlider.startLayerPreview(this, true);
});
// List intersecting preview items when right clicking on them
LS_previewWrapper.on('contextmenu',function(e) {
e.preventDefault(); LayerSlider.contextMenu(e);
});
// Don't drag locked layers
LS_previewArea.on('dragstart', '.disabled,.transformed', function(e) {
e.preventDefault();
}).on('dblclick', '> *:not(.disabled)', function() {
LayerSlider.editLayerStart( jQuery(this) );
}).on('keydown', '.ls-editing', function( event ) {
LayerSlider.editLayer( event );
}).on('keyup', '.ls-editing', function() {
LayerSlider.editLayerUpdate(this);
}).on('paste', '.ls-editing', function( event ) {
LayerSlider.editLayerPaste( event );
});
jQuery('.ls-real-time-preview').on('click', 'a[href="#"]', function( event ) {
event.preventDefault();
});
// Highlight preview item when hovering the intersecting layers list
jQuery(document).on({
mouseenter: function() { LayerSlider.highlightPreviewItem(this); },
mouseleave: function() { LS_previewArea.children().removeClass('highlighted lowlighted'); },
}, '.ls-context-overlapping-layers li'
);
// Select layer from intersecting layers list
jQuery(document).on('click', '.ls-context-overlapping-layers li', function(event) {
var layerIndex = jQuery(this).data('layerIndex');
LayerSlider.selectPreviewItem( layerIndex, event );
});
// Highlight dropable zone
jQuery(document).on('dragover.ls', '.ls-preview-wrapper', function(e) {
e.preventDefault();
jQuery(this).addClass('ls-dragover');
}).on('dragleave.ls drop.ls', '.ls-preview-wrapper', function(e) {
e.preventDefault();
jQuery(this).removeClass('ls-dragover');
});
// Handle dropped images
jQuery('#ls-pages').on('drop.ls', '.ls-preview', function(event) {
LayerSlider.handleDroppedImages(event);
});
// Handle alignment buttons
jQuery(document).on('click', '#ls-layer-alignment td, .ls-context-menu-align li', function(event) {
var $selection = jQuery('.ui-selected-helper'),
moves = jQuery(this).data('move').split(' '),
selTop = $selection.position().top,
selLeft = $selection.position().left,
selWidth = $selection.width(),
selHeight = $selection.height(),
areaWidth = LS_previewArea.width() * LS_previewZoom,
areaHeight = LS_previewArea.height() * LS_previewZoom,
updateInfo = [],
isHorizontal = false,
isVertical = false,
diffTop, diffLeft, x, xp, y, yp;
// Reposition, calc diff
for(var c = 0; c < moves.length; c++) {
switch(moves[c]) {
case 'left': x = 0; xp = '0%'; isHorizontal = true; break;
case 'center': x = areaWidth / 2 - selWidth / 2; xp = '50%'; isHorizontal = true; break;
case 'right': x = areaWidth - selWidth; xp = '100%'; isHorizontal = true; break;
case 'top': y = 0; yp = '0%'; isVertical = true; break;
case 'middle': y = areaHeight / 2 - selHeight / 2; yp = '50%'; isVertical = true; break;
case 'bottom': y = areaHeight - selHeight; yp = '100%'; isVertical = true; break;
}
}
diffTop = selTop - y;
diffLeft = selLeft - x;
jQuery.each(LS_activeLayerIndexSet, function(idx, layerIndex) {
// Get layer data
var layerData = LS_activeSlideData.sublayers[layerIndex],
undoObj = {},
redoObj = {};
// Bail out early if it's a locked layer
if( layerData.locked ) { return false; }
// Get preview item, current position & direction
var $previewItem = LS_previewItems[layerIndex],
position = $previewItem.position(),
left = Math.round( (position.left - diffLeft) / LS_previewZoom ).toString(),
top = Math.round( (position.top - diffTop) / LS_previewZoom ).toString();
// Use percents when only one layer is selected
if( LS_activeLayerIndexSet.length === 1 ) {
left = xp;
top = yp;
}
// Set horizontal values
if( isHorizontal ) {
undoObj.left = layerData.styles.left;
redoObj.left = left;
layerData.styles.left = left;
jQuery('.ls-sublayer-pages input[name=left]').val(left);
}
// Set vertical values
if( isVertical ) {
undoObj.top = layerData.styles.top;
redoObj.top = top;
layerData.styles.top = top;
jQuery('.ls-sublayer-pages input[name=top]').val(top);
}
// Maintain history
updateInfo.push({
itemIndex: layerIndex,
undo: undoObj,
redo: redoObj
});
LayerSlider.generatePreviewItem(layerIndex);
});
// Maintain history
LayerSlider.updatePreviewSelection();
LS_UndoManager.add('layer.style', LS_l10n.SBUndoAlignLayer, updateInfo);
}).on('click', '.ls-editor-layouts button', function(e) {
e.preventDefault();
LS_activeScreenType = jQuery(this).data('type');
jQuery(this).addClass('playing').siblings().removeClass('playing');
LS_DataSource.buildLayersList();
if( LayerSlider.isLayerPreviewActive ) {
LayerSlider.stopLayerPreview( true );
}
if( LayerSlider.isSlidePreviewActive ) {
LayerSlider.stopSlidePreview();
LayerSlider.startSlidePreview();
}
LayerSlider.generatePreview();
});
// GLOBAL SHORTCUTS
var keyTimeout = null, oldX = {}, oldY = {},
slidesItem = jQuery('#ls-main-nav-bar .layers');
jQuery(document).on('keydown', function(e) {
if( typeof lsScreenOptions !== 'undefined' && lsScreenOptions.useKeyboardShortcuts === 'false' ) {
return;
}
if( document.location.href.indexOf('ls-revisions') !== -1 ) {
return;
}
// Save slider when pressing Ctrl/Cmd + S
if( (e.metaKey || e.ctrlKey) && e.which == 83 ) {
if( ! e.altKey ) {
e.preventDefault();
LayerSlider.save({ usedShortcut: true });
return;
}
}
// Disable keyboard shortcuts while the
// main builder interface is not visible.
if( ! slidesItem.length || ! slidesItem.hasClass('active') ) {
return true;
}
// Disable keyboard shortcuts while editing
// images in the Pixie Image Editor
if( jQuery('#pixie-current-image').length ) {
return true;
}
var $target = jQuery(e.target);
if(e.which == 13) {
// Blur input fields when pressing enter
if($target.is(':input:not(textarea)')) {
e.preventDefault();
e.target.blur();
return;
// Toggle layer editing
} else if( !$target.is(':input') && !e.metaKey && !e.ctrlKey && !e.altKey ) {
e.preventDefault();
LayerSlider.editLayerToggle();
return;
}
}
// Disable keyboard shortcuts while editing
// a layer with the 'contenteditable' attribute.
if( jQuery('.ls-editing').length ) {
return;
}
// Toggle layer preview with Shift/Alt/Ctrl + space bar
if( (e.shiftKey || e.altKey || e.ctrlKey) && e.which == 32 && !jQuery(e.target).is(':input') ) {
e.preventDefault();
return jQuery('.ls-layer-preview-button').click();
}
// Toggle slide preview with the space bar
if(e.which == 32 && !jQuery(e.target).is(':input')) {
e.preventDefault();
return jQuery('.ls-preview-button').click();
}
// Disable the other keyboard shortcuts while in preview mode
if( LayerSlider.isSlidePreviewActive || LayerSlider.isLayerPreviewActive ) {
return;
}
// Redo on Ctrl/Cmd + Shift + Z
// or Ctrl/Cmd + Y
if( ((e.metaKey || e.ctrlKey) && e.shiftKey && e.which == 90) ||
((e.metaKey || e.ctrlKey) && e.which == 89) ) {
if( !jQuery(e.target).is(':input') ) {
e.preventDefault();
return LS_UndoManager.redo();
}
}
// Undo on Ctrl/Cmd + Z
if( (e.metaKey || e.ctrlKey) && e.which == 90 ) {
if( !jQuery(e.target).is(':input') ) {
e.preventDefault();
return LS_UndoManager.undo();
}
}
// Remove selected layer when pressing del/backspace
if(e.which == 8 || e.which == 46) {
if( !jQuery(e.target).is(':input') ) {
e.preventDefault();
LayerSlider.removeLayer();
return;
}
}
// Duplicate layer when pressing Ctrl/Cmd + D
if( (e.metaKey || e.ctrlKey) && e.which == 68 ) {
e.preventDefault();
LayerSlider.duplicateLayer();
return;
}
// Cut layer when pressing Ctrl/Cmd + X
if( (e.metaKey || e.ctrlKey) && e.which == 88 ) {
if( !jQuery(e.target).is(':input') ) {
e.preventDefault();
LayerSlider.copyLayer(true, LS_activeLayerDataSet, LS_activeLayerIndexSet, { shiftLayers: false });
LayerSlider.removeLayer(null, { requireConfirmation: false });
return;
}
}
// Copy layer when pressing Ctrl/Cmd + C
if( (e.metaKey || e.ctrlKey) && e.which == 67 ) {
// Copy only if there's no text selection
if( ! document.getSelection().toString() ) {
if( ! jQuery(e.target).is(':input') ) {
e.preventDefault();
LayerSlider.copyLayer(true);
return;
}
// Remove selection after copying text on page,
// so future copy events on layers will be uninterrupted.
} else {
setTimeout(function() {
LS_Utils.removeTextSelection();
}, 300);
}
}
// Paste layer when pressing Ctrl/Cmd + V
if( (e.metaKey || e.ctrlKey) && e.which == 86 ) {
if( !jQuery(e.target).is(':input') ) {
e.preventDefault();
LayerSlider.pasteLayer();
return;
}
}
// Move layers in preview with arrow buttons
if( [37,38,39,40].indexOf(e.which) !== -1 ) {
if( ! jQuery(e.target).is(':input') ) {
e.preventDefault();
var updateInfo = [];
jQuery.each(LS_activeLayerIndexSet, function(idx, layerIndex) {
var layerData = LS_activeSlideData.sublayers[layerIndex],
previewItem = LS_previewItems[layerIndex];
if( ! layerData ) { return true; }
if(layerData.locked ) { return true; }
var x = Math.round( parseInt(layerData.styles.left) ),
y = Math.round( parseInt(layerData.styles.top) );
if( layerData.styles.left.indexOf('%') !== -1 || layerData.styles.top.indexOf('%') !== -1 ) {
var positions = LayerSlider.setPositions(previewItem, layerData.styles.top, layerData.styles.left, true);
x = positions.left;
y = positions.top;
}
if( ! oldX[layerIndex] ) { oldX[layerIndex] = x; }
if( ! oldY[layerIndex] ) { oldY[layerIndex] = y; }
var left = 0, top = 0;
switch(e.which) {
case 37: left--; break; // left
case 38: top--; break; // up
case 39: left++; break; // right
case 40: top++; break; // down
}
// Move horizontally
if(left) {
e.preventDefault();
x += (e.shiftKey || e.altKey) ? left*10 : left;
layerData.styles.left = x+'px';
previewItem.css('left', x+'px');
jQuery('.ls-sublayer-pages input[name=left]').val(x + 'px');
}
// Move vertically
if(top) {
e.preventDefault();
y += (e.shiftKey || e.altKey) ? top*10 : top;
layerData.styles.top = y+'px';
previewItem.css('top', y+'px');
jQuery('.ls-sublayer-pages input[name=top]').val(y + 'px');
}
updateInfo.push({
itemIndex: layerIndex,
undo: { left: oldX[layerIndex]+'px', top: oldY[layerIndex]+'px'},
redo: { left: x+'px', top: y+'px'},
});
});
clearTimeout(keyTimeout);
keyTimeout = setTimeout(function() {
LS_UndoManager.add('layer.style', LS_l10n.SBUndoLayerPosition, updateInfo.reverse());
oldX = {}; oldY = {};
}, 1000);
LayerSlider.updatePreviewSelection();
}
}
});
// Save changes
jQuery('#ls-slider-form').submit(function(e) {
e.preventDefault();
LayerSlider.save(this);
});
// Add color picker
LayerSlider.addColorPicker( jQuery('.ls-slider-settings input.ls-colorpicker') );
// Show color picker on focus
jQuery('.color').focus(function() {
jQuery(this).next().slideDown();
// Hide color picker on blur
}).blur(function() {
jQuery(this).next().slideUp();
});
// Jump to original layer
jQuery('.ls-static-sublayers').on('click', '.ls-icon-jump', function(e) {
e.preventDefault();
e.stopPropagation();
LayerSlider.revealStaticLayer( this );
});
// Eye icon for layers
jQuery('.ls-sublayers').on('click', '.ls-icon-eye', function(e) {
e.stopPropagation();
LayerSlider.hideLayer(this);
// Lock icon for layers
}).on('click', '.ls-icon-lock', function(e) {
e.stopPropagation();
LayerSlider.lockLayer(this);
// Collapse layer before sorting
}).on('mousedown', '.ls-sublayer-sortable-handle', function(){
jQuery(this).closest('.ls-sublayers').addClass('dragging');
// Expand layer after sorting
}).on('mouseup', '.ls-sublayer-sortable-handle', function(){
jQuery('#ls-layers .ls-layer-box.active .ls-sublayer-sortable').removeClass('dragging');
});
LS_PostOptions.init();
LS_PostChooser.init();
LS_InsertIcons.init();
LS_InsertMedia.init();
LS_ButtonPresets.init();
LS_ImportSlide.init();
LS_ImportLayer.init();
// Transitions gallery
jQuery(document).on('click', '#transitionmenu ul li', function() {
// Update navigation
jQuery(this).siblings().removeClass('active');
jQuery(this).addClass('active');
// Update view
jQuery('#ls-transitions-list section').removeClass('active');
jQuery('#ls-transitions-list section').eq( jQuery(this).index() ).addClass('active');
// Show the select all / deselect all button
jQuery('#transitionmenu i:last-child').show();
// Custom transitions
if(jQuery(this).index() == 2) {
jQuery('#ls-transitions-list section').eq(3).addClass('active');
// Special effects
} else if(jQuery(this).index() == 3) {
jQuery('#ls-transitions-list section').eq(3).removeClass('active');
jQuery('#ls-transitions-list section').eq(4).addClass('active');
jQuery('#transitionmenu i:last-child').hide();
}
// Update 'Select all' button
var trs = jQuery('#ls-transitions-list section.active').find('.tr-item');
if(trs.filter('.added').length == trs.length) {
jQuery('#transitiongallery-header i:last').attr('class', 'on').text( LS_l10n.deselectAll );
} else {
jQuery('#transitiongallery-header i:last').attr('class', 'off').text( LS_l10n.selectAll );
}
});
// Link slide to post url
jQuery('#ls-layers').on('click', '.ls-slide-link a.dyn', function(e) {
e.preventDefault();
var $holder = jQuery(this).closest('.ls-slide-link'),
$input = jQuery('input.url', $holder);
// UndoManager action name
var isSlide = $holder.closest('.ls-slide-options').length,
linkData = isSlide ? LS_activeSlideData.properties : LS_activeLayerDataSet[0],
undoText = isSlide ? LS_l10n.SBUndoSlide : LS_l10n.SBUndoLayer,
undoArea = isSlide ? 'slide.general' : 'layer.general',
undoIndex = isSlide ? LS_activeSlideIndex : LS_activeLayerIndexSet[0],
urlField = isSlide ? 'layer_link' : 'url';
// Add UndoManager action
LS_UndoManager.add( undoArea, undoText, {
itemIndex: undoIndex,
undo: {
[urlField]: linkData[urlField] || '',
linkId: linkData.linkId || '',
linkName: linkData.linkName || '',
linkType: linkData.linkType || ''
},
redo: {
[urlField]: '[post-url]',
linkId: '',
linkName: '',
linkType: ''
}
});
// Remove placeholder & push data to datasource
$input.val('[post-url]');
$holder.find('input')
.trigger('input');
// Update interface
LS_GUI.updateLinkPicker( $input );
// Insert Link dropdown
}).on('click', '.ls-insert-link-button', function(e) {
e.preventDefault();
var $dropdown = jQuery('.ls-insert-link');
setTimeout(function() {
jQuery('body').off('click.ls-insert-link');
$dropdown.removeClass('ls-hidden');;
TweenLite.set( $dropdown, {
y: 20,
opacity: 0
});
TweenLite.to( $dropdown, 0.15, {
y: 0,
opacity: 1
});
jQuery('body').one('click.ls-insert-link', function() {
TweenLite.to( jQuery('.ls-insert-link'), 0.15, {
y: 20,
opacity: 0,
onComplete: function() {
jQuery('.ls-insert-link').addClass('ls-hidden');
}
});
});
}, 100);
// Empty linking field
}).on('click', '.ls-slide-link a.change', function(e) {
e.preventDefault();
var $parent = jQuery(this).closest('.ls-slide-link');
// UndoManager action name
var isSlide = $parent.closest('.ls-slide-options').length,
linkData = isSlide ? LS_activeSlideData.properties : LS_activeLayerDataSet[0],
undoText = isSlide ? LS_l10n.SBUndoSlide : LS_l10n.SBUndoLayer,
undoArea = isSlide ? 'slide.general' : 'layer.general',
undoIndex = isSlide ? LS_activeSlideIndex : LS_activeLayerIndexSet[0],
urlField = isSlide ? 'layer_link' : 'url';
// Add UndoManager action
LS_UndoManager.add( undoArea, undoText, {
itemIndex: undoIndex,
undo: {
[urlField]: linkData[urlField] || '',
linkId: linkData.linkId || '',
linkName: linkData.linkName || '',
linkType: linkData.linkType || ''
},
redo: {
[urlField]: '',
linkId: '',
linkName: '',
linkType: ''
}
});
// Remove placeholder & push data to datasource
$parent
.removeClass('has-link')
.find('input')
.val('')
.prop('disabled', false)
.trigger('input');
// Update interface
LS_GUI.updateLinkPicker('url');
});
jQuery('#ls-layers').on('click', '#ls-background-notification a', function( e ) {
e.preventDefault();
jQuery('.ls-layer-style-tab').click();
});
// Use post image as slide background
jQuery('#ls-layers').on('click', '.slide-image .ls-post-image', function(e) {
e.preventDefault();
var imageHolder = jQuery(this).closest('.slide-image').find('.ls-image');
// Slide image
if( imageHolder.hasClass('ls-slide-image') ) {
LS_activeSlideData.properties.background = '[image-url]';
LS_activeSlideData.properties.backgroundId = '';
LS_activeSlideData.properties.backgroundThumb = '';
// Reset image field, generatePreview() will populate them
// with the actual content (if any)
LS_GUI.updateImagePicker( 'background', false );
// Layer image
} else if( imageHolder.hasClass('ls-layer-image') ) {
LS_activeLayerDataSet[0].image = '[image-url]';
LS_activeLayerDataSet[0].imageId = '';
LS_activeLayerDataSet[0].imageThumb = '';
// Reset image field, generatePreview() will populate them
// with the actual content (if any)
LS_GUI.updateImagePicker( 'image', false );
jQuery('.ls-sublayers li').eq(LS_activeLayerIndexSet[0])
.find('.ls-sublayer-thumb').addClass('dashicons dashicons-format-image')
.find('img').remove();
// Layer background
} else if( imageHolder.hasClass('ls-layer-background-image') ) {
LS_activeLayerDataSet[0].layerBackground = '[image-url]';
LS_activeLayerDataSet[0].layerBackgroundId = '';
LS_activeLayerDataSet[0].layerBackgroundThumb = '';
// Reset image field, generatePreview() will populate them
// with the actual content (if any)
LS_GUI.updateImagePicker( 'layerBackground', false );
}
LayerSlider.generatePreview();
});
LS_DataSource.buildSlide();
LayerSlider.addPreviewSlider( jQuery('#ls-layers .ls-editor-slider'), 1 );
LayerSlider.generatePreview();
var $ruler = jQuery('.ls-preview-td').lsRuler();
// Undo
jQuery('#ls-layers').on('click', '.ls-editor-undo:not(.disabled)', function() {
LS_UndoManager.undo();
// Redo
}).on('click', '.ls-editor-redo:not(.disabled)', function() {
LS_UndoManager.redo();
// UndoManager track options
}).on('click focus change', 'select, input, textarea', function(event) {
LS_UndoManager.trackInputs( event, this );
});
$lasso = jQuery('<div>').resizable({
handles: 'all'
// keep aspect ratio when resize layer at corner
}).on('mousedown.ls', '.ui-resizable-handle', function(e){
if( e.which == 1 ){
$lasso.data('ui-resizable')._aspectRatio = !!this.className.match(/-se|-sw|-ne|-nw/);
}
// store selected layers size & position
}).on('resizestart.ls', function( event, ui ){
var uiPos = ui.helper.position();
ui.originalPosition.top = uiPos.top;
ui.originalPosition.left = uiPos.left;
jQuery('.ls-preview .ui-selected').each(function() {
var $layer = jQuery(this),
pos = $layer.position();
$layer.data('originalPosition', {
top: pos.top / LS_previewZoom,
left: pos.left / LS_previewZoom
}).data('originalSize', {
width: $layer.outerWidth(),
height: $layer.outerHeight(),
fontSize: parseInt($layer.css('fontSize')),
lineHeight: $layer.css('lineHeight').indexOf('px') !== -1 ? parseInt( $layer.css('lineHeight') ) : false
});
});
// update selected layers size & position
}).on('resize.ls', function(e, ui){
LayerSlider.resizing(e, ui);
}).on('resizestop.ls', function(e, ui) {
var updateInfo = [];
LayerSlider.resizing(e, ui);
// Remove directio data from $lasso
$lasso.removeData( 'dragDirection');
jQuery('.ls-preview .ui-selected').each(function() {
var $layer = jQuery(this),
index = $layer.index(),
layerData = LS_activeSlideData.sublayers[index],
position = $layer.position(),
size = { width: $layer.width(), height: $layer.height() },
fontSize = parseInt($layer.css('font-size')),
lineHeight = parseInt($layer.css('line-height')),
origPos = $layer.data('originalPosition'),
origSize = $layer.data('originalSize');
var undoObj = {
itemIndex: index,
undo: {
top: origPos.top+'px',
left: origPos.left+'px',
width: origSize.width+'px',
height: origSize.height+'px',
'font-size': origSize.fontSize+'px',
'line-height': origSize.lineHeight+'px',
},
redo: {
top: Math.round(position.top / LS_previewZoom)+'px',
left: Math.round(position.left / LS_previewZoom)+'px',
width: Math.round(size.width)+'px',
height: Math.round(size.height)+'px',
'font-size': Math.round(fontSize)+'px',
'line-height': Math.round(lineHeight)+'px'
}
};
if( ! layerData.styles.width && ! $layer.is('img,div') ) {
$layer.width('auto');
delete undoObj.undo.width;
delete undoObj.redo.width;
}
if( ! layerData.styles.height && ! $layer.is('img,div') ) {
$layer.height('auto');
delete undoObj.undo.height;
delete undoObj.redo.height;
}
updateInfo.push(undoObj);
});
LS_UndoManager.add('layer.style', LS_l10n.SBUndoLayerResize, updateInfo);
LayerSlider.updatePreviewSelection();
}).addClass('ui-selected-helper').appendTo( LS_previewHolder );
LS_previewHolder.on('mouseup.ls', function(e) {
var $helper = jQuery('.ui-selectable-helper');
if( $helper.length ) {
var pos = $helper.position(),
selTop = pos.top,
selLeft = pos.left,
selWidth = $helper.outerWidth(),
selHeight = $helper.outerHeight(),
items = [];
// Loop through layers list
LS_previewArea.children('.ls-l').each(function(layerIndex) {
var $layer = jQuery(this),
t = LS_previewArea.offset().top + $layer.position().top,
l = LS_previewArea.offset().left + $layer.position().left,
w = $layer.outerWidth() * LS_previewZoom,
h = $layer.outerHeight() * LS_previewZoom;
if(
(t > selTop && t+h < selTop+selHeight) &&
(l > selLeft && l+w < selLeft+selWidth)
) {
items.push(layerIndex);
}
});
if(items.length) {
LayerSlider.selectLayer( items );
}
}
}).selectable({
tolerance: 'fit',
filter: '.ui-draggable:not(.disabled,.transformed)',
cancel: '.disabled,.transformed'
// removeFrom | addTo selected layers
}).on('mouseup.ls', '.ui-draggable', function(e) {
// Allow selecting a single layer, even if it's
// already part of the selection if it wasn't dragged
if( e.which !== 3 && ! LS_layerWasDragged ) {
if( ! e.ctrlKey && ! e.metaKey ) {
var $layer = jQuery(this),
layerIndex = $layer.index(),
layerData = LS_activeSlideData.sublayers[ layerIndex ];
// Prevent locked layers to be selected
if( ! layerData || layerData.locked ) { return false; }
LayerSlider.selectLayer( [ jQuery(this).index() ] );
return;
}
}
}).on('mousedown.ls', '.ui-draggable', function(e){
LS_layerWasDragged = false;
if( e.which == 1 ) {
var $layer = jQuery(this),
layerIndex = $layer.index(),
layerData = LS_activeSlideData.sublayers[ layerIndex ];
// Prevent locked layers to be selected
if( ! layerData || layerData.locked ) { return false; }
if( $layer.hasClass('ui-selected') ){
if( e.ctrlKey || e.metaKey ){
$layer.removeClass('ui-selected').trigger('selectablestop.ls');
}
} else {
if( !e.ctrlKey && !e.metaKey ){
$layer.siblings('.ui-selected').removeClass('ui-selected');
}
$layer.addClass('ui-selected').trigger('selectablestop.ls');
}
}
// store selected layers, compute lasso position & size
}).on('selectablestop.ls', function(e, ui){
var layerIndexSet = [];
jQuery('.ls-preview-td .ui-selected').each(function() {
layerIndexSet.push( jQuery(this).index() );
});
if( ! layerIndexSet.length ) {
layerIndexSet = LS_activeLayerIndexSet;
}
LayerSlider.selectLayer(layerIndexSet);
}).on( 'dragstart.ls', function(u, ui){
LS_layerWasDragged = true;
var snapEl = ui.helper.data('ui-draggable').snapElements,
snapElLength = snapEl.length,
$item, width, height;
for( var s=0; s<snapElLength; s++ ) {
$item = jQuery( snapEl[s].item );
snapEl[s].width = $item.width() * LS_previewZoom;
snapEl[s].height = $item.height() * LS_previewZoom;
}
ui.helper.data({
originalWidth: ui.helper[0].style.width,
originalHeight: ui.helper[0].style.height
});
}).on('dragstop.ls', function(e, ui) {
ui.helper[0].style.width = ui.helper.data('originalWidth') || 'auto';
ui.helper[0].style.height = ui.helper.data('originalHeight') || 'auto';
}).on('drag.ls', function(e, ui){
jQuery.data( ui.helper[0], 'ui-draggable' ).helperProportions = {
width: ui.helper.width() * LS_previewZoom,
height: ui.helper.height() * LS_previewZoom
};
var dy = ( ui.position.top - ui.originalPosition.top ) / LS_previewZoom,
dx = ( ui.position.left - ui.originalPosition.left ) / LS_previewZoom;
// Move only horizontally/vertically while pressing shift
if( e.shiftKey ){
if( Math.abs(dx) >= Math.abs(dy) ){
dy = 0; ui.position.top = ui.originalPosition.top;
}else{
dx = 0; ui.position.left = ui.originalPosition.left;
}
ui.helper.css(ui.position);
}
// Disable snapTo while pressing ctrl/cmd key
if( ui.helper.draggable('option', 'snap')){
var d = ui.helper.data('ui-draggable');
if( (e.ctrlKey || e.metaKey) && d.snapElements.length ){
d._snapElements = d.snapElements; d.snapElements = [];
}
if( !(e.ctrlKey || e.metaKey) && !d.snapElements.length ){
d.snapElements = d._snapElements;
}
}
// Update selected layers position
jQuery.each(LS_activeLayerIndexSet, function(idx, layerIndex) {
var $item = LS_previewItems[layerIndex];
var op = $item.data('originalPosition');
$item[0].style.top = ( op.top + dy ) + 'px';
$item[0].style.left = ( op.left + dx ) + 'px';
});
// Update lasso position & position info
var op = $lasso.data('originalPosition');
$lasso.css({
top: op.top + dy * LS_previewZoom + 'px',
left: op.left + dx * LS_previewZoom + 'px'
}).attr({
'data-info-0': 'x: ' + $lasso.css('left'),
'data-info-1': 'y: ' + $lasso.css('top')
});
});
// km-ui smartResize init
kmUI.smartResize.init( '#ls-layers-settings-popout' );
setTimeout(function() {
LayerSlider.updatePreviewSelection();
}, 200);
if( document.fonts && document.fonts.ready && window.Promise ) {
document.fonts.ready.then( function() {
jQuery.each( LS_previewItems, function( layerIndex, $item ) {
var layers = LS_activeSlideData.sublayers,
data = layers[ layerIndex ],
top = data.styles.top,
left = data.styles.left;
LayerSlider.setPositions( $item, top, left );
});
LayerSlider.updatePreviewSelection();
});
}
jQuery(document).on('click', '.ls-activation-lock', function( e ) {
e.preventDefault();
lsDisplayActivationWindow();
});
};
jQuery(document).ready(function() {
// Initialize the interface only if the
// lsSliderData variable is set.
if( window.lsSliderData ) {
initSliderBuilder();
}
});
(function( $ ) {
$.fn.lsRuler = function(unit) {
unit = unit || 50;
var $this = this.addClass('ls-ruler'),
$preview = LS_previewWrapper;
var offsetX = 0, offsetY = 0;
var $info = $('<div class="ls-ruler-info">').appendTo(document.body);
var onDragRulerLineX = function(e) {
var y = parseFloat( $preview.data('lsRulerPos').y );
$info.css({
display: y > 0 ? 'block' : 'none',
left: e.pageX + 15,
top: e.pageY - 35,
}).html('Y: '+ Math.round(y / LS_previewZoom) +' px');
};
var onDragRulerLineY = function(e) {
var x = parseFloat( $preview.data('lsRulerPos').x );
$info.css({
display: x > 0 ? 'block' : 'none',
left: e.pageX + 20,
top: e.pageY - 40,
}).html('X: '+ Math.round(x / LS_previewZoom) +' px');
};
var $x = $('<div class="ls-ruler-x">').draggable({
axis: 'y',
cursorAt: {top: 0},
helper: function() {
return $('<div class="ls-ruler-line-x">').appendTo(LS_previewWrapper);
},
drag: onDragRulerLineX,
stop: function(e, ui) {
$info.css('display', '');
if (ui.position.top < 0) return;
var $clone = ui.helper.clone().removeClass('ui-draggable-dragging');
$clone.draggable({
axis: 'y',
start: function(e, ui) {
offsetY = ui.offset.top - e.pageY;
},
drag: onDragRulerLineX,
stop: function(e, ui) {
offsetY = 0;
$info.css('display', '');
ui.position.top < 0 && ui.helper.remove();
}
}).data({
originalTop: ui.position.top / LS_previewZoom,
originalLeft: ui.position.left / LS_previewZoom
}).appendTo($preview);
}
}).appendTo(LS_previewWrapper);
var $y = $('<div class="ls-ruler-y">').draggable({
axis: 'x',
cursorAt: {left: 0},
helper: function() {
return $('<div class="ls-ruler-line-y">').appendTo(LS_previewWrapper);
},
drag: onDragRulerLineY,
stop: function(e, ui) {
$info.css('display', '');
if (ui.position.left < 0) return;
var $clone = ui.helper.clone().removeClass('ui-draggable-dragging');
$clone.draggable({
axis: 'x',
start: function(e, ui) {
offsetX = ui.offset.left - e.pageX;
},
drag: onDragRulerLineY,
stop: function(e, ui) {
offsetX = 0;
$info.css('display', '');
ui.position.left < 0 && ui.helper.remove();
}
}).data({
originalTop: ui.position.top / LS_previewZoom,
originalLeft: ui.position.left / LS_previewZoom
}).appendTo($preview);
}
}).appendTo(LS_previewWrapper);
var $xw = $('<div class="ls-ruler-wrapper">').appendTo($x),
$yw = $('<div class="ls-ruler-wrapper">').appendTo($y),
$xt = $('<div class="ls-ruler-tracker">').appendTo($x),
$yt = $('<div class="ls-ruler-tracker">').appendTo($y);
$this.on('zoom.lsRuler', function() {
// Lower the number of ticks when zoomed out
$this.toggleClass('disable-5px', LS_previewZoom < 0.75);
// Resize ruler ticks
$x.add($y).css({ fontSize: LS_previewZoom * unit });
// Resize guide lines
jQuery('.ls-ruler-line-x, .ls-ruler-line-y').each(function() {
var top = jQuery(this).data('originalTop') * LS_previewZoom,
left = jQuery(this).data('originalLeft') * LS_previewZoom;
jQuery(this).css({ top: top, left: left });
});
}).on('resize.lsRuler', function() {
$this.trigger('zoom.lsRuler');
var xu = Math.ceil($preview.width() / LS_previewZoom / unit);
var yu = Math.ceil($preview.height() / LS_previewZoom / unit);
for (var i = $xw.children().length; i < xu; i++)
$xw.append('<div class="ls-ruler-unit"><div class="ls-ruler-num">'+ i * unit);
for (var j = $yw.children().length; j < yu; j++)
$yw.append('<div class="ls-ruler-unit"><div class="ls-ruler-num">'+ j * unit);
}).trigger('resize.lsRuler');
$preview.on('mousemove.lsRuler', function(e) {
var pos = {
x: e.pageX + offsetX - Math.round($x.offset().left),
y: e.pageY + offsetY - Math.round($y.offset().top)
};
$preview.data('lsRulerPos', pos);
$xt.css('left', pos.x);
$yt.css('top', pos.y);
}).on('mouseleave.lsRuler', function() {
$xt.css('left', '');
$yt.css('top', '');
});
return $this;
};
}( jQuery ));
var kmComboBox = {
init: function() {
jQuery(document).on('focus', '.km-combo-input:not(.opened)', function() {
LS_comboBoxIsDirty = false;
kmComboBox.show( jQuery(this) );
}).on('click', '.km-combo-box li', function(){
LS_comboBoxIsDirty = false;
kmComboBox.select( jQuery(this) );
}).on('blur', '.km-combo-input.opened', function() {
var $input = jQuery(this);
setTimeout(function($input) {
kmComboBox.hide( $input );
}, 200, $input);
setTimeout(function() {
if( LS_comboBoxIsDirty ) {
LayerSlider.generateSelectedPreviewItems();
}
}, 100);
}).on('mouseenter', '.km-combo-box li', function() {
var $item = jQuery(this),
cssProp = $item.parent().data('css-property'),
cssVal = $item.text(),
fontFamily = $item.data('font-family');
if( fontFamily || cssProp ) {
LS_previewArea
.children('.ui-selected')
.css( cssProp || 'font-family', fontFamily || parseInt(cssVal));
LayerSlider.updatePreviewSelection();
LS_comboBoxIsDirty = true;
}
});
},
show: function( $input ) {
var $wrapper,
$list,
$parent = $input.parent(),
options,
width,
input,
list,
paddingTop;
$parent.addClass( 'km-combo-parent' );
input = {
width: $input.outerWidth(),
height: $input.outerHeight( true ),
left: $input.position().left - parseInt( $parent.css( 'padding-left') ),
top: $input.position().top,
margins: parseInt( $input.css( 'margin-top' ) ) + parseInt( $input.css( 'margin-bottom' ) )
};
$parent.removeClass( 'km-combo-parent' );
// Retrieve list options
options = $input.data('options');
// Create wrapper
$wrapper = jQuery('<div class="km-combo-box"></div>').insertAfter( $input.addClass( 'opened' ) );
// Insert combo-list after the input
$list = jQuery('<ul class="km-combo-list">').appendTo( $wrapper );
$list.data('css-property', $input.data('css-property') );
// Populate list
jQuery.each(options, function(index, option) {
var optionName = jQuery.type(option) == 'string' ? option : option.name || option.value,
optionValue = option.value || optionName,
listItem = jQuery('<li>').data({
name: optionName,
value: optionValue,
linkAction: option.linkAction || false
});
listItem.text(optionName).appendTo($list);
if( option.font ) {
listItem
.data('font-family', optionValue)
.css('font-family', optionValue);
} else if( option.button ) {
} else if( option.class ) {
listItem.addClass( option.class );
}
});
// set styles
list = {
paddingLeft: parseInt( $list.css( 'padding-left' ) ),
paddingRight: parseInt( $list.css( 'padding-right' ) ),
paddingTop: parseInt( $list.css( 'padding-top' ) ),
paddingBottom: parseInt( $list.css( 'padding-bottom' ) ),
width: $list.outerWidth()
};
$list.css({
paddingTop: list.paddingTop * 2 + input.height
});
list.height = $list.outerHeight();
wrapper = {
width: Math.max( input.width + list.paddingLeft + list.paddingRight, list.width ) + 4
};
$wrapper.css({
width: wrapper.width,
transform: 'translate3d( ' + ( ( input.left + input.width / 2 ) - wrapper.width / 2 ) + 'px,' + ( - input.height - list.paddingTop ) + 'px, 0 )',
height: list.height
});
},
hide: function( $input ) {
// Remove the list and wrapper
$input.removeClass( 'opened' ).next('.km-combo-box').remove();
},
select: function( $li ) {
if( $li.is('.group,.button') ) {
return;
}
var $wrapper = $li.closest('.km-combo-box'),
$input = $wrapper.prev('input');
// Link Action
if( $li.data('linkAction' ) ) {
var $holder = $input.closest('.ls-slide-link');
// UndoManager action name
var isSlide = $holder.closest('.ls-slide-options').length,
linkData = isSlide ? LS_activeSlideData.properties : LS_activeLayerDataSet[0],
undoText = isSlide ? LS_l10n.SBUndoSlide : LS_l10n.SBUndoLayer,
undoArea = isSlide ? 'slide.general' : 'layer.general',
undoIndex = isSlide ? LS_activeSlideIndex : LS_activeLayerIndexSet[0],
urlField = isSlide ? 'layer_link' : 'url';
// Add link change to UndoManager
LS_UndoManager.add( undoArea, undoText, {
itemIndex: undoIndex,
undo: {
[urlField]: linkData[urlField] || '',
linkId: linkData.linkId || '',
linkName: linkData.linkName || '',
linkType: linkData.linkType || ''
},
redo: {
[urlField]: $li.data('value'),
linkId: '',
linkName: $li.data('name'),
linkType: ''
}
});
// Push data to DataSource
$input.val( $li.data('value') );
$holder.find('input[name="linkName"]').val( $li.data('name') );
$holder
.find('input')
.trigger('input');
LS_GUI.updateLinkPicker( $input );
// Enter value into input & trigger event
} else {
$input.val( $li.data('value') ).trigger('input').trigger('change');
}
}
};
var layerTransitionPreview = {
create: function(){
jQuery( '#ls-layers' ).on( 'mouseenter', '#ls-transition-selector-table .ls-tpreview-wrapper', function(){
var _tl = new TimelineMax(),
$el = jQuery(this);
if( $el.data( 'ls-tpreview' ) ){
$el.data( 'ls-tpreview' ).clear().kill();
$el.removeData( 'ls-tpreview' );
}
switch( $el.attr('id').split( 'ls-tpreview-')[1] ){
case 'in':
_tl.fromTo( $el.find( '.ls-preview-layer' )[0], 1.5, {
opacity: 1,
x: -90
},{
ease: Quart.easeInOut,
x: 0
}).to( $el.find( '.ls-preview-layer' )[0], 0.25, {
opacity: 0,
onComplete: function(){
_tl.progress( 0 );
}
});
break;
case 'out':
_tl.to( $el.find( '.ls-preview-layer' )[0], 1.5, {
ease: Quart.easeInOut,
x: 90
}).fromTo( $el.find( '.ls-preview-layer' )[0], 0.25, {
immediateRender: false,
x: 0,
opacity: 0
},{
opacity: 1,
onComplete: function(){
_tl.progress( 0 );
}
});
break;
case 'textin':
_tl.staggerFromTo( $el.find( '.ls-preview-layer_t' ).get(), 1, {
opacity: 1,
x: -100,
rotation: -90
},{
ease: Quart.easeOut,
x: 0,
rotation: 0
}, 0.15, null, function(){
_tl.staggerTo( $el.find( '.ls-preview-layer_t' ).get(), 0.25, {
opacity: 0
}, 0, null, function(){
_tl.progress( 0 );
});
});
break;
case 'textout':
_tl.staggerTo( $el.find( '.ls-preview-layer_t' ).get(), 1, {
x: 100,
rotation: 90,
ease: Quart.easeIn,
}, 0.15, null, function(){
_tl.staggerFromTo( $el.find( '.ls-preview-layer_t' ).get(), 0.25, {
immediateRender: false,
x: 0,
opacity: 0,
rotation: 0
},{
opacity: 1
}, 0, null, function(){
_tl.progress( 0 );
});
});
break;
case 'loop':
_tl.to( $el.find( '.ls-preview-layer' )[0], 1.5, {
rotation: 360,
repeat: -1,
ease: Linear.easeNone
});
break;
case 'hover':
_tl.to( $el.find( '.ls-preview-layer' )[0], .75, {
scale: 1.5,
repeat: -1,
yoyo: true,
ease: Quad.easeInOut
});
break;
case 'parallax':
_tl.to( $el.find( '.ls-preview-layer' )[0], 1, {
x: -10,
repeat: -1,
yoyo: true,
ease: Quad.easeInOut
}, 0 );
_tl.to( $el.find( '.ls-preview-layer_b' )[0], 1, {
x: -15,
repeat: -1,
yoyo: true,
ease: Quad.easeInOut
}, 0 );
break;
}
jQuery(this).data( 'ls-tpreview', _tl );
});
jQuery( '#ls-layers' ).on( 'mouseleave', '#ls-transition-selector-table .ls-tpreview-wrapper', function(){
if( jQuery(this).data( 'ls-tpreview' ) ){
jQuery(this).data( 'ls-tpreview' ).clear().kill();
jQuery(this).removeData( 'ls-tpreview' );
TweenMax.set( jQuery(this).find( '.ls-preview-layer, .ls-preview-layer_t' ).get(), {
opacity: 1,
rotation: 0,
scale: 1,
x: 0,
});
}
});
}
};
var prepTemplateForRelease = function() {
var sliderData = window.lsSliderData,
sliderProps = sliderData.properties;
// Global BG & YourLogo
if( sliderProps.backgroundimage ) { sliderProps.backgroundimage = LS_Utils.parse_url( sliderProps.backgroundimage, 'PHP_URL_PATH'); }
if( sliderProps.yourlogo ) { sliderProps.yourlogo = LS_Utils.parse_url( sliderProps.yourlogo, 'PHP_URL_PATH'); }
if( sliderProps.preview ) { sliderProps.preview = LS_Utils.parse_url( sliderProps.preview, 'PHP_URL_PATH'); }
if( sliderData.meta && sliderData.meta.preview ) { sliderData.meta.preview = LS_Utils.parse_url( sliderData.meta.preview, 'PHP_URL_PATH'); }
// Slides
jQuery.each(window.lsSliderData.layers, function(slideIndex, slideData) {
var slideProps = slideData.properties;
slideData.history = [];
if( slideData.meta && slideData.meta.undoStackIndex ) {
slideData.meta.undoStackIndex = -1;
}
if( slideProps.background ) { slideProps.background = LS_Utils.parse_url( slideProps.background, 'PHP_URL_PATH'); }
if( slideProps.backgroundThumb ) { slideProps.backgroundThumb = LS_Utils.parse_url( slideProps.backgroundThumb, 'PHP_URL_PATH'); }
if( slideProps.thumbnail ) { slideProps.thumbnail = LS_Utils.parse_url( slideProps.thumbnail, 'PHP_URL_PATH'); }
if( slideProps.thumbnailThumb ) { slideProps.thumbnailThumb = LS_Utils.parse_url( slideProps.thumbnailThumb, 'PHP_URL_PATH'); }
// Layers
jQuery.each(slideData.sublayers, function(layerIndex, layerData) {
if( layerData.image ) { layerData.image = LS_Utils.parse_url( layerData.image, 'PHP_URL_PATH'); }
if( layerData.imageThumb ) { layerData.imageThumb = LS_Utils.parse_url( layerData.imageThumb, 'PHP_URL_PATH'); }
if( layerData.poster ) { layerData.poster = LS_Utils.parse_url( layerData.poster, 'PHP_URL_PATH'); }
if( layerData.posterThumb ) { layerData.posterThumb = LS_Utils.parse_url( layerData.posterThumb, 'PHP_URL_PATH'); }
if( layerData.layerBackground ) { layerData.layerBackground = LS_Utils.parse_url( layerData.layerBackground, 'PHP_URL_PATH'); }
if( layerData.layerBackgroundThumb ) { layerData.layerBackgroundThumb = LS_Utils.parse_url( layerData.layerBackgroundThumb, 'PHP_URL_PATH'); }
});
});
LS_UndoManager.update();
alert("All Done. Performed tasks:\r\n\r\nā Converted URLs to relative format\r\nā Emptied slides history\r\n\r\nManual save required.");
};