Changeset 193


Ignore:
Timestamp:
05/24/05 21:30:03 (14 years ago)
Author:
gogo
Message:

Various small fixes and refactoring. A couple of new utility functions
and a fix for #6

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/htmlarea.js

    r192 r193  
    12931293  this._framework.ed_cell.appendChild(iframe); 
    12941294  this._iframe = iframe; 
     1295  this._iframe.className = 'xinha_iframe'; 
    12951296 
    12961297    // creates & appends the status bar 
     
    13011302  var textarea = this._textArea; 
    13021303  textarea.parentNode.insertBefore(htmlarea, textarea); 
     1304  textarea.className = 'xinha_textarea'; 
    13031305 
    13041306  // extract the textarea and insert it into the htmlarea 
    1305   textarea.parentNode.removeChild(textarea); 
     1307  HTMLArea.removeFromParent(textarea); 
    13061308  this._framework.ed_cell.appendChild(textarea); 
    13071309 
     
    15151517    var col_span = 1; 
    15161518 
    1517     if(panels.left.on && panels.left.panels.length && HTMLArea.hasDisplayedChildren(panels.left.container)) 
     1519    function panel_is_alive(pan) 
     1520    { 
     1521      if(panels[pan].on && panels[pan].panels.length && HTMLArea.hasDisplayedChildren(panels[pan].container)) 
     1522      { 
     1523        return true; 
     1524      } 
     1525 
     1526      // Otherwise make sure it's been removed from the framework 
     1527      else 
     1528      { 
     1529        HTMLArea.removeFromParent(panels[pan].container); 
     1530        return false; 
     1531      } 
     1532    } 
     1533 
     1534    if(panel_is_alive('left')) 
    15181535    { 
    15191536      col_span += 1; 
    1520       if(!panels.left.container.parentNode) 
     1537      if(!HTMLArea.hasParentNode(panels.left.container)) 
    15211538      { 
    15221539        this._framework.ler_row.insertBefore(panels.left.container,this._framework.ed_cell); 
    15231540      } 
    15241541    } 
    1525     else 
    1526     { 
    1527       if(panels.left.container.parentNode) 
    1528       { 
    1529         panels.left.container.parentNode.removeChild(panels.left.container); 
    1530       } 
    1531     } 
    1532  
    1533     if(panels.top.on && panels.top.panels.length && HTMLArea.hasDisplayedChildren(panels.top.container)) 
    1534     { 
    1535       if(!panels.top.container.parentNode) 
     1542 
     1543    if(panel_is_alive('top')) 
     1544    { 
     1545      if(!HTMLArea.hasParentNode(panels.top.container)) 
    15361546      { 
    15371547        this._framework.tp_row.appendChild(panels.top.container); 
    15381548      } 
    15391549    } 
    1540     else 
    1541     { 
    1542       if(panels.top.container.parentNode) 
    1543       { 
    1544         panels.top.container.parentNode.removeChild(panels.top.container); 
    1545       } 
    1546     } 
    1547  
    1548     if(panels.right.on && panels.right.panels.length && HTMLArea.hasDisplayedChildren(panels.right.container)) 
     1550 
     1551    if(panel_is_alive('right')) 
    15491552    { 
    15501553      col_span += 1; 
    1551       if(!panels.right.container.parentNode) 
     1554      if(!HTMLArea.hasParentNode(panels.right.container)) 
    15521555      { 
    15531556        this._framework.ler_row.insertBefore(panels.right.container, this._framework.ed_cell.nextSibling); 
    15541557      } 
    15551558    } 
    1556     else 
    1557     { 
    1558       if(panels.right.container.parentNode) 
    1559       { 
    1560         panels.right.container.parentNode.removeChild(panels.right.container); 
    1561       } 
    1562     } 
    1563  
    1564     if(panels.bottom.on && panels.bottom.panels.length && HTMLArea.hasDisplayedChildren(panels.bottom.container)) 
    1565     { 
    1566       if(!panels.bottom.container.parentNode) 
    1567       { 
    1568         this._framework.bp_row.appendChild(panels.right.container); 
    1569       } 
    1570     } 
    1571     else 
    1572     { 
    1573       if(panels.bottom.container.parentNode) 
    1574       { 
    1575         panels.bottom.container.parentNode.removeChild(panels.bottom.container); 
     1559 
     1560    if(panel_is_alive('bottom')) 
     1561    { 
     1562      if(!HTMLArea.hasParentNode(panels.bottom.container)) 
     1563      { 
     1564        this._framework.bp_row.appendChild(panels.bottom.container); 
    15761565      } 
    15771566    } 
     
    15851574    if(!this._framework.tp_row.childNodes.length) 
    15861575    { 
    1587       if(this._framework.tp_row.parentNode) 
    1588       { 
    1589         this._framework.tp_row.parentNode.removeChild(this._framework.tp_row); 
    1590       } 
     1576      HTMLArea.removeFromParent(this._framework.tp_row); 
    15911577    } 
    15921578    else 
    15931579    { 
    1594       if(!this._framework.tp_row.parentNode) 
     1580      if(!HTMLArea.hasParentNode(this._framework.tp_row)) 
    15951581      { 
    15961582        this._framework.tbody.insertBefore(this._framework.tp_row, this._framework.ler_row); 
     
    16011587    if(!this._framework.bp_row.childNodes.length) 
    16021588    { 
    1603       if(this._framework.bp_row.parentNode) 
    1604       { 
    1605         this._framework.bp_row.parentNode.removeChild(this._framework.bp_row); 
    1606       } 
     1589      HTMLArea.removeFromParent(this._framework.bp_row); 
    16071590    } 
    16081591    else 
    16091592    { 
    1610       if(!this._framework.bp_row.parentNode) 
     1593      if(!HTMLArea.hasParentNode(this._framework.bp_row)) 
    16111594      { 
    16121595        this._framework.tbody.insertBefore(this._framework.bp_row, this._framework.ler_row.nextSibling); 
     
    16151598 
    16161599    // finally if the statusbar is on, insert it 
    1617     if(this.config.statusBar) 
    1618     { 
    1619       if(!this._framework.sb_row.parentNode) 
     1600    if(!this.config.statusBar) 
     1601    { 
     1602      HTMLArea.removeFromParent(this._framework.sb_row); 
     1603    } 
     1604    else 
     1605    { 
     1606      if(!HTMLArea.hasParentNode(this._framework.sb_row)) 
    16201607      { 
    16211608        this._framework.table.appendChild(this._framework.sb_row); 
    1622       } 
    1623     } 
    1624     else 
    1625     { 
    1626       if(this._framework.sb_row.parentNode) 
    1627       { 
    1628         this._framework.sb_row.parentNode.removeChild(this._framework.sb_row); 
    16291609      } 
    16301610    } 
     
    18931873           + ".htmtableborders, .htmtableborders td, .htmtableborders th {border : 1px dashed lightgrey ! important;} \n" 
    18941874           + "</style>\n"; 
    1895       html += "<style>" 
    1896            + editor.config.pageStyle + "\n" 
     1875      html += "<style type=\"text/css\">" 
    18971876           + "html, body { border: 0px; } \n" 
    18981877           + "span.macro, span.macro ul, span.macro div, span.macro p {background : #CCCCCC;}\n" 
    18991878           + "</style>\n"; 
     1879 
     1880      if(editor.config.pageStyle) 
     1881      { 
     1882        html += "<style type=\"text/css\">\n" + editor.config.pageStyle + "\n</style>"; 
     1883      } 
     1884 
    19001885      if(typeof editor.config.pageStyleSheets !== 'undefined') 
    19011886      { 
     
    23032288      var txt = document.createTextNode(HTMLArea.getInnerText(el)); 
    23042289      el.parentNode.insertBefore(txt, el); 
    2305       el.parentNode.removeChild(el); 
     2290      HTMLArea.removeFromParent(el); 
    23062291    } 
    23072292    ++stats.mso_xmlel; 
     
    23102295    if (/^(a|span|b|strong|i|em|font)$/i.test(el.tagName) && 
    23112296        !el.firstChild) { 
    2312       el.parentNode.removeChild(el); 
     2297      HTMLArea.removeFromParent(el); 
    23132298      ++stats.empty_tags; 
    23142299    } 
     
    27372722      plugin.onUpdateToolbar(); 
    27382723  } 
     2724 
    27392725 
    27402726} 
     
    31473133  this.forceRedraw(); 
    31483134  var range; 
    3149   var collapsed = (typeof pos != "undefined"); 
     3135  var collapsed = typeof pos == "undefined" ? true : false; 
    31503136  if (HTMLArea.is_ie) { 
    31513137    // Tables and Images get selected as "objects" rather than the text contents 
    3152     if(!collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img/)) 
     3138    if(collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|select|textarea/)) 
    31533139    { 
    31543140      range = this._doc.body.createControlRange(); 
     
    31663152    range = this._doc.createRange(); 
    31673153    // Tables and Images get selected as "objects" rather than the text contents 
    3168     if(!collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img/)) 
     3154    if(collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|textarea|select/)) 
    31693155    { 
    31703156      range.selectNode(node); 
    3171       (collapsed) && range.collapse(pos); 
    31723157    } 
    31733158    else 
     
    36293614        if(typeof tag == 'string') tag = editor._doc.createElement(tag); 
    36303615        var a = textNode.parentNode.insertBefore(tag, rightText); 
    3631         textNode.parentNode.removeChild(textNode); 
     3616        HTMLArea.removeFromParent(textNode); 
    36323617        a.appendChild(textNode); 
    36333618        rightText.data = ' ' + rightText.data; 
     
    36503635          a.removeChild(t); 
    36513636          a.parentNode.insertBefore(t, a); 
    3652           a.parentNode.removeChild(a); 
     3637          HTMLArea.removeFromParent(a); 
    36533638          editor._unLink = null; 
    36543639          editor._unlinkOnUndo = false; 
     
    38043789  { 
    38053790    var elm = this._activeElement(sel); 
    3806     elm.parentNode.removeChild(elm); 
     3791    HTMLArea.removeFromParent(elm); 
    38073792    return true; 
    38083793  } 
     
    38443829        p.appendChild(SC.firstChild); 
    38453830      SC.parentNode.insertBefore(p, SC); 
    3846       SC.parentNode.removeChild(SC); 
     3831      HTMLArea.removeFromParent(SC); 
    38473832      var r = range.cloneRange(); 
    38483833      r.setStartBefore(newr); 
     
    46854670      for (i = 0; i < attrs.length; ++i) { 
    46864671        var a = attrs.item(i); 
    4687         if (!a.specified) { 
     4672        if (!a.specified && !(root.tagName.toLowerCase().match(/input|option/) && a.nodeName == 'value')) { 
    46884673          continue; 
    46894674        } 
     
    50054990        alert('An error has occurred: ' + req.statusText); 
    50064991      } 
    5007       req.onreadystatechange = null; 
    50084992    } 
    50094993  } 
     
    50455029        alert('An error has occurred: ' + req.statusText); 
    50465030      } 
    5047       req.onreadystatechange = null; 
    50485031    } 
    50495032  } 
     
    53145297} 
    53155298 
     5299/** Utility function to base64_encode some arbitrary data, uses the builtin btoa() if it exists (Moz) */ 
     5300 
     5301HTMLArea.base64_encode =  function(input) 
     5302{ 
     5303  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
     5304  var output = ""; 
     5305  var chr1, chr2, chr3; 
     5306  var enc1, enc2, enc3, enc4; 
     5307  var i = 0; 
     5308 
     5309  do { 
     5310    chr1 = input.charCodeAt(i++); 
     5311    chr2 = input.charCodeAt(i++); 
     5312    chr3 = input.charCodeAt(i++); 
     5313 
     5314    enc1 = chr1 >> 2; 
     5315    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
     5316    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
     5317    enc4 = chr3 & 63; 
     5318 
     5319    if (isNaN(chr2)) { 
     5320       enc3 = enc4 = 64; 
     5321    } else if (isNaN(chr3)) { 
     5322       enc4 = 64; 
     5323    } 
     5324 
     5325    output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
     5326       keyStr.charAt(enc3) + keyStr.charAt(enc4); 
     5327  } while (i < input.length); 
     5328 
     5329  return output; 
     5330} 
     5331 
     5332/** Utility function to base64_decode some arbitrary data, uses the builtin atob() if it exists (Moz) */ 
     5333 
     5334HTMLArea.base64_decode =function(input) 
     5335{ 
     5336  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
     5337  var output = ""; 
     5338  var chr1, chr2, chr3; 
     5339  var enc1, enc2, enc3, enc4; 
     5340  var i = 0; 
     5341 
     5342  // remove all characters that are not A-Z, a-z, 0-9, +, /, or = 
     5343  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 
     5344 
     5345  do { 
     5346    enc1 = keyStr.indexOf(input.charAt(i++)); 
     5347    enc2 = keyStr.indexOf(input.charAt(i++)); 
     5348    enc3 = keyStr.indexOf(input.charAt(i++)); 
     5349    enc4 = keyStr.indexOf(input.charAt(i++)); 
     5350 
     5351    chr1 = (enc1 << 2) | (enc2 >> 4); 
     5352    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
     5353    chr3 = ((enc3 & 3) << 6) | enc4; 
     5354 
     5355    output = output + String.fromCharCode(chr1); 
     5356 
     5357    if (enc3 != 64) { 
     5358       output = output + String.fromCharCode(chr2); 
     5359    } 
     5360    if (enc4 != 64) { 
     5361       output = output + String.fromCharCode(chr3); 
     5362    } 
     5363  } while (i < input.length); 
     5364 
     5365  return output; 
     5366} 
     5367 
     5368HTMLArea.removeFromParent = function(el) 
     5369{ 
     5370  if(!el.parentNode) return; 
     5371  var pN = el.parentNode; 
     5372  pN.removeChild(el); 
     5373  return el; 
     5374} 
     5375 
     5376HTMLArea.hasParentNode = function(el) 
     5377{ 
     5378  if(el.parentNode) 
     5379  { 
     5380    // When you remove an element from the parent in IE it makes the parent 
     5381    // of the element a document fragment.  Moz doesn't. 
     5382    if(el.parentNode.nodeType == 11) 
     5383    { 
     5384      return false; 
     5385    } 
     5386    return true; 
     5387  } 
     5388 
     5389  return false; 
     5390} 
     5391 
     5392HTMLArea.getOuterHTML = function(element) 
     5393{ 
     5394  if(HTMLArea.is_ie) 
     5395  { 
     5396    return element.outerHTML; 
     5397  } 
     5398  else 
     5399  { 
     5400    return (new XMLSerializer()).serializeToString(element); 
     5401  } 
     5402} 
     5403 
     5404 
    53165405HTMLArea.init(); 
Note: See TracChangeset for help on using the changeset viewer.