summaryrefslogtreecommitdiff
path: root/lib/scripts/edit.js
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2010-08-29 14:22:01 +0200
committerAndreas Gohr <andi@splitbrain.org>2010-08-29 14:22:01 +0200
commit2c053ed58376c6709596ab48fc40dceb90d4e89d (patch)
treec8d0f78c2f47f373473419396d3c0855ec671eca /lib/scripts/edit.js
parentcb4a07568e84d853fbcd9d5eca37f572fa10786f (diff)
parent5479a8c3341247ca228026819f20f3ab5c34a80f (diff)
downloadrpg-2c053ed58376c6709596ab48fc40dceb90d4e89d.tar.gz
rpg-2c053ed58376c6709596ab48fc40dceb90d4e89d.tar.bz2
Merge branch 'master' into stable
Conflicts: conf/msg lib/plugins/acl/ajax.php
Diffstat (limited to 'lib/scripts/edit.js')
-rw-r--r--lib/scripts/edit.js150
1 files changed, 76 insertions, 74 deletions
diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js
index ef0a9a106..01262bcef 100644
--- a/lib/scripts/edit.js
+++ b/lib/scripts/edit.js
@@ -12,12 +12,15 @@
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function createToolButton(icon,label,key,id){
+function createToolButton(icon,label,key,id,classname){
var btn = document.createElement('button');
var ico = document.createElement('img');
// preapare the basic button stuff
btn.className = 'toolbutton';
+ if(classname){
+ btn.className += ' '+classname;
+ }
btn.title = label;
if(key){
btn.title += ' ['+key.toUpperCase()+']';
@@ -68,6 +71,7 @@ function createPicker(id,props,edid){
picker.id = id;
picker.style.position = 'absolute';
picker.style.marginLeft = '-10000px'; // no display:none, to keep access keys working
+ picker.style.marginTop = '-10000px';
for(var key in list){
if (!list.hasOwnProperty(key)) continue;
@@ -151,6 +155,7 @@ function keyHandler(e){
e.keyCode != 32) return;
var field = e.target;
var selection = getSelection(field);
+ if(selection.getLength()) return; //there was text selected, keep standard behavior
var search = "\n"+field.value.substr(0,selection.start);
var linestart = Math.max(search.lastIndexOf("\n"),
search.lastIndexOf("\r")); //IE workaround
@@ -162,7 +167,17 @@ function keyHandler(e){
var match = search.match(/(\n +([\*-] ?)?)/);
if(match){
var scroll = field.scrollHeight;
- insertAtCarret(field.id,match[1]);
+ var match2 = search.match(/^\n +[\*-]\s*$/);
+ // Cancel list if the last item is empty (i. e. two times enter)
+ if (match2 && field.value.substr(selection.start).match(/^($|\r?\n)/)) {
+ field.value = field.value.substr(0, linestart) + "\n" +
+ field.value.substr(selection.start);
+ selection.start = linestart + 1;
+ selection.end = linestart + 1;
+ setSelection(selection);
+ } else {
+ insertAtCarret(field.id,match[1]);
+ }
field.scrollTop += (field.scrollHeight - scroll);
e.preventDefault(); // prevent enter key
return false;
@@ -207,7 +222,13 @@ function keyHandler(e){
addInitEvent(function(){
var field = $('wiki__text');
if(!field) return;
- addEvent(field,'keydown',keyHandler);
+ // in Firefox, keypress doesn't send the correct keycodes,
+ // in Opera, the default of keydown can't be prevented
+ if (is_opera) {
+ addEvent(field,'keypress',keyHandler);
+ } else {
+ addEvent(field,'keydown',keyHandler);
+ }
});
/**
@@ -243,88 +264,68 @@ function currentHeadlineLevel(textboxId){
var textChanged = false;
/**
- * Check for changes before leaving the page
+ * Delete the draft before leaving the page
*/
-function changeCheck(msg){
- if(textChanged){
- var ok = confirm(msg);
- if(ok){
- // remove a possibly saved draft using ajax
- var dwform = $('dw__editform');
- if(dwform){
- var params = 'call=draftdel';
- params += '&id='+encodeURIComponent(dwform.elements.id.value);
-
- var sackobj = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- sackobj.AjaxFailedAlert = '';
- sackobj.encodeURIString = false;
- sackobj.runAJAX(params);
- // we send this request blind without waiting for
- // and handling the returned data
- }
+function deleteDraft() {
+ if (is_opera) return;
+
+ // remove a possibly saved draft using ajax
+ var dwform = $('dw__editform');
+ if(dwform){
+ var params = 'call=draftdel';
+ params += '&id='+encodeURIComponent(dwform.elements.id.value);
+
+ var sackobj = new sack(DOKU_BASE + 'lib/exe/ajax.php');
+ // this needs to be synchronous and GET to not be aborted upon page unload
+ sackobj.asynchronous = false;
+ sackobj.method = 'GET';
+ sackobj.AjaxFailedAlert = '';
+ sackobj.encodeURIString = false;
+ sackobj.runAJAX(params);
}
- return ok;
- }else{
- return true;
- }
}
/**
- * Add changeCheck to all Links and Forms (except those with a
- * JSnocheck class), add handlers to monitor changes
+ * Activate "not saved" dialog, add draft deletion to page unload,
+ * add handlers to monitor changes
*
* Sets focus to the editbox as well
- *
- * @fixme this is old and crappy code. needs to be redone
*/
-function initChangeCheck(msg){
- var edit_text = document.getElementById('wiki__text');
- if(!edit_text) return;
- if(edit_text.readOnly) return;
- if(!$('dw__editform')) return;
-
- // add change check for links
- var links = document.getElementsByTagName('a');
- for(var i=0; i < links.length; i++){
- if(links[i].className.indexOf('JSnocheck') == -1){
- links[i].onclick = function(){
- var rc = changeCheck(msg);
- if(window.event) window.event.returnValue = rc;
- return rc;
- };
- }
- }
- // add change check for forms
- var forms = document.forms;
- for(i=0; i < forms.length; i++){
- if(forms[i].className.indexOf('JSnocheck') == -1){
- forms[i].onsubmit = function(){
- var rc = changeCheck(msg);
- if(window.event) window.event.returnValue = rc;
- return rc;
- };
- }
- }
+addInitEvent(function (){
+ var editform = $('dw__editform');
+ if (!editform) return;
- // reset change memory var on submit
- var btn_save = document.getElementById('edbtn__save');
- btn_save.onclick = function(){ textChanged = false; };
- var btn_prev = document.getElementById('edbtn__preview');
- btn_prev.onclick = function(){ textChanged = false; };
+ var edit_text = $('wiki__text');
+ if(edit_text) {
+ if(edit_text.readOnly) return;
- // add change memory setter
- edit_text.onchange = function(){
+ // set focus
+ edit_text.focus();
+ }
+
+ var checkfunc = function(){
textChanged = true; //global var
summaryCheck();
};
- var summary = document.getElementById('edit__summary');
+ addEvent(editform, 'change', checkfunc);
+ addEvent(editform, 'keydown', checkfunc);
+
+ window.onbeforeunload = function(){
+ if(textChanged) {
+ return LANG.notsavedyet;
+ }
+ };
+ window.onunload = deleteDraft;
+
+ // reset change memory var on submit
+ addEvent($('edbtn__save'), 'click', function(){ textChanged = false; });
+ addEvent($('edbtn__preview'), 'click', function(){ textChanged = false; });
+
+ var summary = $('edit__summary');
addEvent(summary, 'change', summaryCheck);
addEvent(summary, 'keyup', summaryCheck);
if (textChanged) summaryCheck();
-
- // set focus
- edit_text.focus();
-}
+});
/**
* Checks if a summary was entered - if not the style is changed
@@ -371,8 +372,7 @@ var locktimer = new locktimer_class();
locktimer.sack.onCompletion = locktimer.refreshed;
// register refresh event
- addEvent($('dw__editform').elements.wikitext,'keypress',function(){locktimer.refresh();});
-
+ addEvent($('dw__editform'),'keypress',function(){locktimer.refresh();});
// start timer
locktimer.reset();
};
@@ -413,12 +413,14 @@ var locktimer = new locktimer_class();
// refresh every minute only
if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time
var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid);
- if(locktimer.draft){
- var dwform = $('dw__editform');
+ var dwform = $('dw__editform');
+ if(locktimer.draft && dwform.elements.wikitext){
params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value);
params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value);
params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value);
- params += '&date='+encodeURIComponent(dwform.elements.date.value);
+ if(dwform.elements.date){
+ params += '&date='+encodeURIComponent(dwform.elements.date.value);
+ }
}
locktimer.sack.runAJAX(params);
locktimer.lasttime = now;