noalyss-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Noalyss-commit] [noalyss] 14/17: WYSIWYG textarea


From: Dany De Bontridder
Subject: [Noalyss-commit] [noalyss] 14/17: WYSIWYG textarea
Date: Mon, 31 Oct 2022 12:53:39 -0400 (EDT)

sparkyx pushed a commit to branch master
in repository noalyss.

commit 64d59121403ec28c51f7bb6d4f7dd607ae178fb5
Author: sparkyx <danydb@noalyss.eu>
AuthorDate: Sun Oct 30 18:38:08 2022 +0100

    WYSIWYG textarea
---
 html/image/nicEditorIcons.gif |  Bin 0 -> 3716 bytes
 html/js/nicEdit.js            | 1843 ++++++++++++++++++++++++++++++++++++++---
 2 files changed, 1733 insertions(+), 110 deletions(-)

diff --git a/html/image/nicEditorIcons.gif b/html/image/nicEditorIcons.gif
new file mode 100644
index 000000000..cd33a5df5
Binary files /dev/null and b/html/image/nicEditorIcons.gif differ
diff --git a/html/js/nicEdit.js b/html/js/nicEdit.js
index 00a2e09f3..72e2d93a0 100644
--- a/html/js/nicEdit.js
+++ b/html/js/nicEdit.js
@@ -1,112 +1,1735 @@
-/* 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
+/* 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 [...]
-
-
-
-var nicEditorConfig = bkClass.extend({
-       buttons : {
-               'bold' : {name : __('Click to Bold'), command : 'Bold', tags : 
['B','STRONG'], css : {'font-weight' : 'bold'}, key : 'b'},
-               'italic' : {name : __('Click to Italic'), command : 'Italic', 
tags : ['EM','I'], css : {'font-style' : 'italic'}, key : 'i'},
-               'underline' : {name : __('Click to Underline'), command : 
'Underline', tags : ['U'], css : {'text-decoration' : 'underline'}, key : 'u'},
-               'left' : {name : __('Left Align'), command : 'justifyleft', 
noActive : true},
-               'center' : {name : __('Center Align'), command : 
'justifycenter', noActive : true},
-               'right' : {name : __('Right Align'), command : 'justifyright', 
noActive : true},
-               'justify' : {name : __('Justify Align'), command : 
'justifyfull', noActive : true},
-               'ol' : {name : __('Insert Ordered List'), command : 
'insertorderedlist', tags : ['OL']},
-               'ul' :  {name : __('Insert Unordered List'), command : 
'insertunorderedlist', tags : ['UL']},
-               'subscript' : {name : __('Click to Subscript'), command : 
'subscript', tags : ['SUB']},
-               'superscript' : {name : __('Click to Superscript'), command : 
'superscript', tags : ['SUP']},
-               'strikethrough' : {name : __('Click to Strike Through'), 
command : 'strikeThrough', css : {'text-decoration' : 'line-through'}},
-               'removeformat' : {name : __('Remove Formatting'), command : 
'removeformat', noActive : true},
-               'indent' : {name : __('Indent Text'), command : 'indent', 
noActive : true},
-               'outdent' : {name : __('Remove Indent'), command : 'outdent', 
noActive : true},
-               'hr' : {name : __('Horizontal Rule'), command : 
'insertHorizontalRule', noActive : true}
-       },
-       iconsPath : '../nicEditorIcons.gif',
-       buttonList : 
['save','bold','italic','underline','left','center','right','justify','ol','ul','fontSize','fontFamily','fontFormat','indent','outdent','image','upload','link','unlink','forecolor','bgcolor'],
-       iconList : 
{"bgcolor":1,"forecolor":2,"bold":3,"center":4,"hr":5,"indent":6,"italic":7,"justify":8,"left":9,"ol":10,"outdent":11,"removeformat":12,"right":13,"save":24,"strikethrough":15,"subscript":16,"superscript":17,"ul":18,"underline":19,"image":20,"link":21,"unlink":22,"close":23,"arrow":25,"upload":26}
-       
-});
-;
-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=n [...]
-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",bor [...]
-var 
nicEditorIFrameInstance=nicEditorInstance.extend({savedStyles:[],init:function(){var
 
B=this.elm.innerHTML.replace(/^\s+|\s+$/g,"");this.elm.innerHTML="";(!B)?B="<br 
/>":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=["fon [...]
-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);th
 [...]
-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").setSty [...]
-var 
nicPlugin=bkClass.extend({construct:function(B,A){this.options=A;this.ne=B;this.ne.addEvent("panel",this.loadPanel.closure(this));this.init()},loadPanel:function(C){var
 B=this.options.buttons;for(var A in 
B){C.addButton(A,this.options)}C.reorder()},init:function(){}});
-
-
-var nicPaneOptions = { };
-
-var 
nicEditorPane=bkClass.extend({construct:function(D,C,B,A){this.ne=C;this.elm=D;this.pos=D.pos();this.contain=new
 
bkElement("div").setStyle({zIndex:"99999",overflow:"hidden",position:"absolute",left:this.pos[0]+"px",top:this.pos[1]+"px"});this.pane=new
 bkElement("div").setStyle({fontSize:"12px",border:"1px solid 
#ccc",overflow:"hidden",padding:"4px",textAlign:"left",backgroundColor:"#ffffc9"}).addClass("pane").setStyle(B).appendTo(this.contain);if(A&&!A.options.noClose){this.close=new
 [...]
-
-var 
nicEditorAdvancedButton=nicEditorButton.extend({init:function(){this.ne.addEvent("selected",this.removePane.closure(this)).addEvent("blur",this.removePane.closure(this))},mouseClick:function(){if(!this.isDisabled){if(this.pane&&this.pane.pane){this.removePane()}else{this.pane=new
 
nicEditorPane(this.contain,this.ne,{width:(this.width||"270px"),backgroundColor:"#fff"},this);this.addPane();this.ne.selectedInstance.saveRng()}}},addForm:function(C,G){this.form=new
 bkElement("form").addEve [...]
-
-var 
nicButtonTips=bkClass.extend({construct:function(A){this.ne=A;A.addEvent("buttonOver",this.show.closure(this)).addEvent("buttonOut",this.hide.closure(this))},show:function(A){this.timer=setTimeout(this.create.closure(this,A),400)},create:function(A){this.timer=null;if(!this.pane){this.pane=new
 
nicEditorPane(A.button,this.ne,{fontSize:"12px",marginTop:"5px"});this.pane.setContent(A.options.name)}},hide:function(A){if(this.timer){clearTimeout(this.timer)}if(this.pane){this.pane=this.pa
 [...]
-
-
-var nicSelectOptions = {
-       buttons : {
-               'fontSize' : {name : __('Select Font Size'), type : 
'nicEditorFontSizeSelect', command : 'fontsize'},
-               'fontFamily' : {name : __('Select Font Family'), type : 
'nicEditorFontFamilySelect', command : 'fontname'},
-               'fontFormat' : {name : __('Select Font Format'), type : 
'nicEditorFontFormatSelect', command : 'formatBlock'}
-       }
-};
-
-var 
nicEditorSelect=bkClass.extend({construct:function(D,A,C,B){this.options=C.buttons[A];this.elm=D;this.ne=B;this.name=A;this.selOptions=new
 Array();this.margin=new bkElement("div").setStyle({"float":"left",margin:"2px 
1px 0 1px"}).appendTo(this.elm);this.contain=new 
bkElement("div").setStyle({width:"90px",height:"20px",cursor:"pointer",overflow:"hidden"}).addClass("selectContain").addEvent("click",this.toggle.closure(this)).appendTo(this.margin);this.items=new
 bkElement("div").setStyl [...]
-
-
-var nicLinkOptions = {
-       buttons : {
-               'link' : {name : 'Add Link', type : 'nicLinkButton', tags : 
['A']},
-               'unlink' : {name : 'Remove Link',  command : 'unlink', noActive 
: true}
-       }
-};
-
-var 
nicLinkButton=nicEditorAdvancedButton.extend({addPane:function(){this.ln=this.ne.selectedInstance.selElm().parentTag("A");this.addForm({"":{type:"title",txt:"Add/Edit
 
Link"},href:{type:"text",txt:"URL",value:"http://",style:{width:"150px"}},title:{type:"text",txt:"Title"},target:{type:"select",txt:"Open
 In",options:{"":"Current Window",_blank:"New 
Window"},style:{width:"100px"}}},this.ln)},submit:function(C){var 
A=this.inputs.href.value;if(A=="http://";||A==""){alert("You must enter a [...]
-
-
-var nicColorOptions = {
-       buttons : {
-               'forecolor' : {name : __('Change Text Color'), type : 
'nicEditorColorButton', noClose : true},
-               'bgcolor' : {name : __('Change Background Color'), type : 
'nicEditorBgColorButton', noClose : true}
-       }
-};
-
-var 
nicEditorColorButton=nicEditorAdvancedButton.extend({addPane:function(){var 
D={0:"00",1:"33",2:"66",3:"99",4:"CC",5:"FF"};var H=new 
bkElement("DIV").setStyle({width:"270px"});for(var A in D){for(var F in 
D){for(var E in D){var I="#"+D[A]+D[E]+D[F];var C=new 
bkElement("DIV").setStyle({cursor:"pointer",height:"15px","float":"left"}).appendTo(H);var
 G=new bkElement("DIV").setStyle({border:"2px solid "+I}).appendTo(C);var B=new 
bkElement("DIV").setStyle({backgroundColor:I,overflow:"hidde [...]
-
-
-var nicImageOptions = {
-       buttons : {
-               'image' : {name : 'Add Image', type : 'nicImageButton', tags : 
['IMG']}
-       }
-       
-};
-
-var 
nicImageButton=nicEditorAdvancedButton.extend({addPane:function(){this.im=this.ne.selectedInstance.selElm().parentTag("IMG");this.addForm({"":{type:"title",txt:"Add/Edit
 
Image"},src:{type:"text",txt:"URL",value:"http://",style:{width:"150px"}},alt:{type:"text",txt:"Alt
 
Text",style:{width:"100px"}},align:{type:"select",txt:"Align",options:{none:"Default",left:"Left",right:"Right"}}},this.im)},submit:function(B){var
 C=this.inputs.src.value;if(C==""||C=="http://";){alert("You must enter  [...]
-
-
-var nicSaveOptions = {
-       buttons : {
-               'save' : {name : __('Save this content'), type : 
'nicEditorSaveButton'}
-       }
-};
-
-var 
nicEditorSaveButton=nicEditorButton.extend({init:function(){if(!this.ne.options.onSave){this.margin.setStyle({display:"none"})}},mouseClick:function(){var
 B=this.ne.options.onSave;var 
A=this.ne.selectedInstance;B(A.getContent(),A.elm.id,A)}});nicEditors.registerPlugin(nicPlugin,nicSaveOptions);
-
-
-var nicUploadOptions = {
-       buttons : {
-               'upload' : {name : 'Upload Image', type : 'nicUploadButton'}
-       }
-       
-};
-
-var 
nicUploadButton=nicEditorAdvancedButton.extend({nicURI:"http://api.imgur.com/2/upload.json",errorText:"Failed
 to upload image",addPane:function(){if(typeof 
window.FormData==="undefined"){return this.onError("Image uploads are not 
supported in this browser, use Chrome, Firefox, or Safari 
instead.")}this.im=this.ne.selectedInstance.selElm().parentTag("IMG");var A=new 
bkElement("div").setStyle({padding:"10px"}).appendTo(this.pane.pane);new 
bkElement("div").setStyle({fontSize:"14px",font [...]
+var bkExtend = function(){
+       var args = arguments;
+       if (args.length == 1) args = [this, args[0]];
+       for (var prop in args[1]) args[0][prop] = args[1][prop];
+       return args[0];
+};
+function bkClass() { }
+bkClass.prototype.construct = function() {};
+bkClass.extend = function(def) {
+  var classDef = function() {
+      if (arguments[0] !== bkClass) { return this.construct.apply(this, 
arguments); }
+  };
+  var proto = new this(bkClass);
+  bkExtend(proto,def);
+  classDef.prototype = proto;
+  classDef.extend = this.extend;      
+  return classDef;
+};
+
+var bkElement = bkClass.extend({
+       construct : function(elm,d) {
+               if(typeof(elm) == "string") {
+                       elm = (d || document).createElement(elm);
+               }
+               elm = $BK(elm);
+               return elm;
+       },
+       
+       appendTo : function(elm) {
+               elm.appendChild(this);  
+               return this;
+       },
+       
+       appendBefore : function(elm) {
+               elm.parentNode.insertBefore(this,elm);  
+               return this;
+       },
+       
+       addEvent : function(type, fn) {
+               bkLib.addEvent(this,type,fn);
+               return this;    
+       },
+       
+       setContent : function(c) {
+               this.innerHTML = c;
+               return this;
+       },
+       
+       pos : function() {
+               var curleft = curtop = 0;
+               var o = obj = this;
+               if (obj.offsetParent) {
+                       do {
+                               curleft += obj.offsetLeft;
+                               curtop += obj.offsetTop;
+                       } while (obj = obj.offsetParent);
+               }
+               var b = (!window.opera) ? 
parseInt(this.getStyle('border-width') || this.style.border) || 0 : 0;
+               return [curleft+b,curtop+b+this.offsetHeight];
+       },
+       
+       noSelect : function() {
+               bkLib.noSelect(this);
+               return this;
+       },
+       
+       parentTag : function(t) {
+               var elm = this;
+                do {
+                       if(elm && elm.nodeName && elm.nodeName.toUpperCase() == 
t) {
+                               return elm;
+                       }
+                       elm = elm.parentNode;
+               } while(elm);
+               return false;
+       },
+       
+       hasClass : function(cls) {
+               return this.className.match(new 
RegExp('(\\s|^)nicEdit-'+cls+'(\\s|$)'));
+       },
+       
+       addClass : function(cls) {
+               if (!this.hasClass(cls)) { this.className += " nicEdit-"+cls };
+               return this;
+       },
+       
+       removeClass : function(cls) {
+               if (this.hasClass(cls)) {
+                       this.className = this.className.replace(new 
RegExp('(\\s|^)nicEdit-'+cls+'(\\s|$)'),' ');
+               }
+               return this;
+       },
+
+       setStyle : function(st) {
+               var elmStyle = this.style;
+               for(var itm in st) {
+                       switch(itm) {
+                               case 'float':
+                                       elmStyle['cssFloat'] = 
elmStyle['styleFloat'] = st[itm];
+                                       break;
+                               case 'opacity':
+                                       elmStyle.opacity = st[itm];
+                                       elmStyle.filter = "alpha(opacity=" + 
Math.round(st[itm]*100) + ")"; 
+                                       break;
+                               case 'className':
+                                       this.className = st[itm];
+                                       break;
+                               default:
+                                       //if(document.compatMode || itm != 
"cursor") { // Nasty Workaround for IE 5.5
+                                               elmStyle[itm] = st[itm];
+                                       //}             
+                       }
+               }
+               return this;
+       },
+       
+       getStyle : function( cssRule, d ) {
+               var doc = (!d) ? document.defaultView : d; 
+               if(this.nodeType == 1)
+               return (doc && doc.getComputedStyle) ? doc.getComputedStyle( 
this, null ).getPropertyValue(cssRule) : this.currentStyle[ 
bkLib.camelize(cssRule) ];
+       },
+       
+       remove : function() {
+               this.parentNode.removeChild(this);
+               return this;    
+       },
+       
+       setAttributes : function(at) {
+               for(var itm in at) {
+                       this[itm] = at[itm];
+               }
+               return this;
+       }
+});
+
+var bkLib = {
+       isMSIE : (navigator.appVersion.indexOf("MSIE") != -1),
+       
+       addEvent : function(obj, type, fn) {
+               (obj.addEventListener) ? obj.addEventListener( type, fn, false 
) : obj.attachEvent("on"+type, fn);      
+       },
+       
+       toArray : function(iterable) {
+               var length = iterable.length, results = new Array(length);
+       while (length--) { results[length] = iterable[length] };
+       return results; 
+       },
+       
+       noSelect : function(element) {
+               if(element.setAttribute && element.nodeName.toLowerCase() != 
'input' && element.nodeName.toLowerCase() != 'textarea') {
+                       element.setAttribute('unselectable','on');
+               }
+               for(var i=0;i<element.childNodes.length;i++) {
+                       bkLib.noSelect(element.childNodes[i]);
+               }
+       },
+       camelize : function(s) {
+               return s.replace(/\-(.)/g, function(m, l){return 
l.toUpperCase()});
+       },
+       inArray : function(arr,item) {
+           return (bkLib.search(arr,item) != null);
+       },
+       search : function(arr,itm) {
+               for(var i=0; i < arr.length; i++) {
+                       if(arr[i] == itm)
+                               return i;
+               }
+               return null;    
+       },
+       cancelEvent : function(e) {
+               e = e || window.event;
+               if(e.preventDefault && e.stopPropagation) {
+                       e.preventDefault();
+                       e.stopPropagation();
+               }
+               return false;
+       },
+       domLoad : [],
+       domLoaded : function() {
+               if (arguments.callee.done) return;
+               arguments.callee.done = true;
+               for (i = 0;i < bkLib.domLoad.length;i++) bkLib.domLoad[i]();
+       },
+       onDomLoaded : function(fireThis) {
+               this.domLoad.push(fireThis);
+               if (document.addEventListener) {
+                       document.addEventListener("DOMContentLoaded", 
bkLib.domLoaded, null);
+               } else if(bkLib.isMSIE) {
+                       document.write("<style>.nicEdit-main p { margin: 0; 
}</style><scr"+"ipt id=__ie_onload defer " + ((location.protocol == "https:") ? 
"src='javascript:void(0)'" : "src=//0") + "><\/scr"+"ipt>");
+                       $BK("__ie_onload").onreadystatechange = function() {
+                           if (this.readyState == 
"complete"){bkLib.domLoaded();}
+                       };
+               }
+           window.onload = bkLib.domLoaded;
+       }
+};
+
+function $BK(elm) {
+       if(typeof(elm) == "string") {
+               elm = document.getElementById(elm);
+       }
+       return (elm && !elm.appendTo) ? bkExtend(elm,bkElement.prototype) : elm;
+}
+
+var bkEvent = {
+       addEvent : function(evType, evFunc) {
+               if(evFunc) {
+                       this.eventList = this.eventList || {};
+                       this.eventList[evType] = this.eventList[evType] || [];
+                       this.eventList[evType].push(evFunc);
+               }
+               return this;
+       },
+       fireEvent : function() {
+               var args = bkLib.toArray(arguments), evType = args.shift();
+               if(this.eventList && this.eventList[evType]) {
+                       for(var i=0;i<this.eventList[evType].length;i++) {
+                               this.eventList[evType][i].apply(this,args);
+                       }
+               }
+       }       
+};
+
+function __(s) {
+       return s;
+}
+
+Function.prototype.closure = function() {
+  var __method = this, args = bkLib.toArray(arguments), obj = args.shift();
+  return function() { if(typeof(bkLib) != 'undefined') { return 
__method.apply(obj,args.concat(bkLib.toArray(arguments))); } };
+}
+       
+Function.prototype.closureListener = function() {
+       var __method = this, args = bkLib.toArray(arguments), object = 
args.shift(); 
+       return function(e) { 
+       e = e || window.event;
+       if(e.target) { var target = e.target; } else { var target =  
e.srcElement };
+               return __method.apply(object, [e,target].concat(args) ); 
+       };
+}              
+
+
+/* START CONFIG */
+
+var nicEditorConfig = bkClass.extend({
+       buttons : {
+               'bold' : {name : __('Click to Bold'), command : 'Bold', tags : 
['B','STRONG'], css : {'font-weight' : 'bold'}, key : 'b'},
+               'italic' : {name : __('Click to Italic'), command : 'Italic', 
tags : ['EM','I'], css : {'font-style' : 'italic'}, key : 'i'},
+               'underline' : {name : __('Click to Underline'), command : 
'Underline', tags : ['U'], css : {'text-decoration' : 'underline'}, key : 'u'},
+               'left' : {name : __('Left Align'), command : 'justifyleft', 
noActive : true},
+               'center' : {name : __('Center Align'), command : 
'justifycenter', noActive : true},
+               'right' : {name : __('Right Align'), command : 'justifyright', 
noActive : true},
+               'justify' : {name : __('Justify Align'), command : 
'justifyfull', noActive : true},
+               'ol' : {name : __('Insert Ordered List'), command : 
'insertorderedlist', tags : ['OL']},
+               'ul' :  {name : __('Insert Unordered List'), command : 
'insertunorderedlist', tags : ['UL']},
+               'subscript' : {name : __('Click to Subscript'), command : 
'subscript', tags : ['SUB']},
+               'superscript' : {name : __('Click to Superscript'), command : 
'superscript', tags : ['SUP']},
+               'strikethrough' : {name : __('Click to Strike Through'), 
command : 'strikeThrough', css : {'text-decoration' : 'line-through'}},
+               'removeformat' : {name : __('Remove Formatting'), command : 
'removeformat', noActive : true},
+               'indent' : {name : __('Indent Text'), command : 'indent', 
noActive : true},
+               'outdent' : {name : __('Remove Indent'), command : 'outdent', 
noActive : true},
+               'hr' : {name : __('Horizontal Rule'), command : 
'insertHorizontalRule', noActive : true}
+       },
+       iconsPath : '../nicEditorIcons.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}
+       
+});
+/* END CONFIG */
+
+
+var nicEditors = {
+       nicPlugins : [],
+       editors : [],
+       
+       registerPlugin : function(plugin,options) {
+               this.nicPlugins.push({p : plugin, o : options});
+       },
+
+       allTextAreas : function(nicOptions) {
+               var textareas = document.getElementsByTagName("textarea");
+               for(var i=0;i<textareas.length;i++) {
+                       nicEditors.editors.push(new 
nicEditor(nicOptions).panelInstance(textareas[i]));
+               }
+               return nicEditors.editors;
+       },
+       
+       findEditor : function(e) {
+               var editors = nicEditors.editors;
+               for(var i=0;i<editors.length;i++) {
+                       if(editors[i].instanceById(e)) {
+                               return editors[i].instanceById(e);
+                       }
+               }
+       }
+};
+
+
+var nicEditor = bkClass.extend({
+       construct : function(o) {
+               this.options = new nicEditorConfig();
+               bkExtend(this.options,o);
+               this.nicInstances = new Array();
+               this.loadedPlugins = new Array();
+               
+               var plugins = nicEditors.nicPlugins;
+               for(var i=0;i<plugins.length;i++) {
+                       this.loadedPlugins.push(new 
plugins[i].p(this,plugins[i].o));
+               }
+               nicEditors.editors.push(this);
+               bkLib.addEvent(document.body,'mousedown', 
this.selectCheck.closureListener(this) );
+       },
+       
+       panelInstance : function(e,o) {
+               e = this.checkReplace($BK(e));
+               var panelElm = new bkElement('DIV').setStyle({width : 
(parseInt(e.getStyle('width')) || e.clientWidth)+'px'}).appendBefore(e);
+               this.setPanel(panelElm);
+               return this.addInstance(e,o);   
+       },
+
+       checkReplace : function(e) {
+               var r = nicEditors.findEditor(e);
+               if(r) {
+                       r.removeInstance(e);
+                       r.removePanel();
+               }
+               return e;
+       },
+
+       addInstance : function(e,o) {
+               e = this.checkReplace($BK(e));
+               if( e.contentEditable || !!window.opera ) {
+                       var newInstance = new nicEditorInstance(e,o,this);
+               } else {
+                       var newInstance = new nicEditorIFrameInstance(e,o,this);
+               }
+               this.nicInstances.push(newInstance);
+               return this;
+       },
+       
+       removeInstance : function(e) {
+               e = $BK(e);
+               var instances = this.nicInstances;
+               for(var i=0;i<instances.length;i++) {   
+                       if(instances[i].e == e) {
+                               instances[i].remove();
+                               this.nicInstances.splice(i,1);
+                       }
+               }
+       },
+
+       removePanel : function(e) {
+               if(this.nicPanel) {
+                       this.nicPanel.remove();
+                       this.nicPanel = null;
+               }       
+       },
+
+       instanceById : function(e) {
+               e = $BK(e);
+               var instances = this.nicInstances;
+               for(var i=0;i<instances.length;i++) {
+                       if(instances[i].e == e) {
+                               return instances[i];
+                       }
+               }       
+       },
+
+       setPanel : function(e) {
+               this.nicPanel = new nicEditorPanel($BK(e),this.options,this);
+               this.fireEvent('panel',this.nicPanel);
+               return this;
+       },
+       
+       nicCommand : function(cmd,args) {       
+               if(this.selectedInstance) {
+                       this.selectedInstance.nicCommand(cmd,args);
+               }
+       },
+       
+       getIcon : function(iconName,options) {
+               var icon = this.options.iconList[iconName];
+               var file = (options.iconFiles) ? options.iconFiles[iconName] : 
'';
+               return {backgroundImage : "url('"+((icon) ? 
this.options.iconsPath : file)+"')", backgroundPosition : ((icon) ? 
((icon-1)*-18) : 0)+'px 0px'};  
+       },
+               
+       selectCheck : function(e,t) {
+               var found = false;
+               do{
+                       if(t.className && t.className.indexOf('nicEdit') != -1) 
{
+                               return false;
+                       }
+               } while(t = t.parentNode);
+               this.fireEvent('blur',this.selectedInstance,t);
+               this.lastSelectedInstance = this.selectedInstance;
+               this.selectedInstance = null;
+               return false;
+       }
+       
+});
+nicEditor = nicEditor.extend(bkEvent);
+
+ 
+var nicEditorInstance = bkClass.extend({
+       isSelected : false,
+       
+       construct : function(e,options,nicEditor) {
+               this.ne = nicEditor;
+               this.elm = this.e = e;
+               this.options = options || {};
+               
+               newX = parseInt(e.getStyle('width')) || e.clientWidth;
+               newY = parseInt(e.getStyle('height')) || e.clientHeight;
+               this.initialHeight = newY-8;
+               
+               var isTextarea = (e.nodeName.toLowerCase() == "textarea");
+               if(isTextarea || this.options.hasPanel) {
+                       var ie7s = (bkLib.isMSIE && !((typeof 
document.body.style.maxHeight != "undefined") && document.compatMode == 
"CSS1Compat"))
+                       var s = {width: newX+'px', border : '1px solid #ccc', 
borderTop : 0, overflowY : 'auto', overflowX: 'hidden' };
+                       s[(ie7s) ? 'height' : 'maxHeight'] = 
(this.ne.options.maxHeight) ? this.ne.options.maxHeight+'px' : null;
+                       this.editorContain = new 
bkElement('DIV').setStyle(s).appendBefore(e);
+                       var editorElm = new bkElement('DIV').setStyle({width : 
(newX-8)+'px', margin: '4px', minHeight : 
newY+'px'}).addClass('main').appendTo(this.editorContain);
+
+                       e.setStyle({display : 'none'});
+                               
+                       editorElm.innerHTML = e.innerHTML;              
+                       if(isTextarea) {
+                               editorElm.setContent(e.value);
+                               this.copyElm = e;
+                               var f = e.parentTag('FORM');
+                               if(f) { bkLib.addEvent( f, 'submit', 
this.saveContent.closure(this)); }
+                       }
+                       editorElm.setStyle((ie7s) ? {height : newY+'px'} : 
{overflow: 'hidden'});
+                       this.elm = editorElm;   
+               }
+               this.ne.addEvent('blur',this.blur.closure(this));
+
+               this.init();
+               this.blur();
+       },
+       
+       init : function() {
+               this.elm.setAttribute('contentEditable','true');        
+               if(this.getContent() == "") {
+                       this.setContent('<br />');
+               }
+               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.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 s = this.getSel();
+               if(!s || s.rangeCount === 0) { return; }
+               return (s.rangeCount > 0) ? s.getRangeAt(0) : s.createRange();
+       },
+       
+       selRng : function(rng,s) {
+               if(window.getSelection) {
+                       s.removeAllRanges();
+                       s.addRange(rng);
+               } else {
+                       rng.select();
+               }
+       },
+       
+       selElm : function() {
+               var r = this.getRng();
+               if(!r) { return; }
+               if(r.startContainer) {
+                       var contain = r.startContainer;
+                       if(r.cloneContents().childNodes.length == 1) {
+                               for(var i=0;i<contain.childNodes.length;i++) {
+                                       var rng = 
contain.childNodes[i].ownerDocument.createRange();
+                                       rng.selectNode(contain.childNodes[i]);  
                                
+                                       
if(r.compareBoundaryPoints(Range.START_TO_START,rng) != 1 && 
+                                               
r.compareBoundaryPoints(Range.END_TO_END,rng) != -1) {
+                                               return 
$BK(contain.childNodes[i]);
+                                       }
+                               }
+                       }
+                       return $BK(contain);
+               } else {
+                       return $BK((this.getSel().type == "Control") ? 
r.item(0) : r.parentElement());
+               }
+       },
+       
+       saveRng : function() {
+               this.savedRange = this.getRng();
+               this.savedSel = this.getSel();
+       },
+       
+       restoreRng : function() {
+               if(this.savedRange) {
+                       this.selRng(this.savedRange,this.savedSel);
+               }
+       },
+       
+       keyDown : function(e,t) {
+               if(e.ctrlKey) {
+                       this.ne.fireEvent('key',this,e);
+               }
+       },
+       
+       selected : function(e,t) {
+               if(!t && !(t = this.selElm)) { t = this.selElm(); }
+               if(!e.ctrlKey) {
+                       var selInstance = this.ne.selectedInstance;
+                       if(selInstance != this) {
+                               if(selInstance) {
+                                       this.ne.fireEvent('blur',selInstance,t);
+                               }
+                               this.ne.selectedInstance = this;        
+                               this.ne.fireEvent('focus',selInstance,t);
+                       }
+                       this.ne.fireEvent('selected',selInstance,t);
+                       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(e) {
+               this.content = e;
+               this.ne.fireEvent('set',this);
+               this.elm.innerHTML = this.content;      
+       },
+       
+       nicCommand : function(cmd,args) {
+               document.execCommand(cmd,false,args);
+       }               
+});
+
+var nicEditorIFrameInstance = nicEditorInstance.extend({
+       savedStyles : [],
+       
+       init : function() {     
+               var c = this.elm.innerHTML.replace(/^\s+|\s+$/g, '');
+               this.elm.innerHTML = '';
+               (!c) ? c = "<br />" : c;
+               this.initialContent = c;
+               
+               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 styleList = 
['font-size','font-family','font-weight','color'];
+               for(itm in styleList) {
+                       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 fd = $BK(this.elmFrame.contentWindow.document);
+               fd.designMode = "on";           
+               fd.open();
+               var css = this.ne.options.externalCSS;
+               fd.write('<html><head>'+((css) ? '<link href="'+css+'" 
rel="stylesheet" type="text/css" />' : '')+'</head><body id="nicEditContent" 
style="margin: 0 !important; background-color: transparent 
!important;">'+this.initialContent+'</body></html>');
+               fd.close();
+               this.frameDoc = fd;
+
+               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(c) {
+               this.content = c;
+               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(cmd,args) {
+               this.frameDoc.execCommand(cmd,false,args);
+               setTimeout(this.heightUpdate.closure(this),100);
+       }
+
+       
+});
+var nicEditorPanel = bkClass.extend({
+       construct : function(e,options,nicEditor) {
+               this.elm = e;
+               this.options = options;
+               this.ne = nicEditor;
+               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 opt = this.ne.options;
+               var buttons = opt.buttons;
+               for(button in buttons) {
+                               this.addButton(button,opt,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(itm) {
+               for(var i=0;i<this.panelButtons.length;i++) {
+                       if(this.panelButtons[i].name == itm)
+                               return this.panelButtons[i];
+               }       
+       },
+       
+       reorder : function() {
+               var bl = this.buttonList;
+               for(var i=0;i<bl.length;i++) {
+                       var button = this.findButton(bl[i]);
+                       if(button) {
+                               this.panelElm.appendChild(button.margin);
+                       }
+               }       
+       },
+       
+       remove : function() {
+               this.elm.remove();
+       }
+});
+var nicEditorButton = bkClass.extend({
+       
+       construct : function(e,buttonName,options,nicEditor) {
+               this.options = options.buttons[buttonName];
+               this.name = buttonName;
+               this.ne = nicEditor;
+               this.elm = e;
+
+               this.margin = new bkElement('DIV').setStyle({'float' : 'left', 
marginTop : '2px'}).appendTo(e);
+               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(buttonName,options)).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;
+               }
+               
+               nicEditor.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(state) {
+               switch(state) {
+                       case 'hover':
+                               var stateStyle = {border : '1px solid #666', 
backgroundColor : '#ddd'};
+                               break;
+                       case 'active':
+                               var stateStyle = {border : '1px solid #666', 
backgroundColor : '#ccc'};
+                               break;
+                       default:
+                               var stateStyle = {border : '1px solid #efefef', 
backgroundColor : '#efefef'};   
+               }
+               this.border.setStyle(stateStyle).addClass('button-'+state);
+       },
+       
+       checkNodes : function(e) {
+               var elm = e;    
+               do {
+                       if(this.options.tags && 
bkLib.inArray(this.options.tags,elm.nodeName)) {
+                               this.activate();
+                               return true;
+                       }
+               } while(elm = elm.parentNode && elm.className != "nicEdit");
+               elm = $BK(e);
+               while(elm.nodeType == 3) {
+                       elm = $BK(elm.parentNode);
+               }
+               if(this.options.css) {
+                       for(itm in this.options.css) {
+                               
if(elm.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) {
+                       this.ne.fireEvent('buttonDeactivate',this);
+               }
+       },
+       
+       enable : function(ins,t) {
+               this.isDisabled = false;
+               this.contain.setStyle({'opacity' : 
1}).addClass('buttonEnabled');
+               this.updateState();
+               this.checkNodes(t);
+       },
+       
+       disable : function(ins,t) {             
+               this.isDisabled = true;
+               this.contain.setStyle({'opacity' : 
0.6}).removeClass('buttonEnabled');
+               this.updateState();     
+       },
+       
+       toggleActive : function() {
+               (this.isActive) ? this.deactivate() : this.activate();  
+       },
+       
+       hoverOn : function() {
+               if(!this.isDisabled) {
+                       this.isHover = true;
+                       this.updateState();
+                       this.ne.fireEvent("buttonOver",this);
+               }
+       }, 
+       
+       hoverOff : function() {
+               this.isHover = false;
+               this.updateState();
+               this.ne.fireEvent("buttonOut",this);
+       },
+       
+       mouseClick : function() {
+               if(this.options.command) {
+                       
this.ne.nicCommand(this.options.command,this.options.commandArgs);
+                       if(!this.options.noActive) {
+                               this.toggleActive();
+                       }
+               }
+               this.ne.fireEvent("buttonClick",this);
+       },
+       
+       key : function(nicInstance,e) {
+               if(this.options.key && e.ctrlKey && 
String.fromCharCode(e.keyCode || e.charCode).toLowerCase() == this.options.key) 
{
+                       this.mouseClick();
+                       if(e.preventDefault) e.preventDefault();
+               }
+       }
+       
+});
+
+ 
+var nicPlugin = bkClass.extend({
+       
+       construct : function(nicEditor,options) {
+               this.options = options;
+               this.ne = nicEditor;
+               this.ne.addEvent('panel',this.loadPanel.closure(this));
+               
+               this.init();
+       },
+
+       loadPanel : function(np) {
+               var buttons = this.options.buttons;
+               for(var button in buttons) {
+                       np.addButton(button,this.options);
+               }
+               np.reorder();
+       },
+
+       init : function() {  }
+});
+
+
+
+ 
+ /* START CONFIG */
+var nicPaneOptions = { };
+/* END CONFIG */
+
+var nicEditorPane = bkClass.extend({
+       construct : function(elm,nicEditor,options,openButton) {
+               this.ne = nicEditor;
+               this.elm = elm;
+               this.pos = elm.pos();
+               
+               this.contain = new bkElement('div').setStyle({zIndex : '99999', 
overflow : 'hidden', position : 'absolute', left : this.pos[0]+'px', top : 
this.pos[1]+'px'})
+               this.pane = new bkElement('div').setStyle({fontSize : '12px', 
border : '1px solid #ccc', 'overflow': 'hidden', padding : '4px', textAlign: 
'left', backgroundColor : 
'#ffffc9'}).addClass('pane').setStyle(options).appendTo(this.contain);
+               
+               if(openButton && !openButton.options.noClose) {
+                       this.close = new bkElement('div').setStyle({'float' : 
'right', height: '16px', width : '16px', cursor : 
'pointer'}).setStyle(this.ne.getIcon('close',nicPaneOptions)).addEvent('mousedown',openButton.removePane.closure(this)).appendTo(this.pane);
+               }
+               
+               this.contain.noSelect().appendTo(document.body);
+               
+               this.position();
+               this.init();    
+       },
+       
+       init : function() { },
+       
+       position : function() {
+               if(this.ne.nicPanel) {
+                       var panelElm = this.ne.nicPanel.elm;    
+                       var panelPos = panelElm.pos();
+                       var newLeft = 
panelPos[0]+parseInt(panelElm.getStyle('width'))-(parseInt(this.pane.getStyle('width'))+8);
+                       if(newLeft < this.pos[0]) {
+                               this.contain.setStyle({left : newLeft+'px'});
+                       }
+               }
+       },
+       
+       toggle : function() {
+               this.isVisible = !this.isVisible;
+               this.contain.setStyle({display : ((this.isVisible) ? 'block' : 
'none')});
+       },
+       
+       remove : function() {
+               if(this.contain) {
+                       this.contain.remove();
+                       this.contain = null;
+               }
+       },
+       
+       append : function(c) {
+               c.appendTo(this.pane);
+       },
+       
+       setContent : function(c) {
+               this.pane.setContent(c);
+       }
+       
+});
+
+
+ 
+var nicEditorAdvancedButton = nicEditorButton.extend({
+       
+       init : function() {
+               
this.ne.addEvent('selected',this.removePane.closure(this)).addEvent('blur',this.removePane.closure(this));
      
+       },
+       
+       mouseClick : function() {
+               if(!this.isDisabled) {
+                       if(this.pane && this.pane.pane) {
+                               this.removePane();
+                       } else {
+                               this.pane = new 
nicEditorPane(this.contain,this.ne,{width : (this.width || '270px'), 
backgroundColor : '#fff'},this);
+                               this.addPane();
+                               this.ne.selectedInstance.saveRng();
+                       }
+               }
+       },
+       
+       addForm : function(f,elm) {
+               this.form = new 
bkElement('form').addEvent('submit',this.submit.closureListener(this));
+               this.pane.append(this.form);
+               this.inputs = {};
+               
+               for(itm in f) {
+                       var field = f[itm];
+                       var val = '';
+                       if(elm) {
+                               val = elm.getAttribute(itm);
+                       }
+                       if(!val) {
+                               val = field['value'] || '';
+                       }
+                       var type = f[itm].type;
+                       
+                       if(type == 'title') {
+                                       new 
bkElement('div').setContent(field.txt).setStyle({fontSize : '14px', fontWeight: 
'bold', padding : '0px', margin : '2px 0'}).appendTo(this.form);
+                       } else {
+                               var contain = new 
bkElement('div').setStyle({overflow : 'hidden', clear : 
'both'}).appendTo(this.form);
+                               if(field.txt) {
+                                       new 
bkElement('label').setAttributes({'for' : 
itm}).setContent(field.txt).setStyle({margin : '2px 4px', fontSize : '13px', 
width: '50px', lineHeight : '20px', textAlign : 'right', 'float' : 
'left'}).appendTo(contain);
+                               }
+                               
+                               switch(type) {
+                                       case 'text':
+                                               this.inputs[itm] = new 
bkElement('input').setAttributes({id : itm, 'value' : val, 'type' : 
'text'}).setStyle({margin : '2px 0', fontSize : '13px', 'float' : 'left', 
height : '20px', border : '1px solid #ccc', overflow : 
'hidden'}).setStyle(field.style).appendTo(contain);
+                                               break;
+                                       case 'select':
+                                               this.inputs[itm] = new 
bkElement('select').setAttributes({id : itm}).setStyle({border : '1px solid 
#ccc', 'float' : 'left', margin : '2px 0'}).appendTo(contain);
+                                               for(opt in field.options) {
+                                                       var o = new 
bkElement('option').setAttributes({value : opt, selected : (opt == val) ? 
'selected' : ''}).setContent(field.options[opt]).appendTo(this.inputs[itm]);
+                                               }
+                                               break;
+                                       case 'content':
+                                               this.inputs[itm] = new 
bkElement('textarea').setAttributes({id : itm}).setStyle({border : '1px solid 
#ccc', 'float' : 'left'}).setStyle(field.style).appendTo(contain);
+                                               this.inputs[itm].value = val;
+                               }       
+                       }
+               }
+               new bkElement('input').setAttributes({'type' : 
'submit'}).setStyle({backgroundColor : '#efefef',border : '1px solid #ccc', 
margin : '3px 0', 'float' : 'left', 'clear' : 'both'}).appendTo(this.form);
+               this.form.onsubmit = bkLib.cancelEvent; 
+       },
+       
+       submit : function() { },
+       
+       findElm : function(tag,attr,val) {
+               var list = 
this.ne.selectedInstance.getElm().getElementsByTagName(tag);
+               for(var i=0;i<list.length;i++) {
+                       if(list[i].getAttribute(attr) == val) {
+                               return $BK(list[i]);
+                       }
+               }
+       },
+       
+       removePane : function() {
+               if(this.pane) {
+                       this.pane.remove();
+                       this.pane = null;
+                       this.ne.selectedInstance.restoreRng();
+               }       
+       }       
+});
+
+
+var nicButtonTips = bkClass.extend({
+       construct : function(nicEditor) {
+               this.ne = nicEditor;
+               
nicEditor.addEvent('buttonOver',this.show.closure(this)).addEvent('buttonOut',this.hide.closure(this));
+
+       },
+       
+       show : function(button) {
+               this.timer = setTimeout(this.create.closure(this,button),400);
+       },
+       
+       create : function(button) {
+               this.timer = null;
+               if(!this.pane) {
+                       this.pane = new 
nicEditorPane(button.button,this.ne,{fontSize : '12px', marginTop : '5px'});
+                       this.pane.setContent(button.options.name);
+               }               
+       },
+       
+       hide : function(button) {
+               if(this.timer) {
+                       clearTimeout(this.timer);
+               }
+               if(this.pane) {
+                       this.pane = this.pane.remove();
+               }
+       }
+});
+nicEditors.registerPlugin(nicButtonTips);
+
+
+ 
+ /* START CONFIG */
+var nicSelectOptions = {
+       buttons : {
+               'fontSize' : {name : __('Select Font Size'), type : 
'nicEditorFontSizeSelect', command : 'fontsize'},
+               'fontFamily' : {name : __('Select Font Family'), type : 
'nicEditorFontFamilySelect', command : 'fontname'},
+               'fontFormat' : {name : __('Select Font Format'), type : 
'nicEditorFontFormatSelect', command : 'formatBlock'}
+       }
+};
+/* END CONFIG */
+var nicEditorSelect = bkClass.extend({
+       
+       construct : function(e,buttonName,options,nicEditor) {
+               this.options = options.buttons[buttonName];
+               this.elm = e;
+               this.ne = nicEditor;
+               this.name = buttonName;
+               this.selOptions = new Array();
+               
+               this.margin = new bkElement('div').setStyle({'float' : 'left', 
margin : '2px 1px 0 1px'}).appendTo(this.elm);
+               this.contain = new bkElement('div').setStyle({width: '90px', 
height : '20px', cursor : 'pointer', overflow: 
'hidden'}).addClass('selectContain').addEvent('click',this.toggle.closure(this)).appendTo(this.margin);
+               this.items = new bkElement('div').setStyle({overflow : 
'hidden', zoom : 1, border: '1px solid #ccc', paddingLeft : '3px', 
backgroundColor : '#fff'}).appendTo(this.contain);
+               this.control = new bkElement('div').setStyle({overflow : 
'hidden', 'float' : 'right', height: '18px', width : 
'16px'}).addClass('selectControl').setStyle(this.ne.getIcon('arrow',options)).appendTo(this.items);
+               this.txt = new bkElement('div').setStyle({overflow : 'hidden', 
'float' : 'left', width : '66px', height : '14px', marginTop : '1px', 
fontFamily : 'sans-serif', textAlign : 'center', fontSize : 
'12px'}).addClass('selectTxt').appendTo(this.items);
+               
+               if(!window.opera) {
+                       this.contain.onmousedown = this.control.onmousedown = 
this.txt.onmousedown = bkLib.cancelEvent;
+               }
+               
+               this.margin.noSelect();
+               
+               this.ne.addEvent('selected', 
this.enable.closure(this)).addEvent('blur', this.disable.closure(this));
+               
+               this.disable();
+               this.init();
+       },
+       
+       disable : function() {
+               this.isDisabled = true;
+               this.close();
+               this.contain.setStyle({opacity : 0.6});
+       },
+       
+       enable : function(t) {
+               this.isDisabled = false;
+               this.close();
+               this.contain.setStyle({opacity : 1});
+       },
+       
+       setDisplay : function(txt) {
+               this.txt.setContent(txt);
+       },
+       
+       toggle : function() {
+               if(!this.isDisabled) {
+                       (this.pane) ? this.close() : this.open();
+               }
+       },
+       
+       open : function() {
+               this.pane = new nicEditorPane(this.items,this.ne,{width : 
'88px', padding: '0px', borderTop : 0, borderLeft : '1px solid #ccc', 
borderRight : '1px solid #ccc', borderBottom : '0px', backgroundColor : 
'#fff'});
+               
+               for(var i=0;i<this.selOptions.length;i++) {
+                       var opt = this.selOptions[i];
+                       var itmContain = new 
bkElement('div').setStyle({overflow : 'hidden', borderBottom : '1px solid 
#ccc', width: '88px', textAlign : 'left', overflow : 'hidden', cursor : 
'pointer'});
+                       var itm = new bkElement('div').setStyle({padding : '0px 
4px'}).setContent(opt[1]).appendTo(itmContain).noSelect();
+                       
itm.addEvent('click',this.update.closure(this,opt[0])).addEvent('mouseover',this.over.closure(this,itm)).addEvent('mouseout',this.out.closure(this,itm)).setAttributes('id',opt[0]);
+                       this.pane.append(itmContain);
+                       if(!window.opera) {
+                               itm.onmousedown = bkLib.cancelEvent;
+                       }
+               }
+       },
+       
+       close : function() {
+               if(this.pane) {
+                       this.pane = this.pane.remove();
+               }       
+       },
+       
+       over : function(opt) {
+               opt.setStyle({backgroundColor : '#ccc'});                       
+       },
+       
+       out : function(opt) {
+               opt.setStyle({backgroundColor : '#fff'});
+       },
+       
+       
+       add : function(k,v) {
+               this.selOptions.push(new Array(k,v));   
+       },
+       
+       update : function(elm) {
+               this.ne.nicCommand(this.options.command,elm);
+               this.close();   
+       }
+});
+
+var nicEditorFontSizeSelect = nicEditorSelect.extend({
+       sel : {1 : '1&nbsp;(8pt)', 2 : '2&nbsp;(10pt)', 3 : '3&nbsp;(12pt)', 4 
: '4&nbsp;(14pt)', 5 : '5&nbsp;(18pt)', 6 : '6&nbsp;(24pt)'},
+       init : function() {
+               this.setDisplay('Font&nbsp;Size...');
+               for(itm in this.sel) {
+                       this.add(itm,'<font 
size="'+itm+'">'+this.sel[itm]+'</font>');
+               }               
+       }
+});
+
+var nicEditorFontFamilySelect = nicEditorSelect.extend({
+       sel : {'arial' : 'Arial','comic sans ms' : 'Comic Sans','courier new' : 
'Courier New','georgia' : 'Georgia', 'helvetica' : 'Helvetica', 'impact' : 
'Impact', 'times new roman' : 'Times', 'trebuchet ms' : 'Trebuchet', 'verdana' 
: 'Verdana'},
+       
+       init : function() {
+               this.setDisplay('Font&nbsp;Family...');
+               for(itm in this.sel) {
+                       this.add(itm,'<font 
face="'+itm+'">'+this.sel[itm]+'</font>');
+               }
+       }
+});
+
+var nicEditorFontFormatSelect = nicEditorSelect.extend({
+               sel : {'p' : 'Paragraph', 'pre' : 'Pre', 'h6' : 
'Heading&nbsp;6', 'h5' : 'Heading&nbsp;5', 'h4' : 'Heading&nbsp;4', 'h3' : 
'Heading&nbsp;3', 'h2' : 'Heading&nbsp;2', 'h1' : 'Heading&nbsp;1'},
+               
+       init : function() {
+               this.setDisplay('Font&nbsp;Format...');
+               for(itm in this.sel) {
+                       var tag = itm.toUpperCase();
+                       this.add('<'+tag+'>','<'+itm+' style="padding: 0px; 
margin: 0px;">'+this.sel[itm]+'</'+tag+'>');
+               }
+       }
+});
+
+nicEditors.registerPlugin(nicPlugin,nicSelectOptions);
+
+
+
+/* START CONFIG */
+var nicLinkOptions = {
+       buttons : {
+               'link' : {name : 'Add Link', type : 'nicLinkButton', tags : 
['A']},
+               'unlink' : {name : 'Remove Link',  command : 'unlink', noActive 
: true}
+       }
+};
+/* END CONFIG */
+
+var nicLinkButton = nicEditorAdvancedButton.extend({   
+       addPane : function() {
+               this.ln = this.ne.selectedInstance.selElm().parentTag('A');
+               this.addForm({
+                       '' : {type : 'title', txt : 'Add/Edit Link'},
+                       'href' : {type : 'text', txt : 'URL', value : 
'http://', style : {width: '150px'}},
+                       'title' : {type : 'text', txt : 'Title'},
+                       'target' : {type : 'select', txt : 'Open In', options : 
{'' : 'Current Window', '_blank' : 'New Window'},style : {width : '100px'}}
+               },this.ln);
+       },
+       
+       submit : function(e) {
+               var url = this.inputs['href'].value;
+               if(url == "http://"; || url == "") {
+                       alert("You must enter a URL to Create a Link");
+                       return false;
+               }
+               this.removePane();
+               
+               if(!this.ln) {
+                       var tmp = 'javascript:nicTemp();';
+                       this.ne.nicCommand("createlink",tmp);
+                       this.ln = this.findElm('A','href',tmp);
+               }
+               if(this.ln) {
+                       this.ln.setAttributes({
+                               href : this.inputs['href'].value,
+                               title : this.inputs['title'].value,
+                               target : 
this.inputs['target'].options[this.inputs['target'].selectedIndex].value
+                       });
+               }
+       }
+});
+
+nicEditors.registerPlugin(nicPlugin,nicLinkOptions);
+
+
+
+/* START CONFIG */
+var nicColorOptions = {
+       buttons : {
+               'forecolor' : {name : __('Change Text Color'), type : 
'nicEditorColorButton', noClose : true},
+               'bgcolor' : {name : __('Change Background Color'), type : 
'nicEditorBgColorButton', noClose : true}
+       }
+};
+/* END CONFIG */
+
+var nicEditorColorButton = nicEditorAdvancedButton.extend({    
+       addPane : function() {
+                       var colorList = {0 : '00',1 : '33',2 : '66',3 :'99',4 : 
'CC',5 : 'FF'};
+                       var colorItems = new bkElement('DIV').setStyle({width: 
'270px'});
+                       
+                       for(var r in colorList) {
+                               for(var b in colorList) {
+                                       for(var g in colorList) {
+                                               var colorCode = 
'#'+colorList[r]+colorList[g]+colorList[b];
+                                               
+                                               var colorSquare = new 
bkElement('DIV').setStyle({'cursor' : 'pointer', 'height' : '15px', 'float' : 
'left'}).appendTo(colorItems);
+                                               var colorBorder = new 
bkElement('DIV').setStyle({border: '2px solid 
'+colorCode}).appendTo(colorSquare);
+                                               var colorInner = new 
bkElement('DIV').setStyle({backgroundColor : colorCode, overflow : 'hidden', 
width : '11px', height : 
'11px'}).addEvent('click',this.colorSelect.closure(this,colorCode)).addEvent('mouseover',this.on.closure(this,colorBorder)).addEvent('mouseout',this.off.closure(this,colorBorder,colorCode)).appendTo(colorBorder);
+                                               
+                                               if(!window.opera) {
+                                                       colorSquare.onmousedown 
= colorInner.onmousedown = bkLib.cancelEvent;
+                                               }
+
+                                       }       
+                               }       
+                       }
+                       this.pane.append(colorItems.noSelect());        
+       },
+       
+       colorSelect : function(c) {
+               this.ne.nicCommand('foreColor',c);
+               this.removePane();
+       },
+       
+       on : function(colorBorder) {
+               colorBorder.setStyle({border : '2px solid #000'});
+       },
+       
+       off : function(colorBorder,colorCode) {
+               colorBorder.setStyle({border : '2px solid '+colorCode});        
        
+       }
+});
+
+var nicEditorBgColorButton = nicEditorColorButton.extend({
+       colorSelect : function(c) {
+               this.ne.nicCommand('hiliteColor',c);
+               this.removePane();
+       }       
+});
+
+nicEditors.registerPlugin(nicPlugin,nicColorOptions);
+
+
+
+/* START CONFIG */
+var nicImageOptions = {
+       buttons : {
+               'image' : {name : 'Add Image', type : 'nicImageButton', tags : 
['IMG']}
+       }
+       
+};
+/* END CONFIG */
+
+var nicImageButton = nicEditorAdvancedButton.extend({  
+       addPane : function() {
+               this.im = this.ne.selectedInstance.selElm().parentTag('IMG');
+               this.addForm({
+                       '' : {type : 'title', txt : 'Add/Edit Image'},
+                       'src' : {type : 'text', txt : 'URL', 'value' : 
'http://', style : {width: '150px'}},
+                       'alt' : {type : 'text', txt : 'Alt Text', style : 
{width: '100px'}},
+                       'align' : {type : 'select', txt : 'Align', options : 
{none : 'Default','left' : 'Left', 'right' : 'Right'}}
+               },this.im);
+       },
+       
+       submit : function(e) {
+               var src = this.inputs['src'].value;
+               if(src == "" || src == "http://";) {
+                       alert("You must enter a Image URL to insert");
+                       return false;
+               }
+               this.removePane();
+
+               if(!this.im) {
+                       var tmp = 'javascript:nicImTemp();';
+                       this.ne.nicCommand("insertImage",tmp);
+                       this.im = this.findElm('IMG','src',tmp);
+               }
+               if(this.im) {
+                       this.im.setAttributes({
+                               src : this.inputs['src'].value,
+                               alt : this.inputs['alt'].value,
+                               align : this.inputs['align'].value
+                       });
+               }
+       }
+});
+
+nicEditors.registerPlugin(nicPlugin,nicImageOptions);
+
+
+
+
+/* START CONFIG */
+var nicSaveOptions = {
+       buttons : {
+               'save' : {name : __('Save this content'), type : 
'nicEditorSaveButton'}
+       }
+};
+/* END CONFIG */
+
+var nicEditorSaveButton = nicEditorButton.extend({
+       init : function() {
+               if(!this.ne.options.onSave) {
+                       this.margin.setStyle({'display' : 'none'});
+               }
+       },
+       mouseClick : function() {
+               var onSave = this.ne.options.onSave;
+               var selectedInstance = this.ne.selectedInstance;
+               onSave(selectedInstance.getContent(), selectedInstance.elm.id, 
selectedInstance);
+       }
+});
+
+nicEditors.registerPlugin(nicPlugin,nicSaveOptions);
+
+
+
+/* START CONFIG */
+var nicUploadOptions = {
+       buttons : {
+               'upload' : {name : 'Upload Image', type : 'nicUploadButton'}
+       }
+       
+};
+/* END CONFIG */
+
+var nicUploadButton = nicEditorAdvancedButton.extend({ 
+       nicURI : 'https://api.imgur.com/3/image',
+  errorText : 'Failed to upload image',
+
+       addPane : function() {
+    if(typeof window.FormData === "undefined") {
+      return this.onError("Image uploads are not supported in this browser, 
use Chrome, Firefox, or Safari instead.");
+    }
+    this.im = this.ne.selectedInstance.selElm().parentTag('IMG');
+
+    var container = new bkElement('div')
+      .setStyle({ padding: '10px' })
+      .appendTo(this.pane.pane);
+
+               new bkElement('div')
+      .setStyle({ fontSize: '14px', fontWeight : 'bold', paddingBottom: '5px' 
})
+      .setContent('Insert an Image')
+      .appendTo(container);
+
+    this.fileInput = new bkElement('input')
+      .setAttributes({ 'type' : 'file' })
+      .appendTo(container);
+
+    this.progress = new bkElement('progress')
+      .setStyle({ width : '100%', display: 'none' })
+      .setAttributes('max', 100)
+      .appendTo(container);
+
+    this.fileInput.onchange = this.uploadFile.closure(this);
+       },
+
+  onError : function(msg) {
+    this.removePane();
+    alert(msg || "Failed to upload image");
+  },
+
+  uploadFile : function() {
+    var file = this.fileInput.files[0];
+    if (!file || !file.type.match(/image.*/)) {
+      this.onError("Only image files can be uploaded");
+      return;
+    }
+    this.fileInput.setStyle({ display: 'none' });
+    this.setProgress(0);
+
+    var fd = new FormData(); // 
https://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/
+    fd.append("image", file);
+
+    var xhr = new XMLHttpRequest();
+    xhr.open("POST", this.ne.options.uploadURI || this.nicURI);
+
+    xhr.onload = function() {
+      try {
+        var data = JSON.parse(xhr.responseText).data;
+      } catch(e) {
+        return this.onError();
+      }
+      if(data.error) {
+        return this.onError(data.error);
+      }
+      this.onUploaded(data);
+    }.closure(this);
+    xhr.onerror = this.onError.closure(this);
+    xhr.upload.onprogress = function(e) {
+      this.setProgress(e.loaded / e.total);
+    }.closure(this);
+    xhr.setRequestHeader('Authorization', 'Client-ID c37fc05199a05b7');
+    xhr.send(fd);
+  },
+
+  setProgress : function(percent) {
+    this.progress.setStyle({ display: 'block' });
+    if(percent < .98) {
+      this.progress.value = percent;
+    } else {
+      this.progress.removeAttribute('value');
+    }
+  },
+
+  onUploaded : function(options) {
+    this.removePane();
+    var src = options.link;
+    if(!this.im) {
+      this.ne.selectedInstance.restoreRng();
+      var tmp = 'javascript:nicImTemp();';
+      this.ne.nicCommand("insertImage", src);
+      this.im = this.findElm('IMG','src', src);
+    }
+    var w = parseInt(this.ne.selectedInstance.elm.getStyle('width'));
+    if(this.im) {
+      this.im.setAttributes({
+        src : src,
+        width : (w && options.width) ? Math.min(w, options.width) : ''
+      });
+    }
+  }
+});
+
+nicEditors.registerPlugin(nicPlugin,nicUploadOptions);
+
+
+
+var nicXHTML = bkClass.extend({
+       stripAttributes : ['_moz_dirty','_moz_resizing','_extended'],
+       noShort : ['style','title','script','textarea','a'],
+       cssReplace : {'font-weight:bold;' : 'strong', 'font-style:italic;' : 
'em'},
+       sizes : {1 : 'xx-small', 2 : 'x-small', 3 : 'small', 4 : 'medium', 5 : 
'large', 6 : 'x-large'},
+       
+       construct : function(nicEditor) {
+               this.ne = nicEditor;
+               if(this.ne.options.xhtml) {
+                       nicEditor.addEvent('get',this.cleanup.closure(this));
+               }
+       },
+       
+       cleanup : function(ni) {
+               var node = ni.getElm();
+               var xhtml = this.toXHTML(node);
+               ni.content = xhtml;
+       },
+       
+       toXHTML : function(n,r,d) {
+               var txt = '';
+               var attrTxt = '';
+               var cssTxt = '';
+               var nType = n.nodeType;
+               var nName = n.nodeName.toLowerCase();
+               var nChild = n.hasChildNodes && n.hasChildNodes();
+               var extraNodes = new Array();
+               
+               switch(nType) {
+                       case 1:
+                               var nAttributes = n.attributes;
+                               
+                               switch(nName) {
+                                       case 'b':
+                                               nName = 'strong';
+                                               break;
+                                       case 'i':
+                                               nName = 'em';
+                                               break;
+                                       case 'font':
+                                               nName = 'span';
+                                               break;
+                               }
+                               
+                               if(r) {
+                                       for(var i=0;i<nAttributes.length;i++) {
+                                               var attr = nAttributes[i];
+                                               
+                                               var attributeName = 
attr.nodeName.toLowerCase();
+                                               var attributeValue = 
attr.nodeValue;
+                                               
+                                               if(!attr.specified || 
!attributeValue || bkLib.inArray(this.stripAttributes,attributeName) || 
typeof(attributeValue) == "function") {
+                                                       continue;
+                                               }
+                                               
+                                               switch(attributeName) {
+                                                       case 'style':
+                                                               var css = 
attributeValue.replace(/ /g,"");
+                                                               for(itm in 
this.cssReplace) {
+                                                                       
if(css.indexOf(itm) != -1) {
+                                                                               
extraNodes.push(this.cssReplace[itm]);
+                                                                               
css = css.replace(itm,'');
+                                                                       }
+                                                               }
+                                                               cssTxt += css;
+                                                               attributeValue 
= "";
+                                                       break;
+                                                       case 'class':
+                                                               attributeValue 
= attributeValue.replace("Apple-style-span","");
+                                                       break;
+                                                       case 'size':
+                                                               cssTxt += 
"font-size:"+this.sizes[attributeValue]+';';
+                                                               attributeValue 
= "";
+                                                       break;
+                                               }
+                                               
+                                               if(attributeValue) {
+                                                       attrTxt += ' 
'+attributeName+'="'+attributeValue+'"';
+                                               }
+                                       }
+
+                                       if(cssTxt) {
+                                               attrTxt += ' 
style="'+cssTxt+'"';
+                                       }
+
+                                       for(var i=0;i<extraNodes.length;i++) {
+                                               txt += '<'+extraNodes[i]+'>';
+                                       }
+                               
+                                       if(attrTxt == "" && nName == "span") {
+                                               r = false;
+                                       }
+                                       if(r) {
+                                               txt += '<'+nName;
+                                               if(nName != 'br') {
+                                                       txt += attrTxt;
+                                               }
+                                       }
+                               }
+                               
+
+                               
+                               if(!nChild && 
!bkLib.inArray(this.noShort,attributeName)) {
+                                       if(r) {
+                                               txt += ' />';
+                                       }
+                               } else {
+                                       if(r) {
+                                               txt += '>';
+                                       }
+                                       
+                                       for(var i=0;i<n.childNodes.length;i++) {
+                                               var results = 
this.toXHTML(n.childNodes[i],true,true);
+                                               if(results) {
+                                                       txt += results;
+                                               }
+                                       }
+                               }
+                                       
+                               if(r && nChild) {
+                                       txt += '</'+nName+'>';
+                               }
+                               
+                               for(var i=0;i<extraNodes.length;i++) {
+                                       txt += '</'+extraNodes[i]+'>';
+                               }
+
+                               break;
+                       case 3:
+                               //if(n.nodeValue != '\n') {
+                                       txt += n.nodeValue;
+                               //}
+                               break;
+               }
+               
+               return txt;
+       }
+});
+nicEditors.registerPlugin(nicXHTML);
+
+
+
+var nicBBCode = bkClass.extend({
+       construct : function(nicEditor) {
+               this.ne = nicEditor;
+               if(this.ne.options.bbCode) {
+                       nicEditor.addEvent('get',this.bbGet.closure(this));
+                       nicEditor.addEvent('set',this.bbSet.closure(this));
+                       
+                       var loadedPlugins = this.ne.loadedPlugins;
+                       for(itm in loadedPlugins) {
+                               if(loadedPlugins[itm].toXHTML) {
+                                       this.xhtml = loadedPlugins[itm];
+                               }
+                       }
+               }
+       },
+       
+       bbGet : function(ni) {
+               var xhtml = this.xhtml.toXHTML(ni.getElm());
+               ni.content = this.toBBCode(xhtml);
+       },
+       
+       bbSet : function(ni) {
+               ni.content = this.fromBBCode(ni.content);
+       },
+       
+       toBBCode : function(xhtml) {
+               function rp(r,m) {
+                       xhtml = xhtml.replace(r,m);
+               }
+               
+               rp(/\n/gi,"");
+               rp(/<strong>(.*?)<\/strong>/gi,"[b]$1[/b]");
+               rp(/<em>(.*?)<\/em>/gi,"[i]$1[/i]");
+               
rp(/<span.*?style="text-decoration:underline;">(.*?)<\/span>/gi,"[u]$1[/u]");
+               rp(/<ul>(.*?)<\/ul>/gi,"[list]$1[/list]");
+               rp(/<li>(.*?)<\/li>/gi,"[*]$1[/*]");
+               rp(/<ol>(.*?)<\/ol>/gi,"[list=1]$1[/list]");
+               rp(/<img.*?src="(.*?)".*?>/gi,"[img]$1[/img]");
+               rp(/<a.*?href="(.*?)".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
+               rp(/<br.*?>/gi,"\n");
+               rp(/<.*?>.*?<\/.*?>/gi,"");
+               
+               return xhtml;
+       },
+       
+       fromBBCode : function(bbCode) {
+               function rp(r,m) {
+                       bbCode = bbCode.replace(r,m);
+               }               
+               
+               rp(/\[b\](.*?)\[\/b\]/gi,"<strong>$1</strong>");
+               rp(/\[i\](.*?)\[\/i\]/gi,"<em>$1</em>");
+               rp(/\[u\](.*?)\[\/u\]/gi,"<span 
style=\"text-decoration:underline;\">$1</span>");
+               rp(/\[list\](.*?)\[\/list\]/gi,"<ul>$1</ul>");
+               rp(/\[list=1\](.*?)\[\/list\]/gi,"<ol>$1</ol>");
+               rp(/\[\*\](.*?)\[\/\*\]/gi,"<li>$1</li>");
+               rp(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
+               rp(/\[url=(.*?)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
+               rp(/\n/gi,"<br />");
+               //rp(/\[.*?\](.*?)\[\/.*?\]/gi,"$1");
+               
+               return bbCode;
+       }
+
+       
+});
+nicEditors.registerPlugin(nicBBCode);
+
+
+
+nicEditor = nicEditor.extend({
+        floatingPanel : function() {
+                this.floating = new bkElement('DIV').setStyle({position: 
'absolute', top : '-1000px'}).appendTo(document.body);
+                this.addEvent('focus', 
this.reposition.closure(this)).addEvent('blur', this.hide.closure(this));
+                this.setPanel(this.floating);
+        },
+        
+        reposition : function() {
+                var e = this.selectedInstance.e;
+                this.floating.setStyle({ width : 
(parseInt(e.getStyle('width')) || e.clientWidth)+'px' });
+                var top = e.offsetTop-this.floating.offsetHeight;
+                if(top < 0) {
+                        top = e.offsetTop+e.offsetHeight;
+                }
+                
+                this.floating.setStyle({ top : top+'px', left : 
e.offsetLeft+'px', display : 'block' });
+        },
+        
+        hide : function() {
+                this.floating.setStyle({ top : '-1000px'});
+        }
+});
+
+
+
+/* START CONFIG */
+var nicCodeOptions = {
+       buttons : {
+               'xhtml' : {name : 'Edit HTML', type : 'nicCodeButton'}
+       }
+       
+};
+/* END CONFIG */
+
+var nicCodeButton = nicEditorAdvancedButton.extend({
+       width : '350px',
+               
+       addPane : function() {
+               this.addForm({
+                       '' : {type : 'title', txt : 'Edit HTML'},
+                       'code' : {type : 'content', 'value' : 
this.ne.selectedInstance.getContent(), style : {width: '340px', height : 
'200px'}}
+               });
+       },
+       
+       submit : function(e) {
+               var code = this.inputs['code'].value;
+               this.ne.selectedInstance.setContent(code);
+               this.removePane();
+       }
+});
+
+nicEditors.registerPlugin(nicPlugin,nicCodeOptions);
+
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]