jQuery(document).ready( function($) {
$('.page-title-action').hide();
var postID = document.getElementById('post_ID') != null ? document.getElementById('post_ID').value : 0;
// Initialize the CodeMirror editor
if ( $('#ccj_content').length > 0 ) {
var content_mode = $("#ccj_content").attr('mode');
if ( content_mode == 'html' ) {
var content_mode = {
name: "htmlmixed",
scriptTypes: [{matches: /\/x-handlebars-template|\/x-mustache/i,
mode: null}]
};
}
CCJ.codemirror.mode = content_mode;
CCJ.codemirror.extraKeys.F11 = function(cm) {
cm.setOption("fullScreen", !cm.getOption("fullScreen"));
fullscreen_buttons( true );
var cookies = (getCookie('ccj-' + postID) || '0,0,0,0').split(',');
document.cookie = 'ccj-' + postID + '=' + [cookies[0], cookies[1], cookies[2], 1].join(',') + '; SameSite=Lax';
};
CCJ.codemirror.extraKeys.Esc = function(cm) {
if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
fullscreen_buttons( false );
var cookies = (getCookie('ccj-' + postID) || '0,0,0,0').split(',');
document.cookie = 'ccj-' + postID + '=' + [cookies[0], cookies[1], cookies[2], 0].join(',') + '; SameSite=Lax';
};
var editor = CodeMirror.fromTextArea(document.getElementById("ccj_content"), CCJ.codemirror);
// Code folding
editor.setOption("lineNumbers", true);
editor.setOption("lineWrapping", true);
editor.setOption("foldGutter", true);
editor.setOption("gutters", ["CodeMirror-linenumbers", "CodeMirror-foldgutter"]);
CCJ.codemirror.extraKeys["Ctrl-Q"] = function(cm){ cm.foldCode(cm.getCursor()); };
// Note: ccj-postID cookie will save cursor line, cursor character, editor height and fullscreen values
var cookies = (getCookie('ccj-' + postID) || '0,0,0,0').split(',');
// Make the editor resizable
var cm_width = $('#title').width() + 16;
var cm_height = (parseFloat(cookies[2]) >= 200) ? parseFloat(cookies[2]) : 500;
editor.setSize(cm_width, cm_height);
$('.CodeMirror').resizable({
resize: function() {
editor.setSize($(this).width(), $(this).height());
} ,
maxWidth: cm_width,
minWidth: cm_width,
minHeight: 200
});
$(window).resize(function () {
var cm_width = $('#title').width() + 16;
var cm_height = $('.CodeMirror').height();
editor.setSize(cm_width, cm_height);
});
// Code Beautifier
$("#ccj-beautifier").click(function(e){
CodeMirror.commands["selectAll"](editor);
editor.autoFormatRange(editor.getCursor(true), editor.getCursor(false));
editor.setCursor(0);
e.preventDefault();
});
// Autocomplete
if ( CCJ.autocomplete === '1' ) {
editor.on( "keyup", function ( cm, event ) {
if ( ! cm.state.completionActive && event.keyCode > 64 && event.keyCode < 91 ) {
CodeMirror.commands.autocomplete( cm, null, { completeSingle: false } );
}
});
}
// Saving cursor state
editor.on('cursorActivity', function () {
var curPos = editor.getCursor();
document.cookie = 'ccj-' + postID + '=' + [curPos.line, curPos.ch, cookies[2], cookies[3]].join(',') + '; SameSite=Lax';
});
// Restoring cursor state
editor.setCursor(parseFloat(cookies[0]), parseFloat(cookies[1]));
// Save the editor's height
editor.on('refresh', function() {
var height = ( !editor.getOption('fullScreen') ) ? $('.CodeMirror').height() : cookies[2];
var curPos = editor.getCursor();
document.cookie = 'ccj-' + postID + '=' + [curPos.line, curPos.ch, height, Number(editor.getOption('fullScreen'))].join(',') + '; SameSite=Lax';
});
// Save the custom code when hitting "Ctrl-S"
editor.on('keydown', function(cm, event) {
if ( ! event.ctrlKey && ! event.metaKey || event.which !== 83 ) return;
var height = ( !editor.getOption('fullScreen') ) ? $('.CodeMirror').height() : cookies[2];
var curPos = editor.getCursor();
document.cookie = 'ccj-' + postID + '=' + [curPos.line, curPos.ch, height, Number(editor.getOption('fullScreen'))].join(',') + '; SameSite=Lax';
$("form#post").submit();
event.preventDefault();
return false;
});
// Restoring fullscreen
editor.setOption("fullScreen", parseFloat(cookies[3]));
fullscreen_buttons( Boolean(parseFloat(cookies[3])) );
// Action for the `fullscreen` button
$("#ccj-fullscreen-button").click( function() {
editor.triggerOnKeyDown({type: 'keydown', keyCode: 122});
});
$("#publish").click(function(e){
var cookies = (getCookie('ccj-' + postID) || '0,0,0,0').split(',');
var curPos = editor.getCursor();
document.cookie = 'ccj-' + postID + '=' + [curPos.line, curPos.ch, cookies[2], Number(editor.getOption('fullScreen'))].join(',') + '; SameSite=Lax';
});
}
// Enable the tipsy
$('span[rel=tipsy].tipsy-no-html').tipsy({fade: true, gravity: 's'});
$('span[rel=tipsy]').tipsy({fade: true, gravity: 's', html: true});
// Toggle the buttons when in fullscreen mode
function fullscreen_buttons( mode ) {
editor.focus();
if ( mode === true ) {
$("#publish").css({
'position' : 'fixed',
'right' : '40px',
'bottom' : '40px',
'z-index' : 100005,
});
} else {
$("#publish").css({
'position' : 'static',
'right' : 'initial',
'bottom' : 'initial',
'z-index' : 10,
});
}
}
// For post.php or post-new.php pages show the code's title in the page title
if ( $('#titlediv #title').length > 0 ) {
var new_title = $("input[name=custom_code_language]").val().toUpperCase() + ' - ' + $('#titlediv #title').val();
if( $('#titlediv #title').val().length > 0 ) {
$(document).prop('title', new_title );
}
$('#titlediv #title').change(function() {
if ( $(this).val().length > 0 ) {
$(document).prop('title', new_title);
}
});
}
// Make the inactive rows opaque
if ( $('.dashicons-star-empty.ccj_row').length > 0 ) {
$('.dashicons-star-empty.ccj_row').each(function(){
$(this).parent().parent().parent().css('opacity', '0.4');
});
}
// Activate/deactivate codes with AJAX
$(".ccj_activate_deactivate").click( function(e) {
var url = $(this).attr('href');
var code_id = $(this).attr('data-code-id');
e.preventDefault();
$.ajax({
url: url,
success: function(data){
if (data === 'yes') {
ccj_activate_deactivate(code_id, false);
}
if (data === 'no') {
ccj_activate_deactivate(code_id, true);
}
}
});
});
// The "After <body> tag" option cannot go together with the "In Admin" option
custom_code_type_change();
$( 'input[name=custom_code_type]' ).on( 'change', custom_code_type_change );
function custom_code_type_change() {
if ( $( 'input[name=custom_code_type]:checked' ).val() === 'body_open' ) {
$( '#custom_code_side-admin' ).prop( 'disabled', true );
if ( $( 'input[name=custom_code_side]:checked' ).val() === 'admin' ) {
$( '#custom_code_side-admin' ).prop( 'checked', 'checked' );
}
} else {
$( '#custom_code_side-admin' ).prop( 'disabled', false );
}
}
custom_code_side_change();
$( 'input[name=custom_code_side]' ).on( 'change', custom_code_side_change );
function custom_code_side_change() {
if ( $( 'input[name=custom_code_side]:checked' ).val() === 'admin' ) {
$( '#custom_code_type-body_open' ).prop( 'disabled', true );
} else {
$( '#custom_code_type-body_open' ).prop( 'disabled', false );
if ( $( 'input[name=custom_code_type]:checked' ).val() === 'body_open' ) {
$( '#custom_code_type-body_open' ).prop( 'checked', true );
}
}
}
// Toggle the signs for activating/deactivating codes
function ccj_activate_deactivate(code_id, action) {
var row = $('tr#post-'+code_id);
if ( action === true ) {
row.css('opacity', '1');
row.find('.row-actions .ccj_activate_deactivate')
.text(CCJ.deactivate)
.attr('title', CCJ.active_title);
row.find('td.active .dashicons')
.removeClass('dashicons-star-empty')
.addClass('dashicons-star-filled');
row.find('td.active .ccj_activate_deactivate')
.attr('title', CCJ.active_title);
$('#activate-action span').text(CCJ.active);
$('#activate-action .ccj_activate_deactivate').text(CCJ.deactivate);
} else {
row.css('opacity', '0.4');
row.find('.row-actions .ccj_activate_deactivate')
.text(CCJ.activate)
.attr('title', CCJ.deactive_title);
row.find('td.active .dashicons')
.removeClass('dashicons-star-filled')
.addClass('dashicons-star-empty');
row.find('td.active .ccj_activate_deactivate')
.attr('title', CCJ.deactive_title);
$('#activate-action span').text(CCJ.inactive);
$('#activate-action .ccj_activate_deactivate').text(CCJ.activate);
}
}
function getCookie(name) {
var value = '; ' + document.cookie;
var parts = value.split('; ' + name + '=');
if (parts.length === 2) return parts.pop().split(';').shift();
}
// Permalink slug
$( '#titlediv' ).on( 'click', '.ccj-edit-slug', function() {
var i,
$el, revert_e,
c = 0,
slug_value = $('#editable-post-name').html(),
real_slug = $('#post_name'),
revert_slug = real_slug.val(),
permalink = $( '#sample-permalink' ),
permalinkOrig = permalink.html(),
permalinkInner = $( '#sample-permalink a' ).html(),
permalinkHref = $('#sample-permalink a').attr('href'),
buttons = $('#ccj-edit-slug-buttons'),
buttonsOrig = buttons.html(),
full = $('#editable-post-name-full');
// Deal with Twemoji in the post-name.
full.find( 'img' ).replaceWith( function() { return this.alt; } );
full = full.html();
permalink.html( permalinkInner );
// Save current content to revert to when cancelling.
$el = $( '#editable-post-name' );
revert_e = $el.html();
if ( typeof postL10n === 'undefined' || postL10n.cancel === '' || postL10n.ok === '' ) {
postL10n = {
ok : wp.i18n.__( 'OK' ),
cancel : wp.i18n.__( 'Cancel' ),
}
}
buttons.html( '<button type="button" class="save button button-small">' + postL10n.ok + '</button> <button type="button" class="cancel button-link">' + postL10n.cancel + '</button>' );
// Save permalink changes.
buttons.children( '.save' ).click( function() {
var new_slug = $el.children( 'input' ).val();
if ( new_slug == $('#editable-post-name-full').text() ) {
buttons.children('.cancel').click();
return;
}
$.post(
ajaxurl,
{
action: 'ccj_permalink',
code_id: $('#post_ID').val(),
new_slug: new_slug,
permalink: permalinkHref,
filetype: $('#editable-post-name-full').data('filetype'),
ccj_permalink_nonce: $('#ccj-permalink-nonce').val()
},
function(data) {
var box = $('#edit-slug-box');
box.html(data);
if (box.hasClass('hidden')) {
box.fadeIn('fast', function () {
box.removeClass('hidden');
});
}
}
);
});
// Cancel editing of permalink.
buttons.children( '.cancel' ).click( function() {
$('#view-post-btn').show();
$el.html(revert_e);
buttons.html(buttonsOrig);
permalink.html(permalinkOrig);
real_slug.val(revert_slug);
$( '.ccj-edit-slug' ).focus();
});
$el.html( '<input type="text" name="new_slug" id="new-post-slug" value="' + slug_value + '" autocomplete="off" />' ).children( 'input' ).keydown( function( e ) {
var key = e.which;
// On [enter], just save the new slug, don't save the post.
if ( 13 === key ) {
e.preventDefault();
buttons.children( '.save' ).click();
}
// On [esc] cancel the editing.
if ( 27 === key ) {
buttons.children( '.cancel' ).click();
}
} ).keyup( function() {
real_slug.val( this.value );
}).focus();
});
});