leilukin-tumbleblog/admin/javascripts/admin.js.php

1264 lines
42 KiB
PHP

<?php
/**
* File: admin.js.php
* JavaScript for core functionality and extensions.
*/
if (!defined('CHYRP_VERSION'))
exit;
?>
'use strict';
$(function() {
toggle_all();
validate_slug();
validate_email();
validate_url();
validate_passwords();
confirm_submit();
solo_submit();
test_uploads();
Help.init();
Write.init();
Settings.init();
});
// Adds a master toggle to forms that have multiple checkboxes.
function toggle_all() {
$("form[data-toggler]").each(
function() {
var all_on = true;
var target = $(this);
var parent = $("#" + $(this).attr("data-toggler"));
var slaves = target.find(":checkbox");
var master = Date.now().toString(16);
slaves.each(
function() {
return all_on = $(this).prop("checked");
}
);
slaves.click(
function(e) {
slaves.each(
function() {
return all_on = $(this).prop("checked");
}
);
$("#" + master).prop("checked", all_on);
}
);
parent.append(
[$("<label>", {
"for": master
}).text('<?php esce(__("Toggle All", "admin")); ?>'),
$("<input>", {
"type": "checkbox",
"name": "toggle",
"id": master,
"class": "checkbox",
"aria-label": '<?php esce(__("Toggle All", "admin")); ?>'
}).prop("checked", all_on).click(
function(e) {
slaves.prop("checked", $(this).prop("checked"));
}
)]
);
}
);
}
// Validates slug fields.
function validate_slug() {
$("input[name='slug']").keyup(
function(e) {
var slug = $(this).val();
if (/^([a-z0-9\-]*)$/.test(slug))
$(this).removeClass("error");
else
$(this).addClass("error");
}
);
}
// Validates email fields.
function validate_email() {
$("input[type='email']").keyup(
function(e) {
var text = $(this).val();
if (text != "" && !isEmail(text))
$(this).addClass("error");
else
$(this).removeClass("error");
}
);
}
// Validates URL fields.
function validate_url() {
$("input[type='url']").keyup(
function(e) {
var text = $(this).val();
if (text != "" && !isURL(text))
$(this).addClass("error");
else
$(this).removeClass("error");
}
);
$("input[type='url']").on(
"change",
function(e) {
var text = $(this).val();
if (isURL(text))
$(this).val(addScheme(text));
}
);
}
// Tests the strength of #password1 and compares #password1 to #password2.
function validate_passwords() {
var passwords = $("input[type='password']").filter(
function(index) {
var id = $(this).attr("id");
return (!!id) ? id.match(/password[1-2]$/) : false ;
}
);
passwords.first().keyup(
function(e) {
var password = $(this).val();
if (passwordStrength(password) > 99)
$(this).addClass("strong");
else
$(this).removeClass("strong");
}
);
passwords.keyup(
function(e) {
var password1 = passwords.first().val();
var password2 = passwords.last().val();
if (password1 != "" && password1 != password2)
passwords.last().addClass("error");
else
passwords.last().removeClass("error");
}
);
passwords.parents("form").on(
"submit.passwords",
function(e) {
var password1 = passwords.first().val();
var password2 = passwords.last().val();
if (password1 != password2) {
e.preventDefault();
alert('<?php esce(__("Passwords do not match.")); ?>');
}
}
);
}
// Asks the user to confirm form submission.
function confirm_submit() {
$("form[data-confirm]").on(
"submit.confirm",
function(e) {
var text = $(this).attr("data-confirm") ||
'<?php esce(__("Are you sure you want to proceed?", "admin")); ?>' ;
if (!confirm(text.replace(/<[^>]+>/g, "")))
e.preventDefault();
}
);
$("button[data-confirm]").on(
"click.confirm",
function(e) {
var text = $(this).attr("data-confirm") ||
'<?php esce(__("Are you sure you want to proceed?", "admin")); ?>' ;
if (!confirm(text.replace(/<[^>]+>/g, "")))
e.preventDefault();
}
);
}
// Prevents forms being submitted multiple times in a short interval.
function solo_submit() {
$("form").on(
"submit.solo",
function(e) {
var last = $(this).attr("data-submitted") || 0 ;
var when = Date.now();
if ((when - last) < 5000) {
e.preventDefault();
console.log("Form submission blocked for 5 secs.");
} else {
$(this).attr("data-submitted", when);
}
}
);
}
function test_uploads() {
$("input[type='file']:not(.toolbar)").on(
"change.uploads",
function(e) {
if (!!e.target.files && e.target.files.length > 0) {
for (var i = 0; i < e.target.files.length; i++) {
var file = e.target.files[i];
if (file.size > Uploads.limit) {
e.target.value = null;
alert(Uploads.message);
break;
}
}
}
}
);
}
var Route = {
action: '<?php esce($route->action); ?>',
request: '<?php esce($route->request); ?>'
}
var Visitor = {
id: <?php esce($visitor->id); ?>,
token: '<?php esce(authenticate()); ?>'
}
var Site = {
url: '<?php esce($config->url); ?>',
chyrp_url: '<?php esce($config->chyrp_url); ?>',
ajax_url: '<?php esce(unfix(url('/', 'AjaxController'))); ?>'
}
var Oops = {
message: '<?php esce(__("Oops! Something went wrong on this web page.")); ?>',
count: 0
}
var Uploads = {
limit: <?php esce(intval($config->uploads_limit * 1000000)); ?>,
message: '<?php esce(_f("Maximum file size: %d Megabytes!", $config->uploads_limit)); ?>',
active: 0,
send: function(file, doneCallback, failCallback, alwaysCallback) {
Uploads.active++;
var form = new FormData();
form.set("action", "file_upload");
form.set("hash", Visitor.token);
form.set("file", file, file.name);
$.ajax({
type: "POST",
url: Site.ajax_url,
data: form,
processData: false,
contentType: false,
dataType: "json",
}).done(
function(response) {
doneCallback(response);
}
).fail(
function(response) {
Oops.count++;
failCallback(response);
}
).always(
function(response) {
Uploads.active--;
alwaysCallback(response);
}
);
},
show: function(search, filter, clickCallback, failCallback, alwaysCallback) {
if (Uploads.active)
return;
Uploads.active++;
$.post(
Site.ajax_url,
{
action: "uploads_modal",
hash: Visitor.token,
search: search,
filter: filter
},
function(data) {
$(
"<div>",
{
"role": "dialog",
"aria-label": '<?php esce(__("Modal window", "admin")); ?>'
}
).addClass(
"iframe_background"
).append(
[
$(
"<div>",
{
"title": '<?php esce(__("Uploads", "admin")); ?>',
}
).addClass(
"iframe_foreground"
).on(
"click",
"a",
function(e) {
e.preventDefault();
var target = $(e.target);
var file = {
href: target.attr("href"),
name: target.attr("data-name"),
type: target.attr("data-type"),
size: Number(target.attr("data-size"))
};
clickCallback(file);
$(this).parents(".iframe_background").remove();
}
).append(data),
$(
"<a>",
{
"href": "#",
"role": "button",
"accesskey": "x",
"aria-label": '<?php esce(__("Close", "admin")); ?>'
}
).addClass(
"iframe_close_gadget"
).click(
function(e) {
e.preventDefault();
$(this).parent().remove();
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/close.svg',
"alt": '<?php esce(__("close", "admin")); ?>'
}
)
)
]
).click(
function(e) {
if (e.target === e.currentTarget)
$(this).remove();
}
).insertAfter("#content").children("a.iframe_close_gadget").focus();
},
"html"
).fail(
function(response) {
Oops.count++;
failCallback(response);
}
).always(
function(response) {
Uploads.active--;
alwaysCallback(response);
}
);
}
}
var Help = {
init: function() {
$(".help").on(
"click",
function(e) {
e.preventDefault();
Help.show($(this).attr("href"));
}
);
},
show: function(href) {
$("<div>", {
"role": "dialog",
"aria-label": '<?php esce(__("Modal window", "admin")); ?>'
}).addClass(
"iframe_background"
).append(
[
$(
"<iframe>",
{
"src": href,
"title": '<?php esce(__("Help content", "admin")); ?>',
"sandbox": "allow-same-origin allow-popups allow-popups-to-escape-sandbox"
}
).addClass(
"iframe_foreground"
).loader().on(
"load",
function() {
$(this).loader(true);
}
),
$(
"<a>",
{
"href": "#",
"role": "button",
"accesskey": "x",
"aria-label": '<?php esce(__("Close", "admin")); ?>'
}
).addClass(
"iframe_close_gadget"
).click(
function(e) {
e.preventDefault();
$(this).parent().remove();
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/close.svg',
"alt": '<?php esce(__("close", "admin")); ?>'
}
)
)
]
).click(
function(e) {
if (e.target === e.currentTarget)
$(this).remove();
}
).insertAfter("#content").children("a.iframe_close_gadget").focus();
}
}
var Write = {
init: function() {
// Insert toolbar buttons for text formatting.
$("#write_form .options_toolbar, #edit_form .options_toolbar").each(
function() {
var toolbar = $(this);
var target = $("#" + toolbar.attr("id").replace("_toolbar", ""));
var tray = $("#" + target.attr("id") + "_tray");
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Heading", "admin")); ?>',
"aria-label": '<?php esce(__("Heading", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "h3");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/heading.svg',
"alt": '<?php esce(__("heading", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Strong", "admin")); ?>',
"aria-label": '<?php esce(__("Strong", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "strong");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/bold.svg',
"alt": '<?php esce(__("strong", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Emphasis", "admin")); ?>',
"aria-label": '<?php esce(__("Emphasis", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "em");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/italic.svg',
"alt": '<?php esce(__("emphasis", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Strikethrough", "admin")); ?>',
"aria-label": '<?php esce(__("Strikethrough", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "del");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/strikethrough.svg',
"alt": '<?php esce(__("strikethrough", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Highlight", "admin")); ?>',
"aria-label": '<?php esce(__("Highlight", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "mark");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/highlight.svg',
"alt": '<?php esce(__("highlight", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Code", "admin")); ?>',
"aria-label": '<?php esce(__("Code", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "code");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/code.svg',
"alt": '<?php esce(__("code", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Hyperlink", "admin")); ?>',
"aria-label": '<?php esce(__("Hyperlink", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "hyperlink");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/link.svg',
"alt": '<?php esce(__("hyperlink", "admin")); ?>'
}
)
)
);
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Image", "admin")); ?>',
"aria-label": '<?php esce(__("Image", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
Write.formatting(target, "img");
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/image.svg',
"alt": '<?php esce(__("image", "admin")); ?>'
}
)
)
);
// Do not continue if the textarea has <data-no_uploads>.
if (typeof target.attr("data-no_uploads") !== "undefined")
return;
// Insert toolbar buttons for image uploads.
$(
"<label>",
{
"role": "button",
"title": '<?php esce(__("Upload", "admin")); ?>',
"aria-label": '<?php esce(__("Upload", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).append(
[
$(
"<input>",
{
"name": toolbar.attr("id") + "_upload",
"type": "file",
"accept": "image/*"
}
).addClass(
"toolbar hidden"
).change(
function(e) {
if (!!e.target.files && e.target.files.length > 0) {
var file = e.target.files[0];
// Reject files too large to upload.
if (file.size > Uploads.limit) {
e.target.value = null;
tray.html(Uploads.message);
return;
}
tray.loader().html('<?php esce(__("Uploading...", "admin")); ?>');
// Upload the file and insert the tag if successful.
Uploads.send(
file,
function(response) {
Write.formatting(target, "img", response.data.url);
},
function(response) {
tray.html(Oops.message);
},
function(response) {
tray.loader(true);
e.target.value = null;
}
);
}
}
),
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/upload.svg',
"alt": '<?php esce(__("image", "admin")); ?>'
}
)
]
).appendTo(toolbar);
// Insert button to open the uploads modal.
if (<?php esce($visitor->group->can("edit_post", "edit_page", true)); ?>) {
toolbar.append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Insert", "admin")); ?>',
"aria-label": '<?php esce(__("Insert", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
tray.loader();
var search = target.attr("data-uploads_search") || "" ;
var filter = target.attr("data-uploads_filter") || "" ;
Uploads.show(
search,
filter,
function(file) {
Write.formatting(target, "insert", file.href);
},
function(response) {
tray.html(Oops.message);
},
function(response) {
tray.loader(true);
}
);
}
).append(
$("<img>", {
"src": Site.chyrp_url + '/admin/images/icons/storage.svg',
"alt": '<?php esce(__("insert", "admin")); ?>'
})
)
);
}
}
);
// Insert buttons for ajax previews.
if (<?php esce($theme->file_exists("content".DIR."preview")); ?>) {
$("#write_form *[data-preview], #edit_form *[data-preview]").each(
function() {
var target = $(this);
$("#" + target.attr("id") + "_toolbar").append(
$(
"<button>",
{
"type": "button",
"title": '<?php esce(__("Preview", "admin")); ?>',
"aria-label": '<?php esce(__("Preview", "admin")); ?>'
}
).addClass(
"emblem toolbar"
).click(
function(e) {
var content = target.val();
var field = target.attr("name");
var safename = $("input#feather").val() || "page";
var action = (safename == "page") ?
"preview_page" :
"preview_post" ;
e.preventDefault();
if (content != "")
Write.show(action, safename, field, content);
else
target.focus();
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/view.svg',
"alt": '<?php esce(__("preview", "admin")); ?>'
}
)
)
);
}
);
}
// Support drag-and-drop image uploads.
$("#write_form textarea, #edit_form textarea").each(
function() {
var target = $(this);
// Do not continue if the textarea has <data-no_uploads>.
if (typeof target.attr("data-no_uploads") !== "undefined")
return;
target.on("dragover", Write.dragover).
on("dragenter", Write.dragenter).
on("dragleave", Write.dragleave).
on("drop", Write.drop);
}
);
// Add a word counter to textarea elements.
$("#write_form textarea, #edit_form textarea").each(
function() {
var target = $(this);
var tray = $("#" + target.attr("id") + "_tray");
var regex = /\p{White_Space}+/gu;
var label = '<?php esce(__("Words:", "admin")); ?>';
target.on(
"input",
function(e) {
var words = target.val();
var count = words.trim().match(regex);
var total = !!count ? count.length + 1 : 1 ;
if (total == 1 && words.match(/^\p{White_Space}*$/gu))
total = 0;
tray.html(label + " " + total);
}
);
target.trigger("input");
}
);
// Remember unsaved text entered in the primary text input and textarea.
if (!!sessionStorage) {
var prefix = "user_" + Visitor.id;
$("#write_form .main_options input[type='text']").first().val(
function() {
try {
return sessionStorage.getItem(prefix + "_write_title");
} catch(e) {
console.log("Caught Exception: Window.sessionStorage.getItem()");
return null;
}
}
).on(
"change",
function(e) {
try {
sessionStorage.setItem(prefix + "_write_title", $(this).val());
} catch(e) {
console.log("Caught Exception: Window.sessionStorage.setItem()");
}
}
);
$("#write_form .main_options textarea").first().val(
function(index, value) {
try {
return sessionStorage.getItem(prefix + "_write_body");
} catch(e) {
console.log("Caught Exception: Window.sessionStorage.getItem()");
return null;
}
}
).on(
"change",
function(e) {
try {
sessionStorage.setItem(prefix + "_write_body", $(this).val());
} catch(e) {
console.log("Caught Exception: Window.sessionStorage.setItem()");
}
}
);
$("#write_form").on(
"submit.sessionStorage",
function(e) {
try {
sessionStorage.removeItem(prefix + "_write_title");
sessionStorage.removeItem(prefix + "_write_body");
} catch(e) {
console.log("Caught Exception: Window.sessionStorage.removeItem()");
}
}
);
}
},
dragenter: function(e) {
$(e.target).addClass("drag_highlight");
},
dragleave: function(e) {
$(e.target).removeClass("drag_highlight");
},
dragover: function(e) {
e.preventDefault();
},
drop: function(e) {
// Process drag-and-drop image file uploads.
e.stopPropagation();
e.preventDefault();
var dt = e.originalEvent.dataTransfer;
if (!!dt && !!dt.files && dt.files.length > 0) {
var file = dt.files[0];
var form = new FormData();
var tray = $("#" + $(e.target).attr("id") + "_tray");
if (file.type.indexOf("image/") == 0) {
// Reject files too large to upload.
if (file.size > Uploads.limit) {
tray.html(Uploads.message);
return;
}
tray.loader().html('<?php esce(__("Uploading...", "admin")); ?>');
// Upload the file and insert the tag if successful.
Uploads.send(
file,
function(response) {
Write.formatting($(e.target), "img", response.data.url);
},
function(response) {
tray.html(Oops.message);
},
function(response) {
tray.loader(true);
$(e.target).removeClass("drag_highlight");
}
);
}
}
},
formatting: function(target, effect, fragment = "") {
var markdown = <?php esce($config->enable_markdown); ?>;
var opening = "";
var closing = "";
var after = "";
var start = target[0].selectionStart;
var end = target[0].selectionEnd;
var selection = target.val().substring(start, end);
// Test for a trailing space caused by double-click word selection.
if (selection.length > 0) {
if (selection.slice(-1) == " ") {
after = " ";
selection = selection.substring(0, selection.length - 1);
}
}
switch (effect) {
case 'strong':
opening = (markdown) ?
"**" :
'<strong>' ;
closing = (markdown) ?
"**" :
'</strong>' ;
if (selection == "")
selection = " ";
break;
case 'em':
opening = (markdown) ?
"*" :
'<em>' ;
closing = (markdown) ?
"*" :
'</em>' ;
if (selection == "")
selection = " ";
break;
case 'code':
opening = (markdown) ?
"`" :
'<code>' ;
closing = (markdown) ?
"`" :
'</code>' ;
if (selection == "")
selection = " ";
break;
case 'h3':
opening = (markdown) ?
"### " :
'<h3>' ;
closing = (markdown) ?
"" :
'</h3>' ;
break;
case 'del':
opening = (markdown) ?
"~~" :
'<del>' ;
closing = (markdown) ?
"~~" :
'</del>' ;
if (selection == "")
selection = " ";
break;
case 'mark':
opening = (markdown) ?
"==" :
'<mark>' ;
closing = (markdown) ?
"==" :
'</mark>' ;
if (selection == "")
selection = " ";
break;
case 'hyperlink':
if (isURL(selection)) {
if (fragment) {
selection = fragment;
break;
}
opening = (markdown) ?
"[](" :
'<a href="' ;
closing = (markdown) ?
")" :
'"></a>' ;
} else {
opening = (markdown) ?
"[" :
'<a href="' + fragment + '">' ;
closing = (markdown) ?
"](" + fragment + ")" :
'</a>' ;
}
break;
case 'img':
if (isURL(selection)) {
if (fragment) {
selection = fragment;
break;
}
opening = (markdown) ?
"![](" :
'<img alt="" src="' ;
closing = (markdown) ?
")" :
'">' ;
} else {
opening = (markdown) ?
"![" :
'<img alt="' ;
closing = (markdown) ?
"](" + fragment + ")" :
'" src="' + fragment + '">' ;
}
break;
case 'insert':
selection = fragment;
break;
}
var text = opening + selection + closing + after;
target[0].setRangeText(text);
$(target).focus().trigger("input").trigger("change");
},
show: function(action, safename, field, content) {
var uid = Date.now().toString(16);
// Build a form targeting a named iframe.
$(
"<form>",
{
"id": uid,
"action": Site.ajax_url,
"method": "post",
"accept-charset": "UTF-8",
"target": uid,
"style": "display: none;"
}
).append(
[
$(
"<input>",
{
"type": "hidden",
"name": "action",
"value": action
}
),
$(
"<input>",
{
"type": "hidden",
"name": "safename",
"value": safename
}
),
$(
"<input>",
{
"type": "hidden",
"name": "field",
"value": field
}
),
$(
"<input>",
{
"type": "hidden",
"name": "content",
"value": content
}
),
$(
"<input>",
{
"type": "hidden",
"name": "hash",
"value": Visitor.token
}
)
]
).insertAfter("#content");
// Build and display the named iframe.
$(
"<div>",
{
"role": "dialog",
"aria-label": '<?php esce(__("Modal window", "admin")); ?>'
}
).addClass(
"iframe_background"
).append(
[
$(
"<iframe>",
{
"name": uid,
"title": '<?php esce(__("Preview content", "admin")); ?>',
"sandbox": "allow-same-origin allow-popups allow-popups-to-escape-sandbox"
}
).addClass(
"iframe_foreground"
).loader().on(
"load",
function() {
if (!!this.contentWindow.location && this.contentWindow.location != "about:blank")
$(this).loader(true);
}
),
$(
"<a>",
{
"href": "#",
"role": "button",
"accesskey": "x",
"aria-label": '<?php esce(__("Close", "admin")); ?>'
}
).addClass(
"iframe_close_gadget"
).click(
function(e) {
e.preventDefault();
$(this).parent().remove();
}
).append(
$(
"<img>",
{
"src": Site.chyrp_url + '/admin/images/icons/close.svg',
"alt": '<?php esce(__("close", "admin")); ?>'
}
)
)
]
).click(
function(e) {
if (e.target === e.currentTarget)
$(this).remove();
}
).insertAfter("#content").children("a.iframe_close_gadget").focus();
// Submit the form and destroy it immediately.
$("#" + uid).submit().remove();
}
}
var Settings = {
init: function() {
$("#email_correspondence").click(
function() {
if ($(this).prop("checked") == false)
$("#email_activation").prop("checked", false);
}
);
$("#email_activation").click(
function() {
if ($(this).prop("checked") == true)
$("#email_correspondence").prop("checked", true);
}
);
$("form#route_settings input[name='post_url']").on(
"keyup",
function(e) {
$("form#route_settings code.syntax").each(
function() {
var syntax = $(this).html();
var regexp = new RegExp("(/?|^)" + escapeRegExp(syntax) + "(/?|$)", "g");
if ($(e.target).val().match(regexp))
$(this).addClass("tag_added");
else
$(this).removeClass("tag_added");
}
);
}
).trigger("keyup");
}
}
<?php $trigger->call("admin_javascript"); ?>