' +
'
' + self.options.confirm_title + '
' +
'
' + self.options.confirm_content + '
' +
'
' +
'' +
'' +
'
' +
'
' +
'';
// now push content into markup
self.build_modal(content);
},
// Create Image/Gallery Modal
// ----------------------------------------------------------------
create_image : function() {
var self = this;
var content;
var modaal_image_markup = '';
var gallery_total;
// If has group attribute
if ( self.$elem.is('[data-group]') || self.$elem.is('[rel]') ) {
// find gallery groups
var use_group = self.$elem.is('[data-group]');
var gallery_group = use_group ? self.$elem.attr('data-group') : self.$elem.attr('rel');
var gallery_group_items = use_group ? $('[data-group="' + gallery_group + '"]') : $('[rel="' + gallery_group + '"]');
// remove any previous active attribute to any in the group
gallery_group_items.removeAttr('data-gallery-active', 'is_active');
// add active attribute to the item clicked
self.$elem.attr('data-gallery-active', 'is_active');
// how many in the grouping are there (-1 to connect with each function starting with 0)
gallery_total = gallery_group_items.length - 1;
// prepare array for gallery data
var gallery = [];
// start preparing markup
modaal_image_markup = '';
// loop each grouping item and push it into our gallery array
gallery_group_items.each(function(i, item) {
// setup default content
var img_src = '';
var img_alt = '';
var img_description = '';
var img_active = false;
var img_src_error = false;
var data_modaal_desc = item.getAttribute('data-modaal-desc');
var data_item_active = item.getAttribute('data-gallery-active');
// if item has inline custom source, use that instead of href. Fall back to href if available.
if ( $(item).attr('data-modaal-content-source') ) {
img_src = $(item).attr('data-modaal-content-source');
} else if ( $(item).attr('href') ) {
img_src = $(item).attr('href');
} else if ( $(item).attr('src') ) {
img_src = $(item).attr('src');
} else {
img_src = 'trigger requires href or data-modaal-content-source attribute';
img_src_error = true;
}
// Does it have a modaal description
if ( data_modaal_desc != '' && data_modaal_desc !== null && data_modaal_desc !== undefined ) {
img_alt = data_modaal_desc;
img_description = '
Image ' + (i+1) + ' - ' + data_modaal_desc.replace(//g, ">") + '
'
} else {
img_description = '
Image ' + (i+1) + '
';
}
// is it the active item
if ( data_item_active ) {
img_active = true
}
// set new object for values we want
var gallery_item = {
'url': img_src,
'alt': img_alt,
'rawdesc': data_modaal_desc,
'desc': img_description,
'active': img_active,
'src_error': img_src_error
};
// push object into gallery array
gallery.push( gallery_item );
});
// now loop through all items in the gallery and build up the markup
for (var i = 0; i < gallery.length; i++) {
// Set default active class, then check if array item active is true and update string for class
var is_active = '';
var aria_label = gallery[i].rawdesc ? 'Image: ' + gallery[i].rawdesc : 'Image ' + i + ' no description';
if ( gallery[i].active ) {
is_active = ' ' + self.private_options.active_class;
}
// if gallery item has source error, output message rather than undefined image
var image_output = gallery[i].src_error ? gallery[i].url : '

';
// for each item build up the markup
modaal_image_markup += '
' +
image_output + gallery[i].desc +
'
';
}
// Close off the markup for the gallery
modaal_image_markup += '
';
// Add next and previous buttons if outside
if (self.options.outer_controls != true) {
modaal_image_markup += self.scope.prev_btn + self.scope.next_btn;
}
} else {
// This is only a single gallery item so let's grab the necessary values
// define the source, check if content_source option exists, and use that or fall back to href.
var this_img_src;
var img_src_error = false;
if ( self.$elem.attr('data-modaal-content-source') ) {
this_img_src = self.$elem.attr('data-modaal-content-source');
} else if ( self.$elem.attr('href') ) {
this_img_src = self.$elem.attr('href');
} else if ( self.$elem.attr('src') ) {
this_img_src = self.$elem.attr('src');
} else {
this_img_src = 'trigger requires href or data-modaal-content-source attribute';
img_src_error = true;
}
var this_img_alt_txt = '';
var this_img_alt = '';
var aria_label = '';
if ( self.$elem.attr('data-modaal-desc') ) {
aria_label = self.$elem.attr('data-modaal-desc');
this_img_alt_txt = self.$elem.attr('data-modaal-desc');
this_img_alt = 'This is the default confirm dialog content. Replace me through the options
', // html for confirm message
confirm_callback: function() {},
confirm_cancel_callback: function() {},
//Gallery Modal
gallery_active_class: 'gallery_active_item',
outer_controls: false,
before_image_change: function( current_item, incoming_item ) {},
after_image_change: function( current_item ) {},
//Ajax Modal
loading_content: modaal_loading_spinner,
loading_class: 'is_loading',
ajax_error_class: 'modaal-error',
ajax_success: function(){},
//Instagram
instagram_id: null
};
// Check and Set Inline Options
// ------------------------------------------------------------
function modaal_inline_options(self) {
// new empty options
var options = {};
var inline_options = false;
// option: type
if ( self.attr('data-modaal-type') ) {
inline_options = true;
options.type = self.attr('data-modaal-type');
}
// option: type
if ( self.attr('data-modaal-content-source') ) {
inline_options = true;
options.content_source = self.attr('data-modaal-content-source');
}
// option: animation
if ( self.attr('data-modaal-animation') ) {
inline_options = true;
options.animation = self.attr('data-modaal-animation');
}
// option: animation_speed
if ( self.attr('data-modaal-animation-speed') ) {
inline_options = true;
options.animation_speed = self.attr('data-modaal-animation-speed');
}
// option: after_callback_delay
if ( self.attr('data-modaal-after-callback-delay') ) {
inline_options = true;
options.after_callback_delay = self.attr('data-modaal-after-callback-delay');
}
// option: is_locked
if ( self.attr('data-modaal-is-locked') ) {
inline_options = true;
options.is_locked = (self.attr('data-modaal-is-locked') === 'true' ? true : false);
}
// option: hide_close
if ( self.attr('data-modaal-hide-close') ) {
inline_options = true;
options.hide_close = (self.attr('data-modaal-hide-close') === 'true' ? true : false);
}
// option: background
if ( self.attr('data-modaal-background') ) {
inline_options = true;
options.background = self.attr('data-modaal-background');
}
// option: overlay_opacity
if ( self.attr('data-modaal-overlay-opacity') ) {
inline_options = true;
options.overlay_opacity = self.attr('data-modaal-overlay-opacity');
}
// option: overlay_close
if ( self.attr('data-modaal-overlay-close') ) {
inline_options = true;
options.overlay_close = (self.attr('data-modaal-overlay-close') === 'false' ? false : true);
}
// option: accessible_title
if ( self.attr('data-modaal-accessible-title') ) {
inline_options = true;
options.accessible_title = self.attr('data-modaal-accessible-title');
}
// option: start_open
if ( self.attr('data-modaal-start-open') ) {
inline_options = true;
options.start_open = (self.attr('data-modaal-start-open') === 'true' ? true : false);
}
// option: fullscreen
if ( self.attr('data-modaal-fullscreen') ) {
inline_options = true;
options.fullscreen = (self.attr('data-modaal-fullscreen') === 'true' ? true : false);
}
// option: custom_class
if ( self.attr('data-modaal-custom-class') ) {
inline_options = true;
options.custom_class = self.attr('data-modaal-custom-class');
}
// option: close_text
if ( self.attr('data-modaal-close-text') ) {
inline_options = true;
options.close_text = self.attr('data-modaal-close-text');
}
// option: close_aria_label
if ( self.attr('data-modaal-close-aria-label') ) {
inline_options = true;
options.close_aria_label = self.attr('data-modaal-close-aria-label');
}
// option: background_scroll
if ( self.attr('data-modaal-background-scroll') ) {
inline_options = true;
options.background_scroll = (self.attr('data-modaal-background-scroll') === 'true' ? true : false);
}
// option: width
if ( self.attr('data-modaal-width') ) {
inline_options = true;
options.width = parseInt( self.attr('data-modaal-width') );
}
// option: height
if ( self.attr('data-modaal-height') ) {
inline_options = true;
options.height = parseInt( self.attr('data-modaal-height') );
}
// option: confirm_button_text
if ( self.attr('data-modaal-confirm-button-text') ) {
inline_options = true;
options.confirm_button_text = self.attr('data-modaal-confirm-button-text');
}
// option: confirm_cancel_button_text
if ( self.attr('data-modaal-confirm-cancel-button-text') ) {
inline_options = true;
options.confirm_cancel_button_text = self.attr('data-modaal-confirm-cancel-button-text');
}
// option: confirm_title
if ( self.attr('data-modaal-confirm-title') ) {
inline_options = true;
options.confirm_title = self.attr('data-modaal-confirm-title');
}
// option: confirm_content
if ( self.attr('data-modaal-confirm-content') ) {
inline_options = true;
options.confirm_content = self.attr('data-modaal-confirm-content');
}
// option: gallery_active_class
if ( self.attr('data-modaal-gallery-active-class') ) {
inline_options = true;
options.gallery_active_class = self.attr('data-modaal-gallery-active-class');
}
// option: loading_content
if ( self.attr('data-modaal-loading-content') ) {
inline_options = true;
options.loading_content = self.attr('data-modaal-loading-content');
}
// option: loading_class
if ( self.attr('data-modaal-loading-class') ) {
inline_options = true;
options.loading_class = self.attr('data-modaal-loading-class');
}
// option: ajax_error_class
if ( self.attr('data-modaal-ajax-error-class') ) {
inline_options = true;
options.ajax_error_class = self.attr('data-modaal-ajax-error-class');
}
// option: start_open
if ( self.attr('data-modaal-instagram-id') ) {
inline_options = true;
options.instagram_id = self.attr('data-modaal-instagram-id');
}
// now set it up for the trigger, but only if inline_options is true
if ( inline_options ) {
self.modaal(options);
}
};
// On body load (or now, if already loaded), init any modaals defined inline
// Ensure this is done after $.fn.modaal and default options are declared
// ----------------------------------------------------------------
$(function(){
var single_modaal = $('.modaal');
// Check for existing modaal elements
if ( single_modaal.length ) {
single_modaal.each(function() {
var self = $(this);
modaal_inline_options(self);
});
}
// Obvserve DOM mutations for newly added triggers
var modaal_dom_observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
// element added to DOM
var findElement = [].some.call(mutation.addedNodes, function(el) {
var elm = $(el);
if ( elm.is('a') || elm.is('button') ) {
if ( elm.hasClass('modaal') ) {
// is inline Modaal, initialise options
modaal_inline_options(elm);
} else {
// is not inline modaal. Check for existing selector
modaal_existing_selectors.forEach(function(modaalSelector) {
if ( modaalSelector.element == elm.attr('class') ) {
$(elm).modaal( modaalSelector.options );
retu