Changeset 472


Ignore:
Timestamp:
03/19/06 22:25:45 (12 years ago)
Author:
mokhet
Message:

A lot of fixes for ticket #385

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/htmlarea.js

    r471 r472  
    7777function HTMLArea(textarea, config) 
    7878{ 
    79   if(!textarea) throw("Tried to create HTMLArea without textarea specified."); 
     79  if(!textarea) { throw("Tried to create HTMLArea without textarea specified."); } 
    8080 
    8181  if (HTMLArea.checkSupportedBrowser()) { 
     
    120120      } 
    121121      loading_message.style.left = HTMLArea.findPosX(textarea) +  'px'; 
    122       loading_message.style.top = (HTMLArea.findPosY(textarea) + parseInt(this._initial_ta_size.h) / 2) +  'px'; 
     122      loading_message.style.top = (HTMLArea.findPosY(textarea) + parseInt(this._initial_ta_size.h, 10) / 2) +  'px'; 
    123123      // main static message 
    124124      var loading_main = document.createElement("div"); 
     
    141141    this._timerToolbar = null; 
    142142    this._timerUndo = null; 
    143     this._undoQueue = new Array(this.config.undoSteps); 
     143    this._undoQueue = [this.config.undoSteps]; 
    144144    this._undoPos = -1; 
    145145    this._customUndo = true; 
     
    152152 
    153153    // Panels 
    154     var panels = this._panels = 
     154    var panels =  
    155155    { 
    156156      right: 
    157157      { 
    158158        on: true, 
    159         container:    document.createElement('td'), 
    160         panels: [ ] 
     159        container: document.createElement('td'), 
     160        panels: [] 
    161161      }, 
    162162      left: 
    163163      { 
    164164        on: true, 
    165         container:    document.createElement('td'), 
    166         panels: [ ] 
     165        container: document.createElement('td'), 
     166        panels: [] 
    167167      }, 
    168168      top: 
    169169      { 
    170170        on: true, 
    171         container:    document.createElement('td'), 
    172         panels: [ ] 
     171        container: document.createElement('td'), 
     172        panels: [] 
    173173      }, 
    174174      bottom: 
    175175      { 
    176176        on: true, 
    177         container:    document.createElement('td'), 
    178         panels: [ ] 
     177        container: document.createElement('td'), 
     178        panels: [] 
    179179      } 
    180180    }; 
     
    182182    for(var i in panels) 
    183183    { 
    184       if (!panels[i].container) continue; // prevent iterating over wrong type 
     184      if (!panels[i].container) { continue; } // prevent iterating over wrong type 
    185185      panels[i].div = panels[i].container; // legacy 
    186186      panels[i].container.className = 'panels ' + i; 
     
    188188      HTMLArea.freeLater(panels[i], 'div');       
    189189    } 
     190    // finally store the variable 
     191    this._panels = panels; 
     192     
    190193    HTMLArea.freeLater(this, '_textArea'); 
    191194  } 
     
    402405  function cut_copy_paste(e, cmd, obj) { 
    403406    e.execCommand(cmd); 
    404   }; 
     407  } 
    405408 
    406409  this.debug = true; 
     
    475478 
    476479    htmlmode: [ "Toggle HTML Source", ["ed_buttons_main.gif",7,0], true, function(e) {e.execCommand("htmlmode");} ], 
    477     toggleborders: [ "Toggle Borders", ["ed_buttons_main.gif",7,2], false, function(e) { e._toggleBorders() } ], 
     480    toggleborders: [ "Toggle Borders", ["ed_buttons_main.gif",7,2], false, function(e) {e._toggleBorders();} ], 
    478481    print: [ "Print document", ["ed_buttons_main.gif",8,1], false, function(e) {if (HTMLArea.is_gecko) {e._iframe.contentWindow.print();} else {e.focusEditor(); print();}} ], 
    479482    saveas: [ "Save as", "ed_saveas.gif", false, function(e) {e.execCommand("saveas",false,"noname.htm");} ], 
     
    518521  for (var i in this.btnList) { 
    519522    var btn = this.btnList[i]; 
    520     if (typeof btn != 'object') continue; // prevent iterating over wrong type 
     523    if (typeof btn != 'object') { continue; } // prevent iterating over wrong type 
    521524    if (typeof btn[1] != 'string') 
    522525    { 
     
    574577HTMLArea.prototype.registerPanel = function(side, object) 
    575578{ 
    576   if(!side) side = 'right'; 
     579  if(!side) { side = 'right'; } 
    577580  this.setLoadingMessage('Register panel ' + side); 
    578581  var panel = this.addPanel(side); 
     
    659662  if (idIsArray) { //find the button/select box in input array 
    660663    for (i = 0; i < id.length; ++i) { 
    661       if ((id[i] != "separator") && (id[i].indexOf("T[") != 0)) { 
     664      if ((id[i] != "separator") && (id[i].indexOf("T[") !== 0)) { 
    662665        sid = id[i]; 
    663666      } 
     
    667670  } 
    668671 
    669   for (var i = 0; !exists && !found && i < toolbar.length; ++i) { 
    670     a = toolbar[i] 
     672  for (i = 0; !exists && !found && i < toolbar.length; ++i) { 
     673    a = toolbar[i]; 
    671674    for (j = 0; !found && j < a.length; ++j) { 
    672675      if (a[i] == sid) { // check if button/select box exists 
     
    677680        for (o = 0; o < whereLength; ++o) { 
    678681          if(a[j] == where[o]) { 
    679             if (o == 0) { 
     682            if (o === 0) { 
    680683              found = true; 
    681684              j--; 
     
    706709    } 
    707710    if (found) { 
    708       if (position == 0) { // replace the found button 
     711      if (position === 0) { // replace the found button 
    709712        if (idIsArray) { 
    710713          a[j] = id[id.length-1]; 
     
    745748HTMLArea.replaceAll = function(config) { 
    746749  var tas = document.getElementsByTagName("textarea"); 
    747   for (var i = tas.length; i > 0; (new HTMLArea(tas[--i], config)).generate()); 
     750  // @todo: weird syntax, doesnt help to read the code, doesnt obfuscate it and doesnt make it quicker, better rewrite this part 
     751  for (var i = tas.length; i > 0; (new HTMLArea(tas[--i], config)).generate()) 
     752  { 
     753    // NOP 
     754  } 
    748755}; 
    749756 
     
    752759{ 
    753760  var ta = HTMLArea.getElementById("textarea", id); 
    754   return ta ? (new HTMLArea(ta, config)).generate() : null;; 
     761  return ta ? (new HTMLArea(ta, config)).generate() : null; 
    755762}; 
    756763 
     
    770777   
    771778  var tb_row = null; 
    772   var tb_objects = new Object(); 
     779  var tb_objects = {}; 
    773780  this._toolbarObjects = tb_objects; 
    774781 
     
    779786}; 
    780787 
    781  
     788// FIXME : function never used, can probably be removed from source 
    782789HTMLArea.prototype._setConfig = function(config) { 
    783790        this.config = config; 
     
    788795}; 
    789796 
     797/** 
     798 * Create a break element to add in the toolbar 
     799 * 
     800 * @return {Object} HTML element to add 
     801 * @private 
     802 */ 
     803HTMLArea._createToolbarBreakingElement = function() 
     804{ 
     805  var brk = document.createElement('div'); 
     806  brk.style.height = '1px'; 
     807  brk.style.width = '1px'; 
     808  brk.style.lineHeight = '1px'; 
     809  brk.style.fontSize = '1px'; 
     810  brk.style.clear = 'both'; 
     811  return brk; 
     812}; 
     813 
    790814// separate from previous createToolBar to allow dynamic change of toolbar 
    791815HTMLArea.prototype._createToolbar1 = function (editor, toolbar, tb_objects) { 
    792  
     816  var tb_row; 
    793817  // This shouldn't be necessary, but IE seems to float outside of the container 
    794818  // when we float toolbar sections, so we have to clear:both here as well 
     
    796820  if(editor.config.flowToolbars) 
    797821  { 
    798     var brk = document.createElement('div'); 
    799     brk.style.height = 
    800       brk.style.width = 
    801       brk.style.lineHeight = 
    802       brk.style.fontSize = '1px'; 
    803     brk.style.clear = 'both'; 
    804     toolbar.appendChild(brk); 
     822    toolbar.appendChild(HTMLArea._createToolbarBreakingElement()); 
    805823  } 
    806824 
    807825  // creates a new line in the toolbar 
    808826  function newLine() { 
    809     if(typeof tb_row != 'undefined' && tb_row.childNodes.length == 0) return; 
     827    if(typeof tb_row != 'undefined' && tb_row.childNodes.length === 0) { return; } 
    810828 
    811829    var table = document.createElement("table"); 
     
    926944       
    927945      for (var i in options) { 
    928         if (typeof(options[i]) != 'string') continue;  // prevent iterating over wrong type 
     946        if (typeof(options[i]) != 'string') { continue; }  // prevent iterating over wrong type 
    929947        var op = document.createElement("option"); 
    930948        op.innerHTML = HTMLArea._lc(i); 
     
    942960  function createButton(txt) { 
    943961    // the element that will be created 
    944     var el = null; 
    945     var btn = null; 
     962    var el, btn, obj = null; 
    946963    switch (txt) { 
    947964        case "separator": 
    948           if(editor.config.flowToolbars) newLine(); 
     965          if(editor.config.flowToolbars) { newLine(); } 
    949966      el = document.createElement("div"); 
    950967      el.className = "separator"; 
     
    962979      el.className = "indicator"; 
    963980      el.title = HTMLArea._lc("Current style"); 
    964       var obj = { 
     981      obj = { 
    965982        name    : txt, // the button name (i.e. 'bold') 
    966983        element : el, // the UI element (DIV) 
     
    9881005      // let's just pretend we have a button object, and 
    9891006      // assign all the needed information to it. 
    990       var obj = { 
     1007      obj = { 
    9911008        name    : txt, // the button name (i.e. 'bold') 
    9921009        element : el, // the UI element (DIV) 
     
    10031020      tb_objects[txt] = obj; 
    10041021      // handlers to emulate nice flat toolbar buttons 
    1005       HTMLArea._addEvent(el, "mouseout", function () { 
    1006         if (obj.enabled) with (HTMLArea) { 
    1007           //_removeClass(el, "buttonHover"); 
    1008           _removeClass(el, "buttonActive"); 
    1009           (obj.active) && _addClass(el, "buttonPressed"); 
     1022      HTMLArea._addEvent(el, "mouseout", function (ev) 
     1023      { 
     1024        if (obj.enabled) 
     1025        { 
     1026          //HTMLArea._removeClass(el, "buttonHover"); 
     1027          HTMLArea._removeClass(el, "buttonActive"); 
     1028          if (obj.active) { HTMLArea._addClass(el, "buttonPressed"); } 
    10101029        } 
    10111030      }); 
    10121031 
    1013       HTMLArea._addEvent(el, "mousedown", function (ev) { 
    1014         if (obj.enabled) with (HTMLArea) { 
    1015           _addClass(el, "buttonActive"); 
    1016           _removeClass(el, "buttonPressed"); 
    1017           _stopEvent(is_ie ? window.event : ev); 
     1032      HTMLArea._addEvent(el, "mousedown", function (ev) 
     1033      { 
     1034        if (obj.enabled) 
     1035        { 
     1036          HTMLArea._addClass(el, "buttonActive"); 
     1037          HTMLArea._removeClass(el, "buttonPressed"); 
     1038          HTMLArea._stopEvent(HTMLArea.is_ie ? window.event : ev); 
    10181039        } 
    10191040      }); 
     1041 
    10201042      // when clicked, do the following: 
    10211043      HTMLArea._addEvent(el, "click", function (ev) { 
    1022         if (obj.enabled) with (HTMLArea) { 
    1023           _removeClass(el, "buttonActive"); 
    1024           //_removeClass(el, "buttonHover"); 
     1044        if (obj.enabled) 
     1045        { 
     1046          HTMLArea._removeClass(el, "buttonActive"); 
     1047          //HTMLArea._removeClass(el, "buttonHover"); 
    10251048          if(HTMLArea.is_gecko) 
    10261049          { 
     
    10281051          } 
    10291052          obj.cmd(editor, obj.name, obj); 
    1030           _stopEvent(is_ie ? window.event : ev); 
     1053          HTMLArea._stopEvent(HTMLArea.is_ie ? window.event : ev); 
    10311054        } 
    10321055      }); 
     
    10681091      first = false; 
    10691092    } 
    1070     if(this.config.toolbar[i] == null) this.config.toolbar[i] = ['separator']; 
     1093    if(this.config.toolbar[i] === null) { this.config.toolbar[i] = ['separator']; } 
    10711094    var group = this.config.toolbar[i]; 
    10721095 
     
    10741097    { 
    10751098      var code = group[j]; 
     1099      var tb_cell; 
    10761100      if (/^([IT])\[(.*?)\]/.test(code)) 
    10771101      { 
     
    10821106          label = HTMLArea._lc(label); 
    10831107        } 
    1084         var tb_cell = document.createElement("td"); 
     1108        tb_cell = document.createElement("td"); 
    10851109        tb_row.appendChild(tb_cell); 
    10861110        tb_cell.className = "label"; 
     
    10901114      { 
    10911115        var tb_element = createButton(code); 
    1092  
    10931116        if (tb_element) 
    10941117        { 
    1095           var tb_cell = document.createElement("td"); 
     1118          tb_cell = document.createElement("td"); 
    10961119          tb_cell.className = 'toolbarElement'; 
    10971120          tb_row.appendChild(tb_cell); 
    10981121          tb_cell.appendChild(tb_element); 
    10991122        } 
    1100         else if (tb_element == null) 
     1123        else if (tb_element === null) 
    11011124        { 
    11021125          alert("FIXME: Unknown toolbar item: " + code); 
     
    11081131  if(editor.config.flowToolbars) 
    11091132  { 
    1110     var brk = document.createElement('div'); 
    1111     brk.style.height = 
    1112       brk.style.width = 
    1113       brk.style.lineHeight = 
    1114       brk.style.fontSize = '1px'; 
    1115     brk.style.clear = 'both'; 
    1116     toolbar.appendChild(brk); 
     1133    toolbar.appendChild(HTMLArea._createToolbarBreakingElement()); 
    11171134  } 
    11181135 
     
    11201137}; 
    11211138 
    1122 use_clone_img = false; 
     1139// @todo : is this some kind of test not finished ? 
     1140//         Why the hell this is not in the config object ? 
     1141var use_clone_img = false; 
    11231142HTMLArea.makeBtnImg = function(imgDef, doc) 
    11241143{ 
    1125   if(!doc) doc = document; 
     1144  if(!doc) { doc = document; } 
    11261145 
    11271146  if(!doc._htmlareaImgCache) 
     
    11611180      img.style.height = "18px"; 
    11621181      if(use_clone_img) 
     1182      { 
    11631183        doc._htmlareaImgCache[imgDef] = img.cloneNode(); 
     1184      } 
    11641185    } 
    11651186  } 
     
    11761197      img.style.position = 'relative'; 
    11771198      if(use_clone_img) 
     1199      { 
    11781200        doc._htmlareaImgCache[imgDef[0]] = img.cloneNode(); 
     1201      } 
    11791202    } 
    11801203    img.style.top  = imgDef[2] ? ('-' + (18 * (imgDef[2] + 1)) + 'px') : '-18px'; 
     
    11941217  // statusbar.appendChild(document.createTextNode(HTMLArea._lc("Path") + ": ")); 
    11951218  // creates a holder for the path view 
    1196   div = document.createElement("span"); 
     1219  var div = document.createElement("span"); 
    11971220  div.className = "statusBarTree"; 
    11981221  div.innerHTML = HTMLArea._lc("Path") + ": "; 
     
    12201243HTMLArea.prototype.generate = function () 
    12211244{ 
     1245  var i; 
     1246  var editor = this;    // we'll need "this" in some nested functions 
    12221247  this.setLoadingMessage('Generate Xinha object'); 
    1223   var editor = this;    // we'll need "this" in some nested functions 
    12241248 
    12251249  if(typeof Dialog == 'undefined') 
    12261250  { 
    1227     HTMLArea._loadback 
    1228       (_editor_url + 'dialog.js', function() { editor.generate(); } ); 
    1229       return false; 
     1251    HTMLArea._loadback(_editor_url + 'dialog.js', function() { editor.generate(); } ); 
     1252    return false; 
    12301253  } 
    12311254 
    12321255  if(typeof HTMLArea.Dialog == 'undefined') 
    12331256  { 
    1234     HTMLArea._loadback 
    1235       (_editor_url + 'inline-dialog.js', function() { editor.generate(); } ); 
    1236       return false; 
     1257    HTMLArea._loadback(_editor_url + 'inline-dialog.js', function() { editor.generate(); } ); 
     1258    return false; 
    12371259  } 
    12381260 
    12391261  if(typeof PopupWin == 'undefined') 
    12401262  { 
    1241     HTMLArea._loadback 
    1242       (_editor_url + 'popupwin.js', function() { editor.generate(); } ); 
    1243       return false; 
    1244   } 
    1245  
    1246   if(_editor_skin != "") { 
     1263    HTMLArea._loadback(_editor_url + 'popupwin.js', function() { editor.generate(); } ); 
     1264    return false; 
     1265  } 
     1266 
     1267  if(_editor_skin !== "") { 
    12471268    var found=false; 
    12481269    var head = document.getElementsByTagName("head")[0]; 
    12491270    var links = document.getElementsByTagName("link"); 
    1250     for(var i = 0; i<links.length; i++) { 
     1271    for(i = 0; i<links.length; i++) { 
    12511272      if((links[i].rel == "stylesheet")&&(links[i].href == _editor_url + 'skins/' + _editor_skin + '/skin.css')) 
     1273      { 
    12521274        found = true; 
     1275      } 
    12531276    } 
    12541277    if(!found) { 
     
    12561279      link.type = "text/css"; 
    12571280      link.href = _editor_url + 'skins/' + _editor_skin + '/skin.css'; 
    1258       link.rel = "stylesheet" 
     1281      link.rel = "stylesheet"; 
    12591282      head.appendChild(link); 
    12601283    } 
     
    12631286  //backwards-compatibility: load FullScreen-Plugin if we find a "popupeditor"-button in the toolbar 
    12641287  var toolbar = editor.config.toolbar; 
    1265   for (var i = toolbar.length; --i >= 0;) { 
     1288  for (i = toolbar.length; --i >= 0;) { 
    12661289    for (var j = toolbar[i].length; --j >= 0; ) { 
    12671290      if (toolbar[i][j]=="popupeditor") { 
     
    12761299 
    12771300  // If this is gecko, set up the paragraph handling now 
    1278   if(HTMLArea.is_gecko) 
    1279   { 
    1280     switch(editor.config.mozParaHandler) 
    1281     { 
    1282       case 'best': 
    1283       { 
    1284         if(typeof EnterParagraphs == 'undefined') 
    1285         { 
    1286           HTMLArea.loadPlugin("EnterParagraphs", function() { editor.generate(); } ); 
    1287           return false; 
    1288         } 
    1289         editor.registerPlugin('EnterParagraphs'); 
    1290       } 
    1291       break; 
    1292  
    1293       case 'dirty'   : 
    1294       case 'built-in': 
    1295       default        : 
    1296       { 
    1297         // See _editorEvent 
    1298       } 
    1299       break; 
    1300     } 
     1301  if (HTMLArea.is_gecko && editor.config.mozParaHandler == 'best') 
     1302  { 
     1303    if(typeof EnterParagraphs == 'undefined') 
     1304    { 
     1305      HTMLArea.loadPlugin("EnterParagraphs", function() { editor.generate(); } ); 
     1306      return false; 
     1307    } 
     1308    editor.registerPlugin('EnterParagraphs'); 
    13011309  } 
    13021310 
     
    13741382 
    13751383    // create the toolbar and put in the area 
    1376   var toolbar = this._createToolbar(); 
    1377   this._framework.tb_cell.appendChild(toolbar); 
     1384  this._framework.tb_cell.appendChild( this._createToolbar() ); 
    13781385 
    13791386    // create the IFRAME & add to container 
    13801387  var iframe = document.createElement("iframe"); 
    1381   iframe.src = _editor_url + editor.config.URIs["blank"]; 
     1388  iframe.src = _editor_url + editor.config.URIs.blank; 
    13821389  this._framework.ed_cell.appendChild(iframe); 
    13831390  this._iframe = iframe; 
     
    14791486    { 
    14801487      case 'auto': 
    1481       { 
    14821488        width = this._initial_ta_size.w; 
    1483       } 
    14841489      break; 
    14851490 
    14861491      case 'toolbar': 
    1487       { 
    14881492        width = this._toolBar.offsetWidth + 'px'; 
    1489       } 
    14901493      break; 
    14911494 
    14921495      default : 
    1493       { 
     1496        // @todo: check if this is better : 
     1497        // width = (parseInt(this.config.width, 10) == this.config.width)? this.config.width + 'px' : this.config.width; 
    14941498        width = /[^0-9]/.test(this.config.width) ? this.config.width : this.config.width + 'px'; 
    1495       } 
    14961499      break; 
    14971500    } 
     
    15001503    { 
    15011504      case 'auto': 
    1502       { 
    15031505        height = this._initial_ta_size.h; 
    1504       } 
    15051506      break; 
    15061507 
    15071508      default : 
    1508       { 
     1509        // @todo: check if this is better : 
     1510        // height = (parseInt(this.config.height, 10) == this.config.height)? this.config.height + 'px' : this.config.height; 
    15091511        height = /[^0-9]/.test(this.config.height) ? this.config.height : this.config.height + 'px'; 
    1510       } 
    15111512      break; 
    15121513    } 
     
    15361537    this._textArea.style.width  = ''; 
    15371538 
    1538     if(includingBars != null)     this._htmlArea.sizeIncludesToolbars = includingBars; 
    1539     if(includingPanels != null)   this._htmlArea.sizeIncludesPanels   = includingPanels; 
    1540  
    1541     if(width != null) 
    1542     { 
    1543       this._htmlArea.style.width          = width; 
     1539    if(includingBars !== null)   { this._htmlArea.sizeIncludesToolbars = includingBars;   } 
     1540    if(includingPanels !== null) { this._htmlArea.sizeIncludesPanels   = includingPanels; } 
     1541 
     1542    if(width) 
     1543    { 
     1544      this._htmlArea.style.width = width; 
    15441545      if(!this._htmlArea.sizeIncludesPanels) 
    15451546      { 
    15461547        // Need to add some for l & r panels 
    1547         var panel = this._panels.right; 
    1548         if(panel.on && panel.panels.length && HTMLArea.hasDisplayedChildren(panel.div)) 
     1548        var rPanel = this._panels.right; 
     1549        if(rPanel.on && rPanel.panels.length && HTMLArea.hasDisplayedChildren(rPanel.div)) 
    15491550        { 
    1550           this._htmlArea.style.width = this._htmlArea.offsetWidth + parseInt(this.config.panel_dimensions.right); 
    1551         } 
    1552  
    1553         var panel = this._panels.left; 
    1554         if(panel.on && panel.panels.length && HTMLArea.hasDisplayedChildren(panel.div)) 
     1551          this._htmlArea.style.width = this._htmlArea.offsetWidth + parseInt(this.config.panel_dimensions.right, 10); 
     1552        } 
     1553 
     1554        var lPanel = this._panels.left; 
     1555        if(lPanel.on && lPanel.panels.length && HTMLArea.hasDisplayedChildren(lPanel.div)) 
    15551556        { 
    1556           this._htmlArea.style.width = this._htmlArea.offsetWidth + parseInt(this.config.panel_dimensions.left); 
    1557         } 
    1558       } 
    1559     } 
    1560  
    1561     if(height != null) 
    1562     { 
    1563       this._htmlArea.style.height         = height; 
     1557          this._htmlArea.style.width = this._htmlArea.offsetWidth + parseInt(this.config.panel_dimensions.left, 10); 
     1558        } 
     1559      } 
     1560    } 
     1561 
     1562    if(height) 
     1563    { 
     1564      this._htmlArea.style.height = height; 
    15641565      if(!this._htmlArea.sizeIncludesToolbars) 
    15651566      { 
    15661567        // Need to add some for toolbars 
    1567         this._htmlArea.style.height         = this._htmlArea.offsetHeight + this._toolbar.offsetHeight + this._statusBar.offsetHeight; 
     1568        this._htmlArea.style.height = (this._htmlArea.offsetHeight + this._toolbar.offsetHeight + this._statusBar.offsetHeight) + 'px'; 
    15681569      } 
    15691570 
    15701571      if(!this._htmlArea.sizeIncludesPanels) 
    15711572      { 
    1572         // Need to add some for l & r panels 
    1573         var panel = this._panels.top; 
    1574         if(panel.on && panel.panels.length && HTMLArea.hasDisplayedChildren(panel.div)) 
     1573        // Need to add some for t & b panels 
     1574        var tPanel = this._panels.top; 
     1575        if(tPanel.on && tPanel.panels.length && HTMLArea.hasDisplayedChildren(tPanel.div)) 
    15751576        { 
    1576           this._htmlArea.style.height = this._htmlArea.offsetHeight + parseInt(this.config.panel_dimensions.top); 
    1577         } 
    1578  
    1579         var panel = this._panels.bottom; 
    1580         if(panel.on && panel.panels.length && HTMLArea.hasDisplayedChildren(panel.div)) 
     1577          this._htmlArea.style.height = (this._htmlArea.offsetHeight + parseInt(this.config.panel_dimensions.top, 10)) + 'px'; 
     1578        } 
     1579 
     1580        var bPanel = this._panels.bottom; 
     1581        if(bPanel.on && bPanel.panels.length && HTMLArea.hasDisplayedChildren(bPanel.div)) 
    15811582        { 
    1582           this._htmlArea.style.height = this._htmlArea.offsetHeight + parseInt(this.config.panel_dimensions.bottom); 
     1583          this._htmlArea.style.height = (this._htmlArea.offsetHeight + parseInt(this.config.panel_dimensions.bottom, 10)) + 'px'; 
    15831584        } 
    15841585      } 
     
    16861687 
    16871688    var edcellheight = height - this._toolBar.offsetHeight - this._statusBar.offsetHeight; 
    1688     if(panel_is_alive('top'))    edcellheight  -= parseInt(this.config.panel_dimensions.top); 
    1689     if(panel_is_alive('bottom')) edcellheight  -= parseInt(this.config.panel_dimensions.bottom);; 
    1690     this._iframe.style.height    = edcellheight + 'px'; 
     1689    if(panel_is_alive('top'))    { edcellheight  -= parseInt(this.config.panel_dimensions.top, 10); } 
     1690    if(panel_is_alive('bottom')) { edcellheight  -= parseInt(this.config.panel_dimensions.bottom, 10); } 
     1691    this._iframe.style.height = edcellheight + 'px'; 
    16911692 
    16921693    var edcellwidth = width; 
    1693     if(panel_is_alive('left'))  edcellwidth -= parseInt(this.config.panel_dimensions.left); 
    1694     if(panel_is_alive('right')) edcellwidth -= parseInt(this.config.panel_dimensions.right); 
    1695     this._iframe.style.width     =  edcellwidth + 'px'; 
     1694    if(panel_is_alive('left'))  { edcellwidth -= parseInt(this.config.panel_dimensions.left, 10); } 
     1695    if(panel_is_alive('right')) { edcellwidth -= parseInt(this.config.panel_dimensions.right, 10); } 
     1696    this._iframe.style.width =  edcellwidth + 'px'; 
    16961697 
    16971698    this._textArea.style.height = this._iframe.style.height; 
     
    18071808   */ 
    18081809 
    1809   HTMLArea.prototype.editorIsActivated = function() { 
    1810     try { 
    1811       if (HTMLArea.is_gecko) return (this._doc.designMode == 'on'); 
    1812       else return (this._doc.body.contentEditable); 
    1813     } catch (e) 
     1810  HTMLArea.prototype.editorIsActivated = function() 
     1811  { 
     1812    try 
     1813    { 
     1814      return HTMLArea.is_gecko? this._doc.designMode == 'on' : this._doc.body.contentEditable; 
     1815    } 
     1816    catch (ex) 
    18141817    { 
    18151818      return false; 
     
    18241827    if(HTMLArea._currentlyActiveEditor) 
    18251828    { 
    1826       if(HTMLArea._currentlyActiveEditor == this) return true; 
     1829      if(HTMLArea._currentlyActiveEditor == this) { return true; } 
    18271830      HTMLArea._currentlyActiveEditor.deactivateEditor(); 
    18281831    } 
     
    18431846          this._doc.designMode = 'on'; 
    18441847        } 
    1845       } catch (e) {} 
    1846     } 
    1847     else if(!HTMLArea.is_gecko && this._doc.body.contentEditable != true) 
     1848      } catch (ex) {} 
     1849    } 
     1850    else if(!HTMLArea.is_gecko && this._doc.body.contentEditable !== true) 
    18481851    { 
    18491852      this._doc.body.contentEditable = true; 
     
    18681871      try {this._doc.designMode = 'off';} catch (e) {} 
    18691872    } 
    1870     else if(!HTMLArea.is_gecko && this._doc.body.contentEditable != false) 
     1873    else if(!HTMLArea.is_gecko && this._doc.body.contentEditable !== false) 
    18711874    { 
    18721875      this._doc.body.contentEditable = false; 
     
    19041907      if (!doc) { // try later 
    19051908        if (HTMLArea.is_gecko) { 
    1906           setTimeout(function() { editor.initIframe()}, 50); 
     1909          setTimeout(function() { editor.initIframe(); }, 50); 
    19071910          return false; 
    19081911        } else { 
     
    19131916    catch(e) 
    19141917    { // try later 
    1915       setTimeout(function() { editor.initIframe()}, 50); 
     1918      setTimeout(function() { editor.initIframe(); }, 50); 
    19161919    } 
    19171920     
     
    19191922     
    19201923    doc.open(); 
     1924    var html = ''; 
    19211925    if (!editor.config.fullPage) { 
    1922       var html = "<html>\n"; 
     1926      html = "<html>\n"; 
    19231927      html += "<head>\n"; 
    19241928      html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + editor.config.charSet + "\">\n"; 
    1925       if(typeof editor.config.baseHref != 'undefined' && editor.config.baseHref != null) 
     1929      if(typeof editor.config.baseHref != 'undefined' && editor.config.baseHref !== null) 
    19261930      { 
    19271931        html += "<base href=\"" + editor.config.baseHref + "\"/>\n"; 
     
    19421946      if(typeof editor.config.pageStyleSheets !== 'undefined') 
    19431947      { 
    1944         for(style_i = 0; style_i < editor.config.pageStyleSheets.length; style_i++) 
     1948        for(var i = 0; i < editor.config.pageStyleSheets.length; i++) 
    19451949        { 
    1946           if(editor.config.pageStyleSheets[style_i].length > 0) 
    1947               html += "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + editor.config.pageStyleSheets[style_i] + "\">"; 
    1948             //html += "<style> @import url('" + editor.config.pageStyleSheets[style_i] + "'); </style>\n"; 
     1950          if(editor.config.pageStyleSheets[i].length > 0) 
     1951          { 
     1952              html += "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + editor.config.pageStyleSheets[i] + "\">"; 
     1953            //html += "<style> @import url('" + editor.config.pageStyleSheets[i] + "'); </style>\n"; 
     1954          } 
    19491955        } 
    19501956      } 
     
    19551961      html += "</html>"; 
    19561962    } else { 
    1957       var html = editor.inwardHtml(editor._textArea.value); 
     1963      html = editor.inwardHtml(editor._textArea.value); 
    19581964      if (html.match(HTMLArea.RE_doctype)) { 
    19591965        editor.setDoctype(RegExp.$1); 
     
    19741980  if(!this._doc.body) 
    19751981  { 
    1976     setTimeout(function() {editor.whenDocReady(doFunction)}, 50);  
     1982    setTimeout(function() { editor.whenDocReady(doFunction); }, 50); 
    19771983  } 
    19781984  else 
     
    19801986    doFunction(); 
    19811987  } 
    1982 } 
     1988}; 
    19831989 
    19841990// Switches editor mode; parameter can be "textmode" or "wysiwyg".  If no 
    19851991// parameter was passed this function toggles between modes. 
    19861992HTMLArea.prototype.setMode = function(mode) { 
     1993  var html; 
    19871994  if (typeof mode == "undefined") { 
    19881995    mode = ((this._editMode == "textmode") ? "wysiwyg" : "textmode"); 
     
    19901997  switch (mode) { 
    19911998    case "textmode": 
    1992     { 
    1993       var html = this.outwardHtml(this.getHTML()); 
     1999      html = this.outwardHtml(this.getHTML()); 
    19942000      this.setHTML(html); 
    19952001 
     
    20062012 
    20072013      this.notifyOf('modechange', {'mode':'text'}); 
    2008       break; 
    2009     } 
     2014    break; 
    20102015 
    20112016    case "wysiwyg": 
    2012     { 
    2013       var html = this.inwardHtml(this.getHTML()); 
     2017      html = this.inwardHtml(this.getHTML()); 
    20142018      this.deactivateEditor(); 
    20152019      this.setHTML(html); 
     
    20242028 
    20252029      this.notifyOf('modechange', {'mode':'wysiwyg'}); 
    2026       break; 
    2027     } 
     2030    break; 
    20282031 
    20292032    default: 
    2030     { 
    20312033      alert("Mode <" + mode + "> not defined!"); 
    20322034      return false; 
    2033     } 
    20342035  } 
    20352036  this._editMode = mode; 
     
    20372038  for (var i in this.plugins) { 
    20382039    var plugin = this.plugins[i].instance; 
    2039     if (plugin && typeof plugin.onMode == "function") plugin.onMode(mode); 
     2040    if (plugin && typeof plugin.onMode == "function") { plugin.onMode(mode); } 
    20402041  } 
    20412042}; 
     
    20512052  if (!HTMLArea.is_ie) { 
    20522053    if (html.match(HTMLArea.RE_head)) 
     2054    { 
    20532055      this._doc.getElementsByTagName("head")[0].innerHTML = RegExp.$1; 
     2056    } 
    20542057    if (html.match(HTMLArea.RE_body)) 
     2058    { 
    20552059      this._doc.getElementsByTagName("body")[0].innerHTML = RegExp.$1; 
     2060    } 
    20562061  } else { 
    20572062    var reac = this.editorIsActivated(); 
    2058     if(reac) this.deactivateEditor(); 
     2063    if(reac) { this.deactivateEditor(); } 
    20592064    var html_re = /<html>((.|\n)*?)<\/html>/i; 
    20602065    html = html.replace(html_re, "$1"); 
     
    20622067    this._doc.write(html); 
    20632068    this._doc.close(); 
    2064     if(reac) this.activateEditor(); 
     2069    if(reac) { this.activateEditor(); } 
    20652070    this.setEditorEvents(); 
    20662071    return true; 
     
    20922097        var plugin = editor.plugins[i].instance; 
    20932098        HTMLArea.refreshPlugin(plugin); 
    2094       }; 
     2099      } 
    20952100 
    20962101      // specific editor initialization 
     
    21122117  var plugin = arguments[0]; 
    21132118 
     2119  // @todo : try to avoid the use of eval() 
    21142120  // We can only register plugins that have been succesfully loaded 
    2115   if 
    2116   ( 
    2117     plugin == null 
     2121  if ( plugin === null 
    21182122    || typeof plugin == 'undefined' 
    21192123    || (typeof plugin == 'string' && eval('typeof ' + plugin) == 'undefined') 
    2120   ) return false; 
     2124  ) 
     2125  { 
     2126    return false; 
     2127  } 
    21212128 
    21222129  var args = []; 
    21232130  for (var i = 1; i < arguments.length; ++i) 
     2131  { 
    21242132    args.push(arguments[i]); 
     2133  } 
    21252134  return this.registerPlugin2(plugin, args); 
    21262135}; 
     
    21312140// parameters as in the opener window. 
    21322141HTMLArea.prototype.registerPlugin2 = function(plugin, args) { 
     2142  // @todo : try to avoid the use of eval() 
    21332143  if (typeof plugin == "string") 
     2144  { 
    21342145    plugin = eval(plugin); 
     2146  } 
    21352147  if (typeof plugin == "undefined") { 
    21362148    /* FIXME: This should never happen. But why does it do? */ 
     
    21422154    var info = plugin._pluginInfo; 
    21432155    for (var i in info) 
     2156    { 
    21442157      clone[i] = info[i]; 
     2158    } 
    21452159    clone.instance = obj; 
    21462160    clone.args = args; 
    21472161    this.plugins[plugin._pluginInfo.name] = clone; 
    21482162    return obj; 
    2149   } else 
     2163  } else { 
    21502164    alert("Can't register plugin " + plugin.toString() + "."); 
     2165  } 
    21512166}; 
    21522167 
     
    21592174 
    21602175HTMLArea.loadPlugin = function(pluginName, callback) { 
     2176  // @todo : try to avoid the use of eval() 
    21612177  // Might already be loaded 
    21622178  if(eval('typeof ' + pluginName) != 'undefined') 
     
    21822198  else 
    21832199  { 
    2184     document.write("<script type='text/javascript' src='" + plugin_file + "'></script>"); 
     2200    /** 
     2201    * @todo : try to avoid the use of document.write, it's evil 
     2202    * @todo : better yet, try to update HTMLArea._loadback to let it include 
     2203    *         the file without a callback function 
     2204    *  try 
     2205    *  { 
     2206    *    var head = document.getElementsByTagName('head')[0]; 
     2207    *    var script = document.createElement('script'); 
     2208    *    script.type = "text/javascript"; 
     2209    *    script.src = plugin_file; 
     2210    *    head.appendChild(script); 
     2211    *  } 
     2212    *  catch(ex) 
     2213    *  { 
     2214    *    document.write('<script type="text/javascript" src="' + plugin_file + '"></script>'); 
     2215    *  } 
     2216    */ 
     2217    document.write('<script type="text/javascript" src="' + plugin_file + '"></script>'); 
    21852218  } 
    21862219  return false; 
     
    22032236          function(plugin) 
    22042237          { 
     2238            // @todo : try to avoid the use of eval() 
    22052239            if(eval('typeof ' + plugin) != 'undefined') 
    22062240            { 
     
    22282262        break; 
    22292263 
    2230         case 'loading': 
     2264        //case 'loading': 
    22312265        default       : 
    22322266         retVal = false; 
     
    22362270  } 
    22372271 
    2238   if(retVal) return true; // All done, just return 
     2272  if(retVal) { return true; } // All done, just return 
    22392273 
    22402274  // Waiting on plugins to load, return false now and come back a bit later 
     
    22422276  if(callbackIfNotReady) 
    22432277  { 
    2244     setTimeout(function() { if(HTMLArea.loadPlugins(plugins, callbackIfNotReady)) callbackIfNotReady(); }, 150); 
     2278    setTimeout(function() { if(HTMLArea.loadPlugins(plugins, callbackIfNotReady)) { callbackIfNotReady(); } }, 150); 
    22452279  } 
    22462280  return retVal; 
     
    22502284HTMLArea.refreshPlugin = function(plugin) { 
    22512285  if (plugin && typeof plugin.onGenerate == "function") 
     2286  { 
    22522287    plugin.onGenerate(); 
     2288  } 
    22532289  if (plugin && typeof plugin.onGenerateOnce == "function") { 
    22542290    plugin.onGenerateOnce(); 
     
    22642300  url += style; 
    22652301  if (/^\//.test(style)) 
     2302  { 
    22662303    url = style; 
     2304  } 
    22672305  var head = document.getElementsByTagName("head")[0]; 
    22682306  var link = document.createElement("link"); 
     
    22852323  function debug(indent, str) { 
    22862324    for (; --indent >= 0;) 
     2325    { 
    22872326      ta.value += " "; 
     2327    } 
    22882328    ta.value += str + "\n"; 
    22892329  } 
     
    22932333    debug(level, "- " + tag + " [" + ns + "]"); 
    22942334    for (i = root.firstChild; i; i = i.nextSibling) 
     2335    { 
    22952336      if (i.nodeType == 1) 
     2337      { 
    22962338        _dt(i, level + 2); 
     2339      } 
     2340    } 
    22972341  } 
    22982342  _dt(this._doc.body, 0); 
     
    23042348  for (i = el.firstChild; i; i = i.nextSibling) { 
    23052349    if (i.nodeType == 3) 
     2350    { 
    23062351      txt += i.data; 
     2352    } 
    23072353    else if (i.nodeType == 1) 
     2354    { 
    23082355      txt += HTMLArea.getInnerText(i); 
     2356    } 
    23092357  } 
    23102358  return txt; 
     
    23312379    var txt = "HTMLArea word cleaner stats: \n\n"; 
    23322380    for (var i in stats) 
     2381    { 
    23332382      if (stats_txt[i]) 
     2383      { 
    23342384        txt += stats_txt[i] + stats[i] + "\n"; 
     2385      } 
     2386    } 
    23352387    txt += "\nInitial document length: " + stats.orig_len + "\n"; 
    23362388    txt += "Final document length: " + editor._doc.body.innerHTML.length + "\n"; 
     
    23422394    if (newc != node.className) { 
    23432395      node.className = newc; 
    2344       if (!/\S/.test(node.className)) { 
     2396      if (!(/\S/.test(node.className))) { 
    23452397        node.removeAttribute("className"); 
    23462398        ++stats.mso_class; 
     
    23512403    var declarations = node.style.cssText.split(/\s*;\s*/); 
    23522404    for (var i = declarations.length; --i >= 0;) 
    2353       if (/^mso|^tab-stops/i.test(declarations[i]) || 
    2354           /^margin\s*:\s*0..\s+0..\s+0../i.test(declarations[i])) { 
     2405    { 
     2406      if ((/^mso|^tab-stops/i.test(declarations[i])) || 
     2407          (/^margin\s*:\s*0..\s+0..\s+0../i.test(declarations[i]))) 
     2408      { 
    23552409        ++stats.mso_style; 
    23562410        declarations.splice(i, 1); 
    23572411      } 
     2412    } 
    23582413    node.style.cssText = declarations.join("; "); 
    23592414  } 
     2415  var stripTag = null; 
    23602416  if (HTMLArea.is_ie) 
    23612417  { 
    2362     function stripTag(el) 
     2418    stripTag = function(el) 
    23632419    { 
    23642420      el.outerHTML = HTMLArea.htmlEncode(el.innerText); 
    23652421      ++stats.mso_xmlel; 
    2366     } 
     2422    }; 
    23672423  } 
    23682424  else 
    23692425  { 
    2370     function stripTag(el) 
     2426    stripTag = function(el) 
    23712427    { 
    23722428      var txt = document.createTextNode(HTMLArea.getInnerText(el)); 
     
    23742430      HTMLArea.removeFromParent(el); 
    23752431      ++stats.mso_xmlel; 
    2376     } 
     2432    }; 
    23772433  } 
    23782434  function checkEmpty(el) { 
     2435    // @todo : check if this is quicker 
     2436    //  if (!['A','SPAN','B','STRONG','I','EM','FONT'].contains(el.tagName) && !el.firstChild) 
    23792437    if (/^(a|span|b|strong|i|em|font)$/i.test(el.tagName) && 
    23802438        !el.firstChild) { 
     
    23852443  function parseTree(root) { 
    23862444    var tag = root.tagName.toLowerCase(), i, next; 
    2387     if ((HTMLArea.is_ie && root.scopeName != 'HTML') || (!HTMLArea.is_ie && /:/.test(tag))) { 
     2445    // @todo : probably better to use String.indexOf() instead of this ugly regex 
     2446    // if ((HTMLArea.is_ie && root.scopeName != 'HTML') || (!HTMLArea.is_ie && tag.indexOf(':') !== -1)) { 
     2447    if ((HTMLArea.is_ie && root.scopeName != 'HTML') || (!HTMLArea.is_ie && (/:/.test(tag)))) { 
    23882448      stripTag(root); 
    23892449      return false; 
     
    23942454        next = i.nextSibling; 
    23952455        if (i.nodeType == 1 && parseTree(i)) 
     2456        { 
    23962457          checkEmpty(i); 
     2458        } 
    23972459      } 
    23982460    } 
     
    24622524        } 
    24632525      } catch (e) {} break; 
    2464       case "textmode": try { this._textArea.focus() } catch (e) {} break; 
     2526      case "textmode": try { this._textArea.focus(); } catch (e) {} break; 
    24652527      default      : alert("ERROR: mode " + this._editMode + " is not defined"); 
    24662528  } 
     
    24802542  var txt = this.getInnerHTML(); 
    24812543  if (this._undoPos > 0) 
     2544  { 
    24822545    take = (this._undoQueue[this._undoPos - 1] != txt); 
     2546  } 
    24832547  if (take) { 
    24842548    this._undoQueue[this._undoPos] = txt; 
     
    24912555  if (this._undoPos > 0) { 
    24922556    var txt = this._undoQueue[--this._undoPos]; 
    2493     if (txt) this.setHTML(txt); 
    2494     else ++this._undoPos; 
     2557    if (txt) { this.setHTML(txt); } 
     2558    else { ++this._undoPos; } 
    24952559  } 
    24962560}; 
     
    24992563  if (this._undoPos < this._undoQueue.length - 1) { 
    25002564    var txt = this._undoQueue[++this._undoPos]; 
    2501     if (txt) this.setHTML(txt); 
    2502     else --this._undoPos; 
     2565    if (txt) { this.setHTML(txt); } 
     2566    else { --this._undoPos; } 
    25032567  } 
    25042568}; 
     
    25062570HTMLArea.prototype.disableToolbar = function(except) 
    25072571{ 
    2508   if(this._timerToolbar) clearTimeout(this._timerToolbar); 
     2572  if(this._timerToolbar) { clearTimeout(this._timerToolbar); } 
    25092573  if(typeof except == 'undefined') 
    25102574  { 
     
    25232587      continue; 
    25242588    } 
    2525     if (typeof(btn.state) != 'function') continue;  // prevent iterating over wrong type 
     2589    if (typeof(btn.state) != 'function') { continue; }  // prevent iterating over wrong type 
    25262590    btn.state("enabled", false); 
    25272591  } 
     
    25402604   for(var i = 0; i < haystack.length; i++) 
    25412605    { 
    2542       if(needle == haystack[i]) return true; 
     2606      if(needle == haystack[i]) { return true; } 
    25432607    } 
    25442608 
     
    25542618    for(var i = 0; i < haystack.length; i++) 
    25552619    { 
    2556       if(needle == haystack[i]) return i; 
     2620      if(needle == haystack[i]) { return i; } 
    25572621    } 
    25582622 
     
    25612625} 
    25622626 
    2563  
     2627// FIXME : this function needs to be splitted in more functions. 
     2628// It is actually to heavy to be understable and very scary to manipulate 
    25642629// updates enabled/disable/active state of the toolbar elements 
    25652630HTMLArea.prototype.updateToolbar = function(noStatus) { 
     
    26082673        a.appendChild(document.createTextNode(txt)); 
    26092674        this._statusBarTree.appendChild(a); 
    2610         if (i != 0) { 
     2675        if (i !== 0) { 
    26112676          this._statusBarTree.appendChild(document.createTextNode(String.fromCharCode(0xbb))); 
    26122677        } 
     
    26152680  } 
    26162681 
    2617   for (var i in this._toolbarObjects) { 
    2618     var btn = this._toolbarObjects[i]; 
    2619     var cmd = i; 
     2682  for (var cmd in this._toolbarObjects) { 
     2683    var btn = this._toolbarObjects[cmd]; 
    26202684    var inContext = true; 
    2621     if (typeof(btn.state) != 'function') continue;  // prevent iterating over wrong type 
     2685    if (typeof(btn.state) != 'function') { continue; }  // prevent iterating over wrong type 
    26222686    if (btn.context && !text) { 
    26232687      inContext = false; 
     
    26612725    switch (cmd) 
    26622726    { 
    2663         case "fontname": 
    2664         case "fontsize": 
    2665       { 
    2666       if (!text) try { 
    2667         var value = ("" + doc.queryCommandValue(cmd)).toLowerCase(); 
    2668         if (!value) { 
    2669           btn.element.selectedIndex = 0; 
    2670           break; 
    2671         } 
    2672  
    2673         // HACK -- retrieve the config option for this 
    2674         // combo box.  We rely on the fact that the 
    2675         // variable in config has the same name as 
    2676         // button name in the toolbar. 
    2677         var options = this.config[cmd]; 
    2678         var k = 0; 
    2679           for (var j in options) 
     2727      case "fontname": 
     2728      case "fontsize": 
     2729        if (!text) 
     2730        { 
     2731          try 
    26802732          { 
    2681           // FIXME: the following line is scary. 
    2682             if ((j.toLowerCase() == value) || (options[j].substr(0, value.length).toLowerCase() == value)) 
     2733            var value = ("" + doc.queryCommandValue(cmd)).toLowerCase(); 
     2734            if (!value) 
    26832735            { 
    2684             btn.element.selectedIndex = k; 
    2685             throw "ok"; 
    2686           } 
    2687           ++k; 
    2688         } 
    2689         btn.element.selectedIndex = 0; 
    2690       } catch(e) {}; 
    2691       } 
     2736              btn.element.selectedIndex = 0; 
     2737              break; 
     2738            } 
     2739 
     2740            // HACK -- retrieve the config option for this 
     2741            // combo box.  We rely on the fact that the 
     2742            // variable in config has the same name as 
     2743            // button name in the toolbar. 
     2744            var options = this.config[cmd]; 
     2745            var sIndex = 0; 
     2746            for (var j in options) 
     2747            { 
     2748            // FIXME: the following line is scary. 
     2749              if ((j.toLowerCase() == value) || (options[j].substr(0, value.length).toLowerCase() == value)) 
     2750              { 
     2751                btn.element.selectedIndex = sIndex; 
     2752                throw "ok"; 
     2753              } 
     2754              ++sIndex; 
     2755            } 
     2756            btn.element.selectedIndex = 0; 
     2757          } catch(ex) {} 
     2758        } 
    26922759      break; 
    26932760 
     
    26962763      //  things like 'heading 1' for 'h1', which breaks things if you want 
    26972764      //  to call your heading blocks 'header 1'.  Stupid MS. 
    2698       case "formatblock"  : 
    2699       { 
    2700         var blocks = [ ]; 
    2701         for(var i in this.config['formatblock']) 
     2765      case "formatblock": 
     2766        var blocks = []; 
     2767        for(var indexBlock in this.config.formatblock) 
    27022768        { 
    2703           if (typeof(this.config['formatblock'][i]) == 'string')  // prevent iterating over wrong type 
     2769          if (typeof(this.config.formatblock[indexBlock]) == 'string')  // prevent iterating over wrong type 
    27042770          { 
    2705             blocks[blocks.length] = this.config['formatblock'][i]; 
     2771            blocks[blocks.length] = this.config.formatblock[indexBlock]; 
    27062772          } 
    27072773        } 
     
    27102776        if(deepestAncestor) 
    27112777        { 
    2712           for(var x= 0; x < blocks.length; x++) 
     2778          for(var x = 0; x < blocks.length; x++) 
    27132779          { 
    27142780            if(blocks[x].toLowerCase() == deepestAncestor.tagName.toLowerCase()) 
     
    27222788          btn.element.selectedIndex = 0; 
    27232789        } 
    2724       } 
    2725         break; 
    2726  
    2727         case "textindicator": 
    2728       if (!text) { 
    2729         try {with (btn.element.style) { 
    2730           backgroundColor = HTMLArea._makeColor( 
    2731             doc.queryCommandValue(HTMLArea.is_ie ? "backcolor" : "hilitecolor")); 
    2732           if (/transparent/i.test(backgroundColor)) { 
    2733             // Mozilla 
    2734             backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("backcolor")); 
     2790      break; 
     2791 
     2792      case "textindicator": 
     2793        if (!text) 
     2794        { 
     2795          try 
     2796          { 
     2797            var style = btn.element.style; 
     2798            style.backgroundColor = HTMLArea._makeColor(doc.queryCommandValue(HTMLArea.is_ie ? "backcolor" : "hilitecolor")); 
     2799            if (/transparent/i.test(style.backgroundColor)) 
     2800            { 
     2801              // Mozilla 
     2802              style.backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("backcolor")); 
     2803            } 
     2804            style.color = HTMLArea._makeColor(doc.queryCommandValue("forecolor")); 
     2805            style.fontFamily = doc.queryCommandValue("fontname"); 
     2806            style.fontWeight = doc.queryCommandState("bold") ? "bold" : "normal"; 
     2807            style.fontStyle = doc.queryCommandState("italic") ? "italic" : "normal"; 
     2808          } catch (e) { 
     2809            // alert(e + "\n\n" + cmd); 
    27352810          } 
    2736           color = HTMLArea._makeColor(doc.queryCommandValue("forecolor")); 
    2737           fontFamily = doc.queryCommandValue("fontname"); 
    2738           fontWeight = doc.queryCommandState("bold") ? "bold" : "normal"; 
    2739           fontStyle = doc.queryCommandState("italic") ? "italic" : "normal"; 
    2740         }} catch (e) { 
    2741           // alert(e + "\n\n" + cmd); 
    2742         } 
    2743       } 
     2811        } 
    27442812      break; 
    2745         case "htmlmode": btn.state("active", text); break; 
    2746         case "lefttoright": 
    2747         case "righttoleft": 
    2748       var el = this.getParentElement(); 
    2749       while (el && !HTMLArea.isBlockElement(el)) 
    2750         el = el.parentNode; 
    2751       if (el) 
    2752         btn.state("active", (el.style.direction == ((cmd == "righttoleft") ? "rtl" : "ltr"))); 
     2813 
     2814      case "htmlmode": 
     2815        btn.state("active", text); 
    27532816      break; 
    2754         default: 
    2755       cmd = cmd.replace(/(un)?orderedlist/i, "insert$1orderedlist"); 
    2756       try { 
    2757         btn.state("active", (!text && doc.queryCommandState(cmd))); 
    2758       } catch (e) {} 
     2817 
     2818      case "lefttoright": 
     2819      case "righttoleft": 
     2820        var eltBlock = this.getParentElement(); 
     2821        while (eltBlock && !HTMLArea.isBlockElement(eltBlock)) 
     2822        { 
     2823          eltBlock = eltBlock.parentNode; 
     2824        } 
     2825        if (eltBlock) 
     2826        { 
     2827          btn.state("active", (eltBlock.style.direction == ((cmd == "righttoleft") ? "rtl" : "ltr"))); 
     2828        } 
     2829      break; 
     2830 
     2831      default: 
     2832        cmd = cmd.replace(/(un)?orderedlist/i, "insert$1orderedlist"); 
     2833        try { 
     2834          btn.state("active", (!text && doc.queryCommandState(cmd))); 
     2835        } catch (e) {} 
     2836      break; 
    27592837    } 
    27602838  } 
     
    27752853  //  original problem was I was trying to solve with it.  I think perhaps that EnterParagraphs 
    27762854  //  might solve the problem, whatever the hell it was.  I'm going senile, I'm sure. 
     2855  // @todo : since this part is disabled since a long time, does it still need to be in the source ? 
    27772856  if(0 && HTMLArea.is_gecko) 
    27782857  { 
     
    28062885 
    28072886  // check if any plugins have registered refresh handlers 
    2808   for (var i in this.plugins) { 
    2809     var plugin = this.plugins[i].instance; 
     2887  for (var indexPlugin in this.plugins) 
     2888  { 
     2889    var plugin = this.plugins[indexPlugin].instance; 
    28102890    if (plugin && typeof plugin.onUpdateToolbar == "function") 
     2891    { 
    28112892      plugin.onUpdateToolbar(); 
     2893    } 
    28122894  } 
    28132895 
     
    28292911    var node = range.startContainer; 
    28302912    var pos = range.startOffset; 
     2913    var selnode = toBeInserted; 
    28312914    switch (node.nodeType) 
    28322915    { 
     
    28452928        { 
    28462929          node = node.splitText(pos); 
    2847           var selnode = toBeInserted; 
    28482930          if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) 
    28492931          { 
     
    28562938      break; 
    28572939      case 1: // Node.ELEMENT_NODE 
    2858         var selnode = toBeInserted; 
    28592940        if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) 
    28602941        { 
     
    29713052{ 
    29723053  var prnt = this._activeElement(sel); 
    2973   if(prnt == null) 
     3054  if(prnt === null) 
    29743055  { 
    29753056    try 
     
    29923073    if(prnt.nodeType == 1) 
    29933074    { 
    2994       if(types == null) return prnt; 
     3075      if(types === null) { return prnt; } 
    29953076      if(types.contains(prnt.tagName.toLowerCase())) 
    29963077      { 
     
    29983079        return prnt; 
    29993080      } 
    3000       if(prnt.tagName.toLowerCase() == 'body') break; 
    3001       if(prnt.tagName.toLowerCase() == 'table') break; 
     3081      if(prnt.tagName.toLowerCase() == 'body') { break; } 
     3082      if(prnt.tagName.toLowerCase() == 'table') { break; } 
    30023083    } 
    30033084    prnt = prnt.parentNode; 
     
    30183099  HTMLArea.prototype._activeElement = function(sel) 
    30193100  { 
    3020     if((sel == null) || this._selectionEmpty(sel)) 
     3101    if((sel === null) || this._selectionEmpty(sel)) 
    30213102    { 
    30223103      return null; 
     
    30673148  HTMLArea.prototype._activeElement = function(sel) 
    30683149  { 
    3069     if((sel == null) || this._selectionEmpty(sel)) 
     3150    if((sel === null) || this._selectionEmpty(sel)) 
    30703151    { 
    30713152      return null; 
     
    31033184    } 
    31043185 
    3105     return this._createRange(sel).htmlText == ''; 
     3186    return this._createRange(sel).htmlText === ''; 
    31063187  }; 
    31073188} 
     
    31943275{ 
    31953276  var ancestors = this.getAllAncestors(); 
    3196   var apply_to = null; 
    3197  
     3277  var apply_to, x = null; 
    31983278  // Block format can be a tag followed with class defs 
    31993279  //  eg div.blue.left 
     
    32033283  if(block_format.indexOf('.') >= 0) 
    32043284  { 
    3205     target_tag = block_format.substr(0, block_format.indexOf('.')).toLowerCase();; 
    3206  
     3285    target_tag = block_format.substr(0, block_format.indexOf('.')).toLowerCase(); 
    32073286    target_classNames = block_format.substr(block_format.indexOf('.'), block_format.length - block_format.indexOf('.')).replace(/\./g, '').replace(/^\s*/, '').replace(/\s*$/, '').split(' '); 
    32083287  } 
     
    32143293  var sel = this._getSelection(); 
    32153294  var rng = this._createRange(sel); 
    3216   var apply_to = null; 
    32173295 
    32183296  if(HTMLArea.is_gecko) 
     
    32223300      // With no selection we want to apply to the whole contents of the ancestor block 
    32233301      apply_to = this._getAncestorBlock(sel); 
    3224       if(apply_to == null) 
     3302      if(apply_to === null) 
    32253303      { 
    32263304        // If there wasn't an ancestor, make one. 
     
    32343312      { 
    32353313 
    3236         case 'h1'      : 
    3237         case 'h2'      : 
    3238         case 'h3'      : 
    3239         case 'h4'      : 
    3240         case 'h5'      : 
    3241         case 'h6'      : 
    3242         case 'h7'      : 
     3314        case 'h1': 
     3315        case 'h2': 
     3316        case 'h3': 
     3317        case 'h4': 
     3318        case 'h5': 
     3319        case 'h6': 
     3320        case 'h7': 
    32433321          apply_to = [ ]; 
    32443322          var search_tags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7']; 
    32453323          for(var y = 0; y < search_tags.length; y++) 
    32463324          { 
    3247             var headers = this._doc.getElementsByTagName(search_tag[y]); 
    3248             for(var x = 0; x < headers.length; x++) 
     3325            var headers = this._doc.getElementsByTagName(search_tags[y]); 
     3326            for(x = 0; x < headers.length; x++) 
    32493327            { 
    32503328              if(sel.containsNode(headers[x])) 
     
    32543332            } 
    32553333          } 
    3256           if(apply_to.length > 0) break; 
     3334          if(apply_to.length > 0) { break; } 
    32573335          // If there wern't any in the selection drop through 
    3258         case 'div' : 
     3336        case 'div': 
    32593337          apply_to = this._doc.createElement(target_tag); 
    32603338          apply_to.appendChild(rng.extractContents()); 
    32613339          rng.insertNode(apply_to); 
    3262           break; 
    3263  
    3264         case 'p'   : 
    3265         case 'center'  : 
    3266         case 'pre' : 
    3267         case 'ins' : 
    3268         case 'del' : 
    3269         case 'blockquote' : 
    3270         case 'address'    : 
     3340        break; 
     3341 
     3342        case 'p': 
     3343        case 'center': 
     3344        case 'pre': 
     3345        case 'ins': 
     3346        case 'del': 
     3347        case 'blockquote': 
     3348        case 'address': 
    32713349          apply_to = [ ]; 
    32723350          var paras = this._doc.getElementsByTagName(target_tag); 
    3273           for(var x = 0; x < paras.length; x++) 
     3351          for(x = 0; x < paras.length; x++) 
    32743352          { 
    32753353            if(sel.containsNode(paras[x])) 
     
    32793357          } 
    32803358 
    3281           if(apply_to.length == 0) 
     3359          if(apply_to.length === 0) 
    32823360          { 
    32833361            sel.collapseToStart(); 
    32843362            return this._formatBlock(block_format); 
    32853363          } 
    3286           break; 
     3364        break; 
    32873365      } 
    32883366    } 
     
    34073485HTMLArea.prototype.hasSelectedText = function() { 
    34083486  // FIXME: come _on_ mishoo, you can do better than this ;-) 
    3409   return this.getSelectedHTML() != ''; 
     3487  return this.getSelectedHTML() !== ''; 
    34103488}; 
    34113489 
     
    34163494    link = this.getParentElement(); 
    34173495    if (link) { 
    3418       while (link && !/^a$/i.test(link.tagName)) 
     3496      while (link && link.tagName.toLowerCase() != 'a') 
     3497      { 
    34193498        link = link.parentNode; 
     3499      } 
    34203500    } 
    34213501  } 
     
    34363516      compare = range.compareBoundaryPoints(range.START_TO_END, range); 
    34373517    } 
    3438     if (compare == 0) { 
     3518    if (compare === 0) { 
    34393519      alert(HTMLArea._lc("You need to select some text before creating a link")); 
    34403520      return; 
     
    34463526      f_usetarget : editor.config.makeLinkShowsTarget 
    34473527    }; 
    3448   } else 
     3528  } else { 
    34493529    outparam = { 
    34503530      f_href   : HTMLArea.is_ie ? editor.stripBaseURL(link.href) : link.getAttribute("href"), 
     
    34533533      f_usetarget : editor.config.makeLinkShowsTarget 
    34543534    }; 
    3455   this._popupDialog(editor.config.URIs["link"], function(param) { 
    3456     if (!param) 
     3535  } 
     3536  this._popupDialog(editor.config.URIs.link, function(param) { 
     3537    if (!param) { 
    34573538      return false; 
     3539    } 
    34583540    var a = link; 
    3459     if (!a) try { 
     3541    if (!a) { try { 
    34603542      editor._doc.execCommand("createlink", false, param.f_href); 
    34613543      a = editor.getParentElement(); 
     
    34643546      if (!HTMLArea.is_ie) { 
    34653547        a = range.startContainer; 
    3466         if (!/^a$/i.test(a.tagName)) { 
     3548        if (a.tagName.toLowerCase() != 'a') { 
    34673549          a = a.nextSibling; 
    3468           if (a == null) 
     3550          if (a === null) 
     3551          { 
    34693552            a = range.startContainer.parentNode; 
     3553          } 
    34703554        } 
    34713555      } 
    34723556    } catch(e) {} 
    3473     else { 
     3557    } else { 
    34743558      var href = param.f_href.trim(); 
    34753559      editor.selectNodeContents(a); 
    3476       if (href == "") { 
     3560      if (href === '') { 
    34773561        editor._doc.execCommand("unlink", false, null); 
    34783562        editor.updateToolbar(); 
     
    34833567      } 
    34843568    } 
    3485     if (!(a && /^a$/i.test(a.tagName))) 
     3569    if (!(a && a.tagName.toLowerCase() == 'a')) { 
    34863570      return false; 
     3571    } 
    34873572    a.target = param.f_target.trim(); 
    34883573    a.title = param.f_title.trim(); 
     
    34993584  if (typeof image == "undefined") { 
    35003585    image = this.getParentElement(); 
    3501     if (image && !/^img$/i.test(image.tagName)) 
     3586    if (image && image.tagName.toLowerCase() != 'img') { 
    35023587      image = null; 
    3503   } 
    3504   if (image) outparam = { 
    3505     f_base   : editor.config.baseHref, 
    3506     f_url    : HTMLArea.is_ie ? editor.stripBaseURL(image.src) : image.getAttribute("src"), 
    3507     f_alt    : image.alt, 
    3508     f_border : image.border, 
    3509     f_align  : image.align, 
    3510     f_vert   : image.vspace, 
    3511     f_horiz  : image.hspace 
    3512   }; 
    3513   this._popupDialog(editor.config.URIs["insert_image"], function(param) { 
     3588    } 
     3589  } 
     3590  if (image) 
     3591  { 
     3592    outparam = { 
     3593      f_base   : editor.config.baseHref, 
     3594      f_url    : HTMLArea.is_ie ? editor.stripBaseURL(image.src) : image.getAttribute("src"), 
     3595      f_alt    : image.alt, 
     3596      f_border : image.border, 
     3597      f_align  : image.align, 
     3598      f_vert   : image.vspace, 
     3599      f_horiz  : image.hspace 
     3600    }; 
     3601  } 
     3602  this._popupDialog(editor.config.URIs.insert_image, function(param) { 
    35143603    if (!param) {       // user must have pressed Cancel 
    35153604      return false; 
     
    35433632      switch (field) { 
    35443633          case "f_alt"    : img.alt      = value; break; 
    3545           case "f_border" : img.border = parseInt(value || "0"); break; 
     3634          case "f_border" : img.border = parseInt(value || "0", 10); break; 
    35463635          case "f_align"  : img.align    = value; break; 
    3547           case "f_vert"   : img.vspace = parseInt(value || "0"); break; 
    3548           case "f_horiz"  : img.hspace = parseInt(value || "0"); break; 
     3636          case "f_vert"   : img.vspace = parseInt(value || "0", 10); break; 
     3637          case "f_horiz"  : img.hspace = parseInt(value || "0", 10); break; 
    35493638      } 
    35503639    } 
     
    35573646  var range = this._createRange(sel); 
    35583647  var editor = this;    // for nested functions 
    3559   this._popupDialog(editor.config.URIs["insert_table"], function(param) { 
     3648  this._popupDialog(editor.config.URIs.insert_table, function(param) { 
    35603649    if (!param) {       // user must have pressed Cancel 
    35613650      return false; 
     
    35723661      } 
    35733662      switch (field) { 
    3574           case "f_width"   : table.style.width = value + param["f_unit"]; break; 
     3663          case "f_width"   : table.style.width = value + param.f_unit; break; 
    35753664          case "f_align"   : table.align         = value; break; 
    3576           case "f_border"  : table.border        = parseInt(value); break; 
    3577           case "f_spacing" : table.cellSpacing = parseInt(value); break; 
    3578           case "f_padding" : table.cellPadding = parseInt(value); break; 
     3665          case "f_border"  : table.border        = parseInt(value, 10); break; 
     3666          case "f_spacing" : table.cellSpacing = parseInt(value, 10); break; 
     3667          case "f_padding" : table.cellPadding = parseInt(value, 10); break; 
    35793668      } 
    35803669    } 
    35813670    var cellwidth = 0; 
    3582     if (param.f_fixed) 
    3583       cellwidth = Math.floor(100 / parseInt(param.f_cols)); 
     3671    if (param.f_fixed) { 
     3672      cellwidth = Math.floor(100 / parseInt(param.f_cols, 10)); 
     3673    } 
    35843674    var tbody = doc.createElement("tbody"); 
    35853675    table.appendChild(tbody); 
    3586     for (var i = 0; i < param["f_rows"]; ++i) { 
     3676    for (var i = 0; i < param.f_rows; ++i) { 
    35873677      var tr = doc.createElement("tr"); 
    35883678      tbody.appendChild(tr); 
    3589       for (var j = 0; j < param["f_cols"]; ++j) { 
     3679      for (var j = 0; j < param.f_cols; ++j) { 
    35903680        var td = doc.createElement("td"); 
    3591         if (cellwidth) 
     3681        // @todo : check if this line doesnt stop us to use pixel width in cells 
     3682        if (cellwidth) { 
    35923683          td.style.width = cellwidth + "%"; 
     3684        } 
    35933685        tr.appendChild(td); 
    35943686        // Browsers like to see something inside the cell (&nbsp;). 
     
    36343726}; 
    36353727 
     3728/** 
     3729 * Open a popup to select the hilitecolor or forecolor 
     3730 * 
     3731 * @param {String} cmdID The commande ID (hilitecolor or forecolor) 
     3732 * @private 
     3733 */ 
     3734HTMLArea.prototype._colorSelector = function(cmdID) 
     3735{ 
     3736  var editor = this;    // for nested functions 
     3737  if (cmdID == 'hilitecolor') 
     3738  { 
     3739    if (HTMLArea.is_ie) { cmdID = 'backcolor'; } 
     3740    // @todo : useCSS is deprecated, see ticket #619 
     3741    if (HTMLArea.is_gecko) { try { editor._doc.execCommand('useCSS', false, false); } catch (e) {} } //switch on useCSS (mozilla bug #279330) 
     3742  } 
     3743  this._popupDialog(editor.config.URIs.select_color, function(color) { 
     3744    if (color) { // selection not canceled 
     3745      editor._doc.execCommand(cmdID, false, "#" + color); 
     3746    } 
     3747  }, HTMLArea._colorToRgb(this._doc.queryCommandValue(cmdID))); 
     3748}; 
     3749 
    36363750// the execCommand function (intercepts some commands and replaces them with 
    36373751// our own implementation) 
     
    36403754  this.focusEditor(); 
    36413755  cmdID = cmdID.toLowerCase(); 
    3642   if (HTMLArea.is_gecko) try { this._doc.execCommand('useCSS', false, true); } catch (e) {}; //switch useCSS off (true=off) 
     3756  // @todo : useCSS is deprecated, see ticket #619 
     3757  if (HTMLArea.is_gecko) { try { this._doc.execCommand('useCSS', false, true); } catch (e) {} } //switch useCSS off (true=off) 
    36433758  switch (cmdID) { 
    36443759    case "htmlmode" : this.setMode(); break; 
     3760 
    36453761    case "hilitecolor": 
    3646       (HTMLArea.is_ie) && (cmdID = "backcolor"); 
    3647       if (HTMLArea.is_gecko) try { editor._doc.execCommand('useCSS', false, false); } catch (e) {};//switch on useCSS (mozilla bug #279330) 
    36483762    case "forecolor": 
    3649       this._popupDialog(editor.config.URIs["select_color"], function(color) { 
    3650         if (color) { // selection not canceled 
    3651           editor._doc.execCommand(cmdID, false, "#" + color); 
    3652         } 
    3653       }, HTMLArea._colorToRgb(this._doc.queryCommandValue(cmdID))); 
    3654       break; 
     3763      this._colorSelector(cmdID); 
     3764    break; 
     3765 
    36553766    case "createlink": 
    36563767      this._createLink(); 
     
    36593770      case "redo": 
    36603771    if (this._customUndo) 
     3772    { 
    36613773      this[cmdID](); 
     3774    } 
    36623775    else 
     3776    { 
    36633777      this._doc.execCommand(cmdID, UI, param); 
     3778    } 
    36643779    break; 
    36653780      case "inserttable": this._insertTable(); break; 
    36663781      case "insertimage": this._insertImage(); break; 
    3667       case "about"    : this._popupDialog(editor.config.URIs["about"], null, this); break; 
    3668       case "showhelp" : this._popupDialog(editor.config.URIs["help"], null, this); break; 
     3782      case "about"    : this._popupDialog(editor.config.URIs.about, null, this); break; 
     3783      case "showhelp" : this._popupDialog(editor.config.URIs.help, null, this); break; 
    36693784 
    36703785      case "killword": this._wordClean(); break; 
     
    36753790    try { 
    36763791      this._doc.execCommand(cmdID, UI, param); 
    3677       if (this.config.killWordOnPaste) 
     3792      if (this.config.killWordOnPaste) { 
    36783793        this._wordClean(); 
     3794      } 
    36793795    } catch (e) { 
    36803796      if (HTMLArea.is_gecko) { 
     
    36873803    var dir = (cmdID == "righttoleft") ? "rtl" : "ltr"; 
    36883804    var el = this.getParentElement(); 
    3689     while (el && !HTMLArea.isBlockElement(el)) 
     3805    while (el && !HTMLArea.isBlockElement(el)) { 
    36903806      el = el.parentNode; 
     3807    } 
    36913808    if (el) { 
    36923809      if (el.style.direction == dir) 
     3810      { 
    36933811        el.style.direction = ""; 
     3812      } 
    36943813      else 
     3814      { 
    36953815        el.style.direction = dir; 
     3816      } 
    36963817    } 
    36973818    break; 
     
    37053826 
    37063827/** A generic event handler for things that happen in the IFRAME's document. 
     3828 * @todo: this function is *TOO* generic, it needs to be splitted in more specific handlers 
    37073829 * This function also handles key bindings. */ 
    37083830HTMLArea.prototype._editorEvent = function(ev) { 
     
    37323854      var plugin = editor.plugins[i].instance; 
    37333855      if (plugin && typeof plugin.onKeyPress == "function") 
     3856      { 
    37343857        if (plugin.onKeyPress(ev)) 
     3858        { 
    37353859          return false; 
     3860        } 
     3861      } 
    37363862    } 
    37373863  } 
     
    37833909      cmd = "formatblock"; 
    37843910      value = "h" + key; 
    3785       if (HTMLArea.is_ie) 
     3911      if (HTMLArea.is_ie) { 
    37863912        value = "<" + value + ">"; 
     3913      } 
    37873914      break; 
    37883915    } 
     
    38013928    if(HTMLArea.is_gecko) 
    38023929    { 
    3803       var s = editor._getSelection() 
     3930      var s = editor._getSelection(); 
    38043931      var autoWrap = function (textNode, tag) 
    38053932      { 
    38063933        var rightText = textNode.nextSibling; 
    3807         if(typeof tag == 'string') tag = editor._doc.createElement(tag); 
     3934        if(typeof tag == 'string') { tag = editor._doc.createElement(tag); } 
    38083935        var a = textNode.parentNode.insertBefore(tag, rightText); 
    38093936        HTMLArea.removeFromParent(textNode); 
     
    38313958          editor._unLink = null; 
    38323959          editor._unlinkOnUndo = false; 
    3833         } 
     3960        }; 
    38343961        editor._unlinkOnUndo = true; 
    38353962 
     
    38423969        // and link it appropriatly 
    38433970        case 32: 
    3844         { 
    38453971          if(s && s.isCollapsed && s.anchorNode.nodeType == 3 && s.anchorNode.data.length > 3 && s.anchorNode.data.indexOf('.') >= 0) 
    38463972          { 
    38473973            var midStart = s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/); 
    3848             if(midStart == -1) break; 
     3974            if(midStart == -1) { break; } 
    38493975 
    38503976            if(this._getFirstAncestor(s, 'a')) 
     
    38553981            var matchData = s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/, '$1'); 
    38563982 
    3857             var m        = matchData.match(HTMLArea.RE_email); 
    3858             if(m) 
     3983            var mEmail = matchData.match(HTMLArea.RE_email); 
     3984            if(mEmail) 
    38593985            { 
    3860               var leftText  = s.anchorNode; 
    3861               var rightText = leftText.splitText(s.anchorOffset); 
    3862               var midText   = leftText.splitText(midStart); 
    3863  
    3864               autoWrap(midText, 'a').href = 'mailto:' + m[0]; 
     3986              var leftTextEmail  = s.anchorNode; 
     3987              var rightTextEmail = leftTextEmail.splitText(s.anchorOffset); 
     3988              var midTextEmail   = leftTextEmail.splitText(midStart); 
     3989 
     3990              autoWrap(midTextEmail, 'a').href = 'mailto:' + mEmail[0]; 
    38653991              break; 
    38663992            } 
    38673993 
    3868             var m = matchData.match(HTMLArea.RE_url); 
    3869             if(m) 
     3994            var mUrl = matchData.match(HTMLArea.RE_url); 
     3995            if(mUrl) 
    38703996            { 
    3871               var leftText  = s.anchorNode; 
    3872               var rightText = leftText.splitText(s.anchorOffset); 
    3873               var midText   = leftText.splitText(midStart); 
    3874               autoWrap(midText, 'a').href = (m[1] ? m[1] : 'http://') + m[2]; 
     3997              var leftTextUrl  = s.anchorNode; 
     3998              var rightTextUrl = leftTextUrl.splitText(s.anchorOffset); 
     3999              var midTextUrl   = leftTextUrl.splitText(midStart); 
     4000              autoWrap(midTextUrl, 'a').href = (mUrl[1] ? mUrl[1] : 'http://') + mUrl[2]; 
    38754001              break; 
    38764002            } 
    38774003          } 
    3878  
    3879         } 
    38804004        break; 
    38814005 
    38824006        default : 
    3883         { 
    38844007          if(ev.keyCode == 27 || (this._unlinkOnUndo && ev.ctrlKey && ev.which == 122) ) 
    38854008          { 
     
    38994022              // See if we might be changing a link 
    39004023              var a = this._getFirstAncestor(s, 'a'); 
    3901               if(!a) break; // not an anchor 
     4024              // @todo: we probably need here to inform the setTimeout below that we not changing a link and not start another setTimeout 
     4025              if(!a) { break; } // not an anchor 
    39024026              if(!a._updateAnchTimeout) 
    39034027              { 
     
    39074031                { 
    39084032                  var textNode = s.anchorNode; 
    3909                   var fn = function() 
     4033                  var fnAnchor = function() 
    39104034                    { 
    39114035                      a.href = 'mailto:' + textNode.data.trim(); 
    3912                       a._updateAnchTimeout = setTimeout(fn, 250); 
    3913                     } 
    3914                   a._updateAnchTimeout = setTimeout(fn, 250); 
     4036                      // @fixme: why the hell do another timeout is started ? 
     4037                      //         This lead to never ending timer if we dont remove this line 
     4038                      //         But when removed, the email is not correctly updated 
     4039                      a._updateAnchTimeout = setTimeout(fnAnchor, 250); 
     4040                    }; 
     4041                  a._updateAnchTimeout = setTimeout(fnAnchor, 1000); 
    39154042                  break; 
    39164043                } 
     
    39194046                if(m &&  a.href.match(s.anchorNode.data.trim()) ) 
    39204047                { 
    3921                   var textNode = s.anchorNode; 
    3922                   var fn = function() 
     4048                  var txtNode = s.anchorNode; 
     4049                  var fnUrl = function() 
    39234050                    { 
    3924                       var m = textNode.data.match(HTMLArea.RE_url); 
     4051                      // @fixme: Alert, sometimes m is undefined becase the url is not an url anymore (was www.url.com and become for example www.url) 
     4052                      var m = txtNode.data.match(HTMLArea.RE_url); 
    39254053                      a.href = (m[1] ? m[1] : 'http://') + m[2]; 
    3926                       a._updateAnchTimeout = setTimeout(fn, 250); 
    3927                     } 
    3928                   a._updateAnchTimeout = setTimeout(fn, 250); 
     4054                      // @fixme: why the hell do another timeout is started ? 
     4055                      //         This lead to never ending timer if we dont remove this line 
     4056                      //         But when removed, the url is not correctly updated 
     4057                      a._updateAnchTimeout = setTimeout(fnUrl, 250); 
     4058                    }; 
     4059                  a._updateAnchTimeout = setTimeout(fnUrl, 1000); 
    39294060                } 
    39304061              } 
    39314062            } 
    3932  
    39334063          } 
    3934         } 
    39354064        break; 
    39364065      } 
     
    39724101HTMLArea.prototype.convertNode = function(el, newTagName) { 
    39734102  var newel = this._doc.createElement(newTagName); 
    3974   while (el.firstChild) 
     4103  while (el.firstChild) { 
    39754104    newel.appendChild(el.firstChild); 
     4105  } 
    39764106  return newel; 
    39774107}; 
     
    39994129    r2.moveStart("character", -1); 
    40004130    var a = r2.parentElement(); 
    4001     if (a != range.parentElement() && 
    4002         /^a$/i.test(a.tagName)) 
     4131    if (a != range.parentElement() && (/^a$/i.test(a.tagName)) ) 
    40034132    { 
    40044133      r2.collapse(true); 
     
    40294158          SC = SC.parentNode; 
    40304159        } 
    4031         if (!/\S/.test(SC.tagName)) 
     4160        if (!(/\S/.test(SC.tagName))) 
    40324161        { 
    40334162          var p = document.createElement("p"); 
     
    40674196 
    40684197HTMLArea.prototype.dom_checkInsertP = function() { 
    4069  
     4198  var p, body; 
    40704199  // Get the insertion point, we'll scrub any highlighted text the user wants rid of while we are there. 
    40714200  var sel = this._getSelection(); 
     
    40994228 
    41004229  // See if we are in a block element, if so, great. 
    4101   var p    = this.getAllAncestors(); 
     4230  p = this.getAllAncestors(); 
    41024231 
    41034232  var block = null; 
    4104   var body = this._doc.body; 
     4233  body = this._doc.body; 
    41054234  for (var i = 0; i < p.length; ++i) 
    41064235  { 
     
    41094238      break; 
    41104239    } 
    4111     else if (HTMLArea.isBlockElement(p[i]) && !/body|html/i.test(p[i].tagName)) 
     4240    else if (HTMLArea.isBlockElement(p[i]) && !(/body|html/i.test(p[i].tagName))) 
    41124241    { 
    41134242      block = p[i]; 
     
    41974326  var df = r2.extractContents(); 
    41984327 
    4199   if(df.childNodes.length == 0) 
     4328  if(df.childNodes.length === 0) 
    42004329  { 
    42014330    df.appendChild(this._doc.createElement('p')); 
     
    42154344  } 
    42164345 
    4217   // If the original block is empty, put a nsbp in it. 
    4218   if (!/\S/.test(block.innerHTML)) 
     4346  // If the original block is empty, put a &nsbp; in it. 
     4347  if (!(/\S/.test(block.innerHTML))) { 
    42194348    block.innerHTML = "&nbsp;"; 
     4349  } 
    42204350 
    42214351  p = df.firstChild; 
    4222   if (!/\S/.test(p.innerHTML)) 
     4352  if (!(/\S/.test(p.innerHTML))) 
     4353  { 
    42234354    p.innerHTML = "<br />"; 
     4355  } 
    42244356 
    42254357  // If the new block is empty and it's a heading, make it a paragraph 
    42264358  // note, the new block is empty when you are hitting enter at the end of the existing block 
    4227   if (/^\s*<br\s*\/?>\s*$/.test(p.innerHTML) && /^h[1-6]$/i.test(p.tagName)) 
     4359  if ((/^\s*<br\s*\/?>\s*$/.test(p.innerHTML)) && (/^h[1-6]$/i.test(p.tagName))) 
    42284360  { 
    42294361    df.appendChild(this.convertNode(p, "p")); 
     
    42424374  this.activateEditor(); 
    42434375 
    4244   var sel = this._getSelection(); 
     4376  sel = this._getSelection(); 
    42454377  sel.removeAllRanges(); 
    42464378  sel.collapse(newblock,0); 
     
    42814413  switch (this._editMode) { 
    42824414      case "wysiwyg"  : 
    4283         { 
    4284           if (!this.config.fullPage) 
     4415          if (!this.config.fullPage) { 
    42854416            html = HTMLArea.getHTML(this._doc.body, false, this); 
    4286           else 
     4417          } else { 
    42874418            html = this.doctype + "\n" + HTMLArea.getHTML(this._doc.documentElement, true, this); 
     4419          } 
    42884420          break; 
    4289         } 
    42904421      case "textmode" : 
    4291         { 
    42924422          html = this._textArea.value; 
    42934423          break; 
    4294         } 
    42954424      default           : 
    4296         { 
    4297           alert("Mode <" + mode + "> not defined!"); 
     4425          alert("Mode <" + this._editMode + "> not defined!"); 
    42984426          return false; 
    4299         } 
    43004427  } 
    43014428  return html; 
     
    43744501  { 
    43754502    var from = this.config.specialReplacements[i]; 
    4376     var to   = i; 
    4377     if (typeof(from.replace) != 'function' || typeof(to.replace) != 'function') continue;  // prevent iterating over wrong type     
     4503    var to   = i; // why are declaring a new variable here ? Seems to be better to just do : for (var to in config) 
     4504    if (typeof(from.replace) != 'function' || typeof(to.replace) != 'function') { continue; } // prevent iterating over wrong type 
    43784505    // alert('out : ' + from + '=>' + to); 
    43794506    var reg = new RegExp(from.replace(HTMLArea.RE_Specials, '\\$1'), 'g'); 
     
    43894516  for(var i in this.config.specialReplacements) 
    43904517  { 
    4391     var from = i; 
     4518    var from = i; // why are declaring a new variable here ? Seems to be better to just do : for (var from in config) 
    43924519    var to   = this.config.specialReplacements[i]; 
    43934520 
    4394     if (typeof(from.replace) != 'function' || typeof(to.replace) != 'function') continue; // prevent iterating over wrong type 
     4521    if (typeof(from.replace) != 'function' || typeof(to.replace) != 'function') { continue; } // prevent iterating over wrong type 
    43954522    // alert('in : ' + from + '=>' + to); 
    43964523    // 
     
    44164543  if(typeof this.config.stripBaseHref != 'undefined' && this.config.stripBaseHref) 
    44174544  { 
    4418     var baseRe = null 
    4419     if(typeof this.config.baseHref != 'undefined' && this.config.baseHref != null) 
     4545    var baseRe = null; 
     4546    if(typeof this.config.baseHref != 'undefined' && this.config.baseHref !== null) 
    44204547    { 
    44214548      baseRe = new RegExp(this.config.baseHref.replace(HTMLArea.RE_Specials, '\\$1'), 'g'); 
     
    44444571// retrieve the HTML (fastest version, but uses innerHTML) 
    44454572HTMLArea.prototype.getInnerHTML = function() { 
    4446   if(!this._doc.body) return ''; 
     4573  if(!this._doc.body) { return ''; } 
    44474574  var html = ""; 
    44484575  switch (this._editMode) { 
    44494576      case "wysiwyg"  : 
    4450         if (!this.config.fullPage) 
     4577        if (!this.config.fullPage) { 
    44514578          // return this._doc.body.innerHTML; 
    44524579          html = this._doc.body.innerHTML; 
    4453         else 
     4580        } else { 
    44544581          html = this.doctype + "\n" + this._doc.documentElement.innerHTML; 
     4582        } 
    44554583        break; 
    44564584      case "textmode" : 
     
    44584586        break; 
    44594587      default       : 
    4460         alert("Mode <" + mode + "> not defined!"); 
     4588        alert("Mode <" + this._editMode + "> not defined!"); 
    44614589        return false; 
    44624590  } 
     
    44924620// function that returns a clone of the given object 
    44934621HTMLArea.cloneObject = function(obj) { 
    4494   if (!obj) return null; 
    4495   var newObj = new Object; 
     4622  if (!obj) { return null; } 
     4623  var newObj = {}; 
    44964624 
    44974625  // check for array objects 
     
    45034631  if (obj.constructor.toString().match( /\s*function Function\(/ )) { 
    45044632    newObj = obj; // just copy reference to it 
    4505   } else for (var n in obj) { 
    4506     var node = obj[n]; 
    4507     if (typeof node == 'object') { newObj[n] = HTMLArea.cloneObject(node); } 
    4508     else                         { newObj[n] = node; } 
     4633  } else { 
     4634    for (var n in obj) { 
     4635      var node = obj[n]; 
     4636      if (typeof node == 'object') { newObj[n] = HTMLArea.cloneObject(node); } 
     4637      else                         { newObj[n] = node; } 
     4638    } 
    45094639  } 
    45104640 
     
    45894719{ 
    45904720  var x = 0; 
    4591   var e = null; 
    4592   while(e = HTMLArea._eventFlushers.pop()) 
     4721  // @todo : check if Array.prototype.pop exists for every supported browsers 
     4722  var e = HTMLArea._eventFlushers.pop(); 
     4723  while(e) 
    45934724  { 
    45944725    try 
     
    46064737      } 
    46074738    } 
    4608     catch(e) 
     4739    catch(ex) 
    46094740    { 
    46104741      // Do Nothing 
    46114742    } 
     4743    e = HTMLArea._eventFlushers.pop(); 
    46124744  } 
    46134745   
     
    47744906        // We want the handler to be a member of the form, not the array, so that "this" will work correctly 
    47754907        el._xinha_tempEventHandler = a[i]; 
    4776         if(el._xinha_tempEventHandler(event) == false) 
     4908        if(el._xinha_tempEventHandler(event) === false) 
    47774909        { 
    47784910          el._xinha_tempEventHandler = null; 
     
    48194951  } 
    48204952  var cls = el.className.split(" "); 
    4821   var ar = new Array(); 
     4953  var ar = []; 
    48224954  for (var i = cls.length; i > 0;) { 
    48234955    if (cls[--i] != className) { 
     
    48715003// performs HTML encoding of some given string 
    48725004HTMLArea.htmlEncode = function(str) { 
    4873   if(typeof str.replace == 'undefined') str = str.toString(); 
     5005  if(typeof str.replace == 'undefined') { str = str.toString(); } 
    48745006  // we don't need regexp for that, but.. so be it for now. 
    48755007  str = str.replace(/&/ig, "&amp;"); 
     
    48985030HTMLArea.getHTMLWrapper = function(root, outputRoot, editor, indent) { 
    48995031  var html = ""; 
    4900   if(!indent) indent = ''; 
     5032  if(!indent) { indent = ''; } 
    49015033 
    49025034  switch (root.nodeType) { 
     
    49355067      case 11: // Node.DOCUMENT_FRAGMENT_NODE 
    49365068      case 9: // Node.DOCUMENT_NODE 
    4937       { 
    49385069    var closed; 
    49395070    var i; 
    49405071    var root_tag = (root.nodeType == 1) ? root.tagName.toLowerCase() : ''; 
    4941     if (outputRoot) 
     5072    if (outputRoot) { 
    49425073      outputRoot = !(editor.config.htmlRemoveTags && editor.config.htmlRemoveTags.test(root_tag)); 
     5074    } 
    49435075    if (HTMLArea.is_ie && root_tag == "head") { 
    4944       if (outputRoot) 
     5076      if (outputRoot) { 
    49455077        html += (HTMLArea.is_ie ? ('\n' + indent) : '') + "<head>"; 
     5078      } 
    49465079      // lowercasize 
    49475080      var save_multiline = RegExp.multiline; 
     
    49525085      RegExp.multiline = save_multiline; 
    49535086      html += txt + '\n'; 
    4954       if (outputRoot) 
     5087      if (outputRoot) { 
    49555088        html += (HTMLArea.is_ie ? ('\n' + indent) : '') + "</head>"; 
     5089      } 
    49565090      break; 
    49575091    } else if (outputRoot) { 
     
    49855119          // Using Gecko the values of href and src are converted to absolute links 
    49865120          // unless we get them using nodeValue() 
    4987           if (typeof root[a.nodeName] != "undefined" && name != "href" && name != "src" && !/^on/.test(name)) { 
     5121          if (typeof root[a.nodeName] != "undefined" && name != "href" && name != "src" && !(/^on/.test(name))) { 
    49885122            value = root[a.nodeName]; 
    49895123          } else { 
     
    50265160        html += " " + name + '="' + HTMLArea.htmlEncode(value) + '"'; 
    50275161      } 
    5028       if (html != "") { 
     5162      if (html !== "") { 
    50295163        if(closed && root_tag=="p") { 
    50305164          //never use <p /> as empty paragraphs won't be visible 
     
    50395173    var containsBlock = false; 
    50405174    for (i = root.firstChild; i; i = i.nextSibling) { 
    5041       if(!containsBlock && i.nodeType == 1 && HTMLArea.isBlockElement(i)) containsBlock = true; 
     5175      if(!containsBlock && i.nodeType == 1 && HTMLArea.isBlockElement(i)) { containsBlock = true; } 
    50425176      html += HTMLArea.getHTMLWrapper(i, true, editor, indent + '  '); 
    50435177    } 
     
    50465180    } 
    50475181    break; 
    5048       } 
    50495182      case 3: // Node.TEXT_NODE 
    50505183    html = /^script|style$/i.test(root.parentNode.tagName) ? root.data : HTMLArea.htmlEncode(root.data); 
     
    50625195HTMLArea.prototype.stripBaseURL = function(string) 
    50635196{ 
    5064   if(this.config.baseHref==null || !this.config.stripBaseHref) 
    5065   { 
    5066     return(string); 
    5067   } 
    5068   var baseurl = this.config.baseHref; 
    5069  
     5197  if(this.config.baseHref === null || !this.config.stripBaseHref) 
     5198  { 
     5199    return string; 
     5200  } 
    50705201  // strip host-part of URL which is added by MSIE to links relative to server root 
    5071   baseurl = baseurl.replace(/^(https?:\/\/[^\/]+)(.*)$/, '$1'); 
    5072   basere = new RegExp(baseurl); 
     5202  var baseurl = this.config.baseHref.replace(/^(https?:\/\/[^\/]+)(.*)$/, '$1'); 
     5203  var basere = new RegExp(baseurl); 
    50735204  return string.replace(basere, ""); 
    50745205}; 
     
    50935224// returns hexadecimal color representation from a number or a rgb-style color. 
    50945225HTMLArea._colorToRgb = function(v) { 
    5095   if (!v) 
     5226  if (!v) { 
    50965227    return ''; 
    5097  
     5228  } 
     5229  var r,g,b; 
     5230  // @todo: why declaring this function here ? This needs to be a public methode of the object HTMLArea._colorToRgb 
    50985231  // returns the hex representation of one byte (2 digits) 
    50995232  function hex(d) { 
     
    51035236  if (typeof v == "number") { 
    51045237    // we're talking to IE here 
    5105     var r = v & 0xFF; 
    5106     var g = (v >> 8) & 0xFF; 
    5107     var b = (v >> 16) & 0xFF; 
     5238    r = v & 0xFF; 
     5239    g = (v >> 8) & 0xFF; 
     5240    b = (v >> 16) & 0xFF; 
    51085241    return "#" + hex(r) + hex(g) + hex(b); 
    51095242  } 
     
    51135246    var re = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/; 
    51145247    if (v.match(re)) { 
    5115       var r = parseInt(RegExp.$1); 
    5116       var g = parseInt(RegExp.$2); 
    5117       var b = parseInt(RegExp.$3); 
     5248      r = parseInt(RegExp.$1, 10); 
     5249      g = parseInt(RegExp.$2, 10); 
     5250      b = parseInt(RegExp.$3, 10); 
    51185251      return "#" + hex(r) + hex(g) + hex(b); 
    51195252    } 
     
    51445277 
    51455278HTMLArea.prototype.imgURL = function(file, plugin) { 
    5146   if (typeof plugin == "undefined") 
     5279  if (typeof plugin == "undefined") { 
    51475280    return _editor_url + file; 
    5148   else 
     5281  } else { 
    51495282    return _editor_url + "plugins/" + plugin + "/img/" + file; 
     5283  } 
    51505284}; 
    51515285 
     
    51555289    var plugin = RegExp.$1; 
    51565290    var popup = RegExp.$2; 
    5157     if (!/\.html$/.test(popup)) 
     5291    if (!(/\.html$/.test(popup))) { 
    51585292      popup += ".html"; 
     5293    } 
    51595294    url = _editor_url + "plugins/" + plugin + "/popups/" + popup; 
    5160   } else if(file.match(/^\/.*?/)) 
     5295  } else if(file.match(/^\/.*?/)) { 
    51615296            url = file; 
    5162         else 
     5297        } else { 
    51635298    url = _editor_url + this.config.popupURL + file; 
     5299  } 
    51645300  return url; 
    51655301}; 
     
    51735309HTMLArea.getElementById = function(tag, id) { 
    51745310  var el, i, objs = document.getElementsByTagName(tag); 
    5175   for (i = objs.length; --i >= 0 && (el = objs[i]);) 
    5176     if (el.id == id) 
     5311  for (i = objs.length; --i >= 0 && (el = objs[i]);) { 
     5312    if (el.id == id) { 
    51775313      return el; 
     5314    } 
     5315  } 
    51785316  return null; 
    51795317}; 
     
    51845322HTMLArea.prototype._toggleBorders = function() 
    51855323{ 
    5186   tables = this._doc.getElementsByTagName('TABLE'); 
    5187   if(tables.length != 0) 
     5324  var tables = this._doc.getElementsByTagName('TABLE'); 
     5325  if(tables.length !== 0) 
    51885326  { 
    51895327   if(!this.borders) 
     
    52225360HTMLArea.addClasses = function(el, classes) 
    52235361  { 
    5224     if(el != null) 
     5362    if(el !== null) 
    52255363    { 
    52265364      var thiers = el.className.trim().split(' '); 
     
    52295367      { 
    52305368        var exists = false; 
    5231         for(var i = 0; exists == false && i < thiers.length; i++) 
     5369        for(var i = 0; exists === false && i < thiers.length; i++) 
    52325370        { 
    52335371          if(thiers[i] == ours[x]) 
     
    52365374          } 
    52375375        } 
    5238         if(exists == false) 
     5376        if(exists === false) 
    52395377        { 
    52405378          thiers[thiers.length] = ours[x]; 
     
    53025440      if(req.status == 200) 
    53035441      { 
    5304         if(typeof handler == 'function') 
    5305         handler(req.responseText, req); 
     5442        if(typeof handler == 'function') { 
     5443          handler(req.responseText, req); 
     5444        } 
    53065445      } 
    53075446      else 
     
    53935532    } 
    53945533 
    5395     x = window.open("", "debugger"); 
     5534    var x = window.open("", "debugger"); 
    53965535    x.document.write('<pre>' + s + '</pre>'); 
    53975536  } 
     
    54275566  for(var x = 0; x < a1.length; x++) 
    54285567  { 
    5429     if(filterfn(a1[x])) 
     5568    if(filterfn(a1[x])) { 
    54305569      new_a[new_a.length] = a1[x]; 
     5570    } 
    54315571  } 
    54325572 
     
    54495589HTMLArea._loadlang = function(context) 
    54505590{ 
     5591  var url, lang; 
    54515592  if(typeof _editor_lcbackend == "string") 
    54525593  { 
    54535594    //use backend 
    5454     var url = _editor_lcbackend; 
     5595    url = _editor_lcbackend; 
    54555596    url = url.replace(/%lang%/, _editor_lang); 
    54565597    url = url.replace(/%context%/, context); 
     
    54605601    //use internal files 
    54615602    if(context != 'HTMLArea') { 
    5462       var url = _editor_url+"plugins/"+context+"/lang/"+_editor_lang+".js"; 
     5603      url = _editor_url+"plugins/"+context+"/lang/"+_editor_lang+".js"; 
    54635604    } else { 
    5464       var url = _editor_url+"lang/"+_editor_lang+".js"; 
    5465     } 
    5466   } 
    5467  
    5468   var lang; 
     5605      url = _editor_url+"lang/"+_editor_lang+".js"; 
     5606    } 
     5607  } 
     5608 
    54695609  var langData = HTMLArea._geturlcontent(url); 
    5470   if(langData != "") { 
     5610  if(langData !== "") { 
    54715611    try { 
    54725612        eval('lang = ' + langData); 
    54735613    } catch(Error) { 
    54745614        alert('Error reading Language-File ('+url+'):\n'+Error.toString()); 
    5475         lang = { } 
     5615        lang = { }; 
    54765616    } 
    54775617  } else { 
     
    55945734  script[evt] = function() 
    55955735  { 
    5596     if(HTMLArea.is_ie && !/loaded|complete/.test(window.event.srcElement.readyState))  return; 
     5736    if(HTMLArea.is_ie && !(/loaded|complete/.test(window.event.srcElement.readyState))) { return; } 
    55975737    callback(); 
    5598   } 
     5738  }; 
    55995739  head.appendChild(script); 
    56005740}; 
     
    56435783  for(var i in editors) 
    56445784  { 
    5645     if(editors[i].generate) editors[i].generate(); 
     5785    if(editors[i].generate) { editors[i].generate(); } 
    56465786  } 
    56475787}; 
     
    57295869HTMLArea.removeFromParent = function(el) 
    57305870{ 
    5731   if(!el.parentNode) return; 
     5871  if(!el.parentNode) { return; } 
    57325872  var pN = el.parentNode; 
    57335873  pN.removeChild(el); 
     
    57745914    while (obj.offsetParent) 
    57755915    { 
    5776       curleft += obj.offsetLeft 
     5916      curleft += obj.offsetLeft; 
    57775917      obj = obj.offsetParent; 
    57785918    } 
     
    57935933    while (obj.offsetParent) 
    57945934    { 
    5795       curtop += obj.offsetTop 
     5935      curtop += obj.offsetTop; 
    57965936      obj = obj.offsetParent; 
    57975937    } 
     
    58475987  for(var x = 0; x < HTMLArea.toFree.length; x++) 
    58485988  { 
    5849     if(!HTMLArea.toFree[x].o) alert("What is " + x + ' ' + HTMLArea.toFree[x].o); 
     5989    if(!HTMLArea.toFree[x].o) { alert("What is " + x + ' ' + HTMLArea.toFree[x].o); } 
    58505990    HTMLArea.free(HTMLArea.toFree[x].o, HTMLArea.toFree[x].p); 
    58515991  } 
Note: See TracChangeset for help on using the changeset viewer.