/* Javascript for OCAMLWIKI.
* Copyright (C) 2004 Merjis Ltd.
- * $Id: editor.js,v 1.5 2004/11/14 14:23:27 rich Exp $
+ * $Id: editor.js,v 1.6 2004/12/20 11:57:27 rich Exp $
*/
-// Delay in milliseconds before updating.
-// We will adjust this during editing to take into account the actual
-// average round trip time measured during update_preview_now.
+// Delay in milliseconds between updates.
var delay = 1000;
-// This is used to measure the average round trip time.
-var rtt_sum = 0;
-var rtt_n = 0;
-var rtt = 0; // Actual average RTT measured (ms).
-
-function update_preview (content_id, preview_id)
+// This function is called when the content has changed (eg. from a keypress).
+function content_changed (content_id, preview_id)
{
- // Updating is quite expensive, so only update after a period of apparent
- // inactivity.
var preview = document.getElementById (preview_id);
- if (preview.timer) clearTimeout (preview.timer);
- preview.timer =
- setTimeout ("update_preview_now ('" + content_id + "', '" +
- preview_id + "')", delay);
+
+ // Set a flag to indicate that the content has changed.
+ preview.updated = true;
+
+ // If there's not an asynchronous preview in progress at the moment,
+ // then start one.
+ start_update (content_id, preview_id, preview);
}
-function update_preview_now (content_id, preview_id)
+function start_update (content_id, preview_id, preview)
{
- // Remove the timer.
- var preview = document.getElementById (preview_id);
- if (preview.timer) preview.timer = null;
+ if (!preview) preview = document.getElementById (preview_id);
+
+ // Do nothing if a preview is already in progress.
+ if (preview.in_progress) return;
// Get the Wiki-markup content from the content textarea.
var content = document.getElementById (content_id).value;
- // Time how long it takes to send the document to the server.
- var start_time = (new Date()).getTime();
-
// Send the Wiki-markup to the server to be turned into XHTML.
var http = document.all ?
new ActiveXObject ('Microsoft.XMLHTTP') : new XMLHttpRequest ();
if (http)
{
- http.open ('POST', '/_bin/preview.cmo', false);
+ // Set a handler for state changes.
+ http.onreadystatechange = function () {
+ preview_state_change (content_id, preview_id, preview, http);
+ };
+ // 'true' argument means we want to do this asynchronously.
+ http.open ('POST', '/_bin/preview.cmo', true);
http.setRequestHeader ('Content-Type',
'application/x-www-form-urlencoded');
http.send ('content=' + encodeURIComponent (content));
+ // A preview is "in progress".
+ preview.in_progress = true;
+ preview.updated = false;
+ }
+}
+
+function preview_state_change (content_id, preview_id, preview, http)
+{
+ if (http.readyState == 4) { // If state is "loaded".
+ if (http.status == 200) { // Request status is 200 OK.
var xhtml = http.responseText;
// Next line fails with my copy of IE if the text contains a
preview.innerHTML = xhtml;
}
- // Finish timer and recompute RTT.
- var end_time = (new Date()).getTime();
- rtt_sum += end_time - start_time;
- rtt_n++;
- rtt = rtt_sum / rtt_n;
+ // A preview is not in progress now.
+ preview.in_progress = false;
+
+ // Have there been further updates since this preview started? If so
+ // then we need to start another preview.
+ if (preview.updated) start_update (content_id, preview_id, preview);
+ }
+}
- // Recompute the next delay period.
- delay = rtt * 2;
+// Update the preview field synchronously.
+function synch_update (content_id, preview_id)
+{
+ var preview = document.getElementById (preview_id);
+
+ // Get the Wiki-markup content from the content textarea.
+ var content = document.getElementById (content_id).value;
+
+ // Send the Wiki-markup to the server to be turned into XHTML.
+ var http = document.all ?
+ new ActiveXObject ('Microsoft.XMLHTTP') : new XMLHttpRequest ();
+ if (http)
+ {
+ http.open ('POST', '/_bin/preview.cmo', false);
+ http.setRequestHeader ('Content-Type',
+ 'application/x-www-form-urlencoded');
+ http.send ('content=' + encodeURIComponent (content));
+
+ if (http.readyState == 4 && http.status == 200) {
+ var xhtml = http.responseText;
+ preview.innerHTML = xhtml;
+ }
+ }
}
// Initialise the edit_buttons for a section.
};
var warning = "Select an area of text first.";
replace_selection (content_id, fn, warning);
- update_preview_now (content_id, preview_id);
+ start_update (content_id, preview_id);
}
function bold (content_id, preview_id)
};
var warning = "Select an area of text first.";
replace_selection (content_id, fn, warning);
- update_preview_now (content_id, preview_id);
+ start_update (content_id, preview_id);
}
function italic (content_id, preview_id)
};
var warning = "Select an area of text first.";
replace_selection (content_id, fn, warning);
- update_preview_now (content_id, preview_id);
+ start_update (content_id, preview_id);
}
function strikeout (content_id, preview_id)
};
var warning = "Select an area of text first.";
replace_selection (content_id, fn, warning);
- update_preview_now (content_id, preview_id);
+ start_update (content_id, preview_id);
}
function bullet (content_id, preview_id)
};
var warning = "Select some whole lines of text first.";
replace_selection (content_id, fn, warning);
- update_preview_now (content_id, preview_id);
+ start_update (content_id, preview_id);
}
function numbered (content_id, preview_id)
};
var warning = "Select some whole lines of text first.";
replace_selection (content_id, fn, warning);
- update_preview_now (content_id, preview_id);
+ start_update (content_id, preview_id);
}