%PDF- %PDF-
Direktori : /var/www/html/itworks/wp-content/plugins/thim-core/admin/assets/js/ |
Current File : /var/www/html/itworks/wp-content/plugins/thim-core/admin/assets/js/widget-admin.min.js |
var sowEmitters = { /** * Find the group/state and an extra match part. * * @param arg * @param matchPart * @return {*} */ '_match': function (arg, matchPart) { if (typeof matchPart === 'undefined') { matchPart = '.*'; } // Create the regular expression to match the group/state and extra match var exp = new RegExp('^([a-zA-Z0-9_-]+)(\\[([a-zA-Z0-9_-]+)\\])? *: *(' + matchPart + ') *$'); var m = exp.exec(arg); if (m === null) { return false; } var state = ''; var group = 'default'; if (m[3] !== undefined) { group = m[1]; state = m[3]; } else { state = m[1]; } return { 'match': m[4].trim(), 'group': group, 'state': state }; }, '_checker': function (val, args, matchPart, callback) { var returnStates = {}; if (typeof args.length === 'undefined') { args = [args]; } var m; for (var i = 0; i < args.length; i++) { m = sowEmitters._match(args[i], matchPart); if (m === false) { continue; } if (m.match === '_true' || callback(val, args, m.match)) { returnStates[m.group] = m.state; } } return returnStates; }, /** * A very simple state emitter that simply sets the given group the value * * * @param val * @param args * @returns {{}} */ 'select': function (val, args) { if (typeof args.length === 'undefined') { args = [args]; } var returnGroups = {}; for (var i = 0; i < args.length; i++) { if (args[i] === '') { args[i] = 'default'; } returnGroups[args[i]] = val; } return returnGroups; }, /** * The conditional state emitter uses eval to check a given conditional argument. * * @param val * @param args * @return {{}} */ 'conditional': function (val, args) { return sowEmitters._checker(val, args, '[^;{}]*', function (val, args, match) { return eval(match); }); }, /** * The in state emitter checks if the value is in an array of functions * * @param val * @param args * @return {{}} */ 'in': function (val, args) { return sowEmitters._checker(val, args, '[^;{}]*', function (val, args, match) { return match.split(',').map(function (s) { return s.trim(); }).indexOf(val) !== -1; }); } }; (function ($) { $.fn.obSetupForm = function () { return $(this).each(function (i, el) { var $el = $(el), $mainForm, formInitializing = true; // Skip this if we've already set up the form if ($el.is('.thim-widget-form-main')) { if ($el.data('sow-form-setup') == true) return true; if ($('body').hasClass('widgets-php') && !$el.is(':visible')) return true; // Listen for a state change event if this is the main form wrapper $el.on('sowstatechange', function (e, incomingGroup, incomingState) { // Find all wrappers that have state handlers on them $el.find('[data-state-handler]').each(function () { var $$ = $(this); // Create a copy of the current state handlers. Add in initial handlers if the form is initializing. var handler = $.extend({}, $$.data('state-handler'), formInitializing ? $$.data('state-handler-initial') : {}); if (Object.keys(handler).length === 0) { return true; } // We need to figure out what the incoming state is var handlerStateParts, handlerState, thisHandler, $$f, runHandler; // Indicates if the handler has run var handlerRun = {}; // Go through all the handlers for (var state in handler) { runHandler = false; // Parse the handler state parts handlerStateParts = state.match(/^([a-zA-Z0-9_-]+)(\[([a-zA-Z0-9_-]+)\])?(\[\])?$/); if (handlerStateParts === null) { // Skip this if there's a problem with the state parts continue; } handlerState = { 'group': 'default', 'name' : '', 'multi': false }; // Assign the handlerState attributes based on the parsed state if (handlerStateParts[2] !== undefined) { handlerState.group = handlerStateParts[1]; handlerState.name = handlerStateParts[3]; } else { handlerState.name = handlerStateParts[0]; } handlerState.multi = (handlerStateParts[4] !== undefined); if (handlerState.group === '_else') { // This is the special case of an group else handler // Always run if no handlers from the current group have been run yet handlerState.group = handlerState.name; handlerState.name = ''; // We will run this handler because none have run for it yet runHandler = ( typeof handlerRun[handlerState.group] === 'undefined' ); } else { // Evaluate if we're in the current state runHandler = (handlerState.group === incomingGroup && handlerState.name === incomingState); } // Run the handler if previous checks have determined we should if (runHandler) { thisHandler = handler[state]; // Now we can handle the the handler if (!handlerState.multi) { thisHandler = [thisHandler]; } for (var i = 0; i < thisHandler.length; i++) { // Choose the item we'll be acting on here if (typeof thisHandler[i][1] !== 'undefined' && Boolean(thisHandler[i][1])) { // thisHandler[i][1] is the sub selector $$f = $$.find(thisHandler[i][1]); } else { $$f = $$; } // Call the function on the wrapper we've selected if ($$f[thisHandler[i][0]] !== undefined) { $$f[thisHandler[i][0]].apply($$f, typeof thisHandler[i][2] !== 'undefined' ? thisHandler[i][2] : []); } } // Store that we've run a handler handlerRun[handlerState.group] = true; } } }); }); // Lets set up the preview $el.obSetupPreview(); $mainForm = $el; // Lets set up the preview } else { $mainForm = $el.closest('.thim-widget-form-main'); } // Find any field or sub widget fields. var $fields = $el.find('> .thim-widget-field'); // Process any sub sections $fields.find('> .thim-widget-section').obSetupForm(); // Store the field names $fields.find('.thim-widget-input').each(function (i, input) { if ($(input).data('original-name') == null) { $(input).data('original-name', $(input).attr('name')); } }); // Setup all the repeaters $fields.find('> .thim-widget-field-repeater').obSetupRepeater(); // For any repeater items currently in existence $el.find('.thim-widget-field-repeater-item').obSetupRepeaterActions(); //// Set up any color fields //$fields.find('> .tp-colorpicker').wpColorPicker() // Set up any color fields $fields.find('> .thim-widget-input-color').wpColorPicker() .closest('.thim-widget-field').find('a').click(function () { if (typeof $.fn.dialog != 'undefined') { $(this).closest('.panel-dialog').dialog("option", "position", "center"); } }); // handle the media field. Check that this is working $fields.find('> .media-field-wrapper').each(function () { var $media = $(this); // Handle the media uploader $media.find('a.media-upload-button').click(function (event) { if (typeof wp.media == 'undefined') return; var $$ = $(this); var $c = $(this).closest('.thim-widget-field'); var frame = $(this).data('frame'); // If the media frame already exists, reopen it. if (frame) { frame.open(); return false; } // Create the media frame. frame = wp.media({ // Set the title of the modal. title : $$.data('choose'), // Tell the modal to show only images. library: { type: $$.data('library').split(',').map(function (v) { return v.trim() }) }, // Customize the submit button. button : { // Set the text of the button. text : $$.data('update'), // Tell the button not to close the modal, since we're // going to refresh the page when the image is selected. close: false }, //multiple : true }); // Store the frame $$.data('frame', frame); // When an image is selected, run a callback. frame.on('select', function () { // Grab the selected attachment. var attachment = frame.state().get('selection').first().attributes; $c.find('.current .title').html(attachment.title); $c.find('input[type=hidden]').val(attachment.id); if (typeof attachment.sizes != 'undefined') { if (typeof attachment.sizes.thumbnail != 'undefined') $c.find('.current .thumbnail').attr('src', attachment.sizes.thumbnail.url).fadeIn(); else $c.find('.current .thumbnail').attr('src', attachment.sizes.full.url).fadeIn(); } else { $c.find('.current .thumbnail').attr('src', attachment.icon).fadeIn(); } frame.close(); }); // Finally, open the modal. frame.open(); return false; }); // Show/hide the remove button when hovering over the media select button. $media .mouseenter(function () { if ($(this).closest('.thim-widget-field').find('input[type=hidden]').val() != '') $(this).find('.media-remove-button').fadeIn('fast'); }) .mouseleave(function () { $(this).find('.media-remove-button').fadeOut('fast'); }) $media.find('.current') .mouseenter(function () { var t = $(this).find('.title'); if (t.html() != '') { t.fadeIn('fast'); } }) .mouseleave(function () { $(this).find('.title').clearQueue().fadeOut('fast'); }) $media.find('a.media-remove-button') .click(function () { var $$ = $(this).closest('.thim-widget-field'); $$.find('.current .title').html(''); $$.find('input[type=hidden]').val(''); $$.find('.current .thumbnail').fadeOut('fast'); $(this).fadeOut('fast'); }); }) /* Multi Media */ // handle the media field. Check that this is working $fields.find('> .multi-media-field-wrapper').each(function () { var $media = $(this); var $ulist = $media.find(".media-content"); $ulist.sortable({ items : 'li', update: function () { var $vl = $ulist.sortable('toArray').toString(); $media.closest('.thim-widget-field').find('input[type=hidden]').val($vl); } }); // Handle the media uploader $media.find('a.media-upload-button').click(function (event) { if (typeof wp.media == 'undefined') return; var $$ = $(this); var $c = $(this).closest('.thim-widget-field'); var frame = $(this).data('frame'); // If the media frame already exists, reopen it. if (frame) { frame.open(); return false; } // Create the media frame. frame = wp.media({ // Set the title of the modal. title : $$.data('choose'), // Tell the modal to show only images. library : { type: $$.data('library').split(',').map(function (v) { return v.trim() }) }, // Customize the submit button. button : { // Set the text of the button. text : $$.data('update'), // Tell the button not to close the modal, since we're // going to refresh the page when the image is selected. close: false }, multiple: true }); // Store the frame $$.data('frame', frame); // When an image is selected, run a callback. frame.on('select', function () { // Grab the selected attachment. var selection = frame.state().get('selection'); $val = ""; selection.map(function (attachment) { attachment = attachment.toJSON(); if (!$val) $val += attachment.id; else $val += "," + attachment.id; $media.find(".media-content").append('<li id="' + attachment.id + '" class="current"><div class="thumbnail-wrapper"><img src="' + attachment.sizes.full.url + '" class="thumbnail"><a href="#" class="media-remove-button">Remove></a></div></li'); }); var $vl = $ulist.sortable('toArray').toString(); $media.closest('.thim-widget-field').find('input[type=hidden]').val($vl); frame.close(); }); // Finally, open the modal. frame.open(); return false; }); // Show/hide the remove button when hovering over the media select button. $media .mouseenter(function () { if ($(this).closest('.thim-widget-field').find('input[type=hidden]').val() != '') $(this).find('.multimedia-remove-button').fadeIn('fast'); }) .mouseleave(function () { $(this).find('.multimedia-remove-button').fadeOut('fast'); }) $media.find('.current') .mouseenter(function () { var t = $(this).find('.title'); if (t.html() != '') { t.fadeIn('fast'); } }) .mouseleave(function () { $(this).find('.title').clearQueue().fadeOut('fast'); }) $media.find('a.multimedia-remove-button') .click(function () { $(this).closest('li').remove(); var $vl = $ulist.sortable('toArray').toString(); $media.closest('.thim-widget-field').find('input[type=hidden]').val($vl); }); }); // Handle toggling of the sub widget form $fields.filter('.thim-widget-field-type-widget, .thim-widget-field-type-section').find('> label').click(function () { var $$ = $(this); $(this).toggleClass('thim-widget-section-visible'); // console.log("abc"); $(this).siblings('.thim-widget-section').slideToggle(); // $(this).siblings('.thim-widget-section').slideToggle(function () { // console.log("xyz"); // // Center the PB dialog // if (typeof $.fn.dialog != 'undefined') { // $(this).closest('.panel-dialog').dialog("option", "position", "center"); // } // }); }); $('body').on('change', '.tp-radio-image input', function () { var $this = $(this), type = $this.attr('type'), selected = $this.is(':checked'), $parent = $this.parent(), $others = $parent.siblings(); if (selected) { $parent.addClass('tp-radio-active'); type == 'radio' && $others.removeClass('tp-radio-active'); } else { $parent.removeClass('tp-radio-active'); } }); $('.tp-radio-image input').trigger('change'); $fields.filter('.thim-widget-field-type-slider').each(function () { var $$ = $(this); var $input = $$.find('input[type="number"]'); var $c = $$.find('.thim-widget-value-slider'); $c.slider({ max : parseInt($input.attr('max')), min : parseInt($input.attr('min')), value: parseInt($input.val()), step : 1, slide: function (event, ui) { $input.val(parseInt(ui.value)); $$.find('.thim-widget-slider-value').html(ui.value); } }); }); /////////////////////////////////////// // Now lets handle the state emitters var stateEmitterChangeHandler = function () { var $$ = $(this); // These emitters can either be an array or a var emitters = $$.closest('[data-state-emitter]').data('state-emitter'); if (typeof emitters !== 'undefined') { var handleStateEmitter = function (emitter, currentStates) { if (typeof sowEmitters[emitter.callback] === 'undefined' || emitter.callback.substr(0, 1) === '_') { // Skip if the function doesn't exist, or it starts with an underscore. return currentStates; } // Return an array that has the new states added to the array return $.extend(currentStates, sowEmitters[emitter.callback]($$.val(), emitter.args)); }; // Run the states through the state emitters var states = {'default': ''}; // Go through the array of emitters if (typeof emitters.length === 'undefined') { emitters = [emitters]; } for (var i = 0; i < emitters.length; i++) { states = handleStateEmitter(emitters[i], states); } // Check which states have changed and trigger appropriate sowstatechange var formStates = $mainForm.data('states'); if (typeof formStates === 'undefined') { formStates = {'default': ''}; } for (var k in states) { if (typeof formStates[k] === 'undefined' || states[k] !== formStates[k]) { // If the state is different from the original formStates, then trigger a state change formStates[k] = states[k]; $mainForm.trigger('sowstatechange', [k, states[k]]); } } // Store the form states back in the form $mainForm.data('states', formStates); } }; $fields.filter('[data-state-emitter]').each(function () { // Listen for any change events on an emitter field $(this).find('.ob-widget-input').on('keyup change', stateEmitterChangeHandler); // Trigger changes on all necessary fields $(this).find('.ob-widget-input').each(function () { var $$ = $(this); if ($$.is(':radio')) { // Only checked radio inputs must have change events if ($$.is(':checked')) { stateEmitterChangeHandler.call($$[0]); } } else { stateEmitterChangeHandler.call($$[0]); } }); }); // Give plugins a chance to influence the form $el.trigger('sowsetupform').data('sow-form-setup', true); $el.find('.thim-widget-field-repeater-item').trigger('updateFieldPositions'); /******** * The end of the form setup. *******/ }); }; $.fn.obSetupPreview = function () { var $el = $(this); var previewButton = $el.siblings('.thim-widget-preview'); previewButton.find('> a').click(function (e) { e.preventDefault(); var data = {}; $el.find('*[name]').each(function () { var $$ = $(this); var name = /[a-zA-Z\-]+\[[0-9]+\]\[(.*)\]/.exec($$.attr('name')); name = name[1]; parts = name.split(']['); // Make sure we either have numbers or strings parts = parts.map(function (e) { if (!isNaN(parseFloat(e)) && isFinite(e)) return parseInt(e); else return e; }); var sub = data; for (var i = 0; i < parts.length; i++) { if (i == parts.length - 1) { // This is the end, so we need to store the actual field value here if ($$.attr('type') == 'checkbox') { if ($$.is(':checked')) sub[parts[i]] = $$.val() != '' ? $$.val() : true; } else sub[parts[i]] = $$.val(); } else { if (typeof sub[parts[i]] == 'undefined') { sub[parts[i]] = {}; } // Go deeper into the data and continue sub = sub[parts[i]]; } } }); // Create the modal var overlay = $('<div class="thim-widgets-preview-modal-overlay"></div>').appendTo('body'); var modal = $('<div class="thim-widgets-preview-modal"></div>').appendTo('body'); var close = $('<div class="thim-widgets-preview-close dashicons dashicons-no"></div>').appendTo(modal); var iframe = $('<iframe class="thim-widgets-preview-iframe" scrolling="no"></iframe>').appendTo(modal); $.post( ajaxurl, { 'action': 'so_widgets_preview', 'data' : JSON.stringify(data), 'class' : $el.data('class') }, function (html) { iframe.contents().find('body').html(html); } ); close.add(overlay).click(function () { overlay.remove(); modal.remove(); }); }); } $.fn.obSetupRepeater = function () { return $(this).each(function (i, el) { var $el = $(el); var $items = $el.find('.thim-widget-field-repeater-items'); var name = $el.data('repeater-name'); $items.bind('updateFieldPositions', function () { var $$ = $(this); // Set the position for the repeater items $$.find('> .thim-widget-field-repeater-item').each(function (i, el) { $(el).find('.thim-widget-input').each(function (j, input) { var pos = $(input).data('repeater-positions'); if (typeof pos == 'undefined') { pos = {}; } pos[name] = i; $(input).data('repeater-positions', pos); }); }); // Update the field names for all the input items $$.find('.thim-widget-input').each(function (i, input) { var pos = $(input).data('repeater-positions'); var $in = $(input); if (typeof pos != 'undefined') { var newName = $in.data('original-name'); if (typeof newName == 'undefined') { $in.data('original-name', $in.attr('name')); newName = $in.attr('name'); } for (var k in pos) { newName = newName.replace('#' + k + '#', pos[k]); } $(input).attr('name', newName); } }); }); $items.sortable({ handle: '.thim-widget-field-repeater-item-top', items : '> .thim-widget-field-repeater-item', update: function () { $items.trigger('updateFieldPositions'); } }); $items.trigger('updateFieldPositions'); $el.find('> .thim-widget-field-repeater-add').disableSelection().click(function (e) { e.preventDefault(); $el.closest('.thim-widget-field-repeater') .obAddRepeaterItem() .find('> .thim-widget-field-repeater-items').slideDown('fast'); // Center the PB dialog if (typeof $.fn.dialog != 'undefined') { $(this).closest('.panel-dialog').dialog("option", "position", "center"); } }); $el.find('> .thim-widget-field-repeater-top > .thim-widget-field-repeater-expend').click(function (e) { e.preventDefault(); $el.closest('.thim-widget-field-repeater').find('> .thim-widget-field-repeater-items').slideToggle('fast'); }); }); }; $.fn.obAddRepeaterItem = function () { return $(this).each(function (i, el) { var $el = $(el); var theClass = $el.closest('.thim-widget-form').data('class'); var formClass = $el.closest('.thim-widget-form').data('class'); var item = $('<div class="thim-widget-field-repeater-item" />') .append( $('<div class="thim-widget-field-repeater-item-top" />') .append( $('<div class="thim-widget-field-expand" />') ) .append( $('<div class="thim-widget-field-remove" />') ) .append($('<h4 />').html($el.data('item-name'))) ) .append( $('<div class="thim-widget-field-repeater-item-form" />') .html(window.ob_repeater_html[formClass][$el.data('repeater-name')]) ) .obSetupRepeaterActions(); // Add the item and refresh $el.find('> .thim-widget-field-repeater-items').append(item).sortable("refresh").trigger('updateFieldPositions'); item.hide().slideDown('fast'); }); }; $.fn.obSetupRepeaterActions = function () { return $(this).each(function (i, el) { var $el = $(el); if (typeof $el.data('sowrepeater-actions-setup') == 'undefined') { var top = $el.find('> .thim-widget-field-repeater-item-top'); top.find('.thim-widget-field-expand') .click(function (e) { e.preventDefault(); $(this).closest('.thim-widget-field-repeater-item').find('.thim-widget-field-repeater-item-form').eq(0).slideToggle('fast'); }); top.find('.thim-widget-field-remove') .click(function (e) { e.preventDefault(); if (confirm(soWidgets.sure)) { var $s = $(this).closest('.thim-widget-field-repeater-items'); $(this).closest('.thim-widget-field-repeater-item').slideUp('fast', function () { $(this).remove(); $s.sortable("refresh").trigger('updateFieldPositions'); }); } }); $el.find('> .thim-widget-field-repeater-item-form').obSetupForm(); $el.data('sowrepeater-actions-setup', true); } }); } // When we click on a widget top $('.widgets-holder-wrap').on('click', '.widget:has(.thim-widget-form-main) .widget-top', function () { var $$ = $(this).closest('.widget').find('.thim-widget-form-main'); setTimeout(function () { $$.obSetupForm(); }, 200); }); // When we open a Page Builder widget dialog $(document).on('dialogopen', function (e) { $(e.target).find('.thim-widget-form-main').obSetupForm(); }); })(jQuery);