Annotation of kupuMPIWG/common/kupumultieditor.js, revision 1.1
1.1 ! dwinter 1: /*****************************************************************************
! 2: *
! 3: * Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
! 4: *
! 5: * This software is distributed under the terms of the Kupu
! 6: * License. See LICENSE.txt for license text. For a list of Kupu
! 7: * Contributors see CREDITS.txt.
! 8: *
! 9: *****************************************************************************/
! 10:
! 11: // $Id: kupumultieditor.js 3450 2004-03-28 11:07:30Z guido $
! 12:
! 13: function KupuMultiEditor(documents, config, logger) {
! 14: /* multiple kupus in one form */
! 15: this.documents = documents; // array of documents
! 16: this.config = config;
! 17: this.log = logger;
! 18: this.tools = {};
! 19:
! 20: this._designModeAttempts = 0;
! 21: this._initialized = false;
! 22:
! 23: this._previous_range = null;
! 24:
! 25: // here's where the current active document will be stored
! 26: this._current_document = documents[0];
! 27:
! 28: this.initialize = function() {
! 29: this._initializeEventHandlers();
! 30: this.getDocument().getWindow().focus();
! 31: if (this.getBrowserName() == 'IE') {
! 32: for (var i=0; i < this.documents.length; i++) {
! 33: var body = this.documents[i].getDocument().getElementsByTagName('body')[0];
! 34: body.setAttribute('contentEditable', 'true');
! 35: };
! 36: // provide an 'afterInit' method on KupuEditor.prototype
! 37: // for additional bootstrapping (after editor init)
! 38: this._initialized = true;
! 39: if (this.afterInit) {
! 40: this.afterInit();
! 41: };
! 42: this._saveSelection();
! 43: this.logMessage(_('Editor initialized'));
! 44: } else {
! 45: this._setDesignModeWhenReady();
! 46: };
! 47: };
! 48:
! 49: this.updateStateHandler = function(event) {
! 50: /* check whether the event is interesting enough to trigger the
! 51: updateState machinery and act accordingly */
! 52: var interesting_codes = new Array(8, 13, 37, 38, 39, 40, 46);
! 53: if (event.type == 'click' || event.type == 'dblclick' ||
! 54: event.type == 'select' ||
! 55: (event.type == 'keyup' &&
! 56: interesting_codes.contains(event.keyCode))) {
! 57: var target = event.target ? event.target : event.srcElement;
! 58: // find the document targeted
! 59: while (target.nodeType != 9) {
! 60: target = target.parentNode;
! 61: };
! 62: var document = null;
! 63: for (var i=0; i < this.documents.length; i++) {
! 64: document = this.documents[i];
! 65: if (document.getDocument() == target) {
! 66: break;
! 67: };
! 68: };
! 69: if (!document) {
! 70: alert('No document found!');
! 71: return;
! 72: };
! 73: this._current_document = document;
! 74: this.updateState(event);
! 75: };
! 76: // unfortunately it's not possible to do this on blur, since that's
! 77: // too late. also (some versions of?) IE 5.5 doesn't support the
! 78: // onbeforedeactivate event, which would be ideal here...
! 79: if (this.getBrowserName() == 'IE') {
! 80: this._saveSelection();
! 81: };
! 82: };
! 83:
! 84: this.saveDocument = function() {
! 85: throw('Not supported, use prepareForm to attach the editor to a form');
! 86: };
! 87:
! 88: this.getDocument = function() {
! 89: /* return the current active document */
! 90: return this._current_document;
! 91: };
! 92:
! 93: this._initializeEventHandlers = function() {
! 94: /* attache the event handlers to the iframe */
! 95: for (var i=0; i < this.documents.length; i++) {
! 96: var doc = this.documents[i].getDocument();
! 97: this._addEventHandler(doc, "click", this.updateStateHandler, this);
! 98: this._addEventHandler(doc, "keyup", this.updateStateHandler, this);
! 99: if (this.getBrowserName() == "IE") {
! 100: this._addEventHandler(doc, "dblclick", this.updateStateHandler, this);
! 101: this._addEventHandler(doc, "select", this.updateStateHandler, this);
! 102: };
! 103: };
! 104: };
! 105:
! 106: this._setDesignModeWhenReady = function() {
! 107: this._designModeSetAttempts++;
! 108: if (this._designModeSetAttempts > 25) {
! 109: alert(_('Couldn\'t set design mode. Kupu will not work on this browser.'));
! 110: return;
! 111: };
! 112: var should_retry = false;
! 113: for (var i=0; i < this.documents.length; i++) {
! 114: var document = this.documents[i];
! 115: if (!document._designModeSet) {
! 116: try {
! 117: this._setDesignMode(document);
! 118: document._designModeSet = true;
! 119: } catch(e) {
! 120: should_retry = true;
! 121: };
! 122: };
! 123: };
! 124: if (should_retry) {
! 125: timer_instance.registerFunction(this, this._setDesignModeWhenReady, 100);
! 126: } else {
! 127: // provide an 'afterInit' method on KupuEditor.prototype
! 128: // for additional bootstrapping (after editor init)
! 129: if (this.afterInit) {
! 130: this.afterInit();
! 131: };
! 132: this._initialized = true;
! 133: };
! 134: };
! 135:
! 136: this._setDesignMode = function(doc) {
! 137: doc.getDocument().designMode = "On";
! 138: doc.execCommand("undo");
! 139: };
! 140:
! 141: // XXX perhaps we can partially move this to a helper method to approve
! 142: // code reuse?
! 143: this.prepareForm = function(form, idprefix) {
! 144: /* add some fields to the form and place the contents of the iframes
! 145: */
! 146: var sourcetool = this.getTool('sourceedittool');
! 147: if (sourcetool) {sourcetool.cancelSourceMode();};
! 148:
! 149: // make sure people can't edit or save during saving
! 150: if (!this._initialized) {
! 151: return;
! 152: }
! 153: this._initialized = false;
! 154:
! 155: // set the window status so people can see we're actually saving
! 156: window.status= _("Please wait while saving document...");
! 157:
! 158: // set a default id
! 159: if (!idprefix) {
! 160: idprefix = 'kupu';
! 161: };
! 162:
! 163: // pass the content through the filters
! 164: this.logMessage(_("Starting HTML cleanup"));
! 165: var contents = new Array();
! 166: for (var i=0; i < this.documents.length; i++) {
! 167: var transform = this._filterContent(this.documents[i].getDocument().documentElement);
! 168: contents.push(this._serializeOutputToString(transform));
! 169: };
! 170:
! 171: this.logMessage(_("Cleanup done, sending document to server"));
! 172:
! 173: // now create the form input, since IE 5.5 doesn't support the
! 174: // ownerDocument property we use window.document as a fallback (which
! 175: // will almost by definition be correct).
! 176: var document = form.ownerDocument ? form.ownerDocument : window.document;
! 177: for (var i=0; i < contents.length; i++) {
! 178: var ta = document.createElement('textarea');
! 179: ta.style.visibility = 'hidden';
! 180: var text = document.createTextNode(contents[i]);
! 181: ta.appendChild(text);
! 182: ta.setAttribute('name', idprefix + '_' + i);
! 183:
! 184: // and add it to the form
! 185: form.appendChild(ta);
! 186: };
! 187: };
! 188: };
! 189:
! 190: KupuMultiEditor.prototype = new KupuEditor;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>