1566 lines
62 KiB
Smarty
1566 lines
62 KiB
Smarty
/* $Id$ */
|
|
/*
|
|
# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
|
|
# All rights reserved. See LICENSE file for licensing details
|
|
*/
|
|
|
|
(function(serendipity, $, undefined ) {
|
|
// Fires functions which are generated dynamically in backend PHP files
|
|
// (i.e. include/functions_entries_admin.inc.php) which load the various
|
|
// WYSIWYG editors in entries editor, HTML nuggets etc.
|
|
serendipity.spawn = function() {
|
|
if (self.Spawnextended) {
|
|
Spawnextended();
|
|
}
|
|
|
|
if (self.Spawnbody) {
|
|
Spawnbody();
|
|
}
|
|
|
|
if (self.Spawnnugget) {
|
|
Spawnnugget();
|
|
}
|
|
}
|
|
|
|
// Generic function to set cookies
|
|
serendipity.SetCookie = function(name, value) {
|
|
var today = new Date();
|
|
var expire = new Date();
|
|
expire.setTime(today.getTime() + (60*60*24*30*1000));
|
|
document.cookie = 'serendipity[' + name + ']='+escape(value) + ';expires=' + expire.toGMTString();
|
|
}
|
|
|
|
serendipity.GetCookie = function(name) {
|
|
var nameEQ = name + "=";
|
|
var ca = document.cookie.split(';');
|
|
for(var i=0;i < ca.length;i++) {
|
|
var c = ca[i];
|
|
while (c.charAt(0)==' ') c = c.substring(1,c.length);
|
|
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Based upon code written by chris wetherell
|
|
* http://www.massless.org
|
|
* chris [THE AT SIGN] massless.org
|
|
*/
|
|
|
|
// Returns "position" of selection in textarea
|
|
// Used internally by wrapSelectionWithLink()
|
|
serendipity.getSelection = function($txtarea) {
|
|
var start = $txtarea[0].selectionStart;
|
|
var end = $txtarea[0].selectionEnd;
|
|
return $txtarea.val().substring(start, end);
|
|
}
|
|
|
|
// Used by non-wysiwyg editor toolbar buttons to wrap selection
|
|
// in a element associated with toolbar button
|
|
serendipity.wrapSelection = function(txtarea, openTag, closeTag) {
|
|
scrollPos = false;
|
|
|
|
if (txtarea.scrollTop) {
|
|
scrollPos = txtarea.scrollTop;
|
|
}
|
|
|
|
// http://stackoverflow.com/questions/1712417/jquery-wrap-selected-text-in-a-textarea
|
|
var $txtarea = $(txtarea);
|
|
|
|
if (!$txtarea.length) {
|
|
return;
|
|
}
|
|
|
|
var len = $txtarea.val().length;
|
|
var start = $txtarea[0].selectionStart;
|
|
var end = $txtarea[0].selectionEnd;
|
|
var selectedText = $txtarea.val().substring(start, end);
|
|
var replacement = openTag + selectedText + closeTag;
|
|
$txtarea.val($txtarea.val().substring(0, start) + replacement + $txtarea.val().substring(end, len));
|
|
|
|
$txtarea[0].selectionStart = start + replacement.length;
|
|
$txtarea[0].selectionEnd = start + replacement.length;
|
|
|
|
if (scrollPos) {
|
|
txtarea.focus();
|
|
txtarea.scrollTop = scrollPos;
|
|
}
|
|
}
|
|
|
|
// Used by non-wysiwyg editor toolbar buttons to wrap selection
|
|
// in <a> element (only)
|
|
serendipity.wrapSelectionWithLink = function(txtarea) {
|
|
var my_link = prompt("Enter URL:","http://");
|
|
|
|
if (my_link) {
|
|
if (serendipity.getSelection($(txtarea) ) == "") {
|
|
var my_desc = prompt("Enter Description", '');
|
|
}
|
|
var my_title = prompt("Enter title/tooltip:", "");
|
|
}
|
|
|
|
html_title = "";
|
|
|
|
if (my_title != "" && my_title != null) {
|
|
html_title = ' title="' + my_title + '"';
|
|
}
|
|
|
|
if (my_link != null) {
|
|
lft = "<a href=\"" + my_link + "\"" + html_title + ">";
|
|
|
|
if (my_desc != null && my_desc != "") {
|
|
rgt = my_desc + "</a>";
|
|
} else {
|
|
rgt = "</a>";
|
|
}
|
|
|
|
serendipity.wrapSelection(txtarea, lft, rgt);
|
|
}
|
|
|
|
return;
|
|
}
|
|
/* end chris w. script */
|
|
|
|
// Adds img element to selected text
|
|
// Used internally by wrapInsImage()
|
|
serendipity.insertText = function(txtarea, str) {
|
|
$txtarea = $(txtarea);
|
|
var selLength = $txtarea.val().length;
|
|
var selStart = $txtarea[0].selectionStart;
|
|
var selEnd = $txtarea[0].selectionEnd;
|
|
|
|
if (selEnd==1 || selEnd==2) {
|
|
selEnd=selLength;
|
|
}
|
|
|
|
var before = $txtarea.val().substring(0,selStart);
|
|
var after = $txtarea.val().substring(selStart);
|
|
|
|
$txtarea.val(before + str + after);
|
|
|
|
$txtarea[0].selectionStart = selStart + str.length
|
|
$txtarea[0].selectionEnd = selStart + str.length
|
|
}
|
|
|
|
// Used by non-wysiwyg editor toolbar buttons to wrap selection
|
|
// in <img> element (only); doesn't really "wrap", merely inserts
|
|
// an <img> element before selected text
|
|
serendipity.wrapInsImage = function(txtarea) {
|
|
var loc = prompt('Enter the image location: ');
|
|
|
|
if (loc) {
|
|
var alttxt = prompt('Enter alternative text for this image: ');
|
|
serendipity.insertText(txtarea,'<img src="'+ loc + '" alt="' + alttxt + '">');
|
|
}
|
|
}
|
|
/* end Better-Editor functions */
|
|
|
|
// Switches preview of image selected from media db
|
|
serendipity.change_preview = function(input, output) {
|
|
var filename = document.getElementById(input).value;
|
|
var $target = $('#' + output + '_preview > img');
|
|
$target.attr('src', filename);
|
|
}
|
|
|
|
// Opens media db image selection in new window
|
|
serendipity.choose_media = function(id) {
|
|
serendipity.openPopup('serendipity_admin.php?serendipity[adminModule]=media&serendipity[noBanner]=true&serendipity[noSidebar]=true&serendipity[noFooter]=true&serendipity[showMediaToolbar]=false&serendipity[showUpload]=true&serendipity[htmltarget]=' + id + '&serendipity[filename_only]=true');
|
|
}
|
|
|
|
// "Transfer" value from media db popup to form element, used for example for selecting a category-icon
|
|
serendipity.serendipity_imageSelector_addToElement = function(str, id) {
|
|
id = serendipity.escapeBrackets(id);
|
|
var $input = $('#' + id);
|
|
$input.val(str);
|
|
|
|
if ($input.attr('type') != 'hidden') {
|
|
$input.focus(); // IE would generate an error when focusing an hidden element
|
|
}
|
|
|
|
// calling the change-event for doing stuff like generating the preview-image
|
|
$input.change();
|
|
}
|
|
|
|
// Escape [ and ] to be able to use the string as selector
|
|
// jQuery fails to select the input when the selector contains unescaped [ or ]
|
|
serendipity.escapeBrackets = function(str) {
|
|
str = str.replace(/\[/g, "\\[");
|
|
str = str.replace(/\]/g, "\\]");
|
|
return str;
|
|
}
|
|
|
|
// Add another (image) keyword
|
|
serendipity.AddKeyword = function(keyword) {
|
|
s = document.getElementById('keyword_input').value;
|
|
document.getElementById('keyword_input').value = (s != '' ? s + ';' : '') + keyword;
|
|
}
|
|
|
|
// "Transfer" value from media db popup to textarea, including wysiwyg
|
|
// This gets textarea="body"/"extended" and tries to insert into the textarea
|
|
// named serendipity[body]/serendipity[extended]
|
|
serendipity.serendipity_imageSelector_addToBody = function(str, textarea) {
|
|
var oEditor;
|
|
if (typeof(FCKeditorAPI) != 'undefined') {
|
|
oEditor = FCKeditorAPI.GetInstance('serendipity[' + textarea + ']') ;
|
|
|
|
if (oEditor.EditMode == FCK_EDITMODE_WYSIWYG) {
|
|
oEditor.InsertHtml(str);
|
|
return;
|
|
}
|
|
} else if(typeof(xinha_editors) != 'undefined') {
|
|
if (typeof(xinha_editors['serendipity[' + textarea + ']']) != 'undefined') {
|
|
oEditor = xinha_editors['serendipity['+ textarea +']'];
|
|
}
|
|
|
|
if (oEditor) {
|
|
oEditor.insertHTML(str);
|
|
return;
|
|
}
|
|
} else if(typeof(HTMLArea) != 'undefined') {
|
|
if (textarea == 'body' && typeof(editorbody) != 'undefined') {
|
|
oEditor = editorbody;
|
|
} else if (textarea == 'extended' && typeof(editorextended) != 'undefined') {
|
|
oEditor = editorextended;
|
|
} else if (typeof(htmlarea_editors) != 'undefined' && typeof(htmlarea_editors[textarea]) != 'undefined') {
|
|
oEditor = htmlarea_editors[textarea];
|
|
}
|
|
|
|
if (oEditor._editMode != 'textmode') {
|
|
oEditor.insertHTML(str);
|
|
return;
|
|
}
|
|
} else if(typeof(TinyMCE) != 'undefined') {
|
|
// for the TinyMCE editor we do not have a text mode insert
|
|
tinyMCE.execInstanceCommand('serendipity[' + textarea + ']', 'mceInsertContent', false, str);
|
|
return;
|
|
} else if (typeof(CKEDITOR) != 'undefined') {
|
|
oEditor = (typeof(isinstance) == 'undefined') ? CKEDITOR.instances[textarea] : isinstance;
|
|
if (typeof(oEditor) == 'undefined') oEditor = popupEditorInstance;
|
|
if (oEditor.mode == "wysiwyg") {
|
|
oEditor.insertHtml(str);
|
|
return;
|
|
}
|
|
}
|
|
|
|
serendipity.noWysiwygAdd(str, textarea);
|
|
}
|
|
|
|
// The noWysiwygAdd JS function is the vanila serendipity_imageSelector_addToBody js function
|
|
// which works fine in NO WYSIWYG mode
|
|
// NOTE: the serendipity_imageSelector_addToBody could add any valid HTML string to the textarea
|
|
serendipity.noWysiwygAdd = function(str, textarea) {
|
|
escapedElement = serendipity.escapeBrackets(textarea);
|
|
if ($('#' + escapedElement).length) {
|
|
// Proper ID was specified (hopefully by plugins)
|
|
} else {
|
|
// Let's try the serendipity[] prefix
|
|
escapedElement = serendipity.escapeBrackets('serendipity[' + textarea + ']');
|
|
|
|
if (!$('#' + escapedElement).length) {
|
|
console.log("Serendipity plugin error: " + escapedElement + " not found.");
|
|
}
|
|
}
|
|
|
|
serendipity.wrapSelection($('#'+escapedElement), str, '');
|
|
}
|
|
|
|
// Inserting media db img markup including s9y-specific container markup
|
|
serendipity.serendipity_imageSelector_done = function(textarea) {
|
|
var insert = '';
|
|
var img = '';
|
|
var src = '';
|
|
var alt = '';
|
|
var title = '';
|
|
|
|
var f = document.forms['serendipity[selForm]'].elements;
|
|
|
|
img = f['imgName'].value;
|
|
var imgWidth = f['imgWidth'].value;
|
|
var imgHeight = f['imgHeight'].value;
|
|
if (f['serendipity[linkThumbnail]'] && f['serendipity[linkThumbnail]'][0].checked == true) {
|
|
img = f['thumbName'].value;
|
|
imgWidth = f['imgThumbWidth'].value;
|
|
imgHeight = f['imgThumbHeight'].value;
|
|
}
|
|
|
|
if (parent.self.opener == undefined) {
|
|
// in iframes, there is no opener, and the magnific popup is wrapped
|
|
parent.self = window.parent.parent.$.magnificPopup;
|
|
parent.self.opener = window.parent.parent;
|
|
}
|
|
|
|
if (f['serendipity[filename_only]']) {
|
|
// this part is used when selecting only the image without further markup (-> category-icon)
|
|
var starget = f['serendipity[htmltarget]'] ? f['serendipity[htmltarget]'].value : 'serendipity[' + textarea + ']';
|
|
|
|
switch(f['serendipity[filename_only]'].value) {
|
|
case 'true':
|
|
parent.self.opener.serendipity.serendipity_imageSelector_addToElement(img, f['serendipity[htmltarget]'].value);
|
|
parent.self.close();
|
|
return true;
|
|
case 'id':
|
|
parent.self.opener.serendipity.serendipity_imageSelector_addToElement(f['imgID'].value, starget);
|
|
parent.self.close();
|
|
return true;
|
|
case 'thumb':
|
|
parent.self.opener.serendipity.serendipity_imageSelector_addToElement(f['thumbName'].value, starget);
|
|
parent.self.close();
|
|
return true;
|
|
case 'big':
|
|
parent.self.opener.serendipity.serendipity_imageSelector_addToElement(f['imgName'].value, starget);
|
|
parent.self.close();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
alt = f['serendipity[alt]'].value.replace(/"/g, """);
|
|
title = f['serendipity[title]'].value.replace(/"/g, """);
|
|
|
|
var imgID = 0;
|
|
if (f['imgID']) {
|
|
imgID = f['imgID'].value;
|
|
}
|
|
|
|
var floating = $(':input[name="serendipity[align]"]:checked').val();
|
|
if (floating == "") {
|
|
floating = "center";
|
|
}
|
|
img = "<!-- s9ymdb:" + imgID + " --><img class=\"serendipity_image_"+ floating +"\" width=\"" + imgWidth + "\" height=\"" + imgHeight + '" src="' + img + "\" " + (title != '' ? 'title="' + title + '"' : '') + " alt=\"" + alt + "\">";
|
|
|
|
if ($(':input[name="serendipity[isLink]"]:checked').val() == "yes") {
|
|
// wrap the img in a link to the image. TODO: The label in the media_chooser.tpl explains it wrong
|
|
var targetval = $('#select_image_target').val();
|
|
|
|
var prepend = '';
|
|
var ilink = f['serendipity[url]'].value;
|
|
var itarget = '';
|
|
|
|
switch (targetval) {
|
|
case 'js':
|
|
var itarget = ' onclick="F1 = window.open(\'' + f['serendipity[url]'].value + '\',\'Zoom\',\''
|
|
+ 'height=' + (parseInt(f['imgHeight'].value) + 15) + ','
|
|
+ 'width=' + (parseInt(f['imgWidth'].value) + 15) + ','
|
|
+ 'top=' + (screen.height - f['imgHeight'].value) /2 + ','
|
|
+ 'left=' + (screen.width - f['imgWidth'].value) /2 + ','
|
|
+ 'toolbar=no,menubar=no,location=no,resize=1,resizable=1,scrollbars=yes\'); return false;"';
|
|
break;
|
|
case '_blank':
|
|
var itarget = ' target="_blank"';
|
|
break;
|
|
case 'plugin':
|
|
var itarget = ' id="s9yisphref' + imgID + '" onclick="javascript:this.href = this.href + \'&serendipity[from]=\' + self.location.href;"';
|
|
prepend = '<a title="' + ilink + '" id="s9yisp' + imgID + '"></a>';
|
|
ilink = f['baseURL'].value + 'serendipity_admin_image_selector.php?serendipity[step]=showItem&serendipity[image]=' + imgID;
|
|
break;
|
|
}
|
|
|
|
var img = prepend + "<a class=\"serendipity_image_link\" " + (title != '' ? 'title="' + title + '"' : '') + " href='" + ilink + "'" + itarget + ">" + img + "</a>";
|
|
}
|
|
|
|
if ($('#serendipity_imagecomment').val() != '') {
|
|
var comment = f['serendipity[imagecomment]'].value;
|
|
|
|
var img = '<div class="serendipity_imageComment_' + floating + '" style="width: ' + imgWidth + 'px">'
|
|
+ '<div class="serendipity_imageComment_img">' + img + '</div>'
|
|
+ '<div class="serendipity_imageComment_txt">' + comment + '</div>'
|
|
+ '</div>';
|
|
}
|
|
|
|
parent.self.opener.serendipity.serendipity_imageSelector_addToBody(img, textarea);
|
|
parent.self.close();
|
|
}
|
|
|
|
// Toggle extended entry editor
|
|
serendipity.toggle_extended = function(setCookie) {
|
|
if ($('#toggle_extended').length == 0) {
|
|
// this function got called on load of the editor
|
|
var toggleButton = '#toggle_extended';
|
|
$('#extended_entry_editor').parent().find('label').first().wrap('<button id="toggle_extended" class="icon_link" type="button"></button>');
|
|
$(toggleButton).prepend('<span class="icon-down-dir"></span> ');
|
|
$(toggleButton).click(function(e) {
|
|
e.preventDefault();
|
|
serendipity.toggle_extended(true);
|
|
});
|
|
if (localStorage.show_extended_editor == "true") {
|
|
// the editor is visible by default - note the string, as bool isn't supported yet in localStorage
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ($('#extended_entry_editor:hidden').length > 0) {
|
|
$('#extended_entry_editor').show(); // use name selector instead of id here; id does not work
|
|
$('#tools_extended').show();
|
|
$('#toggle_extended').find('> .icon-right-dir').removeClass('icon-right-dir').addClass('icon-down-dir');
|
|
localStorage.show_extended_editor = "true";
|
|
} else {
|
|
$('#extended_entry_editor').hide();
|
|
$('#tools_extended').hide();
|
|
$('#toggle_extended').find('> .icon-down-dir').removeClass('icon-down-dir').addClass('icon-right-dir');
|
|
localStorage.show_extended_editor = "false";
|
|
}
|
|
if (setCookie) {
|
|
document.cookie = 'serendipity[toggle_extended]=' + (($('#extended_entry_editor:hidden').length == 0) ? "true" : "") + ';';
|
|
}
|
|
}
|
|
|
|
// Collapses/expands the category selector
|
|
var categoryselector_stored_categories = null;
|
|
serendipity.toggle_category_selector = function(id) {
|
|
if ($('#toggle_' + id).length == 0) {
|
|
// this function got called on load of the editor
|
|
var toggleButton = '#toggle_' + id;
|
|
|
|
$('#'+id).before('<button id="toggle_' + id + '" class="button_link" type="button" href="#' + id + '"><span class="icon-right-dir"></span><span class="visuallyhidden"> {$CONST.TOGGLE_ALL}</span></button>');
|
|
|
|
$(toggleButton).click(function(e) {
|
|
e.preventDefault();
|
|
$(this).toggleClass('active');
|
|
serendipity.toggle_category_selector(id);
|
|
});
|
|
$('#'+id).change(function(e) {
|
|
categoryselector_stored_categories = null;
|
|
});
|
|
|
|
if ($('#'+id).children('*[selected="selected"]').length > 1) {
|
|
// when loading the page new for the preview and more than one category was
|
|
// selected, collapsing the category-selector would lose those categories
|
|
$('#'+id).attr("size", $('#'+id).children().size);
|
|
$('#toggle_' + id).find('> .icon-right-dir').removeClass('icon-right-dir').addClass('icon-down-dir');
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
if ($('#'+id).attr("multiple")) {
|
|
if ($('#'+id).children(':selected').filter('[value!="0"]').length > 1) {
|
|
// when collapsing, all multiple selection needs to be saved to be restoreable if the click was a mistake
|
|
var selected_categories = '';
|
|
$('#'+id).children(':selected').filter('[value!="0"]').each(function(i, child) {
|
|
selected_categories += child.value + ','
|
|
});
|
|
categoryselector_stored_categories = selected_categories;
|
|
}
|
|
$('#'+id).removeAttr("multiple");
|
|
$('#'+id).removeAttr("size");
|
|
$('#toggle_' + id).find('> .icon-down-dir').removeClass('icon-down-dir').addClass('icon-right-dir');
|
|
|
|
} else {
|
|
$('#'+id).attr("multiple", "");
|
|
$('#'+id).attr("size", $('#'+id).children().size);
|
|
$('#toggle_' + id).find('> .icon-right-dir').removeClass('icon-right-dir').addClass('icon-down-dir');
|
|
|
|
var selected_categories = categoryselector_stored_categories;
|
|
if (selected_categories != null) {
|
|
selected_categories = selected_categories.split(',');
|
|
selected_categories.forEach(function(cat_id) {
|
|
if(cat_id) {
|
|
$('#'+id).find('[value="'+ cat_id +'"]').attr('selected', 'selected');
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// save in the cookie which options were selected when inserting a image from the media db
|
|
serendipity.rememberMediaOptions = function() {
|
|
$('#imageForm :input').each(function(index, element) {
|
|
if (! (element.type == 'radio' && element.checked == false)) {
|
|
serendipity.SetCookie(element.name.replace(/\[/g, '_').replace(/\]/g, ''), $(element).val());
|
|
}
|
|
});
|
|
}
|
|
|
|
// Rescale image
|
|
serendipity.rescale = function(dim, newval) {
|
|
var ratio = $('#serendipityScaleImg').attr('data-imgheight')/$('#serendipityScaleImg').attr('data-imgwidth');
|
|
var trans = new Array();
|
|
trans['width'] = new Array('serendipity[height]', ratio);
|
|
trans['height'] = new Array('serendipity[width]', 1/ratio);
|
|
|
|
if ($('#resize_keepprops').is(':checked')) {
|
|
document.serendipityScaleForm.elements[trans[dim][0]].value=Math.round(trans[dim][1]*newval);
|
|
}
|
|
}
|
|
|
|
// Rename file in media db
|
|
serendipity.rename = function(id, fname) {
|
|
var newname;
|
|
var media_rename = '{$CONST.ENTER_NEW_NAME}';
|
|
var media_token_url = $('input[name*="serendipity[token]"]').val();
|
|
if (newname = prompt(media_rename + fname, fname)) {
|
|
location.href='?serendipity[adminModule]=images&serendipity[adminAction]=rename&serendipity[fid]='+ escape(id) + '&serendipity[newname]='+ escape(newname) +'&serendipity[token]='+ media_token_url;
|
|
}
|
|
}
|
|
|
|
// Collapse/expand tree view in media db choose img popup window
|
|
var tree_toggle_state = 'expand';
|
|
|
|
serendipity.treeToggleAll = function() {
|
|
if (tree_toggle_state == 'expand') {
|
|
tree_toggle_state = 'collapse';
|
|
tree.expandAll();
|
|
} else {
|
|
tree_toggle_state = 'expand';
|
|
tree.collapseAll();
|
|
coreNode.expand();
|
|
}
|
|
}
|
|
|
|
// Used by media_upload.tpl to ..?
|
|
serendipity.getfilename = function(value) {
|
|
re = /^.+[\/\\]+?(.+)$/;
|
|
return value.replace(re, "$1");
|
|
}
|
|
|
|
var inputStorage = new Array();
|
|
|
|
serendipity.checkInputs = function() {
|
|
upload_fieldcount = $('.uploadform_userfile').length;
|
|
|
|
for (i = 1; i <= upload_fieldcount; i++) {
|
|
if (!inputStorage[i]) {
|
|
serendipity.fillInput(i, i);
|
|
} else if (inputStorage[i] == document.getElementById('target_filename_' + i).value) {
|
|
serendipity.fillInput(i, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
serendipity.fillInput = function(source, target) {
|
|
sourceval = serendipity.getfilename(document.getElementById('userfile_' + source).value);
|
|
|
|
if (sourceval.length > 0) {
|
|
document.getElementById('target_filename_' + target).value = sourceval;
|
|
inputStorage[target] = sourceval;
|
|
}
|
|
}
|
|
|
|
// ..?
|
|
serendipity.checkSave = function() {
|
|
{serendipity_hookPlugin hook='backend_entry_checkSave' hookAll='true'}
|
|
return true;
|
|
}
|
|
|
|
// save in which directory the first uploaded files is stored (the default when only inserting one file)
|
|
serendipity.rememberUploadOptions = function() {
|
|
serendipity.SetCookie("addmedia_directory", $('#target_directory_2').val());
|
|
}
|
|
|
|
// Clones the upload form template
|
|
serendipity.addUploadField = function() {
|
|
upload_fieldcount = $('.uploadform_userfile').length + 1;
|
|
|
|
var $fields = $('#uploads > div:last-child').clone(true);
|
|
$fields.attr('id', 'upload_form_' + upload_fieldcount);
|
|
|
|
var userfile = $('.uploadform_userfile', $fields);
|
|
var userfile_label = $('.uploadform_userfile_label', $fields);
|
|
var targetfilename = $('.uploadform_target_filename', $fields);
|
|
var targetfilename_label = $('.uploadform_target_filename_label', $fields);
|
|
var targetdir = $('.uploadform_target_directory', $fields);
|
|
var targetdir_label = $('.uploadform_target_directory_label', $fields);
|
|
|
|
userfile.attr('id', 'userfile_' + upload_fieldcount);
|
|
userfile.attr('name', 'serendipity[userfile][' + upload_fieldcount + ']');
|
|
userfile_label.attr('for', 'userfile_' + upload_fieldcount);
|
|
|
|
targetfilename.attr('id', 'target_filename_' + upload_fieldcount);
|
|
targetfilename.attr('name', 'serendipity[target_filename][' + upload_fieldcount + ']');
|
|
targetfilename.val('');
|
|
targetfilename_label.attr('for', 'target_filename_' + upload_fieldcount);
|
|
|
|
targetdir.attr('id', 'target_directory_' + upload_fieldcount);
|
|
targetdir.attr('name', 'serendipity[target_directory][' + upload_fieldcount + ']');
|
|
// This looks weird, but works. If anyone can improve this, by all means do so.
|
|
targetdir.val($($('#target_directory_' + (upload_fieldcount - 1))).val());
|
|
targetdir_label.attr('for', 'target_directory_' + upload_fieldcount);
|
|
|
|
$fields.appendTo('#uploads');
|
|
}
|
|
|
|
// Inverts a selection of checkboxes
|
|
serendipity.invertSelection = function() {
|
|
$('#formMultiDelete .multidelete').each(function() {
|
|
var $box = $(this);
|
|
var boxId = $box.attr('id');
|
|
if($box.is(':checked')) {
|
|
$(boxId).prop('checked', false);
|
|
} else {
|
|
$(boxId).prop('checked', true);
|
|
}
|
|
$box.trigger('click');
|
|
});
|
|
}
|
|
|
|
// Highlight/dehighlight elements in lists
|
|
serendipity.highlightComment = function(id, checkvalue) {
|
|
$('#' + id).toggleClass('multidel_selected');
|
|
}
|
|
|
|
serendipity.closeCommentPopup = function() {
|
|
{if $use_backendpopups}
|
|
parent.self.close();
|
|
{else}
|
|
window.parent.parent.$.magnificPopup.close();
|
|
{/if}
|
|
}
|
|
|
|
serendipity.openPopup = function(url) {
|
|
{if $use_backendpopups}
|
|
window.open(url,
|
|
'ImageSel',
|
|
'width=800,height=600,toolbar=no,scrollbars=1,scrollbars,resize=1,resizable=1');
|
|
{else}
|
|
$.magnificPopup.open({
|
|
items: {
|
|
src: url
|
|
},
|
|
type: 'iframe'
|
|
});
|
|
{/if}
|
|
|
|
};
|
|
|
|
serendipity.reloadImage = function(img) {
|
|
$(img).attr('src', $(img).attr('src')+'?'+Math.random());
|
|
}
|
|
|
|
serendipity.categoryList = function() {
|
|
var $source = $('#edit_entry_category');
|
|
var $target = $('#category_list > ul');
|
|
var $selected = $source.find('input:checkbox:checked');
|
|
|
|
$target.empty();
|
|
|
|
if ($selected.length > 0) {
|
|
$selected.each(function() {
|
|
var catText = $(this).next('label').text();
|
|
$('<li class="category_selected">'+ catText +'</li>').appendTo($target);
|
|
});
|
|
} else {
|
|
$('<li>{$CONST.NO_CATEGORIES}</li>').appendTo($target);
|
|
}
|
|
}
|
|
|
|
serendipity.liveFilters = function(input, target, elem) {
|
|
var currentInput = $(input).val().toLowerCase();
|
|
|
|
if (currentInput == '') {
|
|
$(target).toggle(true);
|
|
} else {
|
|
$(target).each(function() {
|
|
var $el = $(this);
|
|
|
|
if ($el.find(elem).html().toLowerCase().indexOf(currentInput) > -1) {
|
|
$el.toggle(true);
|
|
} else {
|
|
$el.toggle(false);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
if(Modernizr.indexeddb && {$use_autosave}) {
|
|
serendipity.startEntryEditorCache = function() {
|
|
if ($('textarea[name="serendipity[body]"]').val() == "") {
|
|
serendipity.getCached("serendipity[body]", function(res) {
|
|
if (res && res != null && res != "null") {
|
|
$('textarea[name="serendipity[body]"]').text(res);
|
|
}
|
|
});
|
|
serendipity.getCached("serendipity[extended]", function(res) {
|
|
if (res && res != null && res != "null") {
|
|
if ($('textarea[name="serendipity[extended]"]').val() == "") {
|
|
$('textarea[name="serendipity[extended]"]').text(res);
|
|
if (! $('textarea[name="serendipity[extended]"]').is(':visible')) {
|
|
serendipity.toggle_extended();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
$('textarea[name="serendipity[body]"]').one('keyup', function() {
|
|
setInterval(function() {
|
|
serendipity.cache("serendipity[body]", $('textarea[name="serendipity[body]"]').val())
|
|
}, 5000);
|
|
});
|
|
$('textarea[name="serendipity[extended]"]').one('keyup', function() {
|
|
setInterval(function() {
|
|
serendipity.cache("serendipity[extended]", $('textarea[name="serendipity[extended]"]').val());
|
|
}, 5000);
|
|
});
|
|
}
|
|
|
|
serendipity.eraseEntryEditorCache = function() {
|
|
serendipity.cache("serendipity[body]", null);
|
|
serendipity.cache("serendipity[extended]", null);;
|
|
}
|
|
|
|
var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
|
|
|
serendipity.cache = function (id, data) {
|
|
var request = indexedDB.open("cache", 1);
|
|
request.onupgradeneeded = function (event) {
|
|
event.target.result.createObjectStore("cache");
|
|
};
|
|
request.onsuccess = function(event) {
|
|
event.target.result.transaction(["cache"], 'readwrite').objectStore("cache").put(data, id);
|
|
};
|
|
}
|
|
|
|
serendipity.getCached = function(id, success) {
|
|
var request = indexedDB.open("cache", 1);
|
|
request.onupgradeneeded = function (event) {
|
|
event.target.result.createObjectStore("cache");
|
|
};
|
|
request.onsuccess = function(event) {
|
|
event.target.result.transaction(["cache"], 'readwrite').objectStore("cache").get(id).onsuccess = function (event) {
|
|
success(event.target.result);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
serendipity.toggle_collapsible = function(toggler, target, stateClass, stateIcon, stateOpen, stateClosed) {
|
|
// argument defaults
|
|
stateClass = stateClass || 'additional_info';
|
|
stateIcon = stateIcon || '> span';
|
|
stateOpen = stateOpen || 'icon-down-dir';
|
|
stateClosed = stateClosed || 'icon-right-dir';
|
|
|
|
var $toggleIcon = $(toggler).find(stateIcon);
|
|
var toggleState = $toggleIcon.attr('class');
|
|
|
|
// if toggler does not have an id, don't store state
|
|
var togglerId = $(toggler).attr('id');
|
|
if (togglerId !== undefined) {
|
|
var storageKey = 'show_' + $(toggler).attr('id');
|
|
}
|
|
|
|
if(toggleState == stateOpen) {
|
|
$toggleIcon.removeClass(stateOpen).addClass(stateClosed);
|
|
if (togglerId !== undefined) {
|
|
localStorage.setItem(storageKey, "false");
|
|
}
|
|
} else {
|
|
$toggleIcon.removeClass(stateClosed).addClass(stateOpen);
|
|
if (togglerId !== undefined) {
|
|
localStorage.setItem(storageKey, "true");
|
|
}
|
|
}
|
|
|
|
$(target).toggleClass(stateClass);
|
|
}
|
|
|
|
serendipity.sync_heights = function() {
|
|
if($('.equal_heights').length > 0) {
|
|
if($('html').hasClass('lt-ie9')) {
|
|
$('.equal_heights').syncHeight({
|
|
updateOnResize: false
|
|
});
|
|
} else {
|
|
$('.equal_heights').syncHeight({
|
|
updateOnResize: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
serendipity.skipScroll = function(target, time) {
|
|
time = typeof time !== 'undefined' ? time : 250;
|
|
|
|
$('html, body').animate({
|
|
scrollTop: $(target).offset().top
|
|
}, time);
|
|
}
|
|
|
|
}( window.serendipity = window.serendipity || {}, jQuery ))
|
|
|
|
$(function() {
|
|
// Breakpoints for responsive JS
|
|
var mq_small = Modernizr.mq('(min-width:640px)');
|
|
|
|
// Fire responsive nav
|
|
if($('#main_menu').length > 0) {
|
|
$('#nav-toggle').click(function(e) {
|
|
var $el = $(this);
|
|
var $target = $('body');
|
|
var $icon = $el.find('span:first-child');
|
|
$($target).toggleClass('active_nav');
|
|
if($($target).hasClass('active_nav')) {
|
|
$icon.removeClass('icon-menu').addClass('icon-cancel');
|
|
} else {
|
|
$icon.removeClass('icon-cancel').addClass('icon-menu');
|
|
}
|
|
e.preventDefault();
|
|
});
|
|
}
|
|
|
|
// Fire details polyfill
|
|
$('html').addClass($.fn.details.support ? 'details' : 'no-details');
|
|
$('details').details();
|
|
|
|
// Fire WYSIWYG editor(s)
|
|
serendipity.spawn();
|
|
|
|
// Fire a11y helper script
|
|
AccessifyHTML5({
|
|
header: '#top',
|
|
footer: '#meta'
|
|
});
|
|
|
|
// Editor-area
|
|
if($('#serendipityEntry').length > 0) {
|
|
serendipity.categoryList();
|
|
serendipity.toggle_category_selector('categoryselector');
|
|
serendipity.toggle_extended();
|
|
}
|
|
|
|
// Form submit events
|
|
$('#uploadform').submit(function() {
|
|
serendipity.rememberUploadOptions();
|
|
});
|
|
|
|
$('#imageForm').submit(function() {
|
|
serendipity.serendipity_imageSelector_done();
|
|
});
|
|
|
|
// Click events
|
|
//
|
|
// Make the timestamp readable in browser not supporting datetime-local.
|
|
// Has no effect in those supporting it, as the timestamp is invalid in HTML5
|
|
if($('#serendipityEntry').length > 0) {
|
|
if(!Modernizr.inputtypes.date) {
|
|
$('#serendipityNewTimestamp').val($('#serendipityNewTimestamp').val().replace("T", " "));
|
|
}
|
|
if(Modernizr.indexeddb && {$use_autosave}) {
|
|
serendipity.startEntryEditorCache();
|
|
}
|
|
}
|
|
|
|
// Set entry timestamp
|
|
$('#reset_timestamp').click(function(e) {
|
|
$('#serendipityNewTimestamp').val($(this).attr('data-currtime'));
|
|
if(!Modernizr.inputtypes.date) {
|
|
$('#serendipityNewTimestamp').val($('#serendipityNewTimestamp').val().replace("T", " "));
|
|
}
|
|
e.preventDefault();
|
|
// Inline notification, we might want to make this reuseable
|
|
$('<span id="msg_timestamp" class="msg_notice"><span class="icon-info-circled"></span>{$CONST.TIMESTAMP_RESET} <a class="remove_msg" href="#msg_timestamp"><span class="icon-cancel"></span><span class="visuallyhidden">{$CONST.HIDE}</span></a></span>').insertBefore('#edit_entry_title');
|
|
// Remove timestamp msg
|
|
$('.remove_msg').click(function(e) {
|
|
e.preventDefault();
|
|
var $target = $(this).parent();
|
|
$target.fadeOut(250, function() { $target.remove(); });
|
|
});
|
|
// Automagic removal after 5 secs
|
|
setTimeout(function() {
|
|
$('#msg_timestamp').fadeOut(250).remove();
|
|
}, 5000);
|
|
});
|
|
|
|
// Switch entry status
|
|
$('#switch_entry_status').click(function(e) {
|
|
var $el = $(this);
|
|
var oldState = $el.attr('title');
|
|
var newState = $el.attr('data-title-alt');
|
|
var entryState = $('#entry_status option');
|
|
var stateIcon = $el.find("[class^='icon']");
|
|
|
|
$(entryState).filter(function() {
|
|
return $(this).html() == oldState;
|
|
}).prop('selected', false);
|
|
|
|
$(entryState).filter(function() {
|
|
return $(this).html() == newState;
|
|
}).prop('selected', true);
|
|
|
|
$el.attr({
|
|
'title': newState,
|
|
'data-title-alt': oldState
|
|
}).find('> .visuallyhidden').text(newState);
|
|
|
|
if(stateIcon.hasClass('icon-toggle-on')) {
|
|
stateIcon.removeClass('icon-toggle-on').addClass('icon-toggle-off');
|
|
} else {
|
|
stateIcon.removeClass('icon-toggle-off').addClass('icon-toggle-on');
|
|
}
|
|
|
|
// Inline notification, we might want to make this reuseable
|
|
$('<span id="msg_entrystatus" class="msg_notice"><span class="icon-info-circled"></span>{$CONST.ENTRY_STATUS}: ' + newState + ' <a class="remove_msg" href="#msg_entrystatus"><span class="icon-cancel"></span><span class="visuallyhidden">{$CONST.HIDE}</span></a></span>').insertBefore('#edit_entry_title');
|
|
// Remove entrystatus msg
|
|
$('.remove_msg').click(function(e) {
|
|
e.preventDefault();
|
|
var $target = $(this).parent();
|
|
$target.fadeOut(250, function() { $target.remove(); });
|
|
});
|
|
// Automagic removal after 5 secs
|
|
setTimeout(function() {
|
|
$('#msg_entrystatus').fadeOut(250).remove();
|
|
}, 5000);
|
|
|
|
e.preventDefault();
|
|
});
|
|
|
|
// Matching change event
|
|
$('#entry_status').change(function() {
|
|
$('#switch_entry_status').trigger('click');
|
|
});
|
|
|
|
// Editor tools
|
|
$('.wrap_selection').click(function() {
|
|
var $el = $(this);
|
|
var $tagOpen = $el.attr('data-tag-open');
|
|
var $tagClose = $el.attr('data-tag-close');
|
|
//var target = document.forms['serendipityEntry']['serendipity[' + $el.attr('data-tarea') + ']'];
|
|
var target = $('#'+serendipity.escapeBrackets($el.attr('data-tarea')));
|
|
if ($el.hasClass('lang-html')) {
|
|
var open = '<' + $tagOpen + '>';
|
|
var close = '</' + $tagClose + '>';
|
|
} else {
|
|
var open = $tagOpen;
|
|
var close = $tagClose;
|
|
}
|
|
serendipity.wrapSelection(target, open, close);
|
|
});
|
|
|
|
$('.wrap_insimg').click(function() {
|
|
var target = $('#'+serendipity.escapeBrackets($(this).attr('data-tarea')));
|
|
serendipity.wrapInsImage(target);
|
|
});
|
|
|
|
$('.wrap_insurl').click(function() {
|
|
var target = $('#'+serendipity.escapeBrackets($(this).attr('data-tarea')));
|
|
serendipity.wrapSelectionWithLink(target);
|
|
});
|
|
|
|
$('.wrap_insmedia').click(function() {
|
|
serendipity.openPopup('serendipity_admin.php?serendipity[adminModule]=media&serendipity[noBanner]=true&serendipity[noSidebar]=true&serendipity[noFooter]=true&serendipity[showMediaToolbar]=false&serendipity[showUpload]=true&serendipity[textarea]=' + $(this).attr('data-tarea'));
|
|
});
|
|
|
|
// Entry metadata
|
|
if($('#edit_entry_metadata').length > 0) {
|
|
$('#toggle_metadata').click(function() {
|
|
serendipity.toggle_collapsible($(this), '#meta_data');
|
|
});
|
|
if (localStorage.getItem("show_toggle_metadata") == "true") {
|
|
$('#toggle_metadata').click();
|
|
}
|
|
}
|
|
|
|
// Show category selector
|
|
{if $use_backendpopups}
|
|
if($('#serendipityEntry').length > 0) {
|
|
$('#select_category').click(function(e) {
|
|
$('#toggle_metadata').click();
|
|
|
|
e.preventDefault();
|
|
serendipity.skipScroll($(this).attr('href'));
|
|
});
|
|
}
|
|
{else}
|
|
$('#meta_data #edit_entry_category').addClass('mfp-hide');
|
|
|
|
if($('#serendipityEntry').length > 0) {
|
|
var btnText = '{$CONST.DONE}';
|
|
|
|
$('#select_category').magnificPopup({
|
|
type: "inline",
|
|
closeMarkup: '<button title="%title%" class="mfp-close" type="button">'+ btnText +'</button>',
|
|
callbacks: {
|
|
open: function() {
|
|
// Accessibility helper
|
|
$('#edit_entry_category .form_check input[type="checkbox"]').attr('aria-hidden', 'true');
|
|
if(localStorage.cat_view_state == "compact") {
|
|
$('.mfp-content').addClass('compact_categories');
|
|
$('#toggle_cat_view').find('.icon-th').removeClass('icon-th').addClass('icon-th-list');
|
|
}
|
|
},
|
|
afterClose: function() {
|
|
// Accessibility helper
|
|
$('#edit_entry_category .form_check input[type="checkbox"]').attr('aria-hidden', 'false');
|
|
serendipity.categoryList();
|
|
}
|
|
}
|
|
});
|
|
|
|
$('#category_list').on('click', 'h3, li', function() {
|
|
$('#select_category').trigger('click');
|
|
});
|
|
}
|
|
{/if}
|
|
|
|
// Switch category view
|
|
if($('#serendipityEntry').length > 0) {
|
|
$('#toggle_cat_view').click(function() {
|
|
var $el = $(this);
|
|
var $target = $('.mfp-content');
|
|
|
|
if($target.hasClass('compact_categories')) {
|
|
$target.removeClass('compact_categories');
|
|
$el.find('.icon-th-list').removeClass('icon-th-list').addClass('icon-th');
|
|
localStorage.cat_view_state = "hierarchical";
|
|
} else {
|
|
$target.addClass('compact_categories');
|
|
$el.find('.icon-th').removeClass('icon-th').addClass('icon-th-list');
|
|
localStorage.cat_view_state = "compact";
|
|
}
|
|
});
|
|
};
|
|
|
|
// Show tag selector
|
|
{if $use_backendpopups}
|
|
if($('#serendipityEntry').length > 0) {
|
|
$('#select_tags').click(function(e) {
|
|
$('#toggle_advanced').click();
|
|
|
|
e.preventDefault();
|
|
serendipity.skipScroll($(this).attr('href'));
|
|
});
|
|
}
|
|
{else}
|
|
$('#adv_opts #edit_entry_freetags').addClass('mfp-hide');
|
|
|
|
if($('#serendipityEntry').length > 0) {
|
|
var btnText = '{$CONST.DONE}';
|
|
|
|
$('#select_tags').magnificPopup({
|
|
type: "inline",
|
|
closeMarkup: '<button title="%title%" class="mfp-close" type="button">'+ btnText +'</button>',
|
|
callbacks: {
|
|
afterClose: function() {}
|
|
}
|
|
});
|
|
|
|
$('#backend_freetag_list > a').click(function(e) {
|
|
e.preventDefault();
|
|
});
|
|
}
|
|
{/if}
|
|
|
|
// Category live filter
|
|
$('#categoryfilter').keyup(function() {
|
|
serendipity.liveFilters($(this), '#edit_entry_category .form_check', 'label');
|
|
});
|
|
|
|
// Oldie helper for selecting categories
|
|
$('#edit_entry_category .form_check input').change(function(e) {
|
|
var $el = $(this);
|
|
|
|
if($el.is(":checked")) {
|
|
$el.siblings('label').addClass('selected');
|
|
} else {
|
|
$el.siblings('label').removeClass('selected');
|
|
}
|
|
});
|
|
|
|
// Plugins live filter
|
|
$('#pluginfilter').keyup(function() {
|
|
serendipity.liveFilters($(this), '.plugins_installable > li', '.plugin_features');
|
|
});
|
|
|
|
// Reset button for live filters
|
|
$('.reset_livefilter').click(function() {
|
|
var target = '#' + $(this).attr('data-target');
|
|
$(target).val('').keyup();
|
|
});
|
|
|
|
// Advanced options
|
|
if($('#advanced_options').length > 0) {
|
|
$('#toggle_advanced').click(function() {
|
|
serendipity.toggle_collapsible($(this), '#adv_opts');
|
|
});
|
|
if (localStorage.getItem("show_toggle_advanced") == "true") {
|
|
$('#toggle_advanced').click();
|
|
}
|
|
}
|
|
|
|
// Entry preview
|
|
$('.entry_preview').click(function() {
|
|
document.forms['serendipityEntry'].elements['serendipity[preview]'].value='true';
|
|
});
|
|
|
|
// Collapsible configuration elements
|
|
if($('#serendipity_config_options, #serendipity_category, #image_directory_edit_form').length > 0) {
|
|
var optsCollapsed = true;
|
|
|
|
$('.show_config_option').click(function(e) {
|
|
var $el = $(this);
|
|
if ($el.attr('href')) {
|
|
var $toggled= $el.attr('href');
|
|
} else {
|
|
var $toggled = $el.data('href');
|
|
}
|
|
|
|
serendipity.toggle_collapsible($el, $toggled);
|
|
e.preventDefault();
|
|
});
|
|
|
|
$('#show_config_all').click(function(e) {
|
|
if ($(this).attr('href')) {
|
|
var $container = $(this).attr('href');
|
|
} else {
|
|
var $container = $(this).data('href');
|
|
}
|
|
var $toggleIcon = $(this).find('span:first-child');
|
|
var $toggleIcons = $($container).find('.show_config_option > span');
|
|
var $toggleOption = $($container).find('.config_optiongroup');
|
|
if(optsCollapsed) {
|
|
$toggleIcons.removeClass('icon-right-dir').addClass('icon-down-dir');
|
|
$toggleOption.removeClass('additional_info');
|
|
$toggleIcon.removeClass('icon-right-dir').addClass('icon-down-dir');
|
|
optsCollapsed = false;
|
|
} else {
|
|
$toggleIcons.removeClass('icon-down-dir').addClass('icon-right-dir');
|
|
$toggleOption.addClass('additional_info');
|
|
$toggleIcon.removeClass('icon-down-dir').addClass('icon-right-dir');
|
|
optsCollapsed = true;
|
|
}
|
|
$(this).toggleClass('active');
|
|
e.preventDefault();
|
|
});
|
|
|
|
$('.show_config_option_now').click();
|
|
}
|
|
|
|
$('.change_preview').change(function() {
|
|
serendipity.change_preview($(this).attr('id'), $(this).attr('data-configitem'));
|
|
});
|
|
|
|
$('.choose_media').click(function() {
|
|
var configitem = $(this).parent().find('.change_preview').attr('id');
|
|
serendipity.choose_media(configitem);
|
|
});
|
|
|
|
$('.customfieldMedia').click(function() {
|
|
var configitem = $(this).parent().find('textarea').attr('id');
|
|
serendipity.choose_media(configitem);
|
|
});
|
|
|
|
$('#tree_toggle_all').click(function(e) {
|
|
e.preventDefault();
|
|
serendipity.treeToggleAll();
|
|
});
|
|
|
|
// Comments
|
|
$('.comments_delete, .comments_multidelete, .build_cache').click(function() {
|
|
var $msg = $(this).attr('data-delmsg');
|
|
return confirm($msg);
|
|
});
|
|
|
|
$('.comments_reply').click(function(e) {
|
|
e.preventDefault();
|
|
{if $use_backendpopups}
|
|
window.open(this.href, 'CommentForm', 'width=800,height=600,toolbar=no,scrollbars=1,scrollbars,resize=1,resizable=1').focus();
|
|
{else}
|
|
$(this).magnificPopup({ type:'iframe' });
|
|
{/if}
|
|
});
|
|
|
|
// Selection for multidelete
|
|
$('.multidelete').click(function() {
|
|
var $el = $(this);
|
|
serendipity.highlightComment($el.attr('data-multidelid'), $el.attr('checked'));
|
|
});
|
|
|
|
// Invert checkboxes
|
|
$('.invert_selection').click(function() {
|
|
serendipity.invertSelection();
|
|
});
|
|
|
|
// Go back one step
|
|
$('.go_back').click(function() {
|
|
history.go(-1);
|
|
});
|
|
|
|
// Add media db upload field
|
|
$('#add_upload').click(function(e) {
|
|
e.preventDefault();
|
|
serendipity.addUploadField();
|
|
});
|
|
|
|
// Check media db inputs
|
|
$('.check_input').change(function() {
|
|
serendipity.checkInputs();
|
|
});
|
|
|
|
$('.check_inputs').click(function() {
|
|
serendipity.checkInputs();
|
|
});
|
|
|
|
// Extra function for media db download
|
|
$('#imageurl').change(function() {
|
|
sourceval = serendipity.getfilename(document.getElementById('imageurl').value);
|
|
|
|
if (sourceval.length > 0) {
|
|
document.getElementById('imagefilename').value = sourceval;
|
|
}
|
|
});
|
|
|
|
// Dashboard bookmarklet hint
|
|
$('.s9y_bookmarklet').click(function(e) {
|
|
e.preventDefault();
|
|
alert('{$CONST.FURTHER_LINKS_S9Y_BOOKMARKLET_DESC}');
|
|
});
|
|
|
|
// Limit width of media file info
|
|
if($('.media_pane').length > 0) {
|
|
var thumbsWidth = $('.media_pane').attr('data-thumbmaxwidth') + 'px';
|
|
$('.media_file_meta').css('maxWidth', thumbsWidth);
|
|
}
|
|
|
|
// Show media file info, template info, label info or filters
|
|
$('.media_show_info, .template_show_info, .filters_toolbar li > a, .toggle_info').click(function(e) {
|
|
var $el = $(this);
|
|
if ($el.attr('href')) {
|
|
$($el.attr('href')).toggleClass('additional_info');
|
|
} else {
|
|
$($el.data('href')).toggleClass('additional_info');
|
|
}
|
|
if (mq_small) {
|
|
$el.closest('.has_info').toggleClass('info_expanded');
|
|
}
|
|
$el.toggleClass('active');
|
|
e.preventDefault();
|
|
});
|
|
|
|
// Show further links
|
|
{if $use_backendpopups}
|
|
if($('#dashboard').length > 0) {
|
|
$('.toggle_links').click(function(e) {
|
|
$('#s9y_links').toggleClass('mfp-hide');
|
|
|
|
e.preventDefault();
|
|
serendipity.skipScroll($(this).attr('href'));
|
|
});
|
|
}
|
|
{else}
|
|
if($('#dashboard').length > 0) {
|
|
$('.toggle_links').magnificPopup({ type: "inline" });
|
|
}
|
|
{/if}
|
|
|
|
// Media file actions
|
|
{if $use_backendpopups}
|
|
$('.media_fullsize').click(function(e) {
|
|
e.preventDefault();
|
|
var $el = $(this);
|
|
var filepath = $el.attr('href');
|
|
var pwidth = $el.attr('data-pwidth');
|
|
var pheight = $el.attr('data-pheight');
|
|
var ptop = (screen.height - pheight)/2;
|
|
var pleft = (screen.width - pwidth)/2;
|
|
window.open(filepath, 'Zoom', 'height='+pheight+',width='+pwidth+',top='+ptop+',left='+pleft+',toolbar=no,menubar=no,location=no,resize=1,resizable=1,scrollbars=yes');
|
|
});
|
|
{else}
|
|
if ($('.media_fullsize').length > 0) {
|
|
$('.media_fullsize').magnificPopup({ type:'image' });
|
|
}
|
|
{/if}
|
|
|
|
$('.media_rename').click(function(e) {
|
|
e.preventDefault();
|
|
var $el = $(this);
|
|
serendipity.rename($el.attr('data-fileid'), $el.attr('data-filename'));
|
|
});
|
|
|
|
$('#media_crop').click(function(e) {
|
|
window.open($(this).attr('href'), 'ImageCrop', 'width=800,height=600,toolbar=no,scrollbars=1,scrollbars,resize=1,resizable=1').focus();
|
|
e.preventDefault();
|
|
});
|
|
|
|
$('.add_keyword').click(function(e) {
|
|
serendipity.AddKeyword($(this).attr('data-keyword'));
|
|
e.preventDefault();
|
|
});
|
|
|
|
// Confirm media scale
|
|
$('.image_scale').click(function() {
|
|
if (confirm('{$CONST.REALLY_SCALE_IMAGE}')) document.serendipityScaleForm.submit();
|
|
});
|
|
|
|
// Media scale change events
|
|
$('#resize_width').change(function() {
|
|
serendipity.rescale('width' , $(this).val());
|
|
});
|
|
|
|
$('#resize_height').change(function() {
|
|
serendipity.rescale('height' , $(this).val());
|
|
});
|
|
|
|
// Show extended comment
|
|
$('.toggle_comment_full').click(function(e) {
|
|
var $el = $(this);
|
|
if ($el.attr('href')) {
|
|
var $toggled = $($el.attr('href'));
|
|
} else {
|
|
var $toggled = $($el.data('href'));
|
|
}
|
|
|
|
serendipity.toggle_collapsible($el, $toggled);
|
|
|
|
$toggled.prev().toggleClass('additional_info');
|
|
e.preventDefault();
|
|
});
|
|
|
|
// MediaDB-Filter-Buttons should react instantly
|
|
$('input[name="serendipity[filter][fileCategory]"]').on('change', function() {
|
|
$('#media_library_control').submit();
|
|
});
|
|
|
|
// Clone form submit buttons
|
|
$('#sort_entries > .form_buttons').clone().appendTo('#filter_entries');
|
|
$('#media_pane_sort > .form_buttons').clone().appendTo('#media_pane_filter');
|
|
|
|
// Clone pagination - this could become a function, which should also
|
|
// check if the cloned pagination already exists
|
|
$('.media_pane .pagination').clone().prependTo('.media_pane');
|
|
$('.comments_pane .pagination').clone().prependTo('.comments_pane');
|
|
$('.entries_pane .pagination').clone().prependTo('.entries_pane');
|
|
$('.karma_pane .pagination').clone().prependTo('.karma_pane');
|
|
|
|
// close comment reply on button click
|
|
if ($('#comment_replied').length > 0) {
|
|
$('#comment_replied').click(function() {
|
|
serendipity.closeCommentPopup();
|
|
});
|
|
}
|
|
|
|
// UI-flow when selecting multiple images in ML upload
|
|
if ($('.uploadform_userfile').length > 0) {
|
|
$('.uploadform_userfile').change(function() {
|
|
if ($(this).get(0).files.length > 1) {
|
|
$(this).parent().siblings(':first').fadeOut();
|
|
$(this).parent().siblings(':first').find('input').val('');
|
|
$(this).attr('name', $(this).attr('name') + '[]');
|
|
}
|
|
if ($(this).get(0).files.length == 1) {
|
|
$(this).parent().siblings(':first').fadeIn();
|
|
}
|
|
});
|
|
}
|
|
|
|
// minify images before upload, approach taken from https://github.com/joelvardy/javascript-image-upload/
|
|
{if {serendipity_getConfigVar key='uploadResize'} && ({serendipity_getConfigVar key='maxImgWidth'} > 0 || {serendipity_getConfigVar key='maxImgHeight'} > 0)}
|
|
if ($('#uploadform').length > 0) {
|
|
$('input[name="go_properties"]').hide();
|
|
var progressIcon = document.createElement('span');
|
|
progressIcon.className = 'uploadIcon icon-info-circled';
|
|
errorIcon = document.createElement('span');
|
|
errorIcon.className = 'uploadIcon icon-attention-circled';
|
|
successIcon = document.createElement('span');
|
|
successIcon.className = 'uploadIcon icon-ok-circled';
|
|
$('#uploadform').submit(function(event) {
|
|
event.preventDefault();
|
|
$('.uploadform_userfile').each(function() {
|
|
var files = this.files;
|
|
for (var i = 0; i < files.length; i++) {
|
|
var reader = new FileReader();
|
|
reader.file = files[i];
|
|
reader.onload = function(readerEvent) {
|
|
var image = new Image();
|
|
var file = this.file;
|
|
image.onload = function (imageEvent) {
|
|
var canvas = document.createElement('canvas'),
|
|
max_width = {if {serendipity_getConfigVar key='maxImgWidth'}}{serendipity_getConfigVar key='maxImgWidth'}{else}0{/if},
|
|
max_height = {if {serendipity_getConfigVar key='maxImgHeight'}}{serendipity_getConfigVar key='maxImgHeight'}{else}0{/if},
|
|
width = image.width,
|
|
height = image.height;
|
|
|
|
if (max_width > 0 && width > max_width) {
|
|
height *= max_width / width;
|
|
width = max_width;
|
|
}
|
|
if (max_height > 0 && height > max_height) {
|
|
width *= max_height / height;
|
|
height = max_height;
|
|
}
|
|
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.getContext('2d').drawImage(image, 0, 0, width, height);
|
|
var data = new FormData();
|
|
data.append('serendipity[action]', 'admin');
|
|
data.append('serendipity[adminModule]', 'media');
|
|
data.append('serendipity[adminAction]', 'add');
|
|
data.append('serendipity[token]', $('input[name*="serendipity[token]"]').val());
|
|
data.append('serendipity[target_filename][1]', file.name);
|
|
var type = file.type;
|
|
if (type == "image/bmp") {
|
|
{* bmp is not supported *}
|
|
type = "image/png";
|
|
data.append('serendipity[target_filename][1]', file.name.replace('.bmp', '.png'));
|
|
}
|
|
canvas.toBlob(function(blob) {
|
|
data.append('serendipity[userfile][1]', blob, file.name);
|
|
var progress = document.createElement('progress');
|
|
var progressContainer = document.createElement('span');
|
|
progressContainer.className = 'msg_notice';
|
|
progress.max = 100;
|
|
progress.value = 0;
|
|
$(progressContainer).append(progressIcon);
|
|
progressContainer.innerHTML += file.name + ": "
|
|
$(progressContainer).append(progress);
|
|
$('.form_buttons').append(progressContainer);
|
|
$.ajax({
|
|
type: 'post',
|
|
url: $('#uploadform').attr('action'),
|
|
data: data,
|
|
cache: false,
|
|
processData: false,
|
|
contentType: false,
|
|
xhrFields: {
|
|
onprogress: function (e) {
|
|
if (e.lengthComputable) {
|
|
progress.value = e.loaded / e.total * 100;
|
|
}
|
|
}
|
|
}
|
|
}).done(function(data) {
|
|
progress.value = 100;
|
|
progressContainer.className = "msg_success";
|
|
$(progressContainer).find('.uploadIcon').replaceWith(successIcon.cloneNode(true));
|
|
}).fail(function(data) {
|
|
progressContainer.className = "msg_error";
|
|
progress.disabled = true;
|
|
progressContainer.innerHTML += "{$CONST.ERROR_UNKNOWN_NOUPLOAD}";
|
|
$(progressContainer).find('.uploadIcon').replaceWith(errorIcon.cloneNode(true));
|
|
}).always(function() {
|
|
if ($('#ml_link').length == 0) {
|
|
var mlLink = document.createElement('a');
|
|
mlLink.id = "ml_link";
|
|
mlLink.className = "button_link";
|
|
mlLink.href = $('#uploadform').attr('action');
|
|
mlLink.innerHTML = "{$CONST.MEDIA_LIBRARY}";
|
|
$(mlLink).hide();
|
|
$('.form_buttons').prepend(mlLink);
|
|
$(mlLink).fadeIn();
|
|
}
|
|
});
|
|
}, type);
|
|
}
|
|
image.src = readerEvent.target.result;
|
|
}
|
|
reader.readAsDataURL(reader.file);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
{/if}
|
|
|
|
if ($('#serendipity_only_path').length > 0) {
|
|
$('#serendipity_only_path').change(function() {
|
|
serendipity.SetCookie('serendipity_only_path', $('#serendipity_only_path').val());
|
|
});
|
|
}
|
|
|
|
// reopen detail element after spamblock action
|
|
if ($('#serendipity_comments_list').length > 0 && window.location.hash && $('#' + window.location.hash.replace('#', '')).length > 0) {
|
|
$('#' + window.location.hash.replace('#', '')).find(".toggle_info").click();
|
|
}
|
|
|
|
// ajaxify image rotate, solving cache issue
|
|
$('.media_rotate_right,.media_rotate_left').click(function(e) {
|
|
e.preventDefault();
|
|
var $rotateButton = $(this)
|
|
$.get($rotateButton.attr('href'), function() {
|
|
serendipity.reloadImage($rotateButton.closest('.media_file').find('img'));
|
|
});
|
|
})
|
|
|
|
// Tabs
|
|
if($('.tabs').length > 0) {
|
|
var currTabText = '{$CONST.CURRENT_TAB}';
|
|
|
|
$('.tabs').accessibleTabs({
|
|
wrapperClass: 'tabcontent',
|
|
currentClass: 'on',
|
|
tabhead: 'h3',
|
|
tabheadClass: 'visuallyhidden',
|
|
tabbody: '.panel',
|
|
fx: 'fadeIn',
|
|
currentInfoText: currTabText,
|
|
currentInfoClass: 'visuallyhidden',
|
|
syncheights: false,
|
|
saveState: true
|
|
});
|
|
}
|
|
|
|
// Drag 'n' drop
|
|
if (! Modernizr.touch){
|
|
function getDragdropConfiguration(group) {
|
|
return {
|
|
containerSelector: '.pluginmanager_container',
|
|
group: group,
|
|
handle: '.pluginmanager_grablet',
|
|
|
|
onDrop: function ($item, container, _super) {
|
|
var placement = $item.parents('.pluginmanager_container').data("placement");
|
|
$item.find('select[name$="placement]"]').val(placement);
|
|
$item.removeClass('dragged').removeAttr('style');
|
|
$('body').removeClass('dragging');
|
|
$.autoscroll.stop();
|
|
},
|
|
onDragStart: function ($item, container, _super) {
|
|
$.autoscroll.init();
|
|
$item.css({
|
|
height: $item.height(),
|
|
width: $item.width()
|
|
});
|
|
$item.addClass('dragged');
|
|
$('body').addClass('dragging');
|
|
}
|
|
}
|
|
}
|
|
|
|
$('.pluginmanager_sidebar .pluginmanager_container').sortable(getDragdropConfiguration('plugins_sidebar'));
|
|
$('.pluginmanager_event .pluginmanager_container').sortable(getDragdropConfiguration('plugins_event'));
|
|
$('.configuration_group .pluginmanager_container').sortable(getDragdropConfiguration('plugins_event'));
|
|
}
|
|
|
|
// Equal Heights
|
|
$(window).load(function() {
|
|
if (mq_small) {
|
|
serendipity.sync_heights();
|
|
}
|
|
});
|
|
|
|
// Make sure plugin list heights are recalculated when switching tabs
|
|
$('#pluginlist_tabs a').click(function() {
|
|
if (mq_small) {
|
|
serendipity.sync_heights();
|
|
}
|
|
});
|
|
});
|
|
|
|
// This is kept for older plugins. Use of $(document).ready() is encouraged.
|
|
// At some point, these will be removed.
|
|
addLoadEvent = function(func) {
|
|
var oldonload = window.onload;
|
|
if (typeof window.onload != 'function') {
|
|
window.onload = func;
|
|
} else {
|
|
window.onload = function() {
|
|
oldonload();
|
|
func();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Several plugins use this in the global scope. Those API functions are
|
|
// vital, so they reference to our new serendipity scope. This global
|
|
// scope is deprecated and subject to removal in the future.
|
|
serendipity_imageSelector_addToBody = function(block, textarea) {
|
|
return serendipity.serendipity_imageSelector_addToBody(block, textarea);
|
|
}
|
|
|
|
serendipity_imageSelector_done = function(textarea) {
|
|
return serendipity.serendipity_imageSelector_done(textarea);
|
|
}
|
|
|
|
serendipity_imageSelector_addToElement = function(str, id) {
|
|
return serendipity.serendipity_imageSelector_addToElement(str, id);
|
|
}
|