Type.registerNamespace("Sys.Extended.UI.HtmlEditor.ToolbarButtons"); Sys.Extended.UI.HtmlEditor.ToolbarButtons.RemoveStyles = function(element) { Sys.Extended.UI.HtmlEditor.ToolbarButtons.RemoveStyles.initializeBase(this, [element]); } Sys.Extended.UI.HtmlEditor.ToolbarButtons.RemoveStyles.prototype = { callMethod: function() { if(!Sys.Extended.UI.HtmlEditor.ToolbarButtons.RemoveStyles.callBaseMethod(this, "callMethod")) return false; var editor = this._designPanel; setTimeout(function() { var selectedHTML = (!Sys.Extended.UI.HtmlEditor.isIE) ? Sys.Extended.UI.HtmlEditor.Trim(editor.getSelectedHTML()) : "", sel = editor._getSelection(), range = editor._createRange(sel), rng = null, expanded = false; if(!editor.isControl() && ((Sys.Extended.UI.HtmlEditor.isIE && range.text.length > 0) || (!Sys.Extended.UI.HtmlEditor.isIE && selectedHTML.length > 0))) { rng = editor._getTextNodeCollection(); } else { rng = editor._tryExpand(); expanded = true; } if(rng != null && rng.length > 0) { var changed = false, // document tree changing indicator _found = true, // style tag deleting indicator _text = null; editor._saveContent(); // for undo var span1 = editor._doc.createElement("span"); span1.id = "_left_"; var span2 = editor._doc.createElement("span"); span2.id = "_right_"; var par1 = rng[0].parentNode, par2 = rng[rng.length - 1].parentNode; par1.insertBefore(span1, rng[0]); if(rng[rng.length - 1].nextSibling) par2.insertBefore(span2, rng[rng.length - 1].nextSibling); else par2.appendChild(span2); while(_found) { // while there were tags' deletings _found = false; // reset the indicator for(var i = 0; i < rng.length; i++) { // inspect all TextNodes var par = rng[i].parentNode; // if the TextNode still have a parent if(par) { // it's the first node in his parent if(rng[i].previousSibling == null && rng[i].nextSibling == null) { var tag = par.tagName.toUpperCase(); // parent can be a style tag only if(Sys.Extended.UI.HtmlEditor.isStyleTag(tag) && (tag != "A") && (par.className != Sys.Extended.UI.HtmlEditor.smartClassName || tag.substr(0, 1) == "H")) { // it is what we need ! // have the parent attributes? var _attrs = Sys.Extended.UI.HtmlEditor.differAttr(par, ["class", "color", "face", "size"]); // changes will be now changed = true; // if there aren't attributes - we can delete the tag // and move his chieldren to parent if(_attrs.length == 0) { var parent = par.parentNode, el = (par.firstChild) ? par.firstChild : null, P = null; if(tag.toUpperCase().substr(0, 1) == "H" && (Sys.Extended.UI.HtmlEditor.isIE)) { P = editor._doc.createElement("p"); P.className = Sys.Extended.UI.HtmlEditor.smartClassName; parent.insertBefore(P, par); while(par.firstChild) // chieldren moving P.appendChild(par.firstChild); } else { while(par.firstChild) // chieldren moving parent.insertBefore(par.firstChild, par); if(tag.toUpperCase().substr(0, 1) == "H") { var br = editor._doc.createElement("br"); parent.insertBefore(br, par); } } parent.removeChild(par); _found = true; // set indicator } else { // we can't remove the tag - cleaning only var parent = par.parentNode; // create the new same tag var nel = editor._doc.createElement(tag); // set it's attributes for(var j = 0; j < _attrs.length; j++) nel.setAttribute(_attrs[j][0], _attrs[j][1]); // insert the clone instead the old tag // (no ClassName, no Styles) parent.insertBefore(nel, par); while(par.firstChild) nel.appendChild(par.firstChild); parent.removeChild(par); } } } } } } for(var i = 0; i < rng.length; i++) { // inspect all TextNodes var el = rng[i], _prn = (rng[i].parentNode != null && typeof rng[i].parentNode != "undefined") ? rng[i].parentNode : null; // if the TextNode still have a parent if(_prn) { // now try to cut this Text node from arround style tags var _fnd = null; // look for the upper style parent while(_prn && _prn.tagName && _prn.tagName.toUpperCase() != "BODY" && Sys.Extended.UI.HtmlEditor.isStyleTag(_prn.tagName) && (_prn.tagName.toUpperCase() != "A") && Sys.Extended.UI.HtmlEditor.differAttr(_prn, ["class", "color", "face", "size"]).length == 0) { _fnd = _prn; _prn = _prn.parentNode; } // if such parent is found if(_fnd) { // changes will be now changed = true; function diver(add, el, rpr, before) { var par = rpr.cloneNode(false); if(add) { if(add.push && typeof add.push == "function") for(var iii = 0; iii < add.length; iii++) par.appendChild(add[iii]); else par.appendChild(add); } while(el) { var elSibling = before ? el.previousSibling : el.nextSibling; if(el.nodeType == 1 || (el.nodeType == 3 && Sys.Extended.UI.HtmlEditor.Trim("" + el.data + "").length > 0)) { if(el.nodeType == 1) { if(Sys.Extended.UI.HtmlEditor.isStyleTag(el.tagName) && (el.tagName.toUpperCase() != "A") && (!el.id || (el.id != "_left_" && el.id != "_right_"))) Sys.Extended.UI.HtmlEditor.spanJoiner(el); if(Sys.Extended.UI.HtmlEditor.isStyleTag(el.tagName) && el.childNodes.length == 0 && (!el.id || (el.id != "_left_" && el.id != "_right_"))) el = null; } if(el) if(par.childNodes.length == 0 || !before) par.appendChild(el); else par.insertBefore(el, par.firstChild); } el = elSibling; } if(par.childNodes.length == 0) { delete par; par = null; } else if(par.childNodes.length == 1 && par.firstChild.nodeType == 3 && ("" + par.firstChild.data + "").length == 0) { delete par; par = null; } else { if(Sys.Extended.UI.HtmlEditor.isStyleTag(par.tagName)) { var elNumber = par.childNodes.length; for(var cnt = 0; cnt < par.childNodes.length; cnt++) { var inn = par.childNodes.item(cnt); if(inn.nodeType == 1 && !Sys.Extended.UI.HtmlEditor.isStyleTag(inn.tagName)) elNumber--; } if(elNumber == 0) { var parr = []; while(par.firstChild) { var inn = par.removeChild(par.firstChild); parr.push(inn); } par = parr; } } } if(rpr == _fnd) return par; else return diver(par, before ? rpr.previousSibling : rpr.nextSibling, rpr.parentNode, before); }; _prn = el.parentNode; if(el.previousSibling == null && el.nextSibling == null && _prn && _prn.tagName && _prn.tagName.toUpperCase() != "BODY" && Sys.Extended.UI.HtmlEditor.isStyleTag(_prn.tagName) && Sys.Extended.UI.HtmlEditor.differAttr(_prn, ["class", "color", "face", "size"]).length > 0) el = _prn; // create neibouring style tags for this Text node var p1 = diver(null, el.previousSibling, el.parentNode, true), p2 = diver(null, el.nextSibling, el.parentNode, false); var par = _fnd.parentNode; if(p1) { if(p1.push && typeof p1.push == "function") { for(var iii = 0; iii < p1.length; iii++) par.insertBefore(p1[iii], _fnd); } else { par.insertBefore(p1, _fnd); } if(Sys.Extended.UI.HtmlEditor.isIE) { span1 = editor._doc.getElementById("_left_"); span2 = editor._doc.getElementById("_right_"); } } par.insertBefore(el, _fnd); if(p2) { if(p2.push && typeof p2.push == "function") { for(var iii = 0; iii < p2.length; iii++) par.insertBefore(p2[iii], _fnd); } else { par.insertBefore(p2, _fnd); } if(Sys.Extended.UI.HtmlEditor.isIE) { span1 = editor._doc.getElementById("_left_"); span2 = editor._doc.getElementById("_right_"); } } par.removeChild(_fnd); } } } if(expanded) { if(Sys.Extended.UI.HtmlEditor.isIE && editor.__saveBM__ != null) { try { var ppp = span1.parentNode; ppp.removeChild(span1); while(ppp && ppp.childNodes.length == 0) { ppp.parentNode.removeChild(ppp); ppp = ppp.parentNode; } ppp = span2.parentNode; ppp.removeChild(span2); while(ppp && ppp.childNodes.length == 0) { ppp.parentNode.removeChild(ppp); ppp = ppp.parentNode; } span1 = null; span2 = null; } catch(e) { } var sel = editor._getSelection(); var range = editor._createRange(sel); range.moveToBookmark(editor.__saveBM__); range.select(); editor.__saveBM__ = null; } else if(editor.__saveBM__ != null) { if(editor.__saveBM__[0].nodeType == 3) { var sel = editor._getSelection(); var range = editor._doc.createRange(); range.setStart(editor.__saveBM__[0], editor.__saveBM__[1]); range.setEnd(editor.__saveBM__[0], editor.__saveBM__[1]); editor._removeAllRanges(sel); editor._selectRange(sel, range); } else { editor._trySelect(editor.__saveBM__[0], editor.__saveBM__[0]); editor.__saveBM__[0].parentNode.removeChild(editor.__saveBM__[0]); } editor.__saveBM__ = null; } } else if(!Sys.Extended.UI.HtmlEditor.isIE) { rng = []; var _found = false; function _diver(_point, prize) { while(_point) { if(_point == span2) { _found = true; return; } if(_point.nodeType == 3) { while(_point.nextSibling && _point.nextSibling.nodeType == 3) { _point.data = "" + _point.data + "" + _point.nextSibling.data + ""; _point.parentNode.removeChild(_point.nextSibling); } if(Sys.Extended.UI.HtmlEditor.Trim("" + _point.data + "").length > 0) rng.push(_point); } else _diver(_point.firstChild, false); if(_found) return; var _save = _point.parentNode; if(prize) while(_point && _point.nextSibling == null) _point = _point.parentNode; _point = _point.nextSibling; } } _diver(span1, true); range = editor._doc.createRange(); range.setStart(rng[0], 0); range.setEnd(rng[rng.length - 1], ("" + rng[rng.length - 1].data + "").length); editor._removeAllRanges(sel); editor._selectRange(sel, range); } else { try { sel = editor._getSelection(); var range1 = editor._createRange(sel); var range2 = editor._createRange(sel); range1.moveToElementText(span1); range2.moveToElementText(span2); range1.setEndPoint("EndToEnd", range2); range1.select(); } catch(e) { } } try { var ppp; if(span1 != null) { ppp = span1.parentNode; ppp.removeChild(span1); while(ppp && ppp.childNodes.length == 0) { ppp.parentNode.removeChild(ppp); ppp = ppp.parentNode; } } if(span2 != null) { ppp = span2.parentNode; ppp.removeChild(span2); while(ppp && ppp.childNodes.length == 0) { ppp.parentNode.removeChild(ppp); ppp = ppp.parentNode; } } } catch(e) { } editor.onContentChanged(); editor._editPanel.updateToolbar(); } }, 0); } } Sys.Extended.UI.HtmlEditor.ToolbarButtons.RemoveStyles.registerClass("Sys.Extended.UI.HtmlEditor.ToolbarButtons.RemoveStyles", Sys.Extended.UI.HtmlEditor.ToolbarButtons.MethodButton);