[ Index ]
 

Code source de Kupu-1.3.5

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/common/ -> kupumultieditor.js (source)

   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;


Généré le : Sun Feb 25 15:30:41 2007 par Balluche grâce à PHPXref 0.7