(function( $ ) {
'use strict';
/**
* Display the media uploader.
*
* @since 1.0.0
*/
function ayg_render_media_uploader( $elem ) {
var file_frame, attachment;
// If an instance of file_frame already exists, then we can open it rather than creating a new instance
if ( file_frame ) {
file_frame.open();
return;
};
// Use the wp.media library to define the settings of the media uploader
file_frame = wp.media.frames.file_frame = wp.media({
frame: 'post',
state: 'insert',
multiple: false
});
// Setup an event handler for what to do when a media has been selected
file_frame.on( 'insert', function() {
// Read the JSON data returned from the media uploader
attachment = file_frame.state().get( 'selection' ).first().toJSON();
// First, make sure that we have the URL of the media to display
if ( 0 > $.trim( attachment.url.length ) ) {
return;
};
// Set the data
$elem.prev( '.ayg-settings-url' )
.val( attachment.url );
});
// Now display the actual file_frame
file_frame.open();
};
/**
* Close the popup.
*
* @since 1.0.0
*/
function ayg_modal_hide() {
$( '.ayg-modal' ).hide();
$( 'html' ).removeClass( 'ayg-no-scroll' );
}
/**
* Get Youtube playlist ID from Youtube URL.
*
* @since 1.0.0
* @param {string} url - URL from which to extract the ID.
* @return {string}
*/
function ayg_get_youtube_playlist_id( url ) {
var id = /[&|\?]list=([a-zA-Z0-9_-]+)/gi.exec( url );
return ( id && id.length > 0 ) ? id[1] : url;
}
/**
* Get Youtube channel ID from Youtube URL.
*
* @since 1.0.0
* @param {string} url - URL from which to extract the ID.
* @return {object}
*/
function ayg_get_youtube_channel_id( url ) {
var type = 'channel';
var id = url;
url = url.replace( /(>|<)/gi, '' ).split( /(\/channel\/|\/user\/)/ );
if ( url[2] !== undefined ) {
id = url[2].split( /[^0-9a-z_-]/i );
id = id[0];
}
if ( /\/user\//.test( url ) ) {
type = 'username';
}
return {
type: type,
id: id
};
}
/**
* Get Youtube video ID from Youtube URL.
*
* @since 1.0.0
* @param {string} url - URL from which to extract the ID.
* @return {string}
*/
function ayg_get_youtube_video_id( url ) {
var id = url;
url = url.replace( /(>|<)/gi, '' ).split( /(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/ );
if ( url[2] !== undefined ) {
id = url[2].split( /[^0-9a-z_\-]/i );
id = id[0];
}
return id;
}
/**
* Widget: Initiate color picker
*
* @since 1.0.0
*/
function ayg_widget_color_picker( widget ) {
widget.find( '.ayg-color-picker' ).wpColorPicker( {
change: _.throttle( function() { // For Customizer
$( this ).trigger( 'change' );
}, 3000 )
});
}
function on_ayg_widget_update( event, widget ) {
ayg_widget_color_picker( widget );
}
/**
* Called when the page has loaded.
*
* @since 1.0.0
*/
$(function() {
// Common: Initialize the color picker
$( '.ayg-color-picker' ).wpColorPicker();
// Dashboard: Save API Key
$( '#ayg-button-save-api-key' ).on( 'click', function( e ) {
e.preventDefault();
$( this ).prop( 'disabled', true );
$( '.ayg-ajax-status', '#ayg-table-api-key' ).html( '' );
var data = {
'action': 'ayg_save_api_key',
'api_key': $( '#ayg-api-key' ).val(),
'security': ayg_admin.ajax_nonce
};
if ( ! data.api_key ) {
$( this ).prop( 'disabled', false );
$( '.ayg-ajax-status', '#ayg-table-api-key' ).html( '' + ayg_admin.i18n.invalid_api_key + '' );
return false;
}
$.post( ajaxurl, data, function( response ) {
window.location.reload(); // Reload document
});
});
// Dashboard: Generate shortcode
$( '#ayg-generate-shortcode' ).on( 'click', function( e ) {
e.preventDefault();
// Attributes
var props = {};
$( '.ayg-editor-control', '#ayg-shortcode-builder' ).each(function() {
var $elem = $( this ).find( '.ayg-editor-field' );
var type = $elem.attr( 'type' );
var key = $elem.attr( 'name' );
var value = $elem.val();
var def = $elem.data( 'default' );
// field type = checkbox
if ( 'checkbox' == type ) {
value = $elem.is( ':checked' ) ? 1 : 0;
}
// source = playlist
if ( 'playlist' == key ) {
value = ayg_get_youtube_playlist_id( value );
}
// source = channel
if ( 'channel' == key ) {
var result = ayg_get_youtube_channel_id( value );
key = result.type;
value = result.id;
if ( props.hasOwnProperty( 'type' ) && 'channel' == props.type ) {
props.type = key;
}
}
// source = video
if ( 'video' == key ) {
value = ayg_get_youtube_video_id( value );
}
// source = videos
if ( 'videos' == key ) {
var lines = value.split( '\n' ),
ids = [];
lines.map(function( url ) {
ids.push( ayg_get_youtube_video_id( url ) );
});
value = ids.join( ',' );
}
// Add only if the user input differ from the global configuration
if ( value != def ) {
props[ key ] = value;
}
});
var attrs = '';
for ( var key in props ) {
if ( props.hasOwnProperty( key ) ) {
attrs += ( ' ' + key + '="' + props[ key ] + '"' );
}
}
// Shortcode output
$( '#aiovg-shortcode').val( '[automatic_youtube_gallery' + attrs + ']' );
// Initialize the popup
$( 'html' ).addClass( 'ayg-no-scroll' );
$( '#ayg-shortcode-modal' ).show();
});
// Dashboard: Close the shortcode builder popup
$( '.ayg-modal-close' ).on( 'click', function( e ) {
e.preventDefault();
ayg_modal_hide();
});
$( '.ayg-modal-content' ).on( 'click', function( e ) {
if ( $( e.target ).hasClass( 'ayg-modal-content' ) ) {
ayg_modal_hide();
};
});
// Editor: Toggle between field sections
$( document ).on( 'click', '.ayg-editor-section-header', function( e ) {
var $elem = $( this ).parent();
if ( ! $elem.hasClass( 'ayg-active' ) ) {
$( this ).closest( '.ayg-editor' )
.find( '.ayg-editor-section.ayg-active' )
.toggleClass( 'ayg-active' )
.find( '.ayg-editor-controls' )
.slideToggle();
}
$elem.toggleClass( 'ayg-active' )
.find( '.ayg-editor-controls' )
.slideToggle();
});
// Editor: Show/Hide fields based on the selected source 'type'
$( document ).on( 'change', '.ayg-editor-field-type', function( e ) {
var type = $( this ).val();
var $elem = $( this ).closest( '.ayg-editor' );
$elem.removeClass(function( index, classes ) {
var matches = classes.match( /\ayg-editor-field-type-\S+/ig );
return ( matches ) ? matches.join(' ') : '';
});
$elem.addClass( 'ayg-editor-field-type-' + type );
});
// Editor: Show/Hide fields based on the selected theme
$( document ).on( 'change', '.ayg-editor-field-theme', function( e ) {
var theme = $( this ).val();
var $elem = $( this ).closest( '.ayg-editor' );
$elem.removeClass(function( index, classes ) {
var matches = classes.match( /\ayg-editor-field-theme-\S+/ig );
return ( matches ) ? matches.join(' ') : '';
});
$elem.addClass( 'ayg-editor-field-theme-' + theme );
});
// Editor: Show/Hide fields based on the selected pagination type
$( document ).on( 'change', '.ayg-editor-field-pagination_type', function( e ) {
var pagination_type = $( this ).val();
var $elem = $( this ).closest( '.ayg-editor' );
$elem.removeClass(function( index, classes ) {
var matches = classes.match( /\ayg-editor-field-pagination_type-\S+/ig );
return ( matches ) ? matches.join(' ') : '';
});
$elem.addClass( 'ayg-editor-field-pagination_type-' + pagination_type );
});
// Settings: Show/Hide fields based on the selected theme
$( 'tr.theme', '#ayg-settings' ).find( 'select' ).on( 'change', function() {
var theme = $( this ).val();
var $elem = $( '#ayg-settings' );
$elem.removeClass(function( index, classes ) {
var matches = classes.match( /\ayg-settings-theme-\S+/ig );
return ( matches ) ? matches.join(' ') : '';
});
$elem.addClass( 'ayg-settings-theme-' + theme );
});
// Settings: Show/Hide fields based on the selected pagination type
$( 'tr.pagination_type', '#ayg-settings' ).find( 'select' ).on( 'change', function() {
var pagination_type = $( this ).val();
var $elem = $( '#ayg-settings' );
$elem.removeClass(function( index, classes ) {
var matches = classes.match( /\ayg-settings-pagination_type-\S+/ig );
return ( matches ) ? matches.join(' ') : '';
});
$elem.addClass( 'ayg-settings-pagination_type-' + pagination_type );
});
// Settings: Browse button
$( '.ayg-settings-browse' ).on( 'click', function( e ) {
e.preventDefault();
ayg_render_media_uploader( $( this ) );
});
// Settings: Delete cache
$( '#ayg-button-delete-cache' ).on( 'click', function( e ) {
e.preventDefault();
$( this ).prop( 'disabled', true );
$( '.ayg-ajax-status', '#ayg-table-delete-cache' ).html( '' );
var data = {
'action': 'ayg_delete_cache',
'security': ayg_admin.ajax_nonce
};
$.post( ajaxurl, data, function( response ) {
$( this ).prop( 'disabled', false );
$( '.ayg-ajax-status', '#ayg-table-delete-cache' ).html( '' + ayg_admin.i18n.cleared + '' );
});
});
// Widget: Initiate color picker
$( '#widgets-right .widget:has(.ayg-color-picker)' ).each(function() {
ayg_widget_color_picker( $( this ) );
});
$( document ).on( 'widget-added widget-updated', on_ayg_widget_update );
});
})( jQuery );