Changeset 551 for branches


Ignore:
Timestamp:
08/11/06 00:36:06 (13 years ago)
Author:
mokhet
Message:
  • introduce HTMLArea.prototype.addEvent() which automatically add an avent and a dispose notifier. same goes for HTMLArea.prototype.addDom0Event and HTMLArea.prototype.prependDom0Event ( see ticket #658 for details )
  • apply patch from ticket #415 (warn when run locally)
  • slightly update the form.submit function, making some use of our helper function HTMLArea.getEditor instead of creating a new loop once again
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/mokhet/htmlarea.js

    r548 r551  
    8282HTMLArea.is_win_ie = (HTMLArea.is_ie && !HTMLArea.is_mac); 
    8383HTMLArea.is_gecko  = (navigator.product == "Gecko"); 
     84// detect if run locally. see ticket #415 
     85HTMLArea.isRunLocally = document.URL.toLowerCase().search(/^file:/) != -1; 
     86if ( HTMLArea.isRunLocally ) 
     87{ 
     88  alert('Xinha *must* be installed on a web server. Locally opened files (those that use the "file://" protocol) cannot properly function. Xinha will try to initialize but may not be correctly loaded.'); 
     89} 
    8490 
    8591// Creates a new HTMLArea object.  Tries to replace the textarea with the given 
     
    10791085        el.appendChild(op); 
    10801086      } 
    1081       function el_onchange() { editor._comboSelected(el, txt); } 
    1082       HTMLArea.Events.add(el, 'change', el_onchange); 
    1083       editor.notifyOn('dispose', function() { HTMLArea.Events.remove(el, 'change', el_onchange); }); 
     1087      editor.addEvent(el, 'change', function() { editor._comboSelected(el, txt); }); 
    10841088    } 
    10851089    return el; 
     
    11651169 
    11661170      // handlers to emulate nice flat toolbar buttons 
    1167       function el_onmout() 
     1171      function el_onmouseout() 
    11681172      { 
    11691173        if ( obj.enabled ) 
     
    11771181        } 
    11781182      } 
    1179       function el_onmdown(ev) 
     1183      function el_onmousedown(ev) 
    11801184      { 
    11811185        if ( obj.enabled ) 
     
    12011205        HTMLArea.Events.stop(ev); 
    12021206      } 
    1203       HTMLArea.Events.add(el, 'mouseout', el_onmout); 
    1204       HTMLArea.Events.add(el, 'mousedown', el_onmdown); 
    1205       HTMLArea.Events.add(el, 'click', el_onclick); 
    1206  
    1207       editor.notifyOn('dispose', 
    1208         function() 
    1209         { 
    1210           HTMLArea.Events.remove(el, 'mouseout', el_onmout); 
    1211           HTMLArea.Events.remove(el, 'mousedown', el_onmdown); 
    1212           HTMLArea.Events.remove(el, 'click', el_onclick); 
    1213         } 
    1214       ); 
     1207      editor.addEvent(el, 'mouseout', el_onmouseout); 
     1208      editor.addEvent(el, 'mousedown', el_onmousedown); 
     1209      editor.addEvent(el, 'click', el_onclick); 
    12151210 
    12161211      var i_contain = HTMLArea.makeBtnImg(btn[1]); 
     
    16071602      return true; 
    16081603    } 
    1609     HTMLArea.Events.add(textarea.form, 'submit', form_onsubmit, 'prepend'); 
     1604    editor.prependDom0Event(textarea.form, 'submit', form_onsubmit); 
    16101605 
    16111606    // onDispose get the HTMLArea content and update original textarea. 
     
    16131608 
    16141609    // update the original form.submit() function. See ticket #823 
    1615     if ( !textarea.form.$XINHA_submit ) 
    1616     { 
    1617       textarea.form.$XINHA_submit = textarea.form.submit; 
     1610    if ( !textarea.form.xinha_submit ) 
     1611    { 
     1612      textarea.form.xinha_submit = textarea.form.submit; 
    16181613      textarea.form.submit = function() 
    16191614      { 
     
    16231618          if ( element.type == 'textarea' ) 
    16241619          { 
    1625             for ( var a = __htmlareas.length; a--; ) 
     1620            var editor = HTMLArea.getEditor(element); 
     1621            if ( editor ) 
    16261622            { 
    1627               var editor = __htmlareas[a]; 
    1628               if ( editor && editor._textArea == element ) 
    1629               { 
    1630 //                element.value = editor.outwardHtml(editor.getHTML()); 
    1631                 editor.notifyOf('dispose', editor.config.onDisposeRemoveUI); 
    1632               } 
     1623              editor.notifyOf('dispose', editor.config.onDisposeRemoveUI); 
    16331624            } 
    16341625          } 
    16351626        } 
    1636         this.$XINHA_submit(); 
     1627        this.xinha_submit(); 
    16371628      }; 
    16381629    } 
     
    16481639      return true; 
    16491640    } 
    1650     HTMLArea.Events.add(textarea.form, 'reset', form_onreset, 'prepend'); 
    1651      
    1652     editor.notifyOn('dispose', 
    1653       function() 
    1654       { 
    1655         HTMLArea.Events.remove(textarea.form, 'submit', form_onsubmit); 
    1656         HTMLArea.Events.remove(textarea.form, 'reset', form_onreset); 
    1657       } 
    1658     ); 
     1641    editor.prependDom0Event(textarea.form, 'reset', form_onreset); 
    16591642  } 
    16601643 
     
    16661649    return true; 
    16671650  } 
    1668   HTMLArea.Events.add(window, 'unload', backforward, 'prepend'); 
    1669   editor.notifyOn('dispose', function() { HTMLArea.Events.remove(window, 'unload', backforward); } ); 
     1651  editor.prependDom0Event(window, 'unload', backforward); 
    16701652 
    16711653  // Hide textarea 
     
    16861668    return true; 
    16871669  } 
    1688   HTMLArea.Events.add(iframe, 'load', iframe_onload); 
    1689   editor.notifyOn('dispose', function() { HTMLArea.Events.remove(iframe, 'load', iframe_onload); } ); 
     1670  editor.addEvent(iframe, 'load', iframe_onload); 
    16901671 
    16911672  return true; 
     
    23862367      var doc = editor._doc; 
    23872368      // if we have multiple editors some bug in Mozilla makes some lose editing ability 
    2388       HTMLArea.Events.add(doc, 'mousedown', editor.activateEditor, false, editor); 
     2369      editor.addEvent(doc, 'mousedown', editor.activateEditor, false, editor); 
    23892370 
    23902371      // intercept some events; for updating the toolbar & keyboard handlers 
     
    23922373      if ( HTMLArea.is_ie ) 
    23932374      { 
    2394         listener = function(evt) { editor._editorEvent(editor._iframe.contentWindow.event); }; 
     2375        listener = function() { editor._editorEvent(editor._iframe.contentWindow.event); }; 
    23952376      } 
    23962377      else 
     
    23982379        listener = function(evt) { editor._editorEvent(evt); }; 
    23992380      } 
    2400       HTMLArea.Events.add(doc, ["keydown", "keypress", "mousedown", "mouseup", "drag"], listener); 
     2381      editor.addEvent(doc, ["keydown", "keypress", "mousedown", "mouseup", "drag"], listener); 
    24012382 
    24022383      // check if any plugins have registered refresh handlers 
     
    24142395 
    24152396      // on window resize, resize the editor 
    2416       function win_onresize() { editor.sizeEditor(); } 
    2417       HTMLArea.Events.add(window, 'resize', win_onresize, false, editor); 
    2418  
    2419       editor.notifyOn('dispose', 
    2420         function() 
    2421         { 
    2422           HTMLArea.Events.remove(doc, 'mousedown', editor.activateEditor, editor); 
    2423           HTMLArea.Events.remove(doc, ["keydown", "keypress", "mousedown", "mouseup", "drag"], listener); 
    2424           HTMLArea.Events.remove(window, 'resize', win_onresize, editor); 
    2425         } 
    2426       ); 
     2397      editor.addEvent(window, 'resize', function() { editor.sizeEditor(); }); 
    24272398 
    24282399      editor.removeLoadingMessage(); 
     
    30473018          return false; 
    30483019        } 
    3049         function a_oncmenu() 
     3020        function a_oncontextmenu() 
    30503021        { 
    30513022          // TODO: add context menu here 
     
    30573028        } 
    30583029        HTMLArea.Events.add(a, 'click', a_onclick, true, editor); 
    3059         HTMLArea.Events.add(a, 'contextmenu', a_oncmenu, true, el); 
     3030        HTMLArea.Events.add(a, 'contextmenu', a_oncontextmenu, true, el); 
    30603031        editor.notifyOn('statusbar_dispose', 
    30613032          function() 
    30623033          { 
    30633034            HTMLArea.Events.remove(a, 'click', a_onclick, editor); 
    3064             HTMLArea.Events.remove(a, 'contextmenu', a_oncmenu, el); 
     3035            HTMLArea.Events.remove(a, 'contextmenu', a_oncontextmenu, el); 
    30653036          } 
    30663037        ); 
     
    59965967    if ( req.readyState == 4 ) 
    59975968    { 
    5998       if ( req.status == 200 ) 
     5969      if ( req.status == 200 || HTMLArea.isRunLocally && req.status == 0 ) 
    59995970      { 
    60005971        if ( typeof handler == 'function' ) 
     
    60346005    if ( req.readyState == 4 ) 
    60356006    { 
    6036       if ( req.status == 200 ) 
     6007      if ( req.status == 200 || HTMLArea.isRunLocally && req.status == 0 ) 
    60376008      { 
    60386009        handler(req.responseText, req); 
     
    60656036  req.open('GET', url, false); 
    60666037  req.send(null); 
    6067   if ( req.status == 200 ) 
     6038  if ( req.status == 200 || HTMLArea.isRunLocally && req.status == 0 ) 
    60686039  { 
    60696040    return req.responseText; 
     
    66166587    try { obj[prop] = null; } catch(x) {} 
    66176588  } 
     6589}; 
     6590 
     6591/* 
     6592--------------------------------------------------------------------------- 
     6593  AUTODISPOSER EVENTS 
     6594--------------------------------------------------------------------------- 
     6595*/ 
     6596 
     6597/** 
     6598 * Add an event listener and prepare the dispose notifier 
     6599 * @see HTMLArea.Events.add 
     6600 * @return {boolean} true if the binding is successfull 
     6601 * @public 
     6602 */ 
     6603HTMLArea.prototype.addEvent = function(element, type, handler, forceDom0, scope, arbitraryObj) 
     6604{ 
     6605  var returnValue = HTMLArea.Events.add(element, type, handler, forceDom0, scope, arbitraryObj); 
     6606  // if the binding is successfull, add a dispose notifier 
     6607  if ( returnValue ) 
     6608  { 
     6609    this.notifyOn('dispose', function() { HTMLArea.Events.remove(element, type, handler, scope); }); 
     6610  } 
     6611  return returnValue; 
     6612}; 
     6613 
     6614/** 
     6615 * Add a DOM0 event listener and prepare the dispose notifier 
     6616 * @see HTMLArea.Events.add 
     6617 * @return {boolean} true if the binding is successfull 
     6618 * @public 
     6619 */ 
     6620HTMLArea.prototype.addDom0Event = function(element, type, handler, scope, arbitraryObj) 
     6621{ 
     6622  return this.addEvent(element, type, handler, true, scope, arbitraryObj); 
     6623}; 
     6624 
     6625/** 
     6626 * Prepend a DOM0 event listener and prepare the dispose notifier 
     6627 * @see HTMLArea.Events.add 
     6628 * @return {boolean} true if the binding is successfull 
     6629 * @public 
     6630 */ 
     6631HTMLArea.prototype.prependDom0Event = function(element, type, handler, scope, arbitraryObj) 
     6632{ 
     6633  return this.addEvent(element, type, handler, 'prepend', scope, arbitraryObj); 
    66186634}; 
    66196635 
     
    70767092}; 
    70777093 
    7078 function alerter(t) 
    7079 { 
    7080   if ( alerter.$ ) 
    7081   { 
    7082     alerter.$ = window.confirm(t); 
     7094/** 
     7095 * Enhanced version for the classic alert(), it can be canceled and so stop 
     7096 * bugging us while testing it SHOULD NOT BE USED outside of testing purpose imo 
     7097 */ 
     7098HTMLArea.alerterOk = true; 
     7099HTMLArea.alerter = function(txt) 
     7100{ 
     7101  if ( HTMLArea.alerterOk ) 
     7102  { 
     7103    HTMLArea.alerterOk = window.confirm(txt); 
    70837104  } 
    70847105} 
    7085 alerter.$ = true; 
    70867106 
    70877107/* 
     
    71637183    if ( !this.toFree[i].o ) 
    71647184    { 
    7165       alerter("What is " + i + ' ' + this.toFree[i].o); 
     7185      HTMLArea.alerter("What is " + i + ' ' + this.toFree[i].o + ', typeof ' + ( typeof this.toFree[i].o )); 
    71667186    } 
    71677187    this.free(this.toFree[i].o, this.toFree[i].p); 
Note: See TracChangeset for help on using the changeset viewer.