[ Index ] |
|
Code source de Kupu-1.3.5 |
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;
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 15:30:41 2007 | par Balluche grâce à PHPXref 0.7 |