, ...)
Sys.Extended.UI.HtmlEditor._moveTagsUp(lBound.nextSibling, rBound);
fnd = null;
// optimize spans
if(lPoint == null || rPoint == null) {
if(lPoint != null)
fnd = Sys.Extended.UI.HtmlEditor._commonTotalParent(lPoint, lPoint);
if(rPoint != null)
fnd = Sys.Extended.UI.HtmlEditor._commonTotalParent(rPoint, rPoint);
} else
fnd = Sys.Extended.UI.HtmlEditor._commonTotalParent(lPoint, rPoint);
if(fnd != null)
Sys.Extended.UI.HtmlEditor.spanJoiner(fnd.parent, this._doc, fnd.indexFirst, fnd.indexLast + 1, true);
// prepare output array
function _dive1(next) {
if(!Sys.Extended.UI.HtmlEditor.isInlineElement(next)) {
return true;
} else if(next.tagName && Sys.Extended.UI.HtmlEditor.isStyleTag(next.tagName) && (next.tagName.toUpperCase() != "A") && !Sys.Extended.UI.HtmlEditor.isTempElement(next)) {
var nnn = next.firstChild;
while(nnn != null) {
nnnNext = nnn.nextSibling;
var temp = _dive1(nnn);
if(temp)
return true;
nnn = nnnNext;
}
}
return false;
}
var arrIndex = 0,
subArr = [],
subIndex = 0;
if(lBound.tagName && rBound.tagName) {
var lBoundTagName = lBound.tagName.toUpperCase(),
rBoundTagName = rBound.tagName.toUpperCase();
if((lBoundTagName == "TD" || lBoundTagName == "TR") &&
(rBoundTagName == "TD" || rBoundTagName == "TR")
) {
while(lBound.tagName.toUpperCase() != "TABLE")
lBound = lBound.parentNode;
rBound = lBound;
} else {
if((lBoundTagName == "DD" || lBoundTagName == "DT") &&
(rBoundTagName == "DD" || rBoundTagName == "DT")
) {
while(lBound.tagName && lBound.tagName.toUpperCase() != "DL")
lBound = lBound.parentNode;
rBound = lBound;
} else {
if((lBoundTagName == "LI") && (rBoundTagName == "LI")) {
while(lBoundTagName != "UL" && lBoundTagName != "OL") {
lBound = lBound.parentNode;
lBoundTagName = (lBound.tagName) ? lBound.tagName.toUpperCase() : null;
}
rBound = lBound;
}
}
}
}
var fromPoint = lPoint ? lPoint : rPoint,
toPoint = rPoint ? rPoint : lPoint,
next = lBound;
while(true) {
if(!Sys.Extended.UI.HtmlEditor.isTempElement(next)) {
var isBlock = _dive1(next);
if(!isBlock) {
if(next.nodeType && next.nodeType == 3) {
var str = "" + next.data + "";
if(str.length == 0 || /^[\n\r]+$/.test(str)) {
var tempNext = next.nextSibling;
next.parentNode.removeChild(next);
if(next == rBound)
break;
next = tempNext;
continue;
}
}
subArr[subIndex] = next;
subIndex++;
} else {
if(next.tagName && next.tagName.toUpperCase() == "BR") {
subArr[subIndex] = next;
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
} else
if((next == rBound || next == lBound) &&
!((next == rBound && next == lBound) ? (Sys.Extended.UI.HtmlEditor._reallyFirst(next, fromPoint) && Sys.Extended.UI.HtmlEditor._reallyLast(next, toPoint))
: (Sys.Extended.UI.HtmlEditor._reallyFirst(next, fromPoint) || Sys.Extended.UI.HtmlEditor._reallyLast(next, toPoint))
)
) {
var nextTagName = (next.tagName) ? (next.tagName.toUpperCase()) : null;
if(nextTagName == "TABLE" || nextTagName == "TBODY") {
var table = next;
while(table.tagName.toUpperCase() != "TABLE")
table = table.parentNode;
var fromCellIndex = 0,
fromRowIndex = 0,
toCellIndex = table.rows.item(table.rows.length - 1).cells.length - 1,
toRowIndex = table.rows.length - 1;
// find cells with start/end of selection in the Table
for(var i = 0; i < table.rows.length; i++) {
var row = table.rows.item(i),
j = 0;
for(; j < row.cells.length; j++) {
var cell = row.cells.item(j);
if(Sys.Extended.UI.HtmlEditor._lookChild(cell, fromPoint) >= 0) {
fromCellIndex = j;
fromRowIndex = i;
}
if(Sys.Extended.UI.HtmlEditor._lookChild(cell, toPoint) >= 0) {
toCellIndex = j;
toRowIndex = i;
}
}
}
// collect pseudo paragraps
for(var i = fromRowIndex; i <= toRowIndex; i++)
for(var j = ((i == fromRowIndex) ? fromCellIndex : 0) ; j <= ((i == toRowIndex) ? toCellIndex : (table.rows.item(i).cells.length - 1)) ; j++) {
var cell = table.rows.item(i).cells.item(j);
if(subIndex > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
var is_lPoint = (Sys.Extended.UI.HtmlEditor._lookChild(cell, fromPoint) >= 0),
is_rPoint = (Sys.Extended.UI.HtmlEditor._lookChild(cell, toPoint) >= 0);
if(is_lPoint || is_rPoint) { // need recursion
var r_lPoint = fromPoint,
r_rPoint = toPoint,
rn = Sys.Extended.UI.HtmlEditor.smartClassName + "_right_" + r_level,
ln = Sys.Extended.UI.HtmlEditor.smartClassName + "_left_" + r_level;
if(is_lPoint) {
r_rPoint = this._doc.createElement("span");
r_rPoint.id = rn;
cell.appendChild(r_rPoint);
}
if(is_rPoint) {
r_lPoint = this._doc.createElement("span");
r_lPoint.id = ln;
if(cell.firstChild)
cell.insertBefore(r_lPoint, cell.firstChild);
else
cell.appendChild(r_lPoint);
}
var r_result = this.getPseudoP_Recur(r_lPoint, r_rPoint, r_level + 1);
for(var cnt = 0; cnt < r_result.length; cnt++) {
result[arrIndex] = r_result[cnt];
arrIndex++;
}
if(r_lPoint != fromPoint)
r_lPoint.parentNode.removeChild(r_lPoint);
if(r_rPoint != toPoint)
r_rPoint.parentNode.removeChild(r_rPoint);
} else {
var fromEl = 0,
toEl = cell.childNodes.length;
for(var k = fromEl; k < toEl; k++) {
var el = cell.childNodes.item(k);
if(!Sys.Extended.UI.HtmlEditor.isTempElement(el)) {
subArr[subIndex] = el;
subIndex++;
}
}
if(subArr.length > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
}
}
} else if(nextTagName == "UL" || nextTagName == "OL" || nextTagName == "DL") {
var list = next,
fromIndex = 0,
toIndex = list.childNodes.length - 1;
// find itemss with start/end of selection in the list
for(var i = 0; i < list.childNodes.length; i++) {
var point = list.childNodes.item(i);
if(point.nodeType == 1) {
if(point == fromPoint || Sys.Extended.UI.HtmlEditor._lookChild(point, fromPoint) >= 0)
fromIndex = i;
if(point == toPoint || Sys.Extended.UI.HtmlEditor._lookChild(point, toPoint) >= 0)
toIndex = i;
}
}
// collect pseudo paragraps
for(var i = fromIndex; i <= toIndex; i++) {
var point = list.childNodes.item(i);
if(subIndex > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
var is_lPoint = (Sys.Extended.UI.HtmlEditor._lookChild(point, fromPoint) >= 0),
is_rPoint = (Sys.Extended.UI.HtmlEditor._lookChild(point, toPoint) >= 0);
if(is_lPoint || is_rPoint) { // need recursion
var r_lPoint = fromPoint,
r_rPoint = toPoint,
rn = Sys.Extended.UI.HtmlEditor.smartClassName + "_right_" + r_level,
ln = Sys.Extended.UI.HtmlEditor.smartClassName + "_left_" + r_level;
if(is_lPoint) {
r_rPoint = this._doc.createElement("span");
r_rPoint.id = rn;
point.appendChild(r_rPoint);
}
if(is_rPoint) {
r_lPoint = this._doc.createElement("span");
r_lPoint.id = ln;
if(point.firstChild)
point.insertBefore(r_lPoint, point.firstChild);
else
point.appendChild(r_lPoint);
}
var r_result = this.getPseudoP_Recur(r_lPoint, r_rPoint, r_level + 1);
for(var cnt = 0; cnt < r_result.length; cnt++) {
result[arrIndex] = r_result[cnt];
arrIndex++;
}
if(r_lPoint != fromPoint)
r_lPoint.parentNode.removeChild(r_lPoint);
if(r_rPoint != toPoint)
r_rPoint.parentNode.removeChild(r_rPoint);
} else {
var fromEl = 0,
toEl = point.childNodes.length;
for(var k = fromEl; k < toEl; k++) {
var el = point.childNodes.item(k);
if(!Sys.Extended.UI.HtmlEditor.isTempElement(el)) {
subArr[subIndex] = el;
subIndex++;
}
}
if(subArr.length > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
}
}
} else {
var is_lPoint = (Sys.Extended.UI.HtmlEditor._lookChild(next, fromPoint) >= 0),
is_rPoint = (Sys.Extended.UI.HtmlEditor._lookChild(next, toPoint) >= 0);
if(subIndex > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
if(is_lPoint || is_rPoint) { // need recursion
var r_lPoint = fromPoint,
r_rPoint = toPoint,
rn = Sys.Extended.UI.HtmlEditor.smartClassName + "_right_" + r_level,
ln = Sys.Extended.UI.HtmlEditor.smartClassName + "_left_" + r_level;
if(is_lPoint) {
r_rPoint = this._doc.createElement("span");
r_rPoint.id = rn;
next.appendChild(r_rPoint);
}
if(is_rPoint) {
r_lPoint = this._doc.createElement("span");
r_lPoint.id = ln;
if(next.firstChild)
next.insertBefore(r_lPoint, next.firstChild);
else
next.appendChild(r_lPoint);
}
var r_result = this.getPseudoP_Recur(r_lPoint, r_rPoint, r_level + 1);
for(var cnt = 0; cnt < r_result.length; cnt++) {
result[arrIndex] = r_result[cnt];
arrIndex++;
}
if(r_lPoint != fromPoint)
r_lPoint.parentNode.removeChild(r_lPoint);
if(r_rPoint != toPoint)
r_rPoint.parentNode.removeChild(r_rPoint);
} else {
var fromEl = 0,
toEl = next.childNodes.length;
for(var k = fromEl; k < toEl; k++) {
var el = next.childNodes.item(k);
if(!Sys.Extended.UI.HtmlEditor.isTempElement(el)) {
subArr[subIndex] = el;
subIndex++;
}
}
if(subArr.length > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
}
}
} else {
if(subIndex > 0) {
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
subArr[subIndex] = next;
result[arrIndex] = subArr;
arrIndex++;
subArr = [];
subIndex = 0;
}
}
}
if(next == rBound)
break;
next = next.nextSibling;
}
if(subIndex > 0)
result[arrIndex] = subArr;
}
return result;
};
Sys.Extended.UI.HtmlEditor.unWrap = function(element, pars) {
var editor = this;
if(element.firstChild) {
while(element.firstChild && element.firstChild.nodeType == 3 && ("" + element.firstChild.data + "") == "")
element.removeChild(element.firstChild);
var inner = [];
while(element.firstChild) {
if(element.firstChild != pars[0] && element.firstChild != pars[1])
inner.push(element.firstChild);
element.parentNode.insertBefore(element.firstChild, element);
}
if(inner.length == 0) {
var br = editor._doc.createElement("BR");
element.parentNode.insertBefore(br, element);
}
if(Sys.Extended.UI.HtmlEditor.isIE && inner.length == 1 && inner[0].nodeType == 3) {
var str = "" + inner[0].data + "";
if(str.length == 1 && str.charCodeAt(0) == 160) {
var br = editor._doc.createElement("BR");
inner[0].parentNode.insertBefore(br, inner[0]);
inner[0].parentNode.removeChild(inner[0]);
}
}
while(element.nextSibling && element.nextSibling.nodeType == 3 && ("" + element.nextSibling.data + "") == "")
element.parentNode.removeChild(element.nextSibling);
var previousSibling = (element.previousSibling && pars[1] == element.previousSibling) ? pars[1].previousSibling : element.previousSibling;
if(previousSibling && Sys.Extended.UI.HtmlEditor.isInlineElement(previousSibling))
if(previousSibling.nodeType == 1 && previousSibling.childNodes.length > 0)
previousSibling = Sys.Extended.UI.HtmlEditor._getReallyLast(previousSibling);
if(Sys.Extended.UI.HtmlEditor.isInlineElement(previousSibling) && element.nextSibling != null) {
var br = editor._doc.createElement("BR");
element.parentNode.insertBefore(br, element);
}
} else {
var br = editor._doc.createElement("BR");
element.parentNode.insertBefore(br, element);
}
element.parentNode.removeChild(element);
};
Sys.Extended.UI.HtmlEditor.tryUnWrap = function(element, pars, force) {
var editor = this;
element.style.textAlign = "";
var attrsNumber = 0,
attrs = element.attributes;
for(var k = 0; k < attrs.length; ++k) {
var a = attrs.item(k);
if(!a.specified)
continue;
if(a.name.toLowerCase() == "style")
continue;
attrsNumber++;
}
var save_css = element.style.cssText,
margin = 0,
mar,
elementTagName = element.tagName.toUpperCase();
if(!(typeof force != "undefined" && force))
if(elementTagName != "LI")
try {
mar = parseInt(Sys.Extended.UI.HtmlEditor.getStyle(element, "margin-top"));
if(isNaN(mar))
mar = elementTagName == "P" ? 1 : 0;
margin += mar;
mar = parseInt(Sys.Extended.UI.HtmlEditor.getStyle(element, "margin-bottom"));
if(isNaN(mar))
mar = elementTagName == "P" ? 1 : 0;
margin += mar;
mar = parseInt(Sys.Extended.UI.HtmlEditor.getStyle(element, "margin-right"));
if(isNaN(mar))
mar = elementTagName == "P" ? 1 : 0;
margin += mar;
mar = parseInt(Sys.Extended.UI.HtmlEditor.getStyle(element, "margin-left"));
if(isNaN(mar))
mar = elementTagName == "P" ? 1 : 0;
margin += mar;
} catch(e) { margin = 1; }
element.style.margin = "";
if((attrsNumber == 0 && element.style.cssText.length == 0 && margin == 0) || (typeof force != "undefined" && force && elementTagName != "LI")) {
editor.unWrap(element, pars);
return true;
} else {
element.style.cssText = save_css;
return false;
}
};
Sys.Extended.UI.HtmlEditor._queryCommandValue = function(cmdID, _id) {
var obj = this._rangeStartEnd();
if(obj == null)
return "";
try {
if(cmdID.toLowerCase() == "backcolor") {
var el = obj.start;
while(el) {
var bckg = Sys.Extended.UI.HtmlEditor.getStyle(el, "background-color").toLowerCase();
if(bckg.length > 0 && bckg != "transparent")
return bckg;
el = el.parentNode;
}
return "#FFFFFF";
}
var cssStyle = "none";
switch(cmdID.toLowerCase()) {
case "forecolor":
cssStyle = "color";
break;
case "fontname":
cssStyle = "font-family";
break;
case "fontsize":
cssStyle = "font-size";
break;
}
var ret;
if((cssStyle == "font-size" || cssStyle == "font-family") && this._FontNotSet) {
ret = "";
var par = obj.start;
while(par != null) {
if(cssStyle == "font-size") {
if(par.style && par.style.fontSize && par.style.fontSize.length > 0) {
ret = par.style.fontSize;
break;
} else if(par.tagName && par.tagName.toUpperCase() == "FONT" && par.size && par.size.length > 0) {
ret = Sys.Extended.UI.HtmlEditor.fontSizeSeek(par.size);
break;
}
} else {
if(par.style && par.style.fontFamily && par.style.fontFamily.length > 0) {
ret = par.style.fontFamily;
break;
} else if(par.tagName && par.tagName.toUpperCase() == "FONT" && par.face && par.face.length > 0) {
ret = par.face;
break;
}
}
if(par.className && par.className.length > 0) {
ret = Sys.Extended.UI.HtmlEditor.getStyle(par, cssStyle).toLowerCase();
if(cssStyle == "font-size")
if(!Sys.Extended.UI.HtmlEditor.isIE)
ret = Sys.Extended.UI.HtmlEditor._TryTransformFromPxToPt(ret, this, _id);
break;
}
var parTagName = par.tagName.toUpperCase();
if(parTagName == "BODY" || parTagName == "TD")
break;
par = par.parentNode;
}
} else {
ret = Sys.Extended.UI.HtmlEditor.getStyle(obj.start, cssStyle).toLowerCase();
if(cssStyle == "font-size") {
if(!Sys.Extended.UI.HtmlEditor.isIE) {
ret = Sys.Extended.UI.HtmlEditor._TryTransformFromPxToPt(ret, this, _id);
var par = obj.start;
while(par != null) {
if(par.style && par.style.fontSize && par.style.fontSize.length > 0) {
ret = par.style.fontSize;
break;
}
if(par.className && par.className.length > 0)
break;
var parTagName = par.tagName.toUpperCase();
if(parTagName == "BODY" || parTagName == "TD")
break;
par = par.parentNode;
}
}
}
}
if(this._StyleForTyping != null && this._StyleForTyping.length > 0)
for(var i = 0; i < this._StyleForTyping.length; i++) {
var curCss = this._StyleForTyping[i];
if(curCss.name == cssStyle) {
ret = curCss.value;
break;
}
}
return ret;
} catch(ex) { return ""; }
};
Web hosting by Somee.com