hueman/option-tree/assets/js/ot-admin.js
Alexander Agnarson 3c68c2c053 OptionTree 2.5.4
2015-04-22 11:17:10 +02:00

1292 lines
No EOL
45 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Option Tree UI
*
* Dependencies: jQuery, jQuery UI, ColorPicker
*
* @author Derek Herman (derek@valendesigns.com)
*/
;(function($) {
OT_UI = {
processing: false,
init: function() {
this.init_hide_body();
this.init_sortable();
this.init_add();
this.init_edit();
this.init_remove();
this.init_edit_title();
this.init_edit_id();
this.init_activate_layout();
this.init_conditions();
this.init_upload();
this.init_upload_remove();
this.init_numeric_slider();
this.init_tabs();
this.init_radio_image_select();
this.init_select_wrapper();
this.bind_select_wrapper();
this.init_google_fonts();
this.fix_upload_parent();
this.fix_textarea();
this.replicate_ajax();
this.reset_settings();
this.css_editor_mode();
this.javascript_editor_mode();
},
init_hide_body: function(elm,type) {
var css = '.option-tree-setting-body';
if ( type == 'parent' ) {
$(css).not( elm.parent().parent().children(css) ).hide();
} else if ( type == 'child' ) {
elm.closest('ul').find(css).not( elm.parent().parent().children(css) ).hide();
} else if ( type == 'child-add' ) {
elm.children().find(css).hide();
} else if ( type == 'toggle' ) {
elm.parent().parent().children(css).toggle();
} else {
$(css).hide();
}
},
init_remove_active: function(elm,type) {
var css = '.option-tree-setting-edit';
if ( type == 'parent' ) {
$(css).not(elm).removeClass('active');
} else if ( type == 'child' ) {
elm.closest('ul').find(css).not(elm).removeClass('active');
} else if ( type == 'child-add' ) {
elm.children().find(css).removeClass('active');
} else {
$(css).removeClass('active');
}
},
init_sortable: function(scope) {
scope = scope || document;
$('.option-tree-sortable', scope).each( function() {
if ( $(this).children('li').length ) {
var elm = $(this);
elm.show();
elm.sortable({
items: 'li:not(.ui-state-disabled)',
handle: 'div.open',
placeholder: 'ui-state-highlight',
start: function (event, ui) {
ui.placeholder.height(ui.item.height()-2);
},
stop: function(evt, ui) {
setTimeout(
function(){
OT_UI.update_ids(elm);
},
200
)
}
});
}
});
},
init_add: function() {
$(document).on('click', '.option-tree-section-add', function(e) {
e.preventDefault();
OT_UI.add(this,'section');
});
$(document).on('click', '.option-tree-setting-add', function(e) {
e.preventDefault();
OT_UI.add(this,'setting');
});
$(document).on('click', '.option-tree-help-add', function(e) {
e.preventDefault();
OT_UI.add(this,'the_contextual_help');
});
$(document).on('click', '.option-tree-choice-add', function(e) {
e.preventDefault();
OT_UI.add(this,'choice');
});
$(document).on('click', '.option-tree-list-item-add', function(e) {
e.preventDefault();
OT_UI.add(this,'list_item');
});
$(document).on('click', '.option-tree-social-links-add', function(e) {
e.preventDefault();
OT_UI.add(this,'social_links');
});
$(document).on('click', '.option-tree-list-item-setting-add', function(e) {
e.preventDefault();
if ( $(this).parents('ul').parents('ul').hasClass('ui-sortable') ) {
alert(option_tree.setting_limit);
return false;
}
OT_UI.add(this,'list_item_setting');
});
},
init_edit: function() {
$(document).on('click', '.option-tree-setting-edit', function(e) {
e.preventDefault();
if ( $(this).parents().hasClass('option-tree-setting-body') ) {
OT_UI.init_remove_active($(this),'child');
OT_UI.init_hide_body($(this),'child');
} else {
OT_UI.init_remove_active($(this),'parent');
OT_UI.init_hide_body($(this), 'parent');
}
$(this).toggleClass('active');
OT_UI.init_hide_body($(this), 'toggle');
});
},
init_remove: function() {
$(document).on('click', '.option-tree-setting-remove', function(event) {
event.preventDefault();
if ( $(this).parents('li').hasClass('ui-state-disabled') ) {
alert(option_tree.remove_no);
return false;
}
var agree = confirm(option_tree.remove_agree);
if (agree) {
var list = $(this).parents('ul');
OT_UI.remove(this);
setTimeout( function() {
OT_UI.update_ids(list);
}, 200 );
}
return false;
});
},
init_edit_title: function() {
$(document).on('keyup', '.option-tree-setting-title', function() {
OT_UI.edit_title(this);
});
// Automatically fill option IDs with clean versions of their respective option labels
$(document).on('blur', '.option-tree-setting-title', function() {
var optionId = $(this).parents('.option-tree-setting-body').find('[type="text"][name$="id]"]')
if ( optionId.val() === '' ) {
optionId.val($(this).val().replace(/[^a-z0-9]/gi,'_').toLowerCase());
}
});
},
init_edit_id: function() {
$(document).on('keyup', '.section-id', function(){
OT_UI.update_id(this);
});
},
init_activate_layout: function() {
$(document).on('click', '.option-tree-layout-activate', function() {
var active = $(this).parents('.option-tree-setting').find('.open').text();
$('.option-tree-layout-activate').removeClass('active');
$(this).toggleClass('active');
$('.active-layout-input').attr({'value':active});
});
$(document).on('change', '#option-tree-options-layouts-form select', function() {
var agree = confirm(option_tree.activate_layout_agree);
if (agree) {
$('#option-tree-options-layouts-form').submit();
} else {
var active = $('#the_current_layout').attr('value');
$('#option-tree-options-layouts-form select option[value="' + active + '"]').attr({'selected':'selected'});
$('#option-tree-options-layouts-form select').prev('span').replaceWith('<span>' + active + '</span>');
}
});
},
add: function(elm,type) {
var self = this,
list = '',
list_class = '',
name = '',
post_id = 0,
get_option = '',
settings = '';
if ( type == 'the_contextual_help' ) {
list = $(elm).parent().find('ul:last');
list_class = 'list-contextual-help';
} else if ( type == 'choice' ) {
list = $(elm).parent().children('ul');
list_class = 'list-choice';
} else if ( type == 'list_item' ) {
list = $(elm).parent().children('ul');
list_class = 'list-sub-setting';
} else if ( type == 'list_item_setting' ) {
list = $(elm).parent().children('ul');
list_class = 'list-sub-setting';
} else if ( type == 'social_links' ) {
list = $(elm).parent().children('ul');
list_class = 'list-sub-setting';
} else {
list = $(elm).parent().find('ul:first');
list_class = ( type == 'section' ) ? 'list-section' : 'list-setting';
}
name = list.data('name');
post_id = list.data('id');
get_option = list.data('getOption');
settings = $('#'+name+'_settings_array').val();
if ( this.processing === false ) {
this.processing = true;
var count = parseInt(list.children('li').length);
if ( type == 'list_item' || type == 'social_links' ) {
list.find('li input.option-tree-setting-title', self).each(function(){
var setting = $(this).attr('name'),
regex = /\[([0-9]+)\]/,
matches = setting.match(regex),
id = null != matches ? parseInt(matches[1]) : 0;
id++;
if ( id > count) {
count = id;
}
});
}
$.ajax({
url: option_tree.ajax,
type: 'post',
data: {
action: 'add_' + type,
count: count,
name: name,
post_id: post_id,
get_option: get_option,
settings: settings,
type: type
},
complete: function( data ) {
if ( type == 'choice' || type == 'list_item_setting' ) {
OT_UI.init_remove_active(list,'child-add');
OT_UI.init_hide_body(list,'child-add');
} else {
OT_UI.init_remove_active();
OT_UI.init_hide_body();
}
var listItem = $('<li class="ui-state-default ' + list_class + '">' + data.responseText + '</li>');
list.append(listItem);
list.children().last().find('.option-tree-setting-edit').toggleClass('active');
list.children().last().find('.option-tree-setting-body').toggle();
list.children().last().find('.option-tree-setting-title').focus();
if ( type != 'the_contextual_help' ) {
OT_UI.update_ids(list);
}
OT_UI.init_sortable(listItem);
OT_UI.init_select_wrapper(listItem);
OT_UI.init_numeric_slider(listItem);
OT_UI.parse_condition();
self.processing = false;
}
});
}
},
remove: function(e) {
$(e).parent().parent().parent('li').remove();
},
edit_title: function(e) {
if ( this.timer ) {
clearTimeout(e.timer);
}
this.timer = setTimeout( function() {
$(e).parent().parent().parent().parent().parent().children('.open').text(e.value);
}, 100);
return true;
},
update_id: function(e) {
if ( this.timer ) {
clearTimeout(e.timer);
}
this.timer = setTimeout( function() {
OT_UI.update_ids($(e).parents('ul'));
}, 100);
return true;
},
update_ids: function(list) {
var last_section, section, list_items = list.children('li');
list_items.each(function(index) {
if ( $(this).hasClass('list-section') ) {
section = $(this).find('.section-id').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
if (!section) {
section = $(this).find('.section-title').val().trim().toLowerCase().replace(/[^a-z0-9]/gi,'_');
}
if (!section) {
section = last_section;
}
}
if ($(this).hasClass('list-setting') ) {
$(this).find('.hidden-section').attr({'value':section});
}
last_section = section;
});
},
condition_objects: function() {
return 'select, input[type="radio"]:checked, input[type="text"], input[type="hidden"], input.ot-numeric-slider-hidden-input';
},
match_conditions: function(condition) {
var match;
var regex = /(.+?):(is|not|contains|less_than|less_than_or_equal_to|greater_than|greater_than_or_equal_to)\((.*?)\),?/g;
var conditions = [];
while( match = regex.exec( condition ) ) {
conditions.push({
'check': match[1],
'rule': match[2],
'value': match[3] || ''
});
}
return conditions;
},
parse_condition: function() {
$( '.format-settings[id^="setting_"][data-condition]' ).each(function() {
var passed;
var conditions = OT_UI.match_conditions( $( this ).data( 'condition' ) );
var operator = ( $( this ).data( 'operator' ) || 'and' ).toLowerCase();
$.each( conditions, function( index, condition ) {
var target = $( '#setting_' + condition.check );
var targetEl = !! target.length && target.find( OT_UI.condition_objects() ).first();
if ( ! target.length || ( ! targetEl.length && condition.value.toString() != '' ) ) {
return;
}
var v1 = targetEl.length ? targetEl.val().toString() : '';
var v2 = condition.value.toString();
var result;
switch ( condition.rule ) {
case 'less_than':
result = ( parseInt( v1 ) < parseInt( v2 ) );
break;
case 'less_than_or_equal_to':
result = ( parseInt( v1 ) <= parseInt( v2 ) );
break;
case 'greater_than':
result = ( parseInt( v1 ) > parseInt( v2 ) );
break;
case 'greater_than_or_equal_to':
result = ( parseInt( v1 ) >= parseInt( v2 ) );
break;
case 'contains':
result = ( v1.indexOf(v2) !== -1 ? true : false );
break;
case 'is':
result = ( v1 == v2 );
break;
case 'not':
result = ( v1 != v2 );
break;
}
if ( 'undefined' == typeof passed ) {
passed = result;
}
switch ( operator ) {
case 'or':
passed = ( passed || result );
break;
case 'and':
default:
passed = ( passed && result );
break;
}
});
if ( passed ) {
$(this).animate({opacity: 'show' , height: 'show'}, 200);
} else {
$(this).animate({opacity: 'hide' , height: 'hide'}, 200);
}
delete passed;
});
},
init_conditions: function() {
var delay = (function() {
var timer = 0;
return function(callback, ms) {
clearTimeout(timer);
timer = setTimeout(callback, ms);
};
})();
$('.format-settings[id^="setting_"]').on( 'change.conditionals, keyup.conditionals', OT_UI.condition_objects(), function(e) {
if (e.type === 'keyup') {
// handle keyup event only once every 500ms
delay(function() {
OT_UI.parse_condition();
}, 500);
} else {
OT_UI.parse_condition();
}
OT_UI.load_editors();
});
OT_UI.parse_condition();
},
init_upload: function() {
$(document).on('click', '.ot_upload_media', function() {
var field_id = $(this).parent('.option-tree-ui-upload-parent').find('input').attr('id'),
post_id = $(this).attr('rel'),
save_attachment_id = $('#'+field_id).hasClass('ot-upload-attachment-id'),
btnContent = '';
if ( window.wp && wp.media ) {
window.ot_media_frame = window.ot_media_frame || new wp.media.view.MediaFrame.Select({
title: $(this).attr('title'),
button: {
text: option_tree.upload_text
},
multiple: false
});
window.ot_media_frame.on('select', function() {
var attachment = window.ot_media_frame.state().get('selection').first(),
href = attachment.attributes.url,
attachment_id = attachment.attributes.id,
mime = attachment.attributes.mime,
regex = /^image\/(?:jpe?g|png|gif|x-icon)$/i;
if ( mime.match(regex) ) {
btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
}
btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle"></span>'+option_tree.remove_media_text+'</a>';
$('#'+field_id).val( ( save_attachment_id ? attachment_id : href ) );
$('#'+field_id+'_media').remove();
$('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
$('#'+field_id+'_media').append(btnContent).slideDown();
window.ot_media_frame.off('select');
}).open();
} else {
var backup = window.send_to_editor,
intval = window.setInterval(
function() {
if ( $('#TB_iframeContent').length > 0 && $('#TB_iframeContent').attr('src').indexOf( "&field_id=" ) !== -1 ) {
$('#TB_iframeContent').contents().find('#tab-type_url').hide();
}
$('#TB_iframeContent').contents().find('.savesend .button').val(option_tree.upload_text);
}, 50);
tb_show('', 'media-upload.php?post_id='+post_id+'&field_id='+field_id+'&type=image&TB_iframe=1');
window.send_to_editor = function(html) {
var href = $(html).find('img').attr('src');
if ( typeof href == 'undefined') {
href = $(html).attr('src');
}
if ( typeof href == 'undefined') {
href = $(html).attr('href');
}
var image = /\.(?:jpe?g|png|gif|ico)$/i;
if (href.match(image) && OT_UI.url_exists(href)) {
btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+href+'" alt="" /></div>';
}
btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle"></span>'+option_tree.remove_media_text+'</a>';
$('#'+field_id).val(href);
$('#'+field_id+'_media').remove();
$('#'+field_id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+field_id+'_media" />');
$('#'+field_id+'_media').append(btnContent).slideDown();
OT_UI.fix_upload_parent();
tb_remove();
window.clearInterval(intval);
window.send_to_editor = backup;
};
}
return false;
});
},
init_upload_remove: function() {
$(document).on('click', '.option-tree-ui-remove-media', function(event) {
event.preventDefault();
var agree = confirm(option_tree.remove_agree);
if (agree) {
OT_UI.remove_image(this);
return false;
}
return false;
});
},
init_upload_fix: function(elm) {
var id = $(elm).attr('id'),
val = $(elm).val(),
img = $(elm).parent().next('.option-tree-ui-media-wrap').find('img'),
src = img.attr('src'),
btnContent = '';
if ( val == src ) {
return;
}
if ( val != src ) {
img.attr('src', val);
}
if ( val !== '' && ( typeof src == 'undefined' || src == false ) && OT_UI.url_exists(val) ) {
var image = /\.(?:jpe?g|png|gif|ico)$/i;
if (val.match(image)) {
btnContent += '<div class="option-tree-ui-image-wrap"><img src="'+val+'" alt="" /></div>';
}
btnContent += '<a href="javascript:(void);" class="option-tree-ui-remove-media option-tree-ui-button button button-secondary light" title="'+option_tree.remove_media_text+'"><span class="icon ot-icon-minus-circle">'+option_tree.remove_media_text+'</span></a>';
$('#'+id).val(val);
$('#'+id+'_media').remove();
$('#'+id).parent().parent('div').append('<div class="option-tree-ui-media-wrap" id="'+id+'_media" />');
$('#'+id+'_media').append(btnContent).slideDown();
} else if ( val == '' || ! OT_UI.url_exists(val) ) {
$(elm).parent().next('.option-tree-ui-media-wrap').remove();
}
},
init_numeric_slider: function(scope) {
scope = scope || document;
$(".ot-numeric-slider-wrap", scope).each(function() {
var hidden = $(".ot-numeric-slider-hidden-input", this),
value = hidden.val(),
helper = $(".ot-numeric-slider-helper-input", this);
if ( ! value ) {
value = hidden.data("min");
helper.val(value)
}
$(".ot-numeric-slider", this).slider({
min: hidden.data("min"),
max: hidden.data("max"),
step: hidden.data("step"),
value: value,
slide: function(event, ui) {
hidden.add(helper).val(ui.value).trigger('change');
},
create: function() {
hidden.val($(this).slider('value'));
},
change: function() {
OT_UI.parse_condition();
}
});
});
},
init_tabs: function() {
$(".wrap.settings-wrap .ui-tabs").tabs({
fx: {
opacity: "toggle",
duration: "fast"
}
});
$(".wrap.settings-wrap .ui-tabs a.ui-tabs-anchor").on("click", function(event, ui) {
var obj = "input[name='_wp_http_referer']";
if ( $(obj).length > 0 ) {
var url = $(obj).val(),
hash = $(this).attr('href');
if ( url.indexOf("#") != -1 ) {
var o = url.split("#")[1],
n = hash.split("#")[1];
url = url.replace(o, n);
} else {
url = url + hash;
}
$(obj).val(url);
}
});
},
init_radio_image_select: function() {
$(document).on('click', '.option-tree-ui-radio-image', function() {
$(this).closest('.type-radio-image').find('.option-tree-ui-radio-image').removeClass('option-tree-ui-radio-image-selected');
$(this).toggleClass('option-tree-ui-radio-image-selected');
$(this).parent().find('.option-tree-ui-radio').prop('checked', true).trigger('change');
});
},
init_select_wrapper: function(scope) {
scope = scope || document;
$('.option-tree-ui-select', scope).each(function () {
if ( ! $(this).parent().hasClass('select-wrapper') ) {
$(this).wrap('<div class="select-wrapper" />');
$(this).parent('.select-wrapper').prepend('<span>' + $(this).find('option:selected').text() + '</span>');
}
});
},
bind_select_wrapper: function() {
$(document).on('change', '.option-tree-ui-select', function () {
$(this).prev('span').replaceWith('<span>' + $(this).find('option:selected').text() + '</span>');
});
},
init_google_fonts: function() {
var update_items = function(input, items, element) {
var itemsUI = input.closest('.type-google-font-group').find(element);
if ( itemsUI.length ) {
itemsUI.empty();
itemsUI.append($.map(items, function(item) {
var input = document.createElement('input'),
label = document.createElement('label');
input.type = 'checkbox';
input.id = ( itemsUI.data('field-id-prefix') || '' ) + item;
input.name = ( itemsUI.data('field-name') || '' ) + '[]';
input.value = item;
label.innerHTML = item;
$( label ).attr( 'for', input.id );
return $( document.createElement('p') ).addClass('checkbox-wrap').append([input, label]);
}));
}
};
$(document).on('change', '.option-tree-google-font-family select', function() {
var input = $(this);
$.ajax({
url: option_tree.ajax,
type: 'POST',
dataType: 'json',
data: {
action: 'ot_google_font',
family: input.val(),
field_id: input.attr('id')
}
}).done(function(response) {
if ( response.hasOwnProperty('variants') ) {
update_items( input, response.variants, '.option-tree-google-font-variants' );
}
if ( response.hasOwnProperty('subsets') ) {
update_items( input, response.subsets, '.option-tree-google-font-subsets' );
}
});
});
$('.js-add-google-font').on('click', function (event) {
var $group = $(this).parent('.format-setting-inner').find('.type-google-font-group'),
$el_clone = $(this).prev('.type-google-font-group-clone'),
$clone = $el_clone.clone(true),
$count = $group.length ? $group.length : 0;
$clone.attr('class', 'type-google-font-group');
var replacer = function(index, elm) {
return elm.replace('%key%', $count);
}
$('select', $clone).each( function() {
$(this).attr('id', replacer ).attr('name', replacer );
});
$('.option-tree-google-font-variants', $clone).each( function() {
$(this).attr('data-field-id-prefix', replacer ).attr('data-field-name', replacer );
});
$('.option-tree-google-font-subsets', $clone).each( function() {
$(this).attr('data-field-id-prefix', replacer ).attr('data-field-name', replacer );
});
$el_clone.before($clone)
event.preventDefault()
});
$('.js-remove-google-font').on('click', function (event) {
$(this).parents('.type-google-font-group').remove();
event.preventDefault();
});
},
bind_colorpicker: function(field_id) {
$('#'+field_id).wpColorPicker({
change: function() {
OT_UI.parse_condition();
},
clear: function() {
OT_UI.parse_condition();
}
});
},
bind_date_picker: function(field_id, date_format) {
$('#'+field_id).datepicker({
showOtherMonths: true,
showButtonPanel: true,
currentText: option_tree.date_current,
closeText: option_tree.date_close,
dateFormat: date_format
});
},
bind_date_time_picker: function(field_id, date_format) {
$('#'+field_id).datetimepicker({
showOtherMonths: true,
closeText: option_tree.date_close,
dateFormat: date_format
});
},
fix_upload_parent: function() {
$('.option-tree-ui-upload-input').not('.ot-upload-attachment-id').on('focus blur', function(){
$(this).parent('.option-tree-ui-upload-parent').toggleClass('focus');
OT_UI.init_upload_fix(this);
});
},
remove_image: function(e) {
$(e).parent().parent().find('.option-tree-ui-upload-input').attr('value','');
$(e).parent('.option-tree-ui-media-wrap').remove();
},
fix_textarea: function() {
$('.wp-editor-area').focus( function(){
$(this).parent('div').css({borderColor:'#bbb'});
}).blur( function(){
$(this).parent('div').css({borderColor:'#ccc'});
});
},
replicate_ajax: function() {
if (location.href.indexOf("#") != -1) {
var url = $("input[name=\'_wp_http_referer\']").val(),
hash = location.href.substr(location.href.indexOf("#"));
$("input[name=\'_wp_http_referer\']").val( url + hash );
this.scroll_to_top();
}
setTimeout( function() {
$(".wrap.settings-wrap .fade").fadeOut("fast");
}, 3000 );
},
reset_settings: function() {
$(document).on("click", ".reset-settings", function(event){
var agree = confirm(option_tree.reset_agree);
if (agree) {
return true;
} else {
return false;
}
event.preventDefault();
});
},
css_editor_mode: function() {
$('.ot-css-editor').each(function() {
var editor = ace.edit($(this).attr('id'));
var this_textarea = $('#textarea_' + $(this).attr('id'));
editor.setTheme("ace/theme/chrome");
editor.getSession().setMode("ace/mode/css");
editor.setShowPrintMargin( false );
editor.getSession().setValue(this_textarea.val());
editor.getSession().on('change', function(){
this_textarea.val(editor.getSession().getValue());
});
this_textarea.on('change', function(){
editor.getSession().setValue(this_textarea.val());
});
});
},
javascript_editor_mode: function() {
$('.ot-javascript-editor').each(function() {
var editor = ace.edit($(this).attr('id'));
var this_textarea = $('#textarea_' + $(this).attr('id'));
editor.setTheme("ace/theme/chrome");
editor.getSession().setMode("ace/mode/javascript");
editor.setShowPrintMargin( false );
editor.getSession().setValue(this_textarea.val());
editor.getSession().on('change', function(){
this_textarea.val(editor.getSession().getValue());
});
this_textarea.on('change', function(){
editor.getSession().setValue(this_textarea.val());
});
});
},
load_editors: function() {
OT_UI.css_editor_mode();
OT_UI.javascript_editor_mode();
},
url_exists: function(url) {
var link = document.createElement('a')
link.href = url
if ( link.hostname != window.location.hostname ) {
return true; // Stop the code from checking across domains.
}
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status!=404;
},
scroll_to_top: function() {
setTimeout( function() {
$(this).scrollTop(0);
}, 50 );
}
};
$(document).ready( function() {
OT_UI.init();
});
})(jQuery);
/* Gallery */
!function ($) {
ot_gallery = {
frame: function (elm) {
var selection = this.select(elm)
this._frame = wp.media({
id: 'ot-gallery-frame'
, frame: 'post'
, state: 'gallery-edit'
, title: wp.media.view.l10n.editGalleryTitle
, editing: true
, multiple: true
, selection: selection
})
this._frame.on('update', function () {
var controller = ot_gallery._frame.states.get('gallery-edit')
, library = controller.get('library')
, ids = library.pluck('id')
, parent = $(elm).parents('.format-setting-inner')
, input = parent.children('.ot-gallery-value')
, shortcode = wp.media.gallery.shortcode( selection ).string().replace(/\"/g,"'")
input.attr('value', ids)
if ( parent.children('.ot-gallery-list').length <= 0 )
input.after('<ul class="ot-gallery-list" />')
$.ajax({
type: 'POST',
url: ajaxurl,
dataType: 'html',
data: {
action: 'gallery_update'
, ids: ids
},
success: function(res) {
parent.children('.ot-gallery-list').html(res);
if ( input.hasClass('ot-gallery-shortcode') ) {
input.val(shortcode);
}
if ( $(elm).parent().children('.ot-gallery-delete').length <= 0 ) {
$(elm).parent().append('<a href="#" class="option-tree-ui-button button button-secondary hug-left ot-gallery-delete">' + option_tree.delete + '</a>');
}
$(elm).text(option_tree.edit);
OT_UI.parse_condition();
}
})
})
return this._frame
}
, select: function (elm) {
var input = $(elm).parents('.format-setting-inner').children('.ot-gallery-value')
, ids = input.attr('value')
, _shortcode = input.hasClass('ot-gallery-shortcode') ? ids : '[gallery ids=\'' + ids + '\]'
, shortcode = wp.shortcode.next('gallery', ( ids ? _shortcode : wp.media.view.settings.ot_gallery.shortcode ) )
, defaultPostId = wp.media.gallery.defaults.id
, attachments
, selection
// Bail if we didn't match the shortcode or all of the content.
if ( ! shortcode )
return
// Ignore the rest of the match object.
shortcode = shortcode.shortcode
if ( _.isUndefined( shortcode.get('id') ) && ! _.isUndefined( defaultPostId ) )
shortcode.set( 'id', defaultPostId )
if ( _.isUndefined( shortcode.get('ids') ) && ! input.hasClass('ot-gallery-shortcode') && ids )
shortcode.set( 'ids', ids )
if ( _.isUndefined( shortcode.get('ids') ) )
shortcode.set( 'ids', '0' )
attachments = wp.media.gallery.attachments( shortcode )
selection = new wp.media.model.Selection( attachments.models, {
props: attachments.props.toJSON()
, multiple: true
})
selection.gallery = attachments.gallery
// Fetch the query's attachments, and then break ties from the query to allow for sorting.
selection.more().done( function () {
selection.props.set({ query: false })
selection.unmirror()
selection.props.unset('orderby')
})
return selection
}
, open: function (elm) {
ot_gallery.frame(elm).open()
}
, remove: function (elm) {
if ( confirm( option_tree.confirm ) ) {
$(elm).parents('.format-setting-inner').children('.ot-gallery-value').attr('value', '');
$(elm).parents('.format-setting-inner').children('.ot-gallery-list').remove();
$(elm).next('.ot-gallery-edit').text( option_tree.create );
$(elm).remove();
OT_UI.parse_condition();
}
}
}
// Gallery delete
$(document).on('click.ot_gallery.data-api', '.ot-gallery-delete', function (e) {
e.preventDefault()
ot_gallery.remove($(this))
})
// Gallery edit
$(document).on('click.ot_gallery.data-api', '.ot-gallery-edit', function (e) {
e.preventDefault()
ot_gallery.open($(this))
})
}(window.jQuery);
/*!
* Adds metabox tabs
*/
!function ($) {
$(document).on('ready', function () {
// Loop over the metaboxes
$('.ot-metabox-wrapper').each( function() {
// Only if there is a tab option
if ( $(this).find('.type-tab').length ) {
// Add .ot-metabox-panels
$(this).find('.type-tab').parents('.ot-metabox-wrapper').wrapInner('<div class="ot-metabox-panels" />')
// Wrapp with .ot-metabox-tabs & add .ot-metabox-nav before .ot-metabox-panels
$(this).find('.ot-metabox-panels').wrap('<div class="ot-metabox-tabs" />').before('<ul class="ot-metabox-nav" />')
// Loop over settings and build the tabs nav
$(this).find('.format-settings').each( function() {
if ( $(this).find('.type-tab').length > 0 ) {
var title = $(this).find('.type-tab').prev().find('label').text()
, id = $(this).attr('id')
// Add a class, hide & append nav item
$(this).addClass('is-panel').hide()
$(this).parents('.ot-metabox-panels').prev('.ot-metabox-nav').append('<li><a href="#' + id + '">' + title + '</a></li>')
}
})
// Loop over the panels and wrap and ID them.
$(this).find('.is-panel').each( function() {
var id = $(this).attr('id')
$(this).add( $(this).nextUntil('.is-panel') ).wrapAll('<div id="' + id + '" class="tab-content" />')
})
// Create the tabs
$(this).find('.ot-metabox-tabs').tabs({
activate: function( event, ui ) {
var parent = $(this).outerHeight(),
child = $(this).find('.ot-metabox-panels').outerHeight() + 8,
minHeight = parent - 34
if ( $(this).find('.ot-metabox-panels').css('padding') == '12px' && child < parent ) {
$(this).find('.ot-metabox-panels').css({ minHeight: minHeight })
}
OT_UI.load_editors();
}
})
// Move the orphaned settings to the top
$(this).find('.ot-metabox-panels > .format-settings').prependTo($(this))
// Remove a bunch of classes to stop style conflicts.
$(this).find('.ot-metabox-tabs').removeClass('ui-widget ui-widget-content ui-corner-all')
$(this).find('.ot-metabox-nav').removeClass('ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all')
$(this).find('.ot-metabox-nav li').removeClass('ui-state-default ui-corner-top ui-tabs-active ui-tabs-active')
$(this).find('.ot-metabox-nav li').on('mouseenter mouseleave', function() { $(this).removeClass('ui-state-hover') })
}
})
})
}(window.jQuery);
/*!
* Adds theme option tabs
*/
!function ($) {
$(document).on('ready', function () {
// Loop over the theme options
$('#option-tree-settings-api .inside').each( function() {
// Only if there is a tab option
if ( $(this).find('.type-tab').length ) {
// Add .ot-theme-option-panels
$(this).find('.type-tab').parents('.inside').wrapInner('<div class="ot-theme-option-panels" />')
// Wrap with .ot-theme-option-tabs & add .ot-theme-option-nav before .ot-theme-option-panels
$(this).find('.ot-theme-option-panels').wrap('<div class="ot-theme-option-tabs" />').before('<ul class="ot-theme-option-nav" />')
// Loop over settings and build the tabs nav
$(this).find('.format-settings').each( function() {
if ( $(this).find('.type-tab').length > 0 ) {
var title = $(this).find('.type-tab').prev().find('.label').text()
, id = $(this).attr('id')
// Add a class, hide & append nav item
$(this).addClass('is-panel').hide()
$(this).parents('.ot-theme-option-panels').prev('.ot-theme-option-nav').append('<li><a href="#' + id + '">' + title + '</a></li>')
} else {
}
})
// Loop over the panels and wrap and ID them.
$(this).find('.is-panel').each( function() {
var id = $(this).attr('id')
$(this).add( $(this).nextUntil('.is-panel') ).wrapAll('<div id="' + id + '" class="tab-content" />')
})
// Create the tabs
$(this).find('.ot-theme-option-tabs').tabs({
activate: function( event, ui ) {
OT_UI.load_editors();
}
})
// Move the orphaned settings to the top
$(this).find('.ot-theme-option-panels > .format-settings').prependTo($(this).find('.ot-theme-option-tabs'))
}
})
})
}(window.jQuery);
/*!
* Fixes the state of metabox radio buttons after a Drag & Drop event.
*/
!function ($) {
$(document).on('ready', function () {
// detect mousedown and store all checked radio buttons
$('.hndle').on('mousedown', function () {
// get parent element of .hndle selected.
// We only need to monitor radios insde the object that is being moved.
var parent_id = $(this).closest('div').attr('id')
// set live event listener for mouse up on the content .wrap
// then give the dragged div time to settle before firing the reclick function
$('.wrap').on('mouseup', function () {
var ot_checked_radios = {}
// loop over all checked radio buttons inside of parent element
$('#' + parent_id + ' input[type="radio"]').each( function () {
// stores checked radio buttons
if ( $(this).is(':checked') ) {
ot_checked_radios[$(this).attr('name')] = $(this).val()
}
// write to the object
$(document).data('ot_checked_radios', ot_checked_radios)
})
// restore all checked radio buttons
setTimeout( function () {
// get object of checked radio button names and values
var checked = $(document).data('ot_checked_radios')
// step thru each object element and trigger a click on it's corresponding radio button
for ( key in checked ) {
$('input[name="' + key + '"]').filter('[value="' + checked[key] + '"]').trigger('click')
}
$('.wrap').unbind('mouseup')
}, 50 )
})
})
})
}(window.jQuery);
/*!
* Adds opacity to the default colorpicker
*
* Derivative work of the Codestar WP Color Picker.
*/
;(function ( $, window, document, undefined ) {
'use strict';
// adding alpha support for Automattic Color.js toString function.
if( typeof Color.fn.toString !== undefined ) {
Color.fn.toString = function () {
// check for alpha
if ( this._alpha < 1 ) {
return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');
}
var hex = parseInt( this._color, 10 ).toString( 16 );
if ( this.error ) { return ''; }
// maybe left pad it
if ( hex.length < 6 ) {
for (var i = 6 - hex.length - 1; i >= 0; i--) {
hex = '0' + hex;
}
}
return '#' + hex;
};
}
$.ot_ParseColorValue = function( val ) {
var value = val.replace(/\s+/g, ''),
alpha = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,
rgba = ( alpha < 100 ) ? true : false;
return { value: value, alpha: alpha, rgba: rgba };
};
$.fn.ot_wpColorPicker = function() {
return this.each(function() {
var $this = $(this);
// check for rgba enabled/disable
if( $this.data('rgba') !== false ) {
// parse value
var picker = $.ot_ParseColorValue( $this.val() );
// wpColorPicker core
$this.wpColorPicker({
// wpColorPicker: change
change: function( event, ui ) {
// update checkerboard background color
$this.closest('.wp-picker-container').find('.option-tree-opacity-slider-offset').css('background-color', ui.color.toString());
$this.trigger('keyup');
},
// wpColorPicker: create
create: function( event, ui ) {
// set variables for alpha slider
var a8cIris = $this.data('a8cIris'),
$container = $this.closest('.wp-picker-container'),
// appending alpha wrapper
$alpha_wrap = $('<div class="option-tree-opacity-wrap">' +
'<div class="option-tree-opacity-slider"></div>' +
'<div class="option-tree-opacity-slider-offset"></div>' +
'<div class="option-tree-opacity-text"></div>' +
'</div>').appendTo( $container.find('.wp-picker-holder') ),
$alpha_slider = $alpha_wrap.find('.option-tree-opacity-slider'),
$alpha_text = $alpha_wrap.find('.option-tree-opacity-text'),
$alpha_offset = $alpha_wrap.find('.option-tree-opacity-slider-offset');
// alpha slider
$alpha_slider.slider({
// slider: slide
slide: function( event, ui ) {
var slide_value = parseFloat( ui.value / 100 );
// update iris data alpha && wpColorPicker color option && alpha text
a8cIris._color._alpha = slide_value;
$this.wpColorPicker( 'color', a8cIris._color.toString() );
$alpha_text.text( ( slide_value < 1 ? slide_value : '' ) );
},
// slider: create
create: function() {
var slide_value = parseFloat( picker.alpha / 100 ),
alpha_text_value = slide_value < 1 ? slide_value : '';
// update alpha text && checkerboard background color
$alpha_text.text(alpha_text_value);
$alpha_offset.css('background-color', picker.value);
// wpColorPicker clear button for update iris data alpha && alpha text && slider color option
$container.on('click', '.wp-picker-clear', function() {
a8cIris._color._alpha = 1;
$alpha_text.text('');
$alpha_slider.slider('option', 'value', 100).trigger('slide');
});
// wpColorPicker default button for update iris data alpha && alpha text && slider color option
$container.on('click', '.wp-picker-default', function() {
var default_picker = $.ot_ParseColorValue( $this.data('default-color') ),
default_value = parseFloat( default_picker.alpha / 100 ),
default_text = default_value < 1 ? default_value : '';
a8cIris._color._alpha = default_value;
$alpha_text.text(default_text);
$alpha_slider.slider('option', 'value', default_picker.alpha).trigger('slide');
});
// show alpha wrapper on click color picker button
$container.on('click', '.wp-color-result', function() {
$alpha_wrap.toggle();
});
// hide alpha wrapper on click body
$('body').on( 'click.wpcolorpicker', function() {
$alpha_wrap.hide();
});
},
// slider: options
value: picker.alpha,
step: 1,
min: 1,
max: 100
});
}
});
} else {
// wpColorPicker default picker
$this.wpColorPicker({
change: function() {
$this.trigger('keyup');
}
});
}
});
};
$(document).ready( function(){
$('.hide-color-picker.ot-colorpicker-opacity').ot_wpColorPicker();
});
})( jQuery, window, document );