Hello,
I'm trying to get around Nicedit, and especially the "removeFormat" function.
The problem is I cannot find the "removeFormat" method source code in the code below. The JS syntax looks strange to me. Can someone help me ?
/* NicEdit - Micro Inline WYSIWYG
* Copyright 2007-2008 Brian Kirchoff
*
* NicEdit is distributed under the terms of the MIT license
* For more information visit http://nicedit.com/
* Do not remove this copyright message
*/
var bkExtend = function(){
var A = arguments;
if (A.length == 1) {
A = [this, A[0]]
}
for (var B in A[1]) {
A[0][B] = A[1][B]
}
return A[0]
};
function bkClass(){
}
bkClass.prototype.construct = function(){
};
bkClass.extend = function(C){
var A = function(){
if (arguments[0] !== bkClass) {
return this.construct.apply(this, arguments)
}
};
var B = new this(bkClass);
bkExtend(B, C);
A.prototype = B;
A.extend = this.extend;
return A
};
var bkElement = bkClass.extend({
construct: function(B, A){
if (typeof(B) == "string") {
B = (A || document).createElement(B)
}
B = $BK(B);
return B
},
appendTo: function(A){
A.appendChild(this);
return this
},
appendBefore: function(A){
A.parentNode.insertBefore(this, A);
return this
},
addEvent: function(B, A){
bkLib.addEvent(this, B, A);
return this
},
setContent: function(A){
this.innerHTML = A;
return this
},
pos: function(){
var C = curtop = 0;
var B = obj = this;
if (obj.offsetParent) {
do {
C += obj.offsetLeft;
curtop += obj.offsetTop
}
while (obj = obj.offsetParent)
}
var A = (!window.opera) ? parseInt(this.getStyle("border-width") || this.style.border) || 0 : 0;
return [C + A, curtop + A + this.offsetHeight]
},
noSelect: function(){
bkLib.noSelect(this);
return this
},
parentTag: function(A){
var B = this;
do {
if (B && B.nodeName && B.nodeName.toUpperCase() == A) {
return B
}
B = B.parentNode
}
while (B);
return false
},
hasClass: function(A){
return this.className.match(new RegExp("(\s|^)nicEdit-" + A + "(\s|$)"))
},
addClass: function(A){
if (!this.hasClass(A)) {
this.className += " nicEdit-" + A
}
return this
},
removeClass: function(A){
if (this.hasClass(A)) {
this.className = this.className.replace(new RegExp("(\s|^)nicEdit-" + A + "(\s|$)"), " ")
}
return this
},
setStyle: function(A){
var B = this.style;
for (var C in A) {
switch (C) {
case "float":
B.cssFloat = B.styleFloat = A[C];
break;
case "opacity":
B.opacity = A[C];
B.filter = "alpha(opacity=" + Math.round(A[C] * 100) + ")";
break;
case "className":
this.className = A[C];
break;
default:
B[C] = A[C]
}
}
return this
},
getStyle: function(A, C){
var B = (!C) ? document.defaultView : C;
if (this.nodeType == 1) {
return (B && B.getComputedStyle) ? B.getComputedStyle(this, null).getPropertyValue(A) : this.currentStyle[bkLib.camelize(A)]
}
},
remove: function(){
this.parentNode.removeChild(this);
return this
},
setAttributes: function(A){
for (var B in A) {
this[B] = A[B]
}
return this
}
});
var bkLib = {
isMSIE: (navigator.appVersion.indexOf("MSIE") != -1),
addEvent: function(C, B, A){
(C.addEventListener) ? C.addEventListener(B, A, false) : C.attachEvent("on" + B, A)
},
toArray: function(C){
var B = C.length, A = new Array(B);
while (B--) {
A[B] = C[B]
}
return A
},
noSelect: function(B){
if (B.setAttribute && B.nodeName.toLowerCase() != "input" && B.nodeName.toLowerCase() != "textarea") {
B.setAttribute("unselectable", "on")
}
for (var A = 0; A < B.childNodes.length; A++) {
bkLib.noSelect(B.childNodes[A])
}
},
camelize: function(A){
return A.replace(/-(.)/g, function(B, C){
return C.toUpperCase()
})
},
inArray: function(A, B){
return (bkLib.search(A, B) != null)
},
search: function(A, C){
for (var B = 0; B < A.length; B++) {
if (A[B] == C) {
return B
}
}
return null
},
cancelEvent: function(A){
A = A || window.event;
if (A.preventDefault && A.stopPropagation) {
A.preventDefault();
A.stopPropagation()
}
return false
},
domLoad: [],
domLoaded: function(){
if (arguments.callee.done) {
return
}
arguments.callee.done = true;
for (i = 0; i < bkLib.domLoad.length; i++) {
bkLib.domLoadi
}
},
onDomLoaded: function(A){
this.domLoad.push(A);
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", bkLib.domLoaded, null)
}
else {
if (bkLib.isMSIE) {
document.write(".nicEdit-main p { margin: 0; }<\/script");
$BK("__ie_onload").onreadystatechange = function(){
if (this.readyState == "complete") {
bkLib.domLoaded()
}
}
}
}
window.onload = bkLib.domLoaded
}
};
function $BK(A){
if (typeof(A) == "string") {
A = document.getElementById(A)
}
return (A && !A.appendTo) ? bkExtend(A, bkElement.prototype) : A
}
var bkEvent = {
addEvent: function(A, B){
if (B) {
this.eventList = this.eventList ||
{};
this.eventList[A] = this.eventList[A] || [];
this.eventList[A].push(B)
}
return this
},
fireEvent: function(){
var A = bkLib.toArray(arguments), C = A.shift();
if (this.eventList && this.eventList[C]) {
for (var B = 0; B < this.eventList[C].length; B++) {
this.eventList[C][B].apply(this, A)
}
}
}
};
function __(A){
return A
}
Function.prototype.closure = function(){
var A = this, B = bkLib.toArray(arguments), C = B.shift();
return function(){
if (typeof(bkLib) != "undefined") {
return A.apply(C, B.concat(bkLib.toArray(arguments)))
}
}
};
Function.prototype.closureListener = function(){
var A = this, C = bkLib.toArray(arguments), B = C.shift();
return function(E){
E = E || window.event;
if (E.target) {
var D = E.target
}
else {
var D = E.srcElement
}
return A.apply(B, [E, D].concat(C))
}
};
var nicEditorConfig = bkClass.extend({
buttons: {
'bold': {
name: _('Mettre en gras'),
command: 'Bold',
tags: ['B', 'STRONG'],
css: {
'font-weight': 'bold'
},
key: 'b'
},
'italic': {
name: _('Mettre en italique'),
command: 'Italic',
tags: ['EM', 'I'],
css: {
'font-style': 'italic'
},
key: 'i'
},
'underline': {
name: _('Souligner'),
command: 'Underline',
tags: ['U'],
css: {
'text-decoration': 'underline'
},
key: 'u'
},
'left': {
name: _('Aligné à gauche'),
command: 'justifyleft',
noActive: true
},
'center': {
name: _('Centré'),
command: 'justifycenter',
noActive: true
},
'right': {
name: _('Aligné à droite'),
command: 'justifyright',
noActive: true
},
'justify': {
name: _('Justifié'),
command: 'justifyfull',
noActive: true
},
'ol': {
name: _('Liste non ordonnée'),
command: 'insertorderedlist',
tags: ['OL']
},
'ul': {
name: _('Liste non ordonnée'),
command: 'insertunorderedlist',
tags: ['UL']
},
'subscript': {
name: _('Placer en indice'),
command: 'subscript',
tags: ['SUB']
},
'superscript': {
name: _('Placer en exposant'),
command: 'superscript',
tags: ['SUP']
},
'strikethrough': {
name: _('Barrer le texte'),
command: 'strikeThrough',
css: {
'text-decoration': 'line-through'
}
},
'removeformat': {
name: _('Supprimer la mise en forme'),
command: 'removeformat',
noActive: true
},
'indent': {
name: _('Indenter'),
command: 'indent',
noActive: true
},
'outdent': {
name: _('Remove Indent'),
command: 'outdent',
noActive: true
},
'hr': {
name: _('Ligne horizontale'),
command: 'insertHorizontalRule',
noActive: true
}
},
iconsPath: 'http://js.nicedit.com/nicEditIcons-latest.gif',
buttonList: ['save', 'bold', 'italic', 'underline', 'left', 'center', 'right', 'justify', 'ol', 'ul', 'fontSize', 'fontFamily', 'fontFormat', 'indent', 'outdent', 'image', 'upload', 'link', 'unlink', 'forecolor', 'bgcolor'],
iconList: {
"xhtml": 1,
"bgcolor": 2,
"forecolor": 3,
"bold": 4,
"center": 5,
"hr": 6,
"indent": 7,
"italic": 8,
"justify": 9,
"left": 10,
"ol": 11,
"outdent": 12,
"removeformat": 13,
"right": 14,
"save": 25,
"strikethrough": 16,
"subscript": 17,
"superscript": 18,
"ul": 19,
"underline": 20,
"image": 21,
"link": 22,
"unlink": 23,
"close": 24,
"arrow": 26,
"upload": 27,
"question":2
}
});
;
var nicEditors = {
nicPlugins: [],
editors: [],
registerPlugin: function(B, A){
this.nicPlugins.push({
p: B,
o: A
})
},
allTextAreas: function(C){
var A = document.getElementsByTagName("textarea");
for (var B = 0; B < A.length; B++) {
nicEditors.editors.push(new nicEditor(C).panelInstance(A[B]))
}
return nicEditors.editors
},
findEditor: function(C){
var B = nicEditors.editors;
for (var A = 0; A < B.length; A++) {
if (B[A].instanceById(C)) {
return B[A].instanceById(C)
}
}
}
};
var nicEditor = bkClass.extend({
construct: function(C){
this.options = new nicEditorConfig();
bkExtend(this.options, C);
this.nicInstances = new Array();
this.loadedPlugins = new Array();
var A = nicEditors.nicPlugins;
for (var B = 0; B < A.length; B++) {
this.loadedPlugins.push(new A[B].p(this, A[B].o))
}
nicEditors.editors.push(this);
bkLib.addEvent(document.body, "mousedown", this.selectCheck.closureListener(this))
},
panelInstance: function(B, C){
B = this.checkReplace($BK(B));
var A = new bkElement("DIV").setStyle({
width: (parseInt(B.getStyle("width")) || B.clientWidth) + "px"
}).appendBefore(B);
this.setPanel(A);
return this.addInstance(B, C)
},
checkReplace: function(B){
var A = nicEditors.findEditor(B);
if (A) {
A.removeInstance(B);
A.removePanel()
}
return B
},
addInstance: function(B, C){
B = this.checkReplace($BK(B));
if (B.contentEditable || !!window.opera) {
var A = new nicEditorInstance(B, C, this)
}
else {
var A = new nicEditorIFrameInstance(B, C, this)
}
this.nicInstances.push(A);
return this
},
removeInstance: function(C){
C = $BK(C);
var B = this.nicInstances;
for (var A = 0; A < B.length; A++) {
if (B[A].e == C) {
B[A].remove();
this.nicInstances.splice(A, 1)
}
}
},
removePanel: function(A){
if (this.nicPanel) {
this.nicPanel.remove();
this.nicPanel = null
}
},
instanceById: function(C){
C = $BK(C);
var B = this.nicInstances;
for (var A = 0; A < B.length; A++) {
if (B[A].e == C) {
return B[A]
}
}
},
setPanel: function(A){
this.nicPanel = new nicEditorPanel($BK(A), this.options, this);
this.fireEvent("panel", this.nicPanel);
return this
},
nicCommand: function(B, A){
if (this.selectedInstance) {
this.selectedInstance.nicCommand(B, A)
}
},
getIcon: function(D, A){
var C = this.options.iconList[D];
var B = (A.iconFiles) ? A.iconFiles[D] : "";
return {
backgroundImage: "url('" + ((C) ? this.options.iconsPath : B) + "')",
backgroundPosition: ((C) ? ((C - 1) * -18) : 0) + "px 0px"
}
},
selectCheck: function(C, A){
var B = false;
do {
if (A.className && A.className.indexOf("nicEdit") != -1) {
return false
}
}
while (A = A.parentNode);
this.fireEvent("blur", this.selectedInstance, A);
this.lastSelectedInstance = this.selectedInstance;
this.selectedInstance = null;
return false
}
});
nicEditor = nicEditor.extend(bkEvent);
var nicEditorInstance = bkClass.extend({
isSelected: false,
construct: function(G, D, C){
this.ne = C;
this.elm = this.e = G;
this.options = D ||
{};
newX = parseInt(G.getStyle("width")) || G.clientWidth;
newY = parseInt(G.getStyle("height")) || G.clientHeight;
this.initialHeight = newY - 8;
var H = (G.nodeName.toLowerCase() == "textarea");
if (H || this.options.hasPanel) {
var B = (bkLib.isMSIE && !((typeof document.body.style.maxHeight != "undefined") && document.compatMode == "CSS1Compat"));
var E = {
width: newX + "px",
border: "1px solid #ccc",
borderTop: 0,
overflowY: "auto",
overflowX: "hidden"
};
E[(B) ? "height" : "maxHeight"] = (this.ne.options.maxHeight) ? this.ne.options.maxHeight + "px" : null;
this.editorContain = new bkElement("DIV").setStyle(E).appendBefore(G);
var A = new bkElement("DIV").setStyle({
width: (newX - 8) + "px",
margin: "4px",
minHeight: newY + "px"
}).addClass("main").appendTo(this.editorContain);
G.setStyle({
display: "none"
});
A.innerHTML = G.innerHTML;
if (H) {
A.setContent(G.value);
this.copyElm = G;
var F = G.parentTag("FORM");
if (F) {
bkLib.addEvent(F, "submit", this.saveContent.closure(this))
}
}
A.setStyle((B) ? {
height: newY + "px"
} : {
overflow: "hidden"
});
this.elm = A
}
this.ne.addEvent("blur", this.blur.closure(this));
this.init();
this.blur()
},
init: function(){
this.elm.setAttribute("contentEditable", "true");
if (this.getContent() == "") {
this.setContent("")
}
this.instanceDoc = document.defaultView;
this.elm.addEvent("mousedown", this.selected.closureListener(this)).addEvent("keypress", this.keyDown.closureListener(this)).addEvent("focus", this.selected.closure(this)).addEvent("blur", this.blur.closure(this)).addEvent("keyup", this.selected.closure(this));
this.elm.addEvent("resizestart",function(){return false});
this.elm.addEvent("dragstart",function(){return false});
this.ne.fireEvent("add", this);
},
remove: function(){
this.saveContent();
if (this.copyElm || this.options.hasPanel) {
this.editorContain.remove();
this.e.setStyle({
display: "block"
});
this.ne.removePanel()
}
this.disable();
this.ne.fireEvent("remove", this)
},
disable: function(){
this.elm.setAttribute("contentEditable", "false")
},
getSel: function(){
return (window.getSelection) ? window.getSelection() : document.selection
},
getRng: function(){
var A = this.getSel();
if (!A) {
return null
}
return (A.rangeCount 0) ? A.getRangeAt(0) : A.createRange()
},
selRng: function(A, B){
if (window.getSelection) {
B.removeAllRanges();
B.addRange(A)
}
else {
A.select()
}
},
selElm: function(){
var C = this.getRng();
if (C.startContainer) {
var D = C.startContainer;
if (C.cloneContents().childNodes.length == 1) {
for (var B = 0; B < D.childNodes.length; B++) {
var A = D.childNodes[B].ownerDocument.createRange();
A.selectNode(D.childNodes[B]);
if (C.compareBoundaryPoints(Range.START_TO_START, A) != 1 && C.compareBoundaryPoints(Range.END_TO_END, A) != -1) {
return $BK(D.childNodes[B])
}
}
}
return $BK(D)
}
else {
return $BK((this.getSel().type == "Control") ? C.item(0) : C.parentElement())
}
},
saveRng: function(){
this.savedRange = this.getRng();
this.savedSel = this.getSel()
},
restoreRng: function(){
if (this.savedRange) {
this.selRng(this.savedRange, this.savedSel)
}
},
keyDown: function(B, A){
if (B.ctrlKey) {
this.ne.fireEvent("key", this, B)
}
},
selected: function(C, A){
if (!A) {
A = this.selElm()
}
if (!C.ctrlKey) {
var B = this.ne.selectedInstance;
if (B != this) {
if (B) {
this.ne.fireEvent("blur", B, A)
}
this.ne.selectedInstance = this;
this.ne.fireEvent("focus", B, A)
}
this.ne.fireEvent("selected", B, A);
this.isFocused = true;
this.elm.addClass("selected")
}
return false
},
blur: function(){
this.isFocused = false;
this.elm.removeClass("selected")
},
saveContent: function(){
if (this.copyElm || this.options.hasPanel) {
this.ne.fireEvent("save", this);
(this.copyElm) ? this.copyElm.value = this.getContent() : this.e.innerHTML = this.getContent()
}
},
getElm: function(){
return this.elm
},
getContent: function(){
this.content = this.getElm().innerHTML;
this.ne.fireEvent("get", this);
return this.content
},
setContent: function(A){
this.content = A;
this.ne.fireEvent("set", this);
this.elm.innerHTML = this.content
},
nicCommand: function(B, A){
document.execCommand(B, false, A)
}
});
var nicEditorIFrameInstance = nicEditorInstance.extend({
savedStyles: [],
init: function(){
var B = this.elm.innerHTML.replace(/^\s+|\s+$/g, "");
this.elm.innerHTML = "";
(!B) ? B = "" : B;
this.initialContent = B;
this.elmFrame = new bkElement("iframe").setAttributes({
src: "javascript:;",
frameBorder: 0,
allowTransparency: "true",
scrolling: "no"
}).setStyle({
height: "100px",
width: "100%"
}).addClass("frame").appendTo(this.elm);
if (this.copyElm) {
this.elmFrame.setStyle({
width: (this.elm.offsetWidth - 4) + "px"
})
}
var A = ["font-size", "font-family", "font-weight", "color"];
for (itm in A) {
this.savedStyles[bkLib.camelize(itm)] = this.elm.getStyle(itm)
}
setTimeout(this.initFrame.closure(this), 50)
},
disable: function(){
this.elm.innerHTML = this.getContent()
},
initFrame: function(){
var B = $BK(this.elmFrame.contentWindow.document);
B.designMode = "on";
B.open();
var A = this.ne.options.externalCSS;
B.write("" + ((A) ? '' : "") + '' + this.initialContent + "");
B.close();
this.frameDoc = B;
this.frameWin = $BK(this.elmFrame.contentWindow);
this.frameContent = $BK(this.frameWin.document.body).setStyle(this.savedStyles);
this.instanceDoc = this.frameWin.document.defaultView;
this.heightUpdate();
this.frameDoc.addEvent("mousedown", this.selected.closureListener(this)).addEvent("keyup", this.heightUpdate.closureListener(this)).addEvent("keydown", this.keyDown.closureListener(this)).addEvent("keyup", this.selected.closure(this));
this.ne.fireEvent("add", this)
},
getElm: function(){
return this.frameContent
},
setContent: function(A){
this.content = A;
this.ne.fireEvent("set", this);
this.frameContent.innerHTML = this.content;
this.heightUpdate()
},
getSel: function(){
return (this.frameWin) ? this.frameWin.getSelection() : this.frameDoc.selection
},
heightUpdate: function(){
this.elmFrame.style.height = Math.max(this.frameContent.offsetHeight, this.initialHeight) + "px"
},
nicCommand: function(B, A){
this.frameDoc.execCommand(B, false, A);
setTimeout(this.heightUpdate.closure(this), 100)
}
});
var nicEditorPanel = bkClass.extend({
construct: function(E, B, A){
this.elm = E;
this.options = B;
this.ne = A;
this.panelButtons = new Array();
this.buttonList = bkExtend([], this.ne.options.buttonList);
this.panelContain = new bkElement("DIV").setStyle({
overflow: "hidden",
width: "100%",
border: "1px solid #cccccc",
backgroundColor: "#efefef"
}).addClass("panelContain");
this.panelElm = new bkElement("DIV").setStyle({
margin: "2px",
marginTop: "0px",
zoom: 1,
overflow: "hidden"
}).addClass("panel").appendTo(this.panelContain);
this.panelContain.appendTo(E);
var C = this.ne.options;
var D = C.buttons;
for (button in D) {
this.addButton(button, C, true)
}
this.reorder();
E.noSelect()
},
addButton: function(buttonName, options, noOrder){
var button = options.buttons[buttonName];
var type = (button.type) ? eval("(typeof(" + button.type + ') == "undefined") ? null : ' + button.type + ";") : nicEditorButton;
var hasButton = bkLib.inArray(this.buttonList, buttonName);
if (type && (hasButton || this.ne.options.fullPanel)) {
this.panelButtons.push(new type(this.panelElm, buttonName, options, this.ne));
if (!hasButton) {
this.buttonList.push(buttonName)
}
}
},
findButton: function(B){
for (var A = 0; A < this.panelButtons.length; A++) {
if (this.panelButtons[A].name == B) {
return this.panelButtons[A]
}
}
},
reorder: function(){
var C = this.buttonList;
for (var B = 0; B < C.length; B++) {
var A = this.findButton(C[B]);
if (A) {
this.panelElm.appendChild(A.margin)
}
}
},
remove: function(){
this.elm.remove()
}
});
var nicEditorButton = bkClass.extend({
construct: function(D, A, C, B){
this.options = C.buttons[A];
this.name = A;
this.ne = B;
this.elm = D;
this.margin = new bkElement("DIV").setStyle({
"float": "left",
marginTop: "2px"
}).appendTo(D);
this.contain = new bkElement("DIV").setStyle({
width: "20px",
height: "20px"
}).addClass("buttonContain").appendTo(this.margin);
this.border = new bkElement("DIV").setStyle({
backgroundColor: "#efefef",
border: "1px solid #efefef"
}).appendTo(this.contain);
this.button = new bkElement("DIV").setStyle({
width: "18px",
height: "18px",
overflow: "hidden",
zoom: 1,
cursor: "pointer"
}).addClass("button").setStyle(this.ne.getIcon(A, C)).appendTo(this.border);
this.button.addEvent("mouseover", this.hoverOn.closure(this)).addEvent("mouseout", this.hoverOff.closure(this)).addEvent("mousedown", this.mouseClick.closure(this)).noSelect();
if (!window.opera) {
this.button.onmousedown = this.button.onclick = bkLib.cancelEvent
}
B.addEvent("selected", this.enable.closure(this)).addEvent("blur", this.disable.closure(this)).addEvent("key", this.key.closure(this));
this.disable();
this.init()
},
init: function(){
},
hide: function(){
this.contain.setStyle({
display: "none"
})
},
updateState: function(){
if (this.isDisabled) {
this.setBg()
}
else {
if (this.isHover) {
this.setBg("hover")
}
else {
if (this.isActive) {
this.setBg("active")
}
else {
this.setBg()
}
}
}
},
setBg: function(A){
switch (A) {
case "hover":
var B = {
border: "1px solid #666",
backgroundColor: "#ddd"
};
break;
case "active":
var B = {
border: "1px solid #666",
backgroundColor: "#ccc"
};
break;
default:
var B = {
border: "1px solid #efefef",
backgroundColor: "#efefef"
}
}
this.border.setStyle(B).addClass("button-" + A)
},
checkNodes: function(A){
var B = A;
do {
if (this.options.tags && bkLib.inArray(this.options.tags, B.nodeName)) {
this.activate();
return true
}
}
while (B = B.parentNode && B.className != "nicEdit");
B = $BK(A);
while (B.nodeType == 3) {
B = $BK(B.parentNode)
}
if (this.options.css) {
for (itm in this.options.css) {
if (B.getStyle(itm, this.ne.selectedInstance.instanceDoc) == this.options.css[itm]) {
this.activate();
return true
}
}
}
this.deactivate();
return false
},
activate: function(){
if (!this.isDisabled) {
this.isActive = true;
this.updateState();
this.ne.fireEvent("buttonActivate", this)
}
},
deactivate: function(){
this.isActive = false;
this.updateState();
if (!this.isDisabled) {
th