var PODLOVE = PODLOVE || {}; // jQuery Tiny Pub/Sub // https://github.com/cowboy/jquery-tiny-pubsub (function ($) { var o = $({}); $.subscribe = function () { o.on.apply(o, arguments); }; $.unsubscribe = function () { o.off.apply(o, arguments); }; $.publish = function () { o.trigger.apply(o, arguments); }; }(jQuery)); jQuery.ajaxSetup({ beforeSend: function (xhr, settings) { if (settings.url.includes("wp-json")) { xhr.setRequestHeader("X-WP-Nonce", podlove_admin_global.nonce); } }, }); PODLOVE.rtrim = function (string, thechar) { var re = new RegExp(thechar + "+$", "g"); return string.replace(re, ''); } PODLOVE.untrailingslashit = function (url) { return PODLOVE.rtrim(url, '/'); } PODLOVE.trailingslashit = function (url) { return PODLOVE.untrailingslashit(url) + '/'; } PODLOVE.toDurationFormat = function (float_seconds) { var sec_num = parseInt(float_seconds, 10); var hours = Math.floor(sec_num / 3600); var minutes = Math.floor((sec_num - (hours * 3600)) / 60); var seconds = sec_num - (hours * 3600) - (minutes * 60); var milliseconds = Math.round((float_seconds % 1) * 1000); if (hours < 10) { hours = "0" + hours; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } var time = hours + ':' + minutes + ':' + seconds; if (milliseconds) { time += '.' + milliseconds; }; return time; } function human_readable_size(size) { if (!size || size < 1) { return "???"; } var kilobytes = size / 1024; if (kilobytes < 500) { return kilobytes.toFixed(2) + " kB"; } var megabytes = kilobytes / 1024 return megabytes.toFixed(2) + " MB"; } function convert_to_slug(string) { string = string.toLowerCase(); string = string.replace(/\s+/g, '-'); string = string.replace(/[\u00e4]/g, 'ae'); string = string.replace(/[\u00f6]/g, 'oe'); string = string.replace(/[\u00fc]/g, 'ue'); string = string.replace(/[\u00df]/g, 'ss'); string = string.replace(/[^\w\-]+/g, ''); string = escape(string); return string; } function auto_fill_form(id, title_id) { (function ($) { switch (id) { case 'contributor': if ($("#podlove_contributor_publicname").val() == "") { if ($("#podlove_contributor_realname").val() == "") { $("#podlove_contributor_publicname").attr('placeholder', $("#podlove_contributor_nickname").val()); } else { $("#podlove_contributor_publicname").attr('placeholder', $("#podlove_contributor_realname").val()); } } break; case 'contributor_group': if ($("#podlove_contributor_group_slug").val() == "") { $("#podlove_contributor_group_slug").val(convert_to_slug($("#podlove_contributor_" + title_id).val())); } break; case 'contributor_role': if ($("#podlove_contributor_role_slug").val() == "") { $("#podlove_contributor_role_slug").val(convert_to_slug($("#podlove_contributor_" + title_id).val())); } break; } }(jQuery)); } /** * HTML-based input behavior for text fields. * * To activate behavior, add class `podlove-check-input`. * * - trims whitespace from beginning and end * * Add these data attributes to add further behavior: * * - `data-podlove-input-type="url"` : verifies against URL regex * - `data-podlove-input-type="avatar"`: verifies against URL or email regex * - `data-podlove-input-type="email"` : verifies against email regex * - `data-podlove-input-remove="@ +"` : removes given whitespace separated list of characters from input * * Expects HTML to be in the following form: * * ```html * * * ``` */ function clean_up_input() { (function ($) { $(".podlove-check-input").on('change', function () { var textfield = $(this); var textfieldid = textfield.attr("id"); var $status = $(".podlove-input-status[data-podlove-input-status-for=" + textfieldid + "]"); textfield.removeClass("podlove-invalid-input"); $status.removeClass("podlove-input-isinvalid"); function ShowInputError(message) { $status.text(message); textfield.addClass("podlove-invalid-input"); $status.addClass("podlove-input-isinvalid"); } // trim whitespace textfield.val(textfield.val().trim()); // remove blacklisted characters if (inputType = $(this).data("podlove-input-remove")) { characters = $(this).data("podlove-input-remove").split(' '); $.each(characters, function (index, character) { textfield.val(textfield.val().replace(character, '')); }); } // handle special input types if (inputType = $(this).data("podlove-input-type")) { $status.text(''); if ($(this).val() == '') return; switch (inputType) { case "url": valid_url_regexp = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i; if (!textfield.val().match(valid_url_regexp)) { // Encode URL only if it is not already encoded if (!encodeURI(textfield.val()).match(valid_url_regexp)) { ShowInputError('Please enter a valid URL'); } else { textfield.val(encodeURI(textfield.val())); } } break; case "avatar": if (!textfield.val().match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i)) { // textfield.val( encodeURI( textfield.val() ) ); if (!textfield.val().match(/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i)) { ShowInputError('Please enter a valid email adress or a valid URL'); } } break; case "email": if (!textfield.val().match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/i)) ShowInputError('Please enter a valid email adress.'); break; } } }); }(jQuery)); } /** * Initialize contextual help links. * * Use like this: * * ? */ function init_contextual_help_links() { jQuery("a[data-podlove-help]").on("click", function (e) { var help_id = jQuery(this).data('podlove-help'); e.preventDefault(); // Remove 'active' class from all link tabs jQuery('li[id^="tab-link-"]').each(function () { jQuery(this).removeClass('active'); }); // Hide all panels jQuery('div[id^="tab-panel-"]').each(function () { jQuery(this).css('display', 'none'); }); // Set our desired link/panel jQuery('#tab-link-' + help_id).addClass('active'); jQuery('#tab-panel-' + help_id).css('display', 'block'); // Force click on the Help tab if (jQuery('#contextual-help-link').attr('aria-expanded') === "false") { jQuery('#contextual-help-link').click(); } // Force scroll to top, so you can actually see the help window.scroll(0, 0); }); } jQuery(function ($) { $("#_podlove_meta_recording_date").datepicker({ dateFormat: 'yy-mm-dd' }); $("#dashboard_feed_info").each(function () { PODLOVE.DashboardFeedValidation($(this)); }); $("#asset_validation").each(function () { PODLOVE.DashboardAssetValidation($(this)); }); $("#podlove_podcast").each(function () { PODLOVE.Episode($(this)); }); $("#podlove_episode_assets, table.episode_assets").each(function () { PODLOVE.EpisodeAssetSettings($(this)); }); $(".wrap").each(function () { PODLOVE.FeedSettings($(this)); }); $(".row_podlove_feed_protected").each(function () { PODLOVE.ProtectFeed(); }); $("#podlove_contributor_publicname").change(function () { auto_fill_form('contributor', 'realname'); }); $("#podlove_contributor_realname").change(function () { auto_fill_form('contributor', 'realname'); }); $("#podlove_contributor_nickname").change(function () { auto_fill_form('contributor', 'realname'); }); $("#podlove_contributor_group_title").change(function () { auto_fill_form('contributor_group', 'group_title'); }); $("#podlove_contributor_role_title").change(function () { auto_fill_form('contributor_role', 'role_title'); }); $(document).ready(function () { auto_fill_form('contributor', 'realname'); clean_up_input(); init_contextual_help_links(); new ClipboardJS('.clipboard-btn'); }); });