2 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
3 * Copyright (C) 2002-2012 The Nucleus Group
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 * (see nucleus/documentation/index.html#license for more info)
11 * This file contains functions to allow adding items from inside the weblog.
12 * Also contains code to avoid submitting form data twice.
14 * $Id: edit.js 1388 2009-07-18 06:31:28Z shizuki $
17 var nucleusConvertBreaks = true;
18 var nucleusMediaPopupURL = '';
19 var nucleusMediaURL = 'media/';
20 var nucleusAuthorId = 0;
23 function setConvertBreaks(newval) { nucleusConvertBreaks = newval; }
24 function setMediaUrl(url) { nucleusMediaURL = url; }
25 function setAuthorId(id) { nucleusAuthorId = id; }
27 function preview(id, value) {
28 elem = document.getElementById(id);
31 var preview = nucleusConvertBreaks ? str_replace("\n","<br />",value)+" " : value+" ";
33 // expand the media commands (without explicit collection)
34 preview = preview.replace(/\<\%image\(([^\/\|]*)\|([^\|]*)\|([^\|]*)\|([^)]*)\)\%\>/g,"<img src='"+nucleusMediaURL+nucleusAuthorId+"/$1' width='$2' height='$3' alt=\"$4\" />");
36 // expand the media commands (with collection)
37 preview = preview.replace(/\<\%image\(([^\|]*)\|([^\|]*)\|([^\|]*)\|([^)]*)\)\%\>/g,"<img src='"+nucleusMediaURL+"$1' width='$2' height='$3' alt=\"$4\" />");
38 preview = preview.replace(/\<\%popup\(([^\|]*)\|([^\|]*)\|([^\|]*)\|([^)]*)\)\%\>/g,"<a href='' onclick='if (event && event.preventDefault) event.preventDefault(); alert(\"popup image\"); return false;' title='popup'>$4</a>");
39 preview = preview.replace(/\<\%media\(([^\|]*)\|([^)]*)\)\%\>/g,"<a href='' title='media link'>$2</a>");
41 elem.innerHTML = preview;
45 prevval = document.getElementById('edit').style.display;
46 if (prevval == "block")
50 document.getElementById('edit').style.display = newval;
52 if (newval == "block")
56 function updAllPreviews() {
62 function isEditVisible() {
63 var editform = document.getElementById('edit');
64 if (!editform) return true;
65 var prevval = editform.style.display;
66 return (prevval == "none") ? false : true;
69 function updPreview(id) {
70 // don't update when preview is hidden
71 if (!isEditVisible()) return;
73 var inputField = document.getElementById('input' + id);
74 if (!inputField) return;
75 preview('prev' + id, inputField.value);
78 // replace a in s by b (taken from milov.nl)
79 function str_replace(a, b, s)
81 if (a == b || !s.length || !a.length) return s;
82 if ((p=s.indexOf(a)) == -1) { return s; }
83 else { ns = s.substring(0,p) + b + s.substring(p+a.length,s.length); }
84 return (s.indexOf(a) != -1) ? str_replace(a, b, ns) : ns;
87 function shortCuts() {
88 if (!event || (event.ctrlKey != true)) return;
90 switch (event.keyCode) {
92 ahrefThis(); break; // ctrl-shift-a
94 boldThis(); break; // ctrl-shift-b
96 italicThis(); break; // ctrl-shift-i
98 addMedia(); break; // ctrl-shift-m
105 function cutThis() { execAndUpdate('cut'); }
106 function copyThis() { execAndUpdate('copy'); }
107 function pasteThis() { execAndUpdate('paste'); }
108 function boldThis() { insertAroundCaret('<b>','</b>'); }
109 function italicThis() { insertAroundCaret('<i>','</i>'); }
110 function leftThis() { insertAroundCaret('<div class="leftbox">','</div>'); }
111 function rightThis() { insertAroundCaret('<div class="rightbox">','</div>'); }
112 function alignleftThis() { insertAroundCaret('<div style="text-align: left">','</div>'); }
113 function alignrightThis() { insertAroundCaret('<div style="text-align: right">','</div>'); }
114 function aligncenterThis() { insertAroundCaret('<div style="text-align: center">','</div>'); }
117 function ahrefThis() {
118 if (document.selection)
119 strSelection = document.selection.createRange().text;
123 strHref = prompt("Create a link to:","http://");
124 if (strHref == null) return;
126 var textpre = "<a href=\"" + strHref.replace(/&/g,'&') + "\">";
127 insertAroundCaret(textpre, "</a>");
130 function execAndUpdate(action) {
131 lastSelected.caretPos.execCommand(action);
136 var nonie_FormType = 'body';
138 // Add media to new item
139 function addMedia() {
140 if ( typeof(medium) != 'undefined' )
146 alert('Media Plugin Not Found');
150 function includeImage(collection, filename, type, width, height) {
151 if (isCaretEmpty()) {
152 text = prompt("Text to display ?",filename);
154 text = getCaretText();
157 // add collection name when not private collection (or editing a message that's not your)
159 if (isNaN(collection) || (nucleusAuthorId != collection)) {
160 fullName = collection + '/' + filename;
169 replaceBy = '<%popup(' + fullName + '|'+width+'|'+height+'|' + text +')%>';
173 replaceBy = '<%image(' + fullName + '|'+width+'|'+height+'|' + text +')%>';
176 insertAtCaret(replaceBy);
182 function includeOtherMedia(collection, filename) {
183 if (isCaretEmpty()) {
184 text = prompt("Text to display ?",filename);
186 text = getCaretText();
189 // add collection name when not private collection (or editing a message that's not your)
191 if (isNaN(collection) || (nucleusAuthorId != collection)) {
192 fullName = collection + '/' + filename;
197 var replaceBy = '<%media(' + fullName + '|' + text +')%>';
199 insertAtCaret(replaceBy);
205 // function to prevent submitting form data twice
207 function checkSubmit() {
208 if (submitcount == 0) {
217 // code to store the caret (cursor) position of a text field/text area
218 // taken from javascript.faqts and modified
219 // http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
222 function storeCaret (textEl) {
225 if (textEl.createTextRange)
226 textEl.caretPos = document.selection.createRange().duplicate();
228 // also store lastselectedelement
229 lastSelected = textEl;
231 nonie_FormType = textEl.name;
233 scrollTop = textEl.scrollTop;
238 // inserts text at caret (overwriting selection)
239 function insertAtCaret (text) {
240 var textEl = lastSelected;
241 if (textEl && textEl.createTextRange && textEl.caretPos) {
242 var caretPos = textEl.caretPos;
243 caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
244 } else if (!document.all && document.getElementById) {
245 mozReplace(document.getElementById('input' + nonie_FormType), text);
247 document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;
250 textEl.value += text;
252 document.getElementById('input' + nonie_FormType).value += text;
254 document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;
260 // inserts a tag around the selected text
261 function insertAroundCaret (textpre, textpost) {
262 var textEl = lastSelected;
264 if (textEl && textEl.createTextRange && textEl.caretPos) {
265 var caretPos = textEl.caretPos;
266 caretPos.text = textpre + caretPos.text + textpost;
267 } else if (!document.all && document.getElementById) {
268 mozWrap(document.getElementById('input' + nonie_FormType), textpre, textpost);
270 document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;
273 document.getElementById('input' + nonie_FormType).value += textpre + textpost;
275 document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;
282 /* some methods to get things working in Mozilla as well */
283 function mozWrap(txtarea, lft, rgt) {
284 var selLength = txtarea.textLength;
285 var selStart = txtarea.selectionStart;
286 var selEnd = txtarea.selectionEnd;
287 if (selEnd==1 || selEnd==2) selEnd=selLength;
288 var s1 = (txtarea.value).substring(0,selStart);
289 var s2 = (txtarea.value).substring(selStart, selEnd)
290 var s3 = (txtarea.value).substring(selEnd, selLength);
291 txtarea.value = s1 + lft + s2 + rgt + s3;
293 function mozReplace(txtarea, newText) {
294 var selLength = txtarea.textLength;
295 var selStart = txtarea.selectionStart;
296 var selEnd = txtarea.selectionEnd;
297 if (selEnd==1 || selEnd==2) selEnd=selLength;
298 var s1 = (txtarea.value).substring(0,selStart);
299 var s2 = (txtarea.value).substring(selStart, selEnd)
300 var s3 = (txtarea.value).substring(selEnd, selLength);
301 txtarea.value = s1 + newText + s3;
303 function mozSelectedText() {
304 var txtarea = document.getElementById('input' + nonie_FormType);
305 var selLength = txtarea.textLength;
306 var selStart = txtarea.selectionStart;
307 var selEnd = txtarea.selectionEnd;
308 if (selEnd==1 || selEnd==2) selEnd=selLength;
309 return (txtarea.value).substring(selStart, selEnd);
312 function getCaretText() {
313 if (!document.all && document.getElementById)
314 return mozSelectedText();
316 return lastSelected.caretPos.text;
319 function isCaretEmpty() {
320 if (lastSelected && lastSelected.createTextRange && lastSelected.caretPos)
321 return (lastSelected.caretPos.text == '');
322 else if (!document.all && document.getElementById)
323 return (mozSelectedText() == '');
328 function BtnHighlight(el) {
330 borderLeft="1px solid #e9e9e9";
331 borderRight="1px solid gray";
332 borderTop="1px solid #e9e9e9";
333 borderBottom="1px solid gray";
337 function BtnNormal(el) {
339 border="1px solid #dddddd";