Annotation of kupu/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>