var HtmlAreaRegister=new Array();
var xinha_editors=new Array();
var editor=null;
xinha_init=null;
xinha_config=null;
xinha_plugins=null;
xinha_init=xinha_init?xinha_init:function()
{
xinha_plugins=xinha_plugins?xinha_plugins:
[
'CharacterMap',
'ContextMenu',
'FullScreen',
'ListType',
'SpellChecker',
'Stylist',
'SuperClean',
'TableOperations'
];
if(!HTMLArea.loadPlugins(xinha_plugins,xinha_init))return;
xinha_editors=HTMLArea.makeEditors(xinha_editors,xinha_config,xinha_plugins);
HTMLArea.startEditors(xinha_editors);
}
if(typeof _editor_url=="string"){
_editor_url=_editor_url.replace(/\x2f*$/,'/');
}else{
alert("WARNING: _editor_url is not set!  You should set this variable to the editor files path; it should preferably be an absolute path, like in '/htmlarea/', but it can be relative if you prefer.  Further we will try to load the editor files correctly but we'll probably fail.");
_editor_url='';
}
if(typeof _editor_lang=="string"){
_editor_lang=_editor_lang.toLowerCase();
}else{
_editor_lang="en";
}
var __htmlareas=[];
HTMLArea.agt=navigator.userAgent.toLowerCase();
HTMLArea.is_ie=((HTMLArea.agt.indexOf("msie")!=-1)&&(HTMLArea.agt.indexOf("opera")==-1));
HTMLArea.is_opera=(HTMLArea.agt.indexOf("opera")!=-1);
HTMLArea.is_mac=(HTMLArea.agt.indexOf("mac")!=-1);
HTMLArea.is_mac_ie=(HTMLArea.is_ie&&HTMLArea.is_mac);
HTMLArea.is_win_ie=(HTMLArea.is_ie&&!HTMLArea.is_mac);
HTMLArea.is_gecko=(navigator.product=="Gecko");
function HTMLArea(textarea,config){
if(HTMLArea.checkSupportedBrowser()){
if(typeof config=="undefined"){
this.config=new HTMLArea.Config();
}else{
this.config=config;
}
this._htmlArea=null;
this._textArea=textarea;
this._editMode="wysiwyg";
this.plugins={};
this._timerToolbar=null;
this._timerUndo=null;
this._undoQueue=new Array(this.config.undoSteps);
this._undoPos=-1;
this._customUndo=true;
this._mdoc=document;
this.doctype='';
this.__htmlarea_id_num=__htmlareas.length;
__htmlareas[this.__htmlarea_id_num]=this;
this._notifyListeners={};
var panels=this._panels=
{
right:
{
on:true,
div:document.createElement('div'),
panels:[]
},
left:
{
on:true,
div:document.createElement('div'),
panels:[]
},
top:
{
on:true,
div:document.createElement('div'),
panels:[]
},
bottom:
{
on:true,
div:document.createElement('div'),
panels:[]
}
};
for(var i in panels)
{
panels[i].div.className='panels '+i;
}
}
};
HTMLArea.onload=function(){};
HTMLArea._scripts=[];
HTMLArea.loadScript=function(url,plugin){
if(plugin)
url=HTMLArea.getPluginDir(plugin)+'/'+url;
this._scripts.push(url);
};
HTMLArea.init=function(){
var head=document.getElementsByTagName("head")[0];
var current=0;
var savetitle=document.title;
var evt=HTMLArea.is_ie?"onreadystatechange":"onload";
function loadNextScript(){
if(current>0&&HTMLArea.is_ie&&
!/loaded|complete/.test(window.event.srcElement.readyState))
return;
if(current<HTMLArea._scripts.length){
var url=HTMLArea._scripts[current++];
document.title="[HTMLArea: loading script "+current+"/"+HTMLArea._scripts.length+"]";
var script=document.createElement("script");
script.type="text/javascript";
script.src=url;
script[evt]=loadNextScript;
head.appendChild(script);
}else{
document.title=savetitle;
HTMLArea.onload();
}
};
loadNextScript();
};
HTMLArea.loadScript(_editor_url+"dialog.js");
HTMLArea.loadScript(_editor_url+"inline-dialog.js");
HTMLArea.loadScript(_editor_url+"popupwin.js");
HTMLArea.RE_tagName=/(<\/|<)\s*([^ \t\n>]+)/ig;
HTMLArea.RE_doctype=/(<!doctype((.|\n)*?)>)\n?/i;
HTMLArea.RE_head=/<head>((.|\n)*?)<\/head>/i;
HTMLArea.RE_body=/<body[^>]*>((.|\n)*?)<\/body>/i;
HTMLArea.RE_Specials=/([\/\^$*+?.()|{}[\]])/g;
HTMLArea.RE_email=/[a-z0-9_]{3,}@[a-z0-9_-]{2,}(\.[a-z0-9_-]{2,})+/i;
HTMLArea.RE_url=/(https?:\/\/)?(([a-z0-9_]+:[a-z0-9_]+@)?[a-z0-9_-]{2,}(\.[a-z0-9_-]{2,}){2,}(:[0-9]+)?(\/\S+)*)/i;
HTMLArea.Config=function(){
var cfg=this;
this.version="3.0";
this.width="toolbar";
this.height="auto";
this.statusBar=true;
this.htmlareaPaste=false;
this.mozParaHandler='best';
this.undoSteps=20;
this.undoTimeout=500;
this.sizeIncludesToolbar=true;
this.fullPage=false;
this.pageStyle="";
this.pageStyleSheets=[];
this.baseHref=null;
this.stripBaseHref=true;
this.stripSelfNamedAnchors=true;
this.specialReplacements={};
this.killWordOnPaste=true;
this.makeLinkShowsTarget=true;
this.baseURL=document.baseURI||document.URL;
if(this.baseURL&&this.baseURL.match(/(.*)\/([^\/]+)/))
this.baseURL=RegExp.$1+"/";
this.charSet=HTMLArea.is_gecko?document.characterSet:document.charset;
this.imgURL="/system/jslibrary/images/";
this.popupURL="/system/jslibrary/popups/";
this.helpURL=_editor_url+"reference.html";
this.htmlRemoveTags=null;
this.toolbar=
[
["popupeditor","separator"],
["formatblock","fontname","fontsize","bold","italic","underline","strikethrough","separator"],
["forecolor","hilitecolor","textindicator","separator"],
["subscript","superscript"],
["linebreak","justifyleft","justifycenter","justifyright","justifyfull","separator"],
["insertorderedlist","insertunorderedlist","outdent","indent","separator"],
["inserthorizontalrule","createlink","insertimage","inserttable","separator"],
["undo","redo"],(HTMLArea.is_gecko?[]:["cut","copy","paste"]),["separator"],
["killword","removeformat","toggleborders","lefttoright","righttoleft","separator","htmlmode","about"]
];
this.panel_dimensions=
{
left:'200px',
right:'200px',
top:'100px',
bottom:'100px'
}
this.fontname={
"&mdash; font &mdash;":'',
"Arial":'arial,helvetica,sans-serif',
"Courier New":'courier new,courier,monospace',
"Georgia":'georgia,times new roman,times,serif',
"Tahoma":'tahoma,arial,helvetica,sans-serif',
"Times New Roman":'times new roman,times,serif',
"Verdana":'verdana,arial,helvetica,sans-serif',
"impact":'impact',
"WingDings":'wingdings'
};
this.fontsize={
"&mdash; size &mdash;":"",
"1 (8 pt)":"1",
"2 (10 pt)":"2",
"3 (12 pt)":"3",
"4 (14 pt)":"4",
"5 (18 pt)":"5",
"6 (24 pt)":"6",
"7 (36 pt)":"7"
};
this.formatblock={
"&mdash; format &mdash;":"",
"Heading 1":"h1",
"Heading 2":"h2",
"Heading 3":"h3",
"Heading 4":"h4",
"Heading 5":"h5",
"Heading 6":"h6",
"Normal":"p",
"Address":"address",
"Formatted":"pre"
};
this.customSelects={};
function cut_copy_paste(e,cmd,obj){
e.execCommand(cmd);
};
this.debug=true;
this.URIs={
"blank":"popups/blank.html",
"link":"link.html",
"insert_image":"insert_image.html",
"insert_table":"insert_table.html",
"select_color":"select_color.html",
"fullscreen":"fullscreen.html",
"about":"about.html"
};
this.btnList={
bold:["Bold",["ed_buttons_main.gif",3,2],false,function(e){e.execCommand("bold");}],
italic:["Italic",["ed_buttons_main.gif",2,2],false,function(e){e.execCommand("italic");}],
underline:["Underline",["ed_buttons_main.gif",2,0],false,function(e){e.execCommand("underline");}],
strikethrough:["Strikethrough",["ed_buttons_main.gif",3,0],false,function(e){e.execCommand("strikethrough");}],
subscript:["Subscript",["ed_buttons_main.gif",3,1],false,function(e){e.execCommand("subscript");}],
superscript:["Superscript",["ed_buttons_main.gif",2,1],false,function(e){e.execCommand("superscript");}],
justifyleft:["Justify Left",["ed_buttons_main.gif",0,0],false,function(e){e.execCommand("justifyleft");}],
justifycenter:["Justify Center",["ed_buttons_main.gif",1,1],false,function(e){e.execCommand("justifycenter");}],
justifyright:["Justify Right",["ed_buttons_main.gif",1,0],false,function(e){e.execCommand("justifyright");}],
justifyfull:["Justify Full",["ed_buttons_main.gif",0,1],false,function(e){e.execCommand("justifyfull");}],
orderedlist:["Ordered List",["ed_buttons_main.gif",0,3],false,function(e){e.execCommand("insertorderedlist");}],
unorderedlist:["Bulleted List",["ed_buttons_main.gif",1,3],false,function(e){e.execCommand("insertunorderedlist");}],
insertorderedlist:["Ordered List",["ed_buttons_main.gif",0,3],false,function(e){e.execCommand("insertorderedlist");}],
insertunorderedlist:["Bulleted List",["ed_buttons_main.gif",1,3],false,function(e){e.execCommand("insertunorderedlist");}],
outdent:["Decrease Indent",["ed_buttons_main.gif",1,2],false,function(e){e.execCommand("outdent");}],
indent:["Increase Indent",["ed_buttons_main.gif",0,2],false,function(e){e.execCommand("indent");}],
forecolor:["Font Color",["ed_buttons_main.gif",3,3],false,function(e){e.execCommand("forecolor");}],
hilitecolor:["Background Color",["ed_buttons_main.gif",2,3],false,function(e){e.execCommand("hilitecolor");}],
undo:["Undoes your last action",["ed_buttons_main.gif",4,2],false,function(e){e.execCommand("undo");}],
redo:["Redoes your last action",["ed_buttons_main.gif",5,2],false,function(e){e.execCommand("redo");}],
cut:["Cut selection",["ed_buttons_main.gif",5,0],false,cut_copy_paste],
copy:["Copy selection",["ed_buttons_main.gif",4,0],false,cut_copy_paste],
paste:["Paste from clipboard",["ed_buttons_main.gif",4,1],false,cut_copy_paste],
inserthorizontalrule:["Horizontal Rule",["ed_buttons_main.gif",6,0],false,function(e){e.execCommand("inserthorizontalrule");}],
createlink:["Insert Web Link",["ed_buttons_main.gif",6,1],false,function(e){e._createLink();}],
insertimage:["Insert/Modify Image",["ed_buttons_main.gif",6,3],false,function(e){e.execCommand("insertimage");}],
inserttable:["Insert Table",["ed_buttons_main.gif",6,2],false,function(e){e.execCommand("inserttable");}],
htmlmode:["Toggle HTML Source",["ed_buttons_main.gif",7,0],true,function(e){e.execCommand("htmlmode");}],
toggleborders:["Toggle Borders",["ed_buttons_main.gif",7,2],false,function(e){e._toggleBorders()}],
print:["Print document",["ed_buttons_main.gif",8,1],false,function(e){e._iframe.contentWindow.print();}],
popupeditor:["Enlarge Editor","fullscreen_maximize.gif",true,
function(e,objname,obj)
{
e.execCommand("popupeditor");
}],
about:["About this editor",["ed_buttons_main.gif",8,2],true,function(e){e.execCommand("about");}],
showhelp:["Help using editor",["ed_buttons_main.gif",9,2],true,function(e){e.execCommand("showhelp");}],
splitblock:["Split Block","ed_splitblock.gif",false,function(e){e._splitBlock();}],
lefttoright:["Direction left to right",["ed_buttons_main.gif",0,4],false,function(e){e.execCommand("lefttoright");}],
righttoleft:["Direction right to left",["ed_buttons_main.gif",1,4],false,function(e){e.execCommand("righttoleft");}],
wordclean:["MS Word Cleaner",["ed_buttons_main.gif",5,3],false,function(e){e._wordClean();}],
clearfonts:["Clear Inline Font Specifications",["ed_buttons_main.gif",5,4],false,function(e){e._clearFonts();}],
removeformat:["Remove formatting",["ed_buttons_main.gif",4,4],false,function(e){e.execCommand("removeformat");}],
killword:["Clean up HTML",["ed_buttons_main.gif",4,3],false,function(e){e.execCommand("killword");}]
};
for(var i in this.btnList){
var btn=this.btnList[i];
if(typeof btn[1]!='string')
{
btn[1][0]=_editor_url+this.imgURL+btn[1][0];
}
else
{
btn[1]=_editor_url+this.imgURL+btn[1];
}
btn[0]=HTMLArea._lc(btn[0]);
}
};
HTMLArea.Config.prototype.registerButton=function(id,tooltip,image,textMode,action,context){
var the_id;
if(typeof id=="string"){
the_id=id;
}else if(typeof id=="object"){
the_id=id.id;
}else{
alert("ERROR [HTMLArea.Config::registerButton]:\ninvalid arguments");
return false;
}
if(typeof this.customSelects[the_id]!="undefined"){
}
if(typeof this.btnList[the_id]!="undefined"){
}
switch(typeof id){
case"string":this.btnList[id]=[tooltip,image,textMode,action,context];break;
case"object":this.btnList[id.id]=[id.tooltip,id.image,id.textMode,id.action,id.context];break;
}
};
HTMLArea.prototype.registerPanel=function(side,object)
{
if(!side)side='right';
var panel=this.addPanel(side);
if(object)
{
object.drawPanelIn(panel);
}
}
HTMLArea.Config.prototype.registerDropdown=function(object){
if(typeof this.customSelects[object.id]!="undefined"){
}
if(typeof this.btnList[object.id]!="undefined"){
}
this.customSelects[object.id]=object;
};
HTMLArea.Config.prototype.hideSomeButtons=function(remove){
var toolbar=this.toolbar;
for(var i=toolbar.length;--i>=0;){
var line=toolbar[i];
for(var j=line.length;--j>=0;){
if(remove.indexOf(" "+line[j]+" ")>=0){
var len=1;
if(/separator|space/.test(line[j+1])){
len=2;
}
line.splice(j,len);
}
}
}
};
HTMLArea.Config.prototype.addToolbarElement = function(id, where, position) {
var toolbar = this.toolbar;
var a, i, j, o, sid;
var idIsArray = false;
var whereIsArray = false;
var whereLength = 0;
var whereJ = 0;
var whereI = 0;
var exists = false;
var found = false;
// check if id and where are arrys
if ((id && typeof id == "object") && (id.constructor == Array)) {
idIsArray = true;
}
if ((where && typeof where == "object") && (where.constructor == Array)) {
whereIsArray = true;
whereLength = where.length;
}

if (idIsArray) { //find the button/select box in input array
for (i = 0; i < id.length; ++i) {
if ((id[i] != "separator") && (id[i].indexOf("T[") != 0)) {
sid = id[i];
}
}
} else {
sid = id;
}

for (var i = 0; !exists && !found && i < toolbar.length; ++i) {
a = toolbar[i]
for (j = 0; !found && j < a.length; ++j) {
if (a[i] == sid) { // check if button/select box exists
exists = true;
break;
}
if (whereIsArray) {
for (o = 0; o < whereLength; ++o) {
if(a[j] == where[o]) {
if (o == 0) {
found = true;
j--;
break;
} else {
whereI = i;
whereJ = j;
whereLength = o;
}
}
}
} else {
if (a[j] == where) { // find the position to insert
found = true;
break;
}
}
}
}

if (!exists) {
if (!found && whereIsArray) { //if check found any other as the first button
if (where.length != whereLength) {
j = whereJ;
a = toolbar[whereI];
found = true;
}
}
if (found) {
if (position == 0) { // replace the found button
if (idIsArray) {
a[j] = id[id.length-1];
for (i = id.length-1; --i >= 0;) {
a.splice(j, 0, id[i]);
}
} else {
a[j] = id;
}
} else { // insert before/after the found button
if (position < 0) {
j = j + position + 1; //correct position before
} else if (position > 0) {
j = j + position; //correct posion after
}
if (idIsArray) {
for (i = id.length; --i >= 0;) {
a.splice(j, 0, id[i]);
}
} else {
a.splice(j, 0, id);
}
}
}	else { // no button found
toolbar[0].splice(0, 0, "separator");
if (idIsArray) {
for (i = id.length; --i >= 0;) {
toolbar[0].splice(0, 0, id[i]);
}
} else {
toolbar[0].splice(0, 0, id);
}
}
}
}

HTMLArea.replaceAll=function(config){
var tas=document.getElementsByTagName("textarea");
for(var i=tas.length;i>0;(new HTMLArea(tas[--i],config)).generate());
};
HTMLArea.replace=function(id,config)
{
var ta=HTMLArea.getElementById("textarea",id);
if(ta)
{
var taobj=new HTMLArea(ta,config);
taobj.generate();
return taobj;
}
else
{
return null;
};
};
HTMLArea.prototype._createToolbar=function(){
var editor=this;
var toolbar=document.createElement("div");
this._toolbar=toolbar;
toolbar.className="toolbar";
toolbar.unselectable="1";
var tb_row=null;
var tb_objects=new Object();
this._toolbarObjects=tb_objects;
this._createToolbar1(editor,toolbar,tb_objects);
this._htmlArea.appendChild(toolbar);
}
HTMLArea.prototype._setConfig=function(config){
this.config=config;
}
HTMLArea.prototype._addToolbar=function(){
this._createToolbar1(this,this._toolbar,this._toolbarObjects);
}
HTMLArea.prototype._createToolbar1=function(editor,toolbar,tb_objects){
function newLine(){
var table=document.createElement("table");
table.border="0px";
table.cellSpacing="0px";
table.cellPadding="0px";
toolbar.appendChild(table);
var tb_body=document.createElement("tbody");
table.appendChild(tb_body);
tb_row=document.createElement("tr");
tb_body.appendChild(tb_row);
};
newLine();
function setButtonStatus(id,newval){
var oldval=this[id];
var el=this.element;
if(oldval!=newval){
switch(id){
case"enabled":
if(newval){
HTMLArea._removeClass(el,"buttonDisabled");
el.disabled=false;
}else{
HTMLArea._addClass(el,"buttonDisabled");
el.disabled=true;
}
break;
case"active":
if(newval){
HTMLArea._addClass(el,"buttonPressed");
}else{
HTMLArea._removeClass(el,"buttonPressed");
}
break;
}
this[id]=newval;
}
};
function createSelect(txt){
var options=null;
var el=null;
var cmd=null;
var customSelects=editor.config.customSelects;
var context=null;
var tooltip="";
switch(txt){
case"fontsize":
case"fontname":
case"formatblock":
options=editor.config[txt];
cmd=txt;
break;
default:
cmd=txt;
var dropdown=customSelects[cmd];
if(typeof dropdown!="undefined"){
options=dropdown.options;
context=dropdown.context;
if(typeof dropdown.tooltip!="undefined"){
tooltip=dropdown.tooltip;
}
}else{
alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");
}
break;
}
if(options){
el=document.createElement("select");
el.title=tooltip;
var obj={
name:txt,
element:el,
enabled:true,
text:false,
cmd:cmd,
state:setButtonStatus,
context:context
};
tb_objects[txt]=obj;
for(var i in options){
var op=document.createElement("option");
op.innerHTML=HTMLArea._lc(i);
op.value=options[i];
el.appendChild(op);
}
HTMLArea._addEvent(el,"change",function(){
editor._comboSelected(el,txt);
});
}
return el;
};
function createButton(txt){
var el=null;
var btn=null;
switch(txt){
case"separator":
el=document.createElement("div");
el.className="separator";
break;
case"space":
el=document.createElement("div");
el.className="space";
break;
case"linebreak":
newLine();
return false;
case"textindicator":
el=document.createElement("div");
el.appendChild(document.createTextNode("A"));
el.className="indicator";
el.title=HTMLArea._lc("Current style");
var obj={
name:txt,
element:el,
enabled:true,
active:false,
text:false,
cmd:"textindicator",
state:setButtonStatus
};
tb_objects[txt]=obj;
break;
default:
btn=editor.config.btnList[txt];
}
if(!el&&btn){
el=document.createElement("a");
el.style.display='block';
el.href='javascript:void(0)';
el.style.textDecoration='none';
el.title=btn[0];
el.className="button";
var obj={
name:txt,
element:el,
enabled:true,
active:false,
text:btn[2],
cmd:btn[3],
state:setButtonStatus,
context:btn[4]||null
};
tb_objects[txt]=obj;
HTMLArea._addEvent(el,"mouseout",function(){
if(obj.enabled)with(HTMLArea){
_removeClass(el,"buttonActive");
(obj.active)&&_addClass(el,"buttonPressed");
}
});
HTMLArea._addEvent(el,"mousedown",function(ev){
if(obj.enabled)with(HTMLArea){
_addClass(el,"buttonActive");
_removeClass(el,"buttonPressed");
_stopEvent(is_ie?window.event:ev);
}
});
HTMLArea._addEvent(el,"click",function(ev){
if(obj.enabled)with(HTMLArea){
_removeClass(el,"buttonActive");
if(HTMLArea.is_gecko)
{
editor.activateEditor();
}
obj.cmd(editor,obj.name,obj);
_stopEvent(is_ie?window.event:ev);
}
});
var i_contain=HTMLArea.makeBtnImg(btn[1]);
var img=i_contain.firstChild;
el.appendChild(i_contain);
obj.imgel=img;
obj.swapImage=function(newimg)
{
if(typeof newimg!='string')
{
img.src=newimg[0];
img.style.position='relative';
img.style.top=newimg[2]?('-'+(18*(newimg[2]+1))+'px'):'-18px';
img.style.left=newimg[1]?('-'+(18*(newimg[1]+1))+'px'):'-18px';
}
else
{
obj.imgel.src=newimg;
img.style.top='0px';
img.style.left='0px';
}
}
}else if(!el){
el=createSelect(txt);
}
if(el){
var tb_cell=document.createElement("td");
tb_row.appendChild(tb_cell);
tb_cell.appendChild(el);
}else{
alert("FIXME: Unknown toolbar item: "+txt);
}
return el;
};
var first=true;
for(var i=0;i<this.config.toolbar.length;++i){
if(!first){
}else{
first=false;
}
if(this.config.toolbar[i]==null)this.config.toolbar[i]=['separator'];
var group=this.config.toolbar[i];
for(var j=0;j<group.length;++j)
{
var code=group[j];
if(/^([IT])\[(.*?)\]/.test(code))
{
var l7ed=RegExp.$1=="I";
var label=RegExp.$2;
if(l7ed){
label=HTMLArea._lc(label);
}
var tb_cell=document.createElement("td");
tb_row.appendChild(tb_cell);
tb_cell.className="label";
tb_cell.innerHTML=label;
}
else if(typeof code!='function')
{
createButton(code);
}
}
}
};
use_clone_img=false;
HTMLArea.makeBtnImg=function(imgDef,doc)
{
if(!doc)doc=document;
if(!doc._htmlareaImgCache)
{
doc._htmlareaImgCache={};
}
var i_contain=null;
if(HTMLArea.is_ie&&((!doc.compatMode)||(doc.compatMode&&doc.compatMode=="BackCompat")))
{
i_contain=doc.createElement('span');
}
else
{
i_contain=doc.createElement('div');
i_contain.style.position='relative';
}
i_contain.style.overflow='hidden';
i_contain.style.width="18px";
i_contain.style.height="18px";
var img=null;
if(typeof imgDef=='string')
{
if(doc._htmlareaImgCache[imgDef])
{
img=doc._htmlareaImgCache[imgDef].cloneNode();
}
else
{
img=doc.createElement("img");
img.src=imgDef;
img.style.width="18px";
img.style.height="18px";
if(use_clone_img)
doc._htmlareaImgCache[imgDef]=img.cloneNode();
}
}
else
{
if(doc._htmlareaImgCache[imgDef[0]])
{
img=doc._htmlareaImgCache[imgDef[0]].cloneNode();
}
else
{
img=doc.createElement("img");
img.src=imgDef[0];
img.style.position='relative';
if(use_clone_img)
doc._htmlareaImgCache[imgDef[0]]=img.cloneNode();
}
img.style.top=imgDef[2]?('-'+(18*(imgDef[2]+1))+'px'):'-18px';
img.style.left=imgDef[1]?('-'+(18*(imgDef[1]+1))+'px'):'-18px';
}
i_contain.appendChild(img);
return i_contain;
}
HTMLArea.prototype._createStatusBar=function(){
var statusbar=document.createElement("div");
statusbar.className="statusBar";
this._htmlArea.appendChild(statusbar);
this._statusBar=statusbar;
div=document.createElement("span");
div.className="statusBarTree";
div.innerHTML=HTMLArea._lc("Path")+": ";
this._statusBarTree=div;
this._statusBar.appendChild(div);
if(!this.config.statusBar){
statusbar.style.display="none";
}
};
HTMLArea.prototype.generate=function()
{
var editor=this;
if(HTMLArea.is_gecko)
{
switch(editor.config.mozParaHandler)
{
case'best':
{
if(typeof EnterParagraphs=='undefined')
{
EnterParagraphs='null';
HTMLArea._loadback
(_editor_url+'plugins/EnterParagraphs/enter-paragraphs.js',function(){editor.registerPlugin('EnterParagraphs');editor.generate();});
return false;
}
}
break;
case'dirty':
case'built-in':
default:
{
}
break;
}
}
var textarea=this._textArea;
if(typeof textarea=="string")
{
this._textArea=textarea=HTMLArea.getElementById("textarea",textarea);
}
this._ta_size=
{
w:textarea.offsetWidth,
h:textarea.offsetHeight
};
var htmlarea=document.createElement("div");
htmlarea.className="htmlarea";
this._htmlArea=htmlarea;
if(this.config.width!='auto'&&this.config.width!='toolbar')
{
htmlarea.style.width=this.config.width;
}
textarea.parentNode.insertBefore(htmlarea,textarea);
this._createToolbar();
var innerEditor=document.createElement('div');
htmlarea.appendChild(innerEditor);
innerEditor.style.position='relative';
this.innerEditor=innerEditor;
textarea.parentNode.removeChild(textarea);
innerEditor.appendChild(textarea);
var iframe=document.createElement("iframe");
innerEditor.appendChild(iframe);
iframe.src=_editor_url+editor.config.URIs["blank"];
this._iframe=iframe;
for(var i in this._panels)
{
innerEditor.appendChild(this._panels[i].div);
}
this._createStatusBar();
if(textarea.form){
var f=textarea.form;
if(typeof f.__msh_prevOnSubmit=="undefined")
{
f.__msh_prevOnSubmit=[];
if(typeof f.onsubmit=="function")
{
var funcref=f.onsubmit;
f.__msh_prevOnSubmit.push(funcref);
f.onsubmit=null;
}
f.onsubmit=function()
{
var a=this.__msh_prevOnSubmit;
var allOK=true;
for(var i=a.length;--i>=0;)
{
this.__msh_tempEventHandler=a[i];
if(this.__msh_tempEventHandler()==false)
{
allOK=false;
break;
}
}
return allOK;
}
}
f.__msh_prevOnSubmit.push(function(){editor._textArea.value=editor.outwardHtml(editor.getHTML());});
if(typeof f.__msh_prevOnReset=="undefined")
{
f.__msh_prevOnReset=[];
if(typeof f.onreset=="function")
{
var funcref=f.onreset;
f.__msh_prevOnReset.push(funcref);
f.onreset=null;
}
f.onreset=function()
{
var a=this.__msh_prevOnReset;
var allOK=true;
for(var i=a.length;--i>=0;)
{
if(a[i]()==false)
{
allOK=false;
break;
}
}
return allOK;
}
}
f.__msh_prevOnReset.push(function(){editor.setHTML(editor._textArea.value);editor.updateToolbar();});
}
try{
HTMLArea._addEvent(window,'unload',function(){textarea.value=editor.outwardHtml(editor.getHTML());});
}catch(e){};
textarea.style.display="none";
var height=null;
var width=null;
switch(this.config.height)
{
case'auto':{height=parseInt(this._ta_size.h);break;}
default:{height=parseInt(this.config.height);break;}
}
switch(this.config.width)
{
case'toolbar':{width=parseInt(this._toolbar.offsetWidth);break;}
case'auto':{width=parseInt(this._ta_size.w);break;}
default:{width=parseInt(this.config.width);break;}
}
if(this.config.sizeIncludesToolbar)
{
height-=this._toolbar.offsetHeight;
height-=this._statusBar.offsetHeight;
}
width=Math.max(width,100);
height=Math.max(height,100);
this.setInnerSize(width,height);
this.notifyOn('panel_change',function(){editor.setInnerSize();});
setTimeout(function(){editor.initIframe()},50);
};
HTMLArea.prototype.getInnerSize=function()
{
return this._innerSize;
}
HTMLArea.prototype.setInnerSize=function(width,height)
{
if(typeof width=='undefined'||width==null)
{
width=this._innerSize.width;
}
if(typeof height=='undefined'||height==null)
{
height=this._innerSize.height;
}
this._innerSize={'width':width,'height':height};
var editorWidth=width;
var editorHeight=height;
var editorLeft=0;
var editorTop=0;
var panels=this._panels;
var panel=panels.right;
if(panel.on&&panel.panels.length&&HTMLArea.hasDisplayedChildren(panel.div))
{
panel.div.style.position='absolute';
panel.div.style.width=parseInt(this.config.panel_dimensions.right)+(HTMLArea.ie_ie?-1:-2)+'px';
panel.div.style.height=height+(HTMLArea.is_ie?-1:-1)+'px';
panel.div.style.top='0px';
panel.div.style.right=(HTMLArea.is_ie?1:2)+'px';
panel.div.style.padding="0px";
panel.div.style.overflow="auto";
panel.div.style.display='block';
editorWidth-=parseInt(this.config.panel_dimensions.right)+(HTMLArea.is_ie?2:0);
}
else
{
panel.div.style.display='none';
}
var panel=panels.left;
if(panel.on&&panel.panels.length&&HTMLArea.hasDisplayedChildren(panel.div))
{
panel.div.style.position='absolute';
panel.div.style.width=parseInt(this.config.panel_dimensions.left)+(HTMLArea.ie_ie?-1:-1)+'px';
panel.div.style.height=height+(HTMLArea.is_ie?-1:-1)+'px';
panel.div.style.top='0px';
panel.div.style.left=(HTMLArea.is_ie?0:0)+'px';
panel.div.style.padding="0px";
panel.div.style.overflow="auto";
panel.div.style.display="block";
editorWidth-=parseInt(this.config.panel_dimensions.left)+(HTMLArea.is_ie?2:0);
editorLeft=parseInt(this.config.panel_dimensions.left)+(HTMLArea.is_ie?2:0)+'px';
}
else
{
panel.div.style.display='none';
}
var panel=panels.top;
if(panel.on&&panel.panels.length&&HTMLArea.hasDisplayedChildren(panel.div))
{
panel.div.style.position='absolute';
panel.div.style.top='0px';
panel.div.style.left='0px';
panel.div.style.width=width+'px';
panel.div.style.height=parseInt(this.config.panel_dimensions.top)+'px';
panel.div.style.padding="0px";
panel.div.style.overflow="auto";
panel.div.style.display="block";
editorHeight-=parseInt(this.config.panel_dimensions.top);
editorTop=parseInt(this.config.panel_dimensions.top)+'px';
}
else
{
panel.div.style.display='none';
}
var panel=panels.bottom;
if(panel.on&&panel.panels.length&&HTMLArea.hasDisplayedChildren(panel.div))
{
panel.div.style.position='absolute';
panel.div.style.bottom='0px';
panel.div.style.left='0px';
panel.div.style.width=width+'px';
panel.div.style.height=parseInt(this.config.panel_dimensions.bottom)+'px';
panel.div.style.padding="0px";
panel.div.style.overflow="auto";
panel.div.style.display="block";
editorHeight-=parseInt(this.config.panel_dimensions.bottom);
}
else
{
panel.div.style.display='none';
}
this.innerEditor.style.width=width+'px';
this.innerEditor.style.height=height+'px';
this.innerEditor.style.position='relative';
this._iframe.style.width=editorWidth+'px';
this._iframe.style.height=editorHeight+'px';
this._iframe.style.position='absolute';
this._iframe.style.left=editorLeft;
this._iframe.style.top=editorTop;
this._textArea.style.width=editorWidth+'px';
this._textArea.style.height=editorHeight+'px';
this._textArea.style.position='absolute';
this._textArea.style.left=editorLeft;
this._textArea.style.top=editorTop;
this.notifyOf('resize',{'width':width,'height':height,'editorWidth':editorWidth,'editorHeight':editorHeight,'editorTop':editorTop,'editorLeft':editorLeft});
}
HTMLArea.prototype.addPanel=function(side)
{
var div=document.createElement('div');
div.side=side;
HTMLArea.addClasses(div,'panel');
this._panels[side].panels.push(div);
this._panels[side].div.appendChild(div);
this.notifyOf('panel_change',{'action':'add','panel':div});
return div;
}
HTMLArea.prototype.removePanel=function(panel)
{
this._panels[panel.side].div.removeChild(panel);
var clean=[];
for(var i=0;i<this._panels[panel.side].panels.length;i++)
{
if(this._panels[panel.side].panels[i]!=panel)
{
clean.push(this._panels[panel.side].panels[i]);
}
}
this._panels[panel.side].panels=clean;
this.notifyOf('panel_change',{'action':'remove','panel':panel});
}
HTMLArea.prototype.hidePanel=function(panel)
{
if(panel)
{
panel.style.display='none';
this.notifyOf('panel_change',{'action':'hide','panel':panel});
}
}
HTMLArea.prototype.showPanel=function(panel)
{
if(panel)
{
panel.style.display='';
this.notifyOf('panel_change',{'action':'show','panel':panel});
}
}
HTMLArea.prototype.hidePanels=function(sides)
{
if(typeof sides=='undefined')
{
sides=['left','right','top','bottom'];
}
var reShow=[];
for(var i=0;i<sides.length;i++)
{
if(this._panels[sides[i]].on)
{
reShow.push(sides[i]);
this._panels[sides[i]].on=false;
}
}
this.notifyOf('panel_change',{'action':'multi_hide','sides':sides});
}
HTMLArea.prototype.showPanels=function(sides)
{
if(typeof sides=='undefined')
{
sides=['left','right','top','bottom'];
}
var reHide=[];
for(var i=0;i<sides.length;i++)
{
if(!this._panels[sides[i]].on)
{
reHide.push(sides[i]);
this._panels[sides[i]].on=true;
}
}
this.notifyOf('panel_change',{'action':'multi_show','sides':sides});
}
HTMLArea.objectProperties=function(obj)
{
var props=[];
for(var x in obj)
{
props[props.length]=x;
}
return props;
}
HTMLArea.prototype.editorIsActivated=function(){
try{
if(HTMLArea.is_gecko)return(this._doc.designMode=='on');
else return(this._doc.body.contentEditable);
}catch(e)
{
return false;
}
}
HTMLArea.prototype.activateEditor=function()
{
if(HTMLArea.is_gecko&&this._doc.designMode!='on'){
try{
if(this._iframe.style.display=='none')
{
this._iframe.style.display='';
this._doc.designMode='on';
this._iframe.style.display='none';
}
else
{
this._doc.designMode='on';
}
}catch(e){
alert("error");
}
}
else if(!HTMLArea.is_gecko)
{
if(this._doc.body){
this._doc.body.contentEditable=true;
}
}
}
HTMLArea.prototype.deactivateEditor=function()
{
if(HTMLArea.is_gecko&&this._doc.designMode!='off')
{
try{this._doc.designMode='off';}catch(e){}
}
else
{
}
}
HTMLArea.prototype.initIframe=function()
{
var doc=null;
var editor=this;
try
{
if(editor._iframe.contentDocument)
{
this._doc=editor._iframe.contentDocument;
}
else
{
this._doc=editor._iframe.contentWindow.document;
}
doc=this._doc;
if(!doc){
if(HTMLArea.is_gecko){
setTimeout(function(){editor.initIframe()},50);
return false;
}else{
alert("ERROR: IFRAME can't be initialized.");
}
}
editor.activateEditor();
}
catch(e)
{
setTimeout(function(){editor.initIframe()},50);
}
doc.open();
if(!editor.config.fullPage){
var html="<html>\n";
html+="<head>\n";
html+="<meta http-equiv=\"Content-Type\" content=\"text/html; charset="+editor.config.charSet+"\">\n";
if(typeof editor.config.baseHref!='undefined'&&editor.config.baseHref!=null)
{
html+="<base href=\""+editor.config.baseHref+"\"/>\n";
}
html+="<style title=\"table borders\">"
+".htmtableborders, .htmtableborders td, .htmtableborders th {border : 1px dashed lightgrey ! important;} \n"
+"</style>\n";
html+="<style>"
+editor.config.pageStyle+"\n"
+"html, body { border: 0px; } \n"
+"span.macro, span.macro ul, span.macro div, span.macro p {background : #CCCCCC;}\n"
+"</style>\n";
if(typeof editor.config.pageStyleSheets!=='undefined')
{
for(style_i=0;style_i<editor.config.pageStyleSheets.length;style_i++)
{
if(editor.config.pageStyleSheets[style_i].length>0)
html+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+editor.config.pageStyleSheets[style_i]+"\">";
}
}
html+="</head>\n";
html+="<body>\n";
html+=editor.inwardHtml(editor._textArea.value);
html+="</body>\n";
html+="</html>";
}else{
var html=editor.inwardHtml(editor._textArea.value);
if(html.match(HTMLArea.RE_doctype)){
editor.setDoctype(RegExp.$1);
html=html.replace(HTMLArea.RE_doctype,"");
}
}
doc.write(html);
doc.close();
editor.activateEditor();
if(HTMLArea.is_gecko)
{
HTMLArea._addEvents(
editor._iframe.contentWindow,
["mousedown"],
function(){editor.activateEditor();}
);
}
HTMLArea._addEvents
(doc,["keydown","keypress","mousedown","mouseup","drag"],
function(event){
return editor._editorEvent(HTMLArea.is_ie?editor._iframe.contentWindow.event:event);
});
for(var i in editor.plugins){
var plugin=editor.plugins[i].instance;
HTMLArea.refreshPlugin(plugin);
}
if(typeof editor._onGenerate=="function"){
editor._onGenerate();
}
editor._timerToolbar=setTimeout(function(){
editor.updateToolbar();
editor._timerToolbar=null;
},250);
}
HTMLArea.prototype.setMode=function(mode){
if(typeof mode=="undefined"){
mode=((this._editMode=="textmode")?"wysiwyg":"textmode");
}
switch(mode){
case"textmode":
{
var html=this.outwardHtml(this.getHTML());
this._textArea.value=html;
this.deactivateEditor();
this._iframe.style.display='none';
this._textArea.style.display="block";
if(this.config.statusBar)
{
this._statusBar.innerHTML=HTMLArea._lc("You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.");
}
this.notifyOf('modechange',{'mode':'text'});
break;
}
case"wysiwyg":
{
var html=this.inwardHtml(this.getHTML());
this.deactivateEditor();
if(!this.config.fullPage)
{
this._doc.body.innerHTML=html;
}
else
{
this.setFullHTML(html);
}
this._iframe.style.display='';
this._textArea.style.display="none";
this.activateEditor();
if(this.config.statusBar)
{
this._statusBar.innerHTML='';
this._statusBar.appendChild(this._statusBarTree);
}
this.notifyOf('modechange',{'mode':'wysiwyg'});
break;
}
default:
{
alert("Mode <"+mode+"> not defined!");
return false;
}
}
this._editMode=mode;
for(var i in this.plugins){
var plugin=this.plugins[i].instance;
if(typeof plugin.onMode=="function")plugin.onMode(mode);
}
};
HTMLArea.prototype.setFullHTML=function(html){
var save_multiline=RegExp.multiline;
RegExp.multiline=true;
if(html.match(HTMLArea.RE_doctype)){
this.setDoctype(RegExp.$1);
html=html.replace(HTMLArea.RE_doctype,"");
}
RegExp.multiline=save_multiline;
if(!HTMLArea.is_ie){
if(html.match(HTMLArea.RE_head))
this._doc.getElementsByTagName("head")[0].innerHTML=RegExp.$1;
if(html.match(HTMLArea.RE_body))
this._doc.getElementsByTagName("body")[0].innerHTML=RegExp.$1;
}else{
var html_re=/<html>((.|\n)*?)<\/html>/i;
html=html.replace(html_re,"$1");
this._doc.open();
this._doc.write(html);
this._doc.close();
this.activateEditor();
return true;
}
};
HTMLArea.prototype.registerPlugin=function(){
var plugin=arguments[0];
var args=[];
for(var i=1;i<arguments.length;++i)
args.push(arguments[i]);
return this.registerPlugin2(plugin,args);
};
HTMLArea.prototype.registerPlugin2=function(plugin,args){
if(typeof plugin=="string")
plugin=eval(plugin);
if(typeof plugin=="undefined"){
return false;
}
var obj=new plugin(this,args);
if(obj){
var clone={};
var info=plugin._pluginInfo;
for(var i in info)
clone[i]=info[i];
clone.instance=obj;
clone.args=args;
this.plugins[plugin._pluginInfo.name]=clone;
return obj;
}else
alert("Can't register plugin "+plugin.toString()+".");
};
HTMLArea.getPluginDir=function(pluginName){
return _editor_url+"plugins/"+pluginName;
};
HTMLArea.loadPlugin=function(pluginName,callback){
if(eval('typeof '+pluginName)!='undefined')
{
if(callback)
{
callback();
}
return;
}
var dir=this.getPluginDir(pluginName);
var plugin=pluginName.replace(/([a-z])([A-Z])([a-z])/g,
function(str,l1,l2,l3){
return l1+"-"+l2.toLowerCase()+l3;
}).toLowerCase()+".js";
var plugin_file=dir+"/"+plugin;
if(callback)
{
HTMLArea._loadback(plugin_file,callback);
}
else
{
document.write("<script type='text/javascript' src='"+plugin_file+"'></script>");
}
};
HTMLArea.loadPlugins=function(plugins,callbackIfNotReady)
{
var nuPlugins=HTMLArea.cloneObject(plugins);
while(nuPlugins.length)
{
if(eval('typeof '+nuPlugins[nuPlugins.length-1])!='undefined')
{
nuPlugins.pop();
}
else
{
break;
}
}
if(!nuPlugins.length)
{
return true;
}
HTMLArea.loadPlugin
(nuPlugins.pop(),
function()
{
if(HTMLArea.loadPlugins(nuPlugins,callbackIfNotReady))
{
if(typeof callbackIfNotReady=='function')
{
callbackIfNotReady();
}
}
}
);
return false;
}
HTMLArea.refreshPlugin=function(plugin){
if(typeof plugin.onGenerate=="function")
plugin.onGenerate();
if(typeof plugin.onGenerateOnce=="function"){
plugin.onGenerateOnce();
plugin.onGenerateOnce=null;
}
};
HTMLArea.loadStyle=function(style,plugin){
var url=_editor_url||'';
if(typeof plugin!="undefined"){
url+="plugins/"+plugin+"/";
}
url+=style;
if(/^\//.test(style))
url=style;
var head=document.getElementsByTagName("head")[0];
var link=document.createElement("link");
link.rel="stylesheet";
link.href=url;
head.appendChild(link);
};
HTMLArea.loadStyle(typeof _editor_css=="string"?_editor_css:"/ssi/maintain/htmlarea.css");
HTMLArea.prototype.debugTree=function(){
var ta=document.createElement("textarea");
ta.style.width="100%";
ta.style.height="20em";
ta.value="";
function debug(indent,str){
for(;--indent>=0;)
ta.value+=" ";
ta.value+=str+"\n";
};
function _dt(root,level){
var tag=root.tagName.toLowerCase(),i;
var ns=HTMLArea.is_ie?root.scopeName:root.prefix;
debug(level,"- "+tag+" ["+ns+"]");
for(i=root.firstChild;i;i=i.nextSibling)
if(i.nodeType==1)
_dt(i,level+2);
};
_dt(this._doc.body,0);
document.body.appendChild(ta);
};
HTMLArea.getInnerText=function(el){
var txt='',i;
for(i=el.firstChild;i;i=i.nextSibling){
if(i.nodeType==3)
txt+=i.data;
else if(i.nodeType==1)
txt+=HTMLArea.getInnerText(i);
}
return txt;
};
HTMLArea.prototype._wordClean=function(){
var
editor=this,
stats={
empty_tags:0,
mso_class:0,
mso_style:0,
mso_xmlel:0,
orig_len:this._doc.body.innerHTML.length,
T:(new Date()).getTime()
},
stats_txt={
empty_tags:"Empty tags removed: ",
mso_class:"MSO class names removed: ",
mso_style:"MSO inline style removed: ",
mso_xmlel:"MSO XML elements stripped: "
};
function showStats(){
var txt="HTMLArea word cleaner stats: \n\n";
for(var i in stats)
if(stats_txt[i])
txt+=stats_txt[i]+stats[i]+"\n";
txt+="\nInitial document length: "+stats.orig_len+"\n";
txt+="Final document length: "+editor._doc.body.innerHTML.length+"\n";
txt+="Clean-up took "+(((new Date()).getTime()-stats.T)/1000)+" seconds";
alert(txt);
};
function clearClass(node){
var newc=node.className.replace(/(^|\s)mso.*?(\s|$)/ig,' ');
if(newc!=node.className){
node.className=newc;
if(!/\S/.test(node.className)){
node.removeAttribute("className");
++stats.mso_class;
}
}
};
function clearStyle(node){
var declarations=node.style.cssText.split(/\s*;\s*/);
for(var i=declarations.length;--i>=0;)
if(/^mso|^tab-stops/i.test(declarations[i])||
/^margin\s*:\s*0..\s+0..\s+0../i.test(declarations[i])){
++stats.mso_style;
declarations.splice(i,1);
}
node.style.cssText=declarations.join("; ");
};
function stripTag(el){
if(HTMLArea.is_ie)
el.outerHTML=HTMLArea.htmlEncode(el.innerText);
else{
var txt=document.createTextNode(HTMLArea.getInnerText(el));
el.parentNode.insertBefore(txt,el);
el.parentNode.removeChild(el);
}
++stats.mso_xmlel;
};
function checkEmpty(el){
if(/^(a|span|b|strong|i|em|font)$/i.test(el.tagName)&&
!el.firstChild){
el.parentNode.removeChild(el);
++stats.empty_tags;
}
};
function parseTree(root){
var tag=root.tagName.toLowerCase(),i,next;
if((HTMLArea.is_ie&&root.scopeName!='HTML')||(!HTMLArea.is_ie&&/:/.test(tag))){
stripTag(root);
return false;
}else{
clearClass(root);
clearStyle(root);
for(i=root.firstChild;i;i=next){
next=i.nextSibling;
if(i.nodeType==1&&parseTree(i))
checkEmpty(i);
}
}
return true;
};
parseTree(this._doc.body);
this._clearSmartTags();
this.updateToolbar();
};
HTMLArea.prototype._insertAnchor=function(){
var style_id="IA-style"
var style=editor._doc.getElementById(style_id);
if(style==null){
style=editor._doc.createElement("link");
style.id=style_id;
style.rel='stylesheet';
style.href=_editor_url+'plugins/InsertAnchor/insert-anchor.css';
editor._doc.getElementsByTagName("HEAD")[0].appendChild(style);
}
var anchor;
anchor=prompt("Anchor name","");
if(anchor==""||anchor==null){
return;
}
try{
var doc=editor._doc;
var alink=doc.createElement("a");
alink.id=anchor;
alink.name=anchor;
alink.title=anchor;
alink.className="anchor";
if(HTMLArea.is_ie){
var sel=editor._getSelection();
var range=editor._createRange(sel);
range.pasteHTML(alink.outerHTML);
}else{
editor.insertNodeAtSelection(alink);
}
}
catch(e){}
};
HTMLArea.prototype._clearFonts=function(){
var D=this.getInnerHTML();
if(confirm('Would you like to clear font typefaces?'))
{
D=D.replace(/face="[^"]*"/gi,'');
D=D.replace(/font-family:[^;}"']+;?/gi,'');
}
if(confirm('Would you like to clear font sizes?'))
{
D=D.replace(/size="[^"]*"/gi,'');
D=D.replace(/font-size:[^;}"']+;?/gi,'');
}
if(confirm('Would you like to clear font colours?'))
{
D=D.replace(/color="[^"]*"/gi,'');
D=D.replace(/([^-])color:[^;}"']+;?/gi,'$1');
}
D=D.replace(/(style|class)="\s*"/gi,'');
D=D.replace(/<(font|span)\s*>/gi,'');
this.setHTML(D);
this.updateToolbar();
}
HTMLArea.prototype._clearSmartTags=function(){
var D=this.getInnerHTML();
if(confirm('Would you like to tidy all smart tags?'))
{
var replacements,regex,key,textnodes,node,i,s;
replacements={
"\xa0":" ",
"\xa9":"(c)",
"\xae":"(r)",
"\xb7":"*",
"\u2018":"'",
"\u2019":"'",
"\u201c":'"',
"\u201d":'"',
"\u2026":"...",
"\u2002":" ",
"\u2003":" ",
"\u2009":" ",
"\u2013":"-",
"\u2014":"--",
"\u2122":"(tm)"};
regex={};
for(key in replacements){
regex[key]=new RegExp(key,'g');
}
for(key in replacements){
D=D.replace(regex[key],replacements[key]);
}
}
this.setHTML(D);
this.updateToolbar();
}
HTMLArea.prototype._splitBlock=function()
{
this._doc.execCommand('formatblock',false,'<div>');
}
HTMLArea.prototype.forceRedraw=function(){
this._doc.body.style.visibility="hidden";
this._doc.body.style.visibility="visible";
};
HTMLArea.prototype.focusEditor=function(){
switch(this._editMode){
case"wysiwyg":
try
{
if(!this.editorIsActivated())
{
this.activateEditor();
this._iframe.contentWindow.focus();
}
}catch(e){}break;
case"textmode":try{this._textArea.focus()}catch(e){}break;
default:alert("ERROR: mode "+this._editMode+" is not defined");
}
return this._doc;
};
HTMLArea.prototype._undoTakeSnapshot=function(){
++this._undoPos;
if(this._undoPos>=this.config.undoSteps){
this._undoQueue.shift();
--this._undoPos;
}
var take=true;
var txt=this.getInnerHTML();
if(this._undoPos>0)
take=(this._undoQueue[this._undoPos-1]!=txt);
if(take){
this._undoQueue[this._undoPos]=txt;
}else{
this._undoPos--;
}
};
HTMLArea.prototype.undo=function(){
if(this._undoPos>0){
var txt=this._undoQueue[--this._undoPos];
if(txt)this.setHTML(txt);
else++this._undoPos;
}
};
HTMLArea.prototype.redo=function(){
if(this._undoPos<this._undoQueue.length-1){
var txt=this._undoQueue[++this._undoPos];
if(txt)this.setHTML(txt);
else--this._undoPos;
}
};
HTMLArea.prototype.disableToolbar=function(except)
{
if(typeof except=='undefined')
{
except=[];
}
else if(typeof except!='object')
{
except=[except];
}
for(var i in this._toolbarObjects)
{
var btn=this._toolbarObjects[i];
if(except.contains(i))
{
continue;
}
btn.state("enabled",false);
}
}
HTMLArea.prototype.enableToolbar=function()
{
this.updateToolbar();
}
if(!Array.prototype.contains)
{
Array.prototype.contains=function(needle)
{
var haystack=this;
for(var i=0;i<haystack.length;i++)
{
if(needle==haystack[i])return true;
}
return false;
}
}
if(!Array.prototype.indexOf)
{
Array.prototype.indexOf=function(needle)
{
var haystack=this;
for(var i=0;i<haystack.length;i++)
{
if(needle==haystack[i])return i;
}
return null;
}
}
HTMLArea.prototype.updateToolbar=function(noStatus){
var doc=this._doc;
var text=(this._editMode=="textmode");
var ancestors=null;
if(!text){
ancestors=this.getAllAncestors();
if(this.config.statusBar&&!noStatus){
this._statusBarTree.innerHTML=HTMLArea._lc("Path")+": ";
for(var i=ancestors.length;--i>=0;){
var el=ancestors[i];
if(!el){
continue;
}
var a=document.createElement("a");
a.href="javascript:void(0)";
a.el=el;
a.editor=this;
a.onclick=function(){
this.blur();
this.editor.selectNodeContents(this.el);
this.editor.updateToolbar(true);
return false;
};
a.oncontextmenu=function(){
this.blur();
var info="Inline style:\n\n";
info+=this.el.style.cssText.split(/;\s*/).join(";\n");
alert(info);
return false;
};
var txt=el.tagName.toLowerCase();
a.title=el.style.cssText;
if(el.id){
txt+="#"+el.id;
}
if(el.className){
txt+="."+el.className;
}
a.appendChild(document.createTextNode(txt));
this._statusBarTree.appendChild(a);
if(i!=0){
this._statusBarTree.appendChild(document.createTextNode(String.fromCharCode(0xbb)));
}
}
}
}
for(var i in this._toolbarObjects){
var btn=this._toolbarObjects[i];
var cmd=i;
var inContext=true;
if(btn.context&&!text){
inContext=false;
var context=btn.context;
var attrs=[];
if(/(.*)\[(.*?)\]/.test(context)){
context=RegExp.$1;
attrs=RegExp.$2.split(",");
}
context=context.toLowerCase();
var match=(context=="*");
for(var k=0;k<ancestors.length;++k){
if(!ancestors[k]){
continue;
}
if(match||(ancestors[k].tagName.toLowerCase()==context)){
inContext=true;
for(var ka=0;ka<attrs.length;++ka){
if(!eval("ancestors[k]."+attrs[ka])){
inContext=false;
break;
}
}
if(inContext){
break;
}
}
}
}
btn.state("enabled",(!text||btn.text)&&inContext);
if(typeof cmd=="function"){
continue;
}
var dropdown=this.config.customSelects[cmd];
if((!text||btn.text)&&(typeof dropdown!="undefined")){
dropdown.refresh(this);
continue;
}
switch(cmd)
{
case"fontname":
case"fontsize":
{
if(!text)try{
var value=(""+doc.queryCommandValue(cmd)).toLowerCase();
if(!value){
btn.element.selectedIndex=0;
break;
}
var options=this.config[cmd];
var k=0;
for(var j in options)
{
if((j.toLowerCase()==value)||(options[j].substr(0,value.length).toLowerCase()==value))
{
btn.element.selectedIndex=k;
throw"ok";
}
++k;
}
btn.element.selectedIndex=0;
}catch(e){};
}
break;
case"formatblock":
{
var blocks=[];
for(var i in this.config['formatblock'])
{
blocks[blocks.length]=this.config['formatblock'][i];
}
var deepestAncestor=this._getFirstAncestor(this._getSelection(),blocks);
if(deepestAncestor)
{
for(var x=0;x<blocks.length;x++)
{
if(blocks[x].toLowerCase()==deepestAncestor.tagName.toLowerCase())
{
btn.element.selectedIndex=x;
}
}
}
else
{
btn.element.selectedIndex=0;
}
}
break;
case"textindicator":
if(!text){
try{with(btn.element.style){
backgroundColor=HTMLArea._makeColor(
doc.queryCommandValue(HTMLArea.is_ie?"backcolor":"hilitecolor"));
if(/transparent/i.test(backgroundColor)){
backgroundColor=HTMLArea._makeColor(doc.queryCommandValue("backcolor"));
}
color=HTMLArea._makeColor(doc.queryCommandValue("forecolor"));
fontFamily=doc.queryCommandValue("fontname");
fontWeight=doc.queryCommandState("bold")?"bold":"normal";
fontStyle=doc.queryCommandState("italic")?"italic":"normal";
}}catch(e){
}
}
break;
case"htmlmode":btn.state("active",text);break;
case"lefttoright":
case"righttoleft":
var el=this.getParentElement();
while(el&&!HTMLArea.isBlockElement(el))
el=el.parentNode;
if(el)
btn.state("active",(el.style.direction==((cmd=="righttoleft")?"rtl":"ltr")));
break;
default:
cmd=cmd.replace(/(un)?orderedlist/i,"insert$1orderedlist");
try{
btn.state("active",(!text&&doc.queryCommandState(cmd)));
}catch(e){}
}
}
if(this._customUndo&&!this._timerUndo){
this._undoTakeSnapshot();
var editor=this;
this._timerUndo=setTimeout(function(){
editor._timerUndo=null;
},this.config.undoTimeout);
}
if(0&&HTMLArea.is_gecko)
{
var s=this._getSelection();
if(s&&s.isCollapsed&&s.anchorNode
&&s.anchorNode.parentNode.tagName.toLowerCase()!='body'
&&s.anchorNode.nodeType==3&&s.anchorOffset==s.anchorNode.length
&&!
(s.anchorNode.parentNode.nextSibling
&&s.anchorNode.parentNode.nextSibling.nodeType==3
)
&&!HTMLArea.isBlockElement(s.anchorNode.parentNode)
)
{
try
{
s.anchorNode.parentNode.parentNode.insertBefore
(this._doc.createTextNode('\t'),s.anchorNode.parentNode.nextSibling);
}
catch(e)
{
}
}
}
for(var i in this.plugins){
var plugin=this.plugins[i].instance;
if(typeof plugin.onUpdateToolbar=="function")
plugin.onUpdateToolbar();
}
}
HTMLArea.prototype.insertNodeAtSelection=function(toBeInserted){
if(!HTMLArea.is_ie){
var sel=this._getSelection();
var range=this._createRange(sel);
sel.removeAllRanges();
range.deleteContents();
var node=range.startContainer;
var pos=range.startOffset;
switch(node.nodeType){
case 3:
if(toBeInserted.nodeType==3){
node.insertData(pos,toBeInserted.data);
range=this._createRange();
range.setEnd(node,pos+toBeInserted.length);
range.setStart(node,pos+toBeInserted.length);
sel.addRange(range);
}else{
node=node.splitText(pos);
var selnode=toBeInserted;
if(toBeInserted.nodeType==11){
selnode=selnode.firstChild;
}
node.parentNode.insertBefore(toBeInserted,node);
this.selectNodeContents(selnode);
this.updateToolbar();
}
break;
case 1:
var selnode=toBeInserted;
if(toBeInserted.nodeType==11){
selnode=selnode.firstChild;
}
node.insertBefore(toBeInserted,node.childNodes[pos]);
this.selectNodeContents(selnode);
this.updateToolbar();
break;
}
}else{
return null;
}
};
HTMLArea.prototype.getParentElement=function(sel){
if(typeof sel=='undefined')
{
sel=this._getSelection();
}
var range=this._createRange(sel);
if(HTMLArea.is_ie){
switch(sel.type){
case"Text":
case"None":
return range.parentElement();
case"Control":
return range.item(0);
default:
return this._doc.body;
}
}else try{
var p=range.commonAncestorContainer;
if(!range.collapsed&&range.startContainer==range.endContainer&&
range.startOffset-range.endOffset<=1&&range.startContainer.hasChildNodes())
p=range.startContainer.childNodes[range.startOffset];
while(p.nodeType==3){
p=p.parentNode;
}
return p;
}catch(e){
return null;
}
};
HTMLArea.prototype.getAllAncestors=function(){
var p=this.getParentElement();
var a=[];
while(p&&(p.nodeType==1)&&(p.tagName.toLowerCase()!='body')){
a.push(p);
p=p.parentNode;
}
a.push(this._doc.body);
return a;
};
HTMLArea.prototype._getFirstAncestor=function(sel,types)
{
var prnt=this._activeElement(sel);
if(prnt==null)
{
try
{
prnt=(HTMLArea.is_ie?this._createRange(sel).parentElement():this._createRange(sel).commonAncestorContainer);
}
catch(e)
{
return null;
}
}
if(typeof types=='string')
{
types=[types];
}
while(prnt)
{
if(prnt.nodeType==1)
{
if(types==null)return prnt;
if(types.contains(prnt.tagName.toLowerCase()))
{
return prnt;
}
if(prnt.tagName.toLowerCase()=='body')break;
if(prnt.tagName.toLowerCase()=='table')break;
}
prnt=prnt.parentNode;
}
return null;
}
HTMLArea.prototype._activeElement=function(sel)
{
if(sel==null)return null;
if(this._selectionEmpty(sel))return null;
if(HTMLArea.is_ie)
{
if(sel.type.toLowerCase()=="control")
{
return sel.createRange().item(0);
}
else
{
var range=sel.createRange();
var p_elm=this.getParentElement(sel);
if(p_elm.innerHTML==range.htmlText)
{
return p_elm;
}
return null;
}
}
else
{
if(!sel.isCollapsed)
{
if(sel.anchorNode.nodeType==1)
{
return sel.anchorNode;
}
}
return null;
}
}
HTMLArea.prototype._selectionEmpty=function(sel)
{
if(!sel)return true;
if(HTMLArea.is_ie)
{
return this._createRange(sel).htmlText=='';
}
else if(typeof sel.isCollapsed!='undefined')
{
return sel.isCollapsed;
}
return true;
}
HTMLArea.prototype._getAncestorBlock=function(sel)
{
var prnt=(HTMLArea.is_ie?this._createRange(sel).parentElement:this._createRange(sel).commonAncestorContainer);
while(prnt&&(prnt.nodeType==1))
{
switch(prnt.tagName.toLowerCase())
{
case'div':
case'p':
case'address':
case'blockquote':
case'center':
case'del':
case'ins':
case'pre':
case'h1':
case'h2':
case'h3':
case'h4':
case'h5':
case'h6':
case'h7':
return prnt;
case'body':
case'noframes':
case'dd':
case'li':
case'th':
case'td':
case'noscript':
return null;
default:
break;
}
}
return null;
}
HTMLArea.prototype._createImplicitBlock=function(type)
{
var sel=this._getSelection();
if(HTMLArea.is_ie)
{
sel.empty();
}
else
{
sel.collapseToStart();
}
var rng=this._createRange(sel);
}
HTMLArea.prototype._formatBlock=function(block_format)
{
var ancestors=this.getAllAncestors();
var apply_to=null;
var target_tag=null;
var target_classNames=[];
if(block_format.indexOf('.')>=0)
{
target_tag=block_format.substr(0,block_format.indexOf('.')).toLowerCase();;
target_classNames=block_format.substr(block_format.indexOf('.'),block_format.length-block_format.indexOf('.')).replace(/\./g,'').replace(/^\s*/,'').replace(/\s*$/,'').split(' ');
}
else
{
target_tag=block_format.toLowerCase();
}
var sel=this._getSelection();
var rng=this._createRange(sel);
var apply_to=null;
if(HTMLArea.is_gecko)
{
if(sel.isCollapsed)
{
apply_to=this._getAncestorBlock(sel);
if(apply_to==null)
{
apply_to=this._createImplicitBlock(sel,target_tag);
}
}
else
{
switch(target_tag)
{
case'h1':
case'h2':
case'h3':
case'h4':
case'h5':
case'h6':
case'h7':
apply_to=[];
var search_tags=['h1','h2','h3','h4','h5','h6','h7'];
for(var y=0;y<search_tags.length;y++)
{
var headers=this._doc.getElementsByTagName(search_tag[y]);
for(var x=0;x<headers.length;x++)
{
if(sel.containsNode(headers[x]))
{
apply_to[apply_to.length]=headers[x];
}
}
}
if(apply_to.length>0)break;
case'div':
apply_to=this._doc.createElement(target_tag);
apply_to.appendChild(rng.extractContents());
rng.insertNode(apply_to);
break;
case'p':
case'center':
case'pre':
case'ins':
case'del':
case'blockquote':
case'address':
apply_to=[];
var paras=this._doc.getElementsByTagName(target_tag);
for(var x=0;x<paras.length;x++)
{
if(sel.containsNode(paras[x]))
{
apply_to[apply_to.length]=paras[x];
}
}
if(apply_to.length==0)
{
sel.collapseToStart();
return this._formatBlock(block_format);
}
break;
}
}
}
}
HTMLArea.prototype.selectNodeContents=function(node,pos){
this.focusEditor();
this.forceRedraw();
var range;
var collapsed=(typeof pos!="undefined");
if(HTMLArea.is_ie){
if(!collapsed&&node.tagName&&node.tagName.toLowerCase().match(/table|img/))
{
range=this._doc.body.createControlRange();
range.add(node);
}
else
{
range=this._doc.body.createTextRange();
range.moveToElementText(node);
(collapsed)&&range.collapse(pos);
}
range.select();
}else{
var sel=this._getSelection();
range=this._doc.createRange();
if(!collapsed&&node.tagName&&node.tagName.toLowerCase().match(/table|img/))
{
range.selectNode(node);
(collapsed)&&range.collapse(pos);
}
else
{
range.selectNodeContents(node);
(collapsed)&&range.collapse(pos);
}
sel.removeAllRanges();
sel.addRange(range);
}
};
HTMLArea.prototype.insertHTML=function(html){
var sel=this._getSelection();
var range=this._createRange(sel);
if(HTMLArea.is_ie){
range.pasteHTML(html);
}else{
var fragment=this._doc.createDocumentFragment();
var div=this._doc.createElement("div");
div.innerHTML=html;
while(div.firstChild){
fragment.appendChild(div.firstChild);
}
var node=this.insertNodeAtSelection(fragment);
}
};
HTMLArea.prototype.surroundHTML=function(startTag,endTag){
var html=this.getSelectedHTML();
this.insertHTML(startTag+html+endTag);
};
HTMLArea.prototype.getSelectedHTML=function(){
var sel=this._getSelection();
var range=this._createRange(sel);
var existing=null;
if(HTMLArea.is_ie){
existing=range.htmlText;
}else{
existing=HTMLArea.getHTML(range.cloneContents(),false,this);
}
return existing;
};
HTMLArea.prototype.hasSelectedText=function(){
return this.getSelectedHTML()!='';
};
HTMLArea.prototype._createLink=function(link){
var editor=this;
var outparam=null;
if(typeof link=="undefined"){
link=this.getParentElement();
if(link){
if(/^img$/i.test(link.tagName))
link=link.parentNode;
if(!/^a$/i.test(link.tagName))
link=null;
}
}
if(!link){
var sel=editor._getSelection();
var range=editor._createRange(sel);
var compare=0;
if(HTMLArea.is_ie){
compare=range.compareEndPoints("StartToEnd",range);
}else{
compare=range.compareBoundaryPoints(range.START_TO_END,range);
}
if(compare==0){
alert(HTMLArea._lc("You need to select some text before creating a link"));
return;
}
outparam={
f_href:'',
f_title:'',
f_target:'',
f_usetarget:editor.config.makeLinkShowsTarget
};
}else
outparam={
f_href:HTMLArea.is_ie?editor.stripBaseURL(link.href):link.getAttribute("href"),
f_title:link.title,
f_target:link.target,
f_usetarget:editor.config.makeLinkShowsTarget
};
this._popupDialog(editor.config.URIs["link"],function(param){
if(!param)
return false;
var a=link;
if(!a)try{
editor._doc.execCommand("createlink",false,param.f_href);
a=editor.getParentElement();
var sel=editor._getSelection();
var range=editor._createRange(sel);
if(!HTMLArea.is_ie){
a=range.startContainer;
if(!/^a$/i.test(a.tagName)){
a=a.nextSibling;
if(a==null)
a=range.startContainer.parentNode;
}
}
}catch(e){}
else{
var href=param.f_href.trim();
editor.selectNodeContents(a);
if(href==""){
editor._doc.execCommand("unlink",false,null);
editor.updateToolbar();
return false;
}
else{
a.href=href;
}
}
if(!(a&&/^a$/i.test(a.tagName)))
return false;
a.target=param.f_target.trim();
a.title=param.f_title.trim();
editor.selectNodeContents(a);
editor.updateToolbar();
},outparam);
};
HTMLArea.prototype._insertImage=function(image){
var editor=this;
var outparam=null;
if(typeof image=="undefined"){
image=this.getParentElement();
if(image&&!/^img$/i.test(image.tagName))
image=null;
}
if(image)outparam={
f_base:editor.config.baseURL,
f_url:HTMLArea.is_ie?editor.stripBaseURL(image.src):image.getAttribute("src"),
f_alt:image.alt,
f_border:image.border,
f_align:image.align,
f_vert:image.vspace,
f_horiz:image.hspace
};
this._popupDialog(editor.config.URIs["insert_image"],function(param){
if(!param){
return false;
}
var img=image;
if(!img){
var sel=editor._getSelection();
var range=editor._createRange(sel);
editor._doc.execCommand("insertimage",false,param.f_url);
if(HTMLArea.is_ie){
img=range.parentElement();
if(img.tagName.toLowerCase()!="img"){
img=img.previousSibling;
}
}else{
img=range.startContainer.previousSibling;
}
}else{
img.src=param.f_url;
}
for(var field in param){
var value=param[field];
switch(field){
case"f_alt":img.alt=value;break;
case"f_border":img.border=parseInt(value||"0");break;
case"f_align":img.align=value;break;
case"f_vert":img.vspace=parseInt(value||"0");break;
case"f_horiz":img.hspace=parseInt(value||"0");break;
}
}
},outparam);
};
HTMLArea.prototype._insertTable=function(){
var sel=this._getSelection();
var range=this._createRange(sel);
var editor=this;
this._popupDialog(editor.config.URIs["insert_table"],function(param){
if(!param){
return false;
}
var doc=editor._doc;
var table=doc.createElement("table");
for(var field in param){
var value=param[field];
if(!value){
continue;
}
switch(field){
case"f_width":table.style.width=value+param["f_unit"];break;
case"f_align":table.align=value;break;
case"f_border":table.border=parseInt(value);break;
case"f_spacing":table.cellSpacing=parseInt(value);break;
case"f_padding":table.cellPadding=parseInt(value);break;
}
}
var cellwidth=0;
if(param.f_fixed)
cellwidth=Math.floor(100/parseInt(param.f_cols));
var tbody=doc.createElement("tbody");
table.appendChild(tbody);
for(var i=0;i<param["f_rows"];++i){
var tr=doc.createElement("tr");
tbody.appendChild(tr);
for(var j=0;j<param["f_cols"];++j){
var td=doc.createElement("td");
if(cellwidth)
td.style.width=cellwidth+"%";
tr.appendChild(td);
(HTMLArea.is_gecko)&&td.appendChild(doc.createElement("br"));
}
}
if(HTMLArea.is_ie){
range.pasteHTML(table.outerHTML);
}else{
editor.insertNodeAtSelection(table);
}
return true;
},null);
};
HTMLArea.prototype._comboSelected=function(el,txt){
this.focusEditor();
var value=el.options[el.selectedIndex].value;
switch(txt){
case"fontname":
case"fontsize":this.execCommand(txt,false,value);break;
case"formatblock":
value="<"+value+">"
this.execCommand(txt,false,value);
break;
default:
var dropdown=this.config.customSelects[txt];
if(typeof dropdown!="undefined"){
dropdown.action(this);
}else{
alert("FIXME: combo box "+txt+" not implemented");
}
}
};
HTMLArea.prototype.execCommand=function(cmdID,UI,param){
var editor=this;
this.focusEditor();
cmdID=cmdID.toLowerCase();
if(HTMLArea.is_gecko)try{this._doc.execCommand('useCSS',false,true);}catch(e){};
switch(cmdID){
case"htmlmode":this.setMode();break;
case"hilitecolor":
(HTMLArea.is_ie)&&(cmdID="backcolor");
case"forecolor":
this._popupDialog(editor.config.URIs["select_color"],function(color){
if(color){
editor._doc.execCommand(cmdID,false,"#"+color);
}
},HTMLArea._colorToRgb(this._doc.queryCommandValue(cmdID)));
break;
case"createlink":
this._createLink();
break;
case"popupeditor":
HTMLArea._object=this;
var win;
if(HTMLArea.is_ie){
{
win=window.open(this.popupURL(editor.config.URIs["fullscreen"]),"ha_fullscreen",
"toolbar=no,location=no,directories=no,status=no,menubar=no,"+
"scrollbars=no,resizable=yes,width=640,height=480");
}
}else{
win=window.open(this.popupURL(editor.config.URIs["fullscreen"]),"ha_fullscreen",
"toolbar=no,menubar=no,personalbar=no,width=640,height=480,"+
"scrollbars=no,resizable=yes");
}
win.focus()
break;
case"undo":
case"redo":
if(this._customUndo)
this[cmdID]();
else
this._doc.execCommand(cmdID,UI,param);
break;
case"inserttable":this._insertTable();break;
case"insertimage":this._insertImage();break;
case"about":this._popupDialog(editor.config.URIs["about"],null,this);break;
case"showhelp":window.open(this.config.helpURL,"ha_help");break;
case"killword":this._wordClean();break;
case"insertanchor":this._insertAnchor();break;
case"cut":
case"copy":
case"paste":
try{
this._doc.execCommand(cmdID,UI,param);
if(this.config.killWordOnPaste)
this._wordClean();
}catch(e){
if(HTMLArea.is_gecko){
alert(HTMLArea._lc("The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly."));
}
}
break;
case"lefttoright":
case"righttoleft":
var dir=(cmdID=="righttoleft")?"rtl":"ltr";
var el=this.getParentElement();
while(el&&!HTMLArea.isBlockElement(el))
el=el.parentNode;
if(el){
if(el.style.direction==dir)
el.style.direction="";
else
el.style.direction=dir;
}
break;
default:try{this._doc.execCommand(cmdID,UI,param);}
catch(e){if(this.config.debug){alert(e+"\n\nby execCommand("+cmdID+");");}}
}
this.updateToolbar();
return false;
};
HTMLArea.prototype._editorEvent=function(ev){
var editor=this;
var keyEvent=(HTMLArea.is_ie&&ev.type=="keydown")||(!HTMLArea.is_ie&&ev.type=="keypress");
if(typeof editor._textArea['on'+ev.type]=="function"){
editor._textArea['on'+ev.type]();
}
if(HTMLArea.is_gecko&&keyEvent&&ev.ctrlKey&&this._unLink&&this._unlinkOnUndo)
{
if(String.fromCharCode(ev.charCode).toLowerCase()=='z')
{
HTMLArea._stopEvent(ev);
this._unLink();
editor.updateToolbar();
return;
}
}
if(keyEvent)
{
for(var i in editor.plugins)
{
var plugin=editor.plugins[i].instance;
if(typeof plugin.onKeyPress=="function")
if(plugin.onKeyPress(ev))
return false;
}
}
if(keyEvent&&ev.ctrlKey&&!ev.altKey)
{
var sel=null;
var range=null;
var key=String.fromCharCode(HTMLArea.is_ie?ev.keyCode:ev.charCode).toLowerCase();
var cmd=null;
var value=null;
switch(key){
case'a':
if(!HTMLArea.is_ie){
sel=this._getSelection();
sel.removeAllRanges();
range=this._createRange();
range.selectNodeContents(this._doc.body);
sel.addRange(range);
HTMLArea._stopEvent(ev);
}
break;
case'b':cmd="bold";break;
case'i':cmd="italic";break;
case'u':cmd="underline";break;
case's':cmd="strikethrough";break;
case'l':cmd="justifyleft";break;
case'e':cmd="justifycenter";break;
case'r':cmd="justifyright";break;
case'j':cmd="justifyfull";break;
case'z':cmd="undo";break;
case'y':cmd="redo";break;
case'v':if(HTMLArea.is_ie||editor.config.htmlareaPaste){cmd="paste";}break;
case'n':cmd="formatblock";value=HTMLArea.is_ie?"<p>":"p";break;
case'0':cmd="killword";break;
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
cmd="formatblock";
value="h"+key;
if(HTMLArea.is_ie)
value="<"+value+">";
break;
}
if(cmd){
this.execCommand(cmd,false,value);
HTMLArea._stopEvent(ev);
}
}
else if(keyEvent)
{
if(HTMLArea.is_gecko)
{
var s=editor._getSelection()
var autoWrap=function(textNode,tag)
{
var rightText=textNode.nextSibling;
if(typeof tag=='string')tag=editor._doc.createElement(tag);
var a=textNode.parentNode.insertBefore(tag,rightText);
textNode.parentNode.removeChild(textNode);
a.appendChild(textNode);
rightText.data=' '+rightText.data;
if(HTMLArea.is_ie)
{
var r=editor._createRange(s);
s.moveToElementText(rightText);
s.move('character',1);
}
else
{
s.collapse(rightText,1);
}
HTMLArea._stopEvent(ev);
editor._unLink=function()
{
var t=a.firstChild;
a.removeChild(t);
a.parentNode.insertBefore(t,a);
a.parentNode.removeChild(a);
editor._unLink=null;
editor._unlinkOnUndo=false;
}
editor._unlinkOnUndo=true;
return a;
}
switch(ev.which)
{
case 32:
{
if(s&&s.isCollapsed&&s.anchorNode.nodeType==3&&s.anchorNode.data.length>3&&s.anchorNode.data.indexOf('.')>=0)
{
var midStart=s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
if(midStart==-1)break;
if(this._getFirstAncestor(s,'a'))
{
break;
}
var matchData=s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/,'$1');
var m=matchData.match(HTMLArea.RE_email);
if(m)
{
var leftText=s.anchorNode;
var rightText=leftText.splitText(s.anchorOffset);
var midText=leftText.splitText(midStart);
autoWrap(midText,'a').href='mailto:'+m[0];
break;
}
var m=matchData.match(HTMLArea.RE_url);
if(m)
{
var leftText=s.anchorNode;
var rightText=leftText.splitText(s.anchorOffset);
var midText=leftText.splitText(midStart);
autoWrap(midText,'a').href=(m[1]?m[1]:'http://')+m[2];
break;
}
}
}
break;
default:
{
if(ev.keyCode==27||(this._unlinkOnUndo&&ev.ctrlKey&&ev.which==122))
{
if(this._unLink)
{
this._unLink();
HTMLArea._stopEvent(ev);
}
break;
}
else if(ev.which||ev.keyCode==8||ev.keyCode==46)
{
this._unlinkOnUndo=false;
if(s.anchorNode&&s.anchorNode.nodeType==3)
{
var a=this._getFirstAncestor(s,'a');
if(!a)break;
if(!a._updateAnchTimeout)
{
if(s.anchorNode.data.match(HTMLArea.RE_email)
&&(a.href.match('mailto:'+s.anchorNode.data.trim()))
)
{
var textNode=s.anchorNode;
var fn=function()
{
a.href='mailto:'+textNode.data.trim();
a._updateAnchTimeout=setTimeout(fn,250);
}
a._updateAnchTimeout=setTimeout(fn,250);
break;
}
var m=s.anchorNode.data.match(HTMLArea.RE_url);
if(m&&a.href.match(s.anchorNode.data.trim()))
{
var textNode=s.anchorNode;
var fn=function()
{
var m=textNode.data.match(HTMLArea.RE_url);
a.href=(m[1]?m[1]:'http://')+m[2];
a._updateAnchTimeout=setTimeout(fn,250);
}
a._updateAnchTimeout=setTimeout(fn,250);
}
}
}
}
}
break;
}
}
switch(ev.keyCode)
{
case 13:
if(HTMLArea.is_gecko&&!ev.shiftKey&&this.config.mozParaHandler=='dirty')
{
this.dom_checkInsertP();
HTMLArea._stopEvent(ev);
}
break;
case 8:
case 46:
if(HTMLArea.is_gecko&&!ev.shiftKey){
if(this.dom_checkBackspace())
HTMLArea._stopEvent(ev);
}else if(HTMLArea.is_ie){
if(this.ie_checkBackspace())
HTMLArea._stopEvent(ev);
}
break;
}
}
if(editor._timerToolbar){
clearTimeout(editor._timerToolbar);
}
editor._timerToolbar=setTimeout(function(){
editor.updateToolbar();
editor._timerToolbar=null;
},100);
};
HTMLArea.prototype.convertNode=function(el,newTagName){
var newel=this._doc.createElement(newTagName);
while(el.firstChild)
newel.appendChild(el.firstChild);
return newel;
};
HTMLArea.prototype.ie_checkBackspace=function(){
var sel=this._getSelection();
var range=this._createRange(sel);
if(range.text=="undefined")return true;
var r2=range.duplicate();
r2.moveStart("character",-1);
var a=r2.parentElement();
if(a!=range.parentElement()&&
/^a$/i.test(a.tagName)){
r2.collapse(true);
r2.moveEnd("character",1);
r2.pasteHTML('');
r2.select();
return true;
}
};
HTMLArea.prototype.dom_checkBackspace=function(){
var self=this;
setTimeout(function(){
var sel=self._getSelection();
var range=self._createRange(sel);
var SC=range.startContainer;
var SO=range.startOffset;
var EC=range.endContainer;
var EO=range.endOffset;
var newr=SC.nextSibling;
if(SC.nodeType==3)
SC=SC.parentNode;
if(!/\S/.test(SC.tagName)){
var p=document.createElement("p");
while(SC.firstChild)
p.appendChild(SC.firstChild);
SC.parentNode.insertBefore(p,SC);
SC.parentNode.removeChild(SC);
var r=range.cloneRange();
r.setStartBefore(newr);
r.setEndAfter(newr);
r.extractContents();
sel.removeAllRanges();
sel.addRange(r);
}
},10);
};
HTMLArea.prototype.dom_checkInsertP=function(){
var sel=this._getSelection();
var range=this._createRange(sel);
if(!range.collapsed)
{
range.deleteContents();
}
this.deactivateEditor();
var SC=range.startContainer;
var SO=range.startOffset;
var EC=range.endContainer;
var EO=range.endOffset;
if(SC==EC&&SC==body&&!SO&&!EO)
{
p=this._doc.createTextNode(" ");
body.insertBefore(p,body.firstChild);
range.selectNodeContents(p);
SC=range.startContainer;
SO=range.startOffset;
EC=range.endContainer;
EO=range.endOffset;
}
var p=this.getAllAncestors();
var block=null;
var body=this._doc.body;
for(var i=0;i<p.length;++i)
{
if(HTMLArea.isParaContainer(p[i]))
{
break;
}
else if(HTMLArea.isBlockElement(p[i])&&!/body|html/i.test(p[i].tagName))
{
block=p[i];
break;
}
}
if(!block)
{
var wrap=range.startContainer;
while(wrap.parentNode&&!HTMLArea.isParaContainer(wrap.parentNode))
{
wrap=wrap.parentNode;
}
var start=wrap;
var end=wrap;
while(start.previousSibling)
{
if(start.previousSibling.tagName)
{
if(!HTMLArea.isBlockElement(start.previousSibling))
{
start=start.previousSibling;
}
else
{
break;
}
}
else
{
start=start.previousSibling;
}
}
while(end.nextSibling)
{
if(end.nextSibling.tagName)
{
if(!HTMLArea.isBlockElement(end.nextSibling))
{
end=end.nextSibling;
}
else
{
break;
}
}
else
{
end=end.nextSibling;
}
}
range.setStartBefore(start);
range.setEndAfter(end);
range.surroundContents(this._doc.createElement('p'));
block=range.startContainer.firstChild;
range.setStart(SC,SO);
}
range.setEndAfter(block);
var r2=range.cloneRange();
sel.removeRange(range);
var df=r2.extractContents();
if(df.childNodes.length==0)
{
df.appendChild(this._doc.createElement('p'));
df.firstChild.appendChild(this._doc.createElement('br'));
}
if(df.childNodes.length>1)
{
var nb=this._doc.createElement('p');
while(df.firstChild)
{
var s=df.firstChild;
df.removeChild(s);
nb.appendChild(s);
}
df.appendChild(nb);
}
if(!/\S/.test(block.innerHTML))
block.innerHTML="&nbsp;";
p=df.firstChild;
if(!/\S/.test(p.innerHTML))
p.innerHTML="<br />";
if(/^\s*<br\s*\/?>\s*$/.test(p.innerHTML)&&/^h[1-6]$/i.test(p.tagName))
{
df.appendChild(this.convertNode(p,"p"));
df.removeChild(p);
}
var newblock=block.parentNode.insertBefore(df.firstChild,block.nextSibling);
this.activateEditor();
var sel=this._getSelection();
sel.removeAllRanges();
sel.collapse(newblock,0);
this.scrollToElement(newblock);
};
HTMLArea.prototype.scrollToElement=function(e)
{
if(HTMLArea.is_gecko)
{
var top=0;
var left=0;
while(e)
{
top+=e.offsetTop;
left+=e.offsetLeft;
if(e.offsetParent&&e.offsetParent.tagName.toLowerCase()!='body')
{
e=e.offsetParent;
}
else
{
e=null;
}
}
this._iframe.contentWindow.scrollTo(left,top);
}
}
HTMLArea.prototype.getHTML=function(){
var html='';
switch(this._editMode){
case"wysiwyg":
{
if(!this.config.fullPage)
html=HTMLArea.getHTML(this._doc.body,false,this);
else
html=this.doctype+"\n"+HTMLArea.getHTML(this._doc.documentElement,true,this);
break;
}
case"textmode":
{
html=this._textArea.value;
break;
}
default:
{
alert("Mode <"+mode+"> not defined!");
return false;
}
}
rExp = /<p \/>/gi; html = html.replace(rExp,'');
return html;
};
HTMLArea.prototype.outwardHtml=function(html)
{
html=html.replace(/<(\/?)b(\s|>|\/)/ig,"<$1strong$2");
html=html.replace(/<(\/?)i(\s|>|\/)/ig,"<$1em$2");
var serverBase=location.href.replace(/(https?:\/\/[^\/]*)\/.*/,'$1')+'/';
html=html.replace(/https?:\/\/null\//g,serverBase);
// Removed by TS so that relative urls don't have serverBase appended.
//html=html.replace(/((href|src|background)=[\'\"])\/+/ig,'$1'+serverBase);
html=this.outwardSpecialReplacements(html);
// Removed by TS so that relative urls don't have serverBase appended.
//html=this.fixRelativeLinks(html);
return html;
}
HTMLArea.prototype.inwardHtml=function(html)
{
if(HTMLArea.is_gecko){
html=html.replace(/<(\/?)strong(\s|>|\/)/ig,"<$1b$2");
html=html.replace(/<(\/?)em(\s|>|\/)/ig,"<$1i$2");
}
html=this.inwardSpecialReplacements(html);
var nullRE=new RegExp('((href|src|background)=[\'"])/+','gi');
// Next 2 lines removed by TS so that relative urls don't have serverBase appended.
//html=html.replace(nullRE,'$1'+location.href.replace(/(https?:\/\/[^\/]*)\/.*/,'$1')+'/');
//html=this.fixRelativeLinks(html);
return html;
}
HTMLArea.prototype.outwardSpecialReplacements=function(html)
{
for(var i in this.config.specialReplacements)
{
var from=this.config.specialReplacements[i];
var to=i;
var reg=new RegExp(from.replace(HTMLArea.RE_Specials,'\\$1'),'g');
html=html.replace(reg,to.replace(/\$/g,'$$$$'));
}
return html;
}
HTMLArea.prototype.inwardSpecialReplacements=function(html)
{
for(var i in this.config.specialReplacements)
{
var from=i;
var to=this.config.specialReplacements[i];
var reg=new RegExp(from.replace(HTMLArea.RE_Specials,'\\$1'),'g');
html=html.replace(reg,to.replace(/\$/g,'$$$$'));
}
return html;
}
HTMLArea.prototype.fixRelativeLinks=function(html)
{
if(typeof this.config.stripSelfNamedAnchors!='undefined'&&this.config.stripSelfNamedAnchors)
{
var stripRe=new RegExp(document.location.href.replace(HTMLArea.RE_Specials,'\\$1')+'(#.*)','g');
html=html.replace(stripRe,'$1');
}
if(typeof this.config.stripBaseHref!='undefined'&&this.config.stipBaseHref)
{
var baseRe=null
if(typeof this.config.baseHref!='undefined'&&this.config.baseHref!=null)
{
baseRe=new RegExp(this.config.baseHref.replace(HTMLArea.RE_Specials,'\\$1'),'g');
}
else
{
baseRe=new RegExp(document.location.href.replace(/([^\/]*\/?)$/,'').replace(HTMLArea.RE_Specials,'\\$1'),'g');
}
html=html.replace(baseRe,'');
}
if(HTMLArea.is_ie)
{
}
return html;
}
HTMLArea.prototype.getInnerHTML=function(){
if(!this._doc.body)return'';
switch(this._editMode){
case"wysiwyg":
if(!this.config.fullPage)
html=this._doc.body.innerHTML;
else
html=this.doctype+"\n"+this._doc.documentElement.innerHTML;
break;
case"textmode":
html=this._textArea.value;
break;
default:
alert("Mode <"+mode+"> not defined!");
return false;
}
return html;
};
HTMLArea.prototype.setHTML=function(html){
switch(this._editMode){
case"wysiwyg":
if(!this.config.fullPage)
this._doc.body.innerHTML=html;
else
this._doc.body.innerHTML=html;
break;
case"textmode":this._textArea.value=html;break;
default:alert("Mode <"+mode+"> not defined!");
}
return false;
};
HTMLArea.prototype.setDoctype=function(doctype){
this.doctype=doctype;
};
HTMLArea._object=null;
HTMLArea.cloneObject=function(obj){
if(!obj)return null;
var newObj=new Object;
if(obj.constructor.toString().indexOf("function Array(")==1){
newObj=obj.constructor();
}
if(obj.constructor.toString().indexOf("function Function(")==1){
newObj=obj;
}else for(var n in obj){
var node=obj[n];
if(typeof node=='object'){newObj[n]=HTMLArea.cloneObject(node);}
else{newObj[n]=node;}
}
return newObj;
};
HTMLArea.checkSupportedBrowser=function(){
if(HTMLArea.is_gecko){
if(navigator.productSub<20021201){
alert("You need at least Mozilla-1.3 Alpha.\n"+
"Sorry, your Gecko is not supported.");
return false;
}
if(navigator.productSub<20030210){
alert("Mozilla < 1.3 Beta is not supported!\n"+
"I'll try, though, but it might not work.");
}
}
return HTMLArea.is_gecko||HTMLArea.is_ie;
};
HTMLArea.prototype._getSelection=function(){
if(HTMLArea.is_ie){
return this._doc.selection;
}else{
return this._iframe.contentWindow.getSelection();
}
};
HTMLArea.prototype._createRange=function(sel){
if(HTMLArea.is_ie){
return sel.createRange();
}else{
this.activateEditor();
if(typeof sel!="undefined"){
try{
return sel.getRangeAt(0);
}catch(e){
return this._doc.createRange();
}
}else{
return this._doc.createRange();
}
}
};
HTMLArea._addEvent=function(el,evname,func){
if(HTMLArea.is_ie){
el.attachEvent("on"+evname,func);
}else{
el.addEventListener(evname,func,true);
}
};
HTMLArea._addEvents=function(el,evs,func){
for(var i=evs.length;--i>=0;){
HTMLArea._addEvent(el,evs[i],func);
}
};
HTMLArea._removeEvent=function(el,evname,func){
if(HTMLArea.is_ie){
el.detachEvent("on"+evname,func);
}else{
el.removeEventListener(evname,func,true);
}
};
HTMLArea._removeEvents=function(el,evs,func){
for(var i=evs.length;--i>=0;){
HTMLArea._removeEvent(el,evs[i],func);
}
};
HTMLArea._stopEvent=function(ev){
if(HTMLArea.is_ie){
ev.cancelBubble=true;
ev.returnValue=false;
}else{
ev.preventDefault();
ev.stopPropagation();
}
};
HTMLArea.prototype.notifyOn=function(ev,fn)
{
if(typeof this._notifyListeners[ev]=='undefined')
{
this._notifyListeners[ev]=[];
}
this._notifyListeners[ev].push(fn);
}
HTMLArea.prototype.notifyOf=function(ev,args)
{
if(this._notifyListeners[ev])
{
for(var i=0;i<this._notifyListeners[ev].length;i++)
{
this._notifyListeners[ev][i](ev,args);
}
}
}
HTMLArea._removeClass=function(el,className){
if(!(el&&el.className)){
return;
}
var cls=el.className.split(" ");
var ar=new Array();
for(var i=cls.length;i>0;){
if(cls[--i]!=className){
ar[ar.length]=cls[i];
}
}
el.className=ar.join(" ");
};
HTMLArea._addClass=function(el,className){
HTMLArea._removeClass(el,className);
el.className+=" "+className;
};
HTMLArea._hasClass=function(el,className){
if(!(el&&el.className)){
return false;
}
var cls=el.className.split(" ");
for(var i=cls.length;i>0;){
if(cls[--i]==className){
return true;
}
}
return false;
};
HTMLArea._blockTags=" body form textarea fieldset ul ol dl li div "+
"p h1 h2 h3 h4 h5 h6 quote pre table thead "+
"tbody tfoot tr td th iframe address blockquote";
HTMLArea.isBlockElement=function(el){
return el&&el.nodeType==1&&(HTMLArea._blockTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
};
HTMLArea._paraContainerTags=" body td th caption fieldset div";
HTMLArea.isParaContainer=function(el)
{
return el&&el.nodeType==1&&(HTMLArea._paraContainerTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
}
HTMLArea._closingTags=" head script style div span tr td tbody table em strong b i code cite dfn abbr acronym font a title ";
HTMLArea.needsClosingTag=function(el){
return el&&el.nodeType==1&&(HTMLArea._closingTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
};
HTMLArea.htmlEncode=function(str){
if(typeof str.replace=='undefined')str=str.toString();
str=str.replace(/&/ig,"&amp;");
str=str.replace(/</ig,"&lt;");
str=str.replace(/>/ig,"&gt;");
str=str.replace(/\xA0/g,"&nbsp;");
str=str.replace(/\x22/g,"&quot;");
return str;
};
HTMLArea.getHTML=function(root,outputRoot,editor){
try{
return HTMLArea.getHTMLWrapper(root,outputRoot,editor);
}
catch(e){
alert(HTMLArea._lc('Your Document is not well formed. Check JavaScript console for details.'));
return editor._iframe.contentWindow.document.body.innerHTML;
}
}
HTMLArea.getHTMLWrapper=function(root,outputRoot,editor){
var html="";
switch(root.nodeType){
case 10:
case 6:
case 12:
break;
case 2:
break;
case 4:
html+='<![CDATA['+root.data+']]>';
break;
case 5:
html+='&'+root.nodeValue+';';
break;
case 7:
html+='<?'+root.target+' '+root.data+' ?>';
break;
case 1:
case 11:
case 9:
{
var closed;
var i;
var root_tag=(root.nodeType==1)?root.tagName.toLowerCase():'';
if(root_tag=='br'&&!root.nextSibling)
break;
if(outputRoot)
outputRoot=!(editor.config.htmlRemoveTags&&editor.config.htmlRemoveTags.test(root_tag));
if(HTMLArea.is_ie&&root_tag=="head"){
if(outputRoot)
html+="<head>";
var save_multiline=RegExp.multiline;
RegExp.multiline=true;
var txt=root.innerHTML.replace(HTMLArea.RE_tagName,function(str,p1,p2){
return p1+p2.toLowerCase();
});
RegExp.multiline=save_multiline;
html+=txt;
if(outputRoot)
html+="</head>";
break;
}else if(outputRoot){
closed=(!(root.hasChildNodes()||HTMLArea.needsClosingTag(root)));
html="<"+root.tagName.toLowerCase();
var attrs=root.attributes;
for(i=0;i<attrs.length;++i){
var a=attrs.item(i);
if(!a.specified){
continue;
}
var name=a.nodeName.toLowerCase();
if(/_moz_editor_bogus_node/.test(name)){
html="";
break;
}
if(/(_moz)|(contenteditable)|(_msh)/.test(name)){
continue;
}
var value;
if(name!="style"){
if(typeof root[a.nodeName]!="undefined"&&name!="href"&&name!="src"&&!/^on/.test(name)){
value=root[a.nodeName];
}else{
value=a.nodeValue;
if(HTMLArea.is_ie&&(name=="href"||name=="src")){
value=editor.stripBaseURL(value);
}
}
}else{
value=root.style.cssText;
}
if(/^(_moz)?$/.test(value)){
continue;
}
html+=" "+name+'="'+HTMLArea.htmlEncode(value)+'"';
}
if(html!=""){
html+=closed?" />":">";
}
}
for(i=root.firstChild;i;i=i.nextSibling){
html+=HTMLArea.getHTMLWrapper(i,true,editor);
}
if(outputRoot&&!closed){
html+="</"+root.tagName.toLowerCase()+">";
}
break;
}
case 3:
html=/^script|style$/i.test(root.parentNode.tagName)?root.data:HTMLArea.htmlEncode(root.data);
break;
case 8:
html="<!--"+root.data+"-->";
break;
}
return html;
};
HTMLArea.prototype.stripBaseURL=function(string){
var baseurl=this.config.baseURL;
baseurl=baseurl.replace(/[^\/]+$/,'');
var basere=new RegExp(baseurl);
string=string.replace(basere,"");
baseurl=baseurl.replace(/^(https?:\/\/[^\/]+)(.*)$/,'$1');
basere=new RegExp(baseurl);
return string.replace(basere,"");
};
String.prototype.trim=function(){
return this.replace(/^\s+/,'').replace(/\s+$/,'');
};
HTMLArea._makeColor=function(v){
if(typeof v!="number"){
return v;
}
var r=v&0xFF;
var g=(v>>8)&0xFF;
var b=(v>>16)&0xFF;
return"rgb("+r+","+g+","+b+")";
};
HTMLArea._colorToRgb=function(v){
if(!v)
return'';
function hex(d){
return(d<16)?("0"+d.toString(16)):d.toString(16);
};
if(typeof v=="number"){
var r=v&0xFF;
var g=(v>>8)&0xFF;
var b=(v>>16)&0xFF;
return"#"+hex(r)+hex(g)+hex(b);
}
if(v.substr(0,3)=="rgb"){
var re=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
if(v.match(re)){
var r=parseInt(RegExp.$1);
var g=parseInt(RegExp.$2);
var b=parseInt(RegExp.$3);
return"#"+hex(r)+hex(g)+hex(b);
}
return null;
}
if(v.substr(0,1)=="#"){
return v;
}
return null;
};
HTMLArea.prototype._popupDialog=function(url,action,init){
Dialog(this.popupURL(url),action,init);
};
HTMLArea.prototype.imgURL=function(file,plugin){
if(typeof plugin=="undefined")
return _editor_url+file;
else
return _editor_url+"plugins/"+plugin+"/img/"+file;
};
HTMLArea.prototype.popupURL=function(file){
var url="";
if(file.match(/^plugin:\/\/(.*?)\/(.*)/)){
var plugin=RegExp.$1;
var popup=RegExp.$2;
if(!/\.html$/.test(popup))
popup+=".html";
url=_editor_url+"plugins/"+plugin+"/popups/"+popup;
}else if(file.match(/^\/.*?/))
url=file;
else
url=_editor_url+this.config.popupURL+file;
return url;
};
HTMLArea.getElementById=function(tag,id){
var el,i,objs=document.getElementsByTagName(tag);
for(i=objs.length;--i>=0&&(el=objs[i]);)
if(el.id==id)
return el;
return null;
};
HTMLArea.prototype._toggleBorders=function()
{
tables=this._doc.getElementsByTagName('TABLE');
if(tables.length!=0)
{
if(!this.borders)
{
name="bordered";
this.borders=true;
}
else
{
name="";
this.borders=false;
}
for(var ix=0;ix<tables.length;ix++)
{
if(this.borders)
{
HTMLArea._addClass(tables[ix],'htmtableborders');
}
else
{
HTMLArea._removeClass(tables[ix],'htmtableborders');
}
}
}
return true;
}
HTMLArea.addClasses=function(el,classes)
{
if(el!=null)
{
var thiers=el.className.trim().split(' ');
var ours=classes.split(' ');
for(var x=0;x<ours.length;x++)
{
var exists=false;
for(var i=0;exists==false&&i<thiers.length;i++)
{
if(thiers[i]==ours[x])
{
exists=true;
}
}
if(exists==false)
{
thiers[thiers.length]=ours[x];
}
}
el.className=thiers.join(' ').trim();
}
}
HTMLArea.removeClasses=function(el,classes)
{
var existing=el.className.trim().split();
var new_classes=[];
var remove=classes.trim().split();
for(var i=0;i<existing.length;i++)
{
var found=false;
for(var x=0;x<remove.length&&!found;x++)
{
if(existing[i]==remove[x])
{
found=true;
}
}
if(!found)
{
new_classes[new_classes.length]=existing[i];
}
}
return new_classes.join(' ');
}
HTMLArea.addClass=HTMLArea._addClass;
HTMLArea.removeClass=HTMLArea._removeClass;
HTMLArea._addClasses=HTMLArea.addClasses;
HTMLArea._removeClasses=HTMLArea.removeClasses;
HTMLArea._postback=function(url,data,handler)
{
var req=null;
if(HTMLArea.is_ie)
{
req=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
req=new XMLHttpRequest();
}
var content='';
for(var i in data)
{
content+=(content.length?'&':'')+i+'='+encodeURIComponent(data[i]);
}
function callBack()
{
if(req.readyState==4)
{
if(req.status==200)
{
if(typeof handler=='function')
handler(req.responseText,req);
}
else
{
alert('An error has occurred: '+req.statusText);
}
}
}
req.onreadystatechange=callBack;
req.open('POST',url,true);
req.setRequestHeader
(
'Content-Type',
'application/x-www-form-urlencoded; charset=UTF-8'
);
req.send(content);
}
HTMLArea._getback=function(url,handler)
{
var req=null;
if(HTMLArea.is_ie)
{
req=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
req=new XMLHttpRequest();
}
function callBack()
{
if(req.readyState==4)
{
if(req.status==200)
{
handler(req.responseText,req);
}
else
{
alert('An error has occurred: '+req.statusText);
}
}
}
req.onreadystatechange=callBack;
req.open('GET',url,true);
req.send(null);
}
HTMLArea._geturlcontent=function(url)
{
var req=null;
if(HTMLArea.is_ie)
{
req=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
req=new XMLHttpRequest();
}
req.open('GET',url,false);
req.send(null);
if(req.status==200)
{
return req.responseText;
}
else
{
return'';
}
}
if(typeof dump=='undefined')
{
function dump(o){
var s='';
for(var prop in o){
s+=prop+' = '+o[prop]+'\n';
}
x=window.open("","debugger");
x.document.write('<pre>'+s+'</pre>');
}
}
HTMLArea.arrayContainsArray=function(a1,a2)
{
var all_found=true;
for(var x=0;x<a2.length;x++)
{
var found=false;
for(var i=0;i<a1.length;i++)
{
if(a1[i]==a2[x])
{
found=true;
break;
}
}
if(!found)
{
all_found=false;
break;
}
}
return all_found;
}
HTMLArea.arrayFilter=function(a1,filterfn)
{
var new_a=[];
for(var x=0;x<a1.length;x++)
{
if(filterfn(a1[x]))
new_a[new_a.length]=a1[x];
}
return new_a;
}
HTMLArea.uniq_count=0;
HTMLArea.uniq=function(prefix)
{
return prefix+HTMLArea.uniq_count++;
}
HTMLArea._loadlang=function(context)
{
if(typeof _editor_lcbackend=="string")
{
var url=_editor_lcbackend;
url=url.replace(/%lang%/,_editor_lang);
url=url.replace(/%context%/,context);
}
else
{
if(context!='HTMLArea'){
var url=_editor_url+"plugins/"+context+"/lang/"+_editor_lang+".js";
}else{
var url=_editor_url+"lang/"+_editor_lang+".js";
}
}
var lang;
var langData=HTMLArea._geturlcontent(url);
if(langData!=""){
try{
eval('lang = '+langData);
}catch(Error){
alert('Error reading Language-File ('+url+'):\n'+Error.toString());
lang={}
}
}else{
lang={};
}
return lang;
}
HTMLArea._lc=function(string,context)
{
if(_editor_lang=="en")
{
return string;
}
if(typeof HTMLArea._lc_catalog=='undefined')
{
HTMLArea._lc_catalog=[];
}
if(typeof context=='undefined')
{
context='HTMLArea';
}
if(typeof HTMLArea._lc_catalog[context]=='undefined')
{
HTMLArea._lc_catalog[context]=HTMLArea._loadlang(context);
}
if(typeof HTMLArea._lc_catalog[context][string]=='undefined')
{
return string;
}
else
{
return HTMLArea._lc_catalog[context][string];
}
}
HTMLArea.hasDisplayedChildren=function(el)
{
var children=el.childNodes;
for(var i=0;i<children.length;i++)
{
if(children[i].tagName)
{
if(children[i].style.display!='none')
{
return true;
}
}
}
return false;
}
HTMLArea._loadback=function(src,callback)
{
var head=document.getElementsByTagName("head")[0];
var evt=HTMLArea.is_ie?"onreadystatechange":"onload";
var script=document.createElement("script");
script.type="text/javascript";
script.src=src;
script[evt]=function()
{
if(HTMLArea.is_ie&&!/loaded|complete/.test(window.event.srcElement.readyState))return;
callback();
}
head.appendChild(script);
};
HTMLArea.collectionToArray=function(collection)
{
var array=[];
for(var i=0;i<collection.length;i++)
{
array.push(collection.item(i));
}
return array;
}
if(!Array.prototype.append)
{
Array.prototype.append=function(a)
{
for(var i=0;i<a.length;i++)
{
this.push(a[i]);
}
return this;
}
}
HTMLArea.makeEditors=function(editor_names,default_config,plugin_names)
{
if(typeof default_config=='function')
{
default_config=default_config();
}
var editors={};
for(var x=0;x<editor_names.length;x++)
{
var editor=new HTMLArea(editor_names[x],HTMLArea.cloneObject(default_config));
editor.registerPlugins(plugin_names);
editors[editor_names[x]]=editor;
}
return editors;
}
HTMLArea.startEditors=function(editors)
{
for(var i in editors)
{
if(editors[i].generate)editors[i].generate();
}
}
HTMLArea.prototype.registerPlugins=function(plugin_names){
if(plugin_names)
{
for(var i=0;i<plugin_names.length;i++)
{
this.registerPlugin(eval(plugin_names[i]));
}
}
}
HTMLArea.prototype.prepareHTML=function(){
for(i=0;i<HtmlAreaRegister.length;i++){
var editor=HtmlAreaRegister[i];
editor._textArea.value=editor.getHTML();
}
}
HTMLArea.init();