// htmlArea v3.0 - Copyright (c) 2003-2006 dynarch.com
//                               2002-2003 interactivetools.com, inc.
// This copyright notice MUST stay intact for use (see license.txt).
//
// A free WYSIWYG editor replacement for <textarea> fields.
// For full source code and docs, visit http://www.interactivetools.com/
//
// Version 3.0 developed by Mihai Bazon, Dynarch.com.
//   http://www.dynarch.com/
//
// $Id: htmlarea.js,v 1.101 2006-06-28 09:07:30 mishoo Exp $
(function(){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 agt=navigator.userAgent.toLowerCase();

HTMLArea.is_ie=((agt.indexOf("msie")!=-1)&&(agt.indexOf("opera")==-1));

HTMLArea.is_opera=window.opera?true:(agt.indexOf("opera")!=-1);

HTMLArea.is_mac=(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");

HTMLArea.is_midas=HTMLArea.is_opera||HTMLArea.is_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=false;

this._mdoc=document;

this.doctype='';

}};

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+"popupwin.js");

HTMLArea.loadScript(_editor_url+"colors.js");

HTMLArea.loadScript(_editor_url+"lang/"+_editor_lang+".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.Config=function(){this.version="3.0";

this.width="100%";

this.height="auto";

this.statusBar=true;

this.htmlareaPaste=false;

this.undoSteps=20;

this.undoTimeout=500;

this.sizeIncludesToolbar=true;

this.fullPage=false;

this.pageStyle="";

this.killWordOnPaste=true;

this.makeLinkShowsTarget=true;

this.baseURL=document.baseURI||document.URL;

if(this.baseURL&&this.baseURL.match(/(.*)\/([^\/]+)/))this.baseURL=RegExp.$1+"/";

this.imgURL="images/";

this.popupURL="popups/";

this.htmlRemoveTags=null;

this.toolbar=[["fontname","space","fontsize","space","formatblock","space","bold","italic","underline","strikethrough","separator","subscript","superscript","separator","copy","cut","paste","space","undo","redo","space","removeformat","killword"],["justifyleft","justifycenter","justifyright","justifyfull","separator","lefttoright","righttoleft","separator","orderedlist","unorderedlist","outdent","indent","separator","forecolor","hilitecolor","separator","inserthorizontalrule","createlink","insertimage","inserttable","toggletableborders","htmlmode","separator","popupeditor","separator","showhelp","about"]];

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,verdana,arial,helvetica,sans-serif',"Times New Roman":'times new roman,times,serif',"Verdana":'verdana,tahoma,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=false;

this.btnList={bold:["Bold","ed_format_bold.gif",false,function(e){e.execCommand("bold");
}],italic:["Italic","ed_format_italic.gif",false,function(e){e.execCommand("italic");

}],underline:["Underline","ed_format_underline.gif",false,function(e){e.execCommand("underline");

}],strikethrough:["Strikethrough","ed_format_strike.gif",false,function(e){e.execCommand("strikethrough");

}],subscript:["Subscript","ed_format_sub.gif",false,function(e){e.execCommand("subscript");

}],superscript:["Superscript","ed_format_sup.gif",false,function(e){e.execCommand("superscript");

}],justifyleft:["Justify Left","ed_align_left.gif",false,function(e){e.execCommand("justifyleft");

}],justifycenter:["Justify Center","ed_align_center.gif",false,function(e){e.execCommand("justifycenter");

}],justifyright:["Justify Right","ed_align_right.gif",false,function(e){e.execCommand("justifyright");

}],justifyfull:["Justify Full","ed_align_justify.gif",false,function(e){e.execCommand("justifyfull");

}],orderedlist:["Ordered List","ed_list_num.gif",false,function(e){e.execCommand("insertorderedlist");

}],unorderedlist:["Bulleted List","ed_list_bullet.gif",false,function(e){e.execCommand("insertunorderedlist");

}],outdent:["Decrease Indent","ed_indent_less.gif",false,function(e){e.execCommand("outdent");

}],indent:["Increase Indent","ed_indent_more.gif",false,function(e){e.execCommand("indent");

}],forecolor:["Font Color","ed_color_fg.gif",false,function(e){e.execCommand("forecolor");

}],hilitecolor:["Background Color","ed_color_bg.gif",false,function(e){e.execCommand("hilitecolor");

}],inserthorizontalrule:["Horizontal Rule","ed_hr.gif",false,function(e){e.execCommand("inserthorizontalrule");

}],createlink:["Insert Web Link","ed_link.gif",false,function(e){e.execCommand("createlink",true);

}],insertimage:["Insert/Modify Image","ed_image.gif",false,function(e){e.execCommand("insertimage");

}],inserttable:["Insert Table","insert_table.gif",false,function(e){e.execCommand("inserttable");

}],toggletableborders:["Toggle table guidelines","ed_table_borders.gif",false,function(e){e.execCommand("toggletableborders");

}],htmlmode:["Toggle HTML Source","ed_html.gif",true,function(e){e.execCommand("htmlmode");

}],popupeditor:["Enlarge Editor","fullscreen_maximize.gif",true,function(e){e.execCommand("popupeditor");

}],about:["About this editor","ed_about.gif",true,function(e){e.execCommand("about");

}],showhelp:["Help using editor","ed_help.gif",true,function(e){e.execCommand("showhelp");

}],undo:["Undoes your last action","ed_undo.gif",false,function(e){e.execCommand("undo");

}],redo:["Redoes your last action","ed_redo.gif",false,function(e){e.execCommand("redo");

}],cut:["Cut selection","ed_cut.gif",false,cut_copy_paste],copy:["Copy selection","ed_copy.gif",false,cut_copy_paste],paste:["Paste from clipboard","ed_paste.gif",false,cut_copy_paste],lefttoright:["Direction left to right","ed_left_to_right.gif",false,function(e){e.execCommand("lefttoright");

}],righttoleft:["Direction right to left","ed_right_to_left.gif",false,function(e){e.execCommand("righttoleft");

}],removeformat:["Remove formatting","ed_rmformat.gif",false,function(e){e.execCommand("removeformat");

}],print:["Print document","ed_print.gif",false,function(e){e._iframe.contentWindow.print();

}],killword:["Clear MSOffice tags","ed_killword.gif",false,function(e){e.execCommand("killword");

}]};

for(var i in this.btnList){var btn=this.btnList[i];

btn[1]=_editor_url+this.imgURL+btn[1];

if(typeof HTMLArea.I18N.tooltips[i]!="undefined"){if(/^(cut|copy|paste)$/.test(i)&&HTMLArea.is_gecko&&HTMLArea.I18N.tooltips[i+'_ff'])i=i+'_ff';

btn[0]=HTMLArea.I18N.tooltips[i];

}}};

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":return this.btnList[id]=[tooltip,image,textMode,action,context];

case "object":return this.btnList[id.id]=[id.tooltip,id.image,id.textMode,id.action,id.context];

}};

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.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);

return ta?(new HTMLArea(ta,config)).generate():null;

};

HTMLArea.prototype._createToolbar=function(){var editor=this;

var toolbar=document.createElement("div");

if(HTMLArea.is_ie)toolbar.style.width="100%";

HTMLArea._addEvents(toolbar,["mousedown","mouseup"],function(ev){var tgt;

if(HTMLArea.is_ie){ev=window.event;

tgt=ev.srcElement;

}else tgt=ev.target;

if(tgt===toolbar||tgt.disabled||tgt.parentNode.disabled){editor.updateToolbar();

HTMLArea._stopEvent(ev);

return false;

}});

this._toolbar=toolbar;

toolbar.className="toolbar";

toolbar.unselectable="1";

var tb_row=null;

var tb_objects=new Object();

this._toolbarObjects=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=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.I18N.tooltips.textindicator;

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("div");

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,"mouseover",function(){if(obj.enabled){HTMLArea._addClass(el,"buttonHover");

}});

HTMLArea._addEvent(el,"mouseout",function(){if(obj.enabled)with(HTMLArea){_removeClass(el,"buttonHover");

_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");

_removeClass(el,"buttonHover");

obj.cmd(editor,obj.name,obj);

_stopEvent(is_ie?window.event:ev);

}});

var img=document.createElement("img");

img.src=btn[1];

img.style.width="18px";

img.style.height="18px";

if(HTMLArea.is_ie)img.ondragstart=HTMLArea.do_false;

el.appendChild(img);

}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){createButton("linebreak");

}else{first=false;

}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.I18N.custom[label];

}var tb_cell=document.createElement("td");

tb_row.appendChild(tb_cell);

tb_cell.className="label";

tb_cell.innerHTML=label;

}else{createButton(code);

}}}this._htmlArea.appendChild(toolbar);

};

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.I18N.msg["Path"]+": ";

this._statusBarTree=div;

this._statusBar.appendChild(div);

if(!this.config.statusBar){statusbar.style.display="none";

}};

HTMLArea.prototype.generate=function(){var editor=this;

var textarea=this._textArea;

if(typeof textarea=="string"){this._textArea=textarea=HTMLArea.getElementById("textarea",textarea);

}this._ta_size={w:textarea.offsetWidth,h:textarea.offsetHeight};

textarea.style.display="none";

var htmlarea=document.createElement("div");

htmlarea.className="htmlarea";

this._htmlArea=htmlarea;

textarea.parentNode.insertBefore(htmlarea,textarea);

if(textarea.form){var f=textarea.form;

if(typeof f.onsubmit=="function"){var funcref=f.onsubmit;

if(typeof f.__msh_prevOnSubmit=="undefined"){f.__msh_prevOnSubmit=[];

}f.__msh_prevOnSubmit.push(funcref);

}f.onsubmit=function(){editor._textArea.value=editor.getHTML();

var a=this.__msh_prevOnSubmit;

if(typeof a!="undefined"){for(var i=a.length;

--i>=0;

){a[i]();

}}};

if(typeof f.onreset=="function"){var funcref=f.onreset;

if(typeof f.__msh_prevOnReset=="undefined"){f.__msh_prevOnReset=[];

}f.__msh_prevOnReset.push(funcref);

}f.onreset=function(){editor.setHTML(editor._textArea.value);

editor.updateToolbar();

var a=this.__msh_prevOnReset;

if(typeof a!="undefined"){for(var i=a.length;

--i>=0;

){a[i]();

}}};

}try{window.onunload=function(){editor._textArea.value=editor.getHTML();

};

}catch(e){};

this._createToolbar();

htmlarea.appendChild(textarea);

var iframe=document.createElement("iframe");

iframe.src=HTMLArea.is_ie?"javascript:false;":"about:blank";

htmlarea.appendChild(iframe);

this._iframe=iframe;

this._createStatusBar();

if(!HTMLArea.is_ie){iframe.style.borderWidth="0";

}var height=this.config.height,width=this.config.width;

if(height=="auto")height=this._ta_size.h;

if(height==parseInt(height,10)){if(this.config.sizeIncludesToolbar){height-=this._toolbar.offsetHeight;

height-=this._statusBar.offsetHeight;

}if(height<0)height=0;

height+="px";

}if(width=="auto")width=this._ta_size.w;

if(width==parseInt(width,10))width+="px";

iframe.style.width=width;

iframe.style.height=height;

textarea.style.width=width;

textarea.style.height=height;

function initIframe(){var doc=editor._iframe.contentWindow.document;

if(!doc){if(HTMLArea.is_gecko){setTimeout(initIframe,100);

return false;

}else{alert("ERROR: IFRAME can't be initialized.");

}}if(HTMLArea.is_midas){doc.designMode="on";

}editor._doc=doc;

if(!editor.config.fullPage){
doc.open();

var html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '+'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'+"<html>\n";

html+="<head>\n";

if(editor.config.baseURL)html+='<base href="'+editor.config.baseURL+'" />';

html+="<link rel='stylesheet' href='"+_editor_url+"iframe.css' />";

html+="<style type='text/css'>"+editor.config.pageStyle+" html,body { border: 0px; }</style>\n";

html+="</head>\n";

html+="<body class='msh_htmlarea'>\n";

html+=editor._textArea.value;

html+="</body>\n";

html+="</html>";

doc.write(html);
doc.close();


}else{var html=editor._textArea.value;

if(html.match(HTMLArea.RE_doctype)){editor.setDoctype(RegExp.$1);

html=html.replace(HTMLArea.RE_doctype,"");

}doc.open();

doc.write(html);

doc.close();

}if(HTMLArea.is_ie){doc.body.contentEditable=true;

}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;

if(typeof plugin.onGenerate=="function")plugin.onGenerate();

if(typeof plugin.onGenerateOnce=="function"){plugin.onGenerateOnce();

plugin.onGenerateOnce=null;

}}var timer=setInterval(function(){if(editor._doc.body){if(/\S/.test(editor._textArea.value)){editor.convertSemanticTags(true);

editor._wordClean();

}else editor.execCommand("formatblock",false,"p");

editor.updateToolbar();

window.focus();

editor.focusEditor();

clearInterval(timer);

}},100);

if(typeof editor.onGenerate=="function")editor.onGenerate();

};

setTimeout(initIframe,100);

};

HTMLArea.prototype.setMode=function(mode){if(typeof mode=="undefined"){mode=((this._editMode=="textmode")?"wysiwyg":"textmode");

}switch(mode){case "textmode":this._textArea.value=this.getHTML();

this._iframe.style.display="none";

this._textArea.style.display="block";

if(this.config.statusBar){this._statusBar.innerHTML=HTMLArea.I18N.msg["TEXT_MODE"];

}break;

case "wysiwyg":if(HTMLArea.is_midas){try{this._doc.designMode="off";

}catch(e){};

}if(!this.config.fullPage)this._doc.body.innerHTML=this.getHTML();

else this.setFullHTML(this.getHTML());

this._iframe.style.display="block";

this._textArea.style.display="none";

if(HTMLArea.is_midas){try{this._doc.designMode="on";

}catch(e){};

}if(this.config.statusBar){this._statusBar.innerHTML='';

this._statusBar.appendChild(this._statusBarTree);

}this.convertSemanticTags(true);

break;

default:alert("Mode <"+mode+"> not defined!");

return false;

}this._editMode=mode;

this.focusEditor();

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._doc.body.contentEditable=true;

return true;

}};

HTMLArea.prototype.registerPlugin=function(){var plugin=arguments[0];

var args=[];

for(var i=1;

i<arguments.length;

++i)args.push(arguments[i]);

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;

}else alert("Can't register plugin "+plugin.toString()+".");

};

HTMLArea.getPluginDir=function(pluginName){return _editor_url+"plugins/"+pluginName;

};

HTMLArea.loadPlugin=function(pluginName){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;

var plugin_lang=dir+"/lang/"+_editor_lang+".js";

this.loadScript(plugin_file);

this.loadScript(plugin_lang);

};

HTMLArea.loadStyle=function(style,plugin){var url=_editor_url||'';

if(typeof plugin!="undefined"){url+="plugins/"+plugin+"/";

}url+=style;

if(/^\x2f/.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:"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.collapsed=function(){var sel=this._getSelection(),range=this._createRange(sel);

if(HTMLArea.is_ie)return range.compareEndPoints("StartToEnd",range)==0;

else return range.collapsed;

};

HTMLArea.prototype.flatRange=function(){var df,sel=this._getSelection(),range=this._createRange(sel),tmp;

if(HTMLArea.is_ie){if(sel.type=="Control")return false;

try{tmp=document.createElement("div");

tmp.innerHTML=range.htmlText;

}catch(e){return false;

}if(tmp.childNodes.length>1)return false;

}else try{df=range.cloneContents();

if(range.startContainer.nodeType==1&&range.endContainer.nodeType==1)df=df.firstChild;

if(df){if(/^img$/i.test(df.tagName)&&!df.nextSibling)return false;

while(df.firstChild)if(df.removeChild(df.firstChild).nodeType==1)return false;

}}catch(e){};

return true;

};

HTMLArea.prototype._wordClean=function(want_stats){var body=this._doc.body;

var stats={empty_tags:0,mso_class:0,mso_style:0,mso_xmlel:0,orig_len: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="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: "+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*/),line;

for(var i=declarations.length;

--i>=0;

){line=declarations[i];

if(/^mso|^tab-stops|^layout-grid/i.test(line)||/^margin\s*:\s*[0-9]+..\s+[0-9]+..\s+[0-9]+../i.test(line)){++stats.mso_style;

declarations.splice(i,1);

}else{declarations[i]=line.replace(/windowtext/,'#000');

}}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.childNodes.length==0){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(body);

this.updateToolbar();

};

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{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.resetStatusBar=function(txt){if(this.config.statusBar){var b=this._statusBarTree;

while(b.firstChild)b.removeChild(b.lastChild);

if(!txt)txt='-';

b.appendChild(document.createTextNode(txt));

}};

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.resetStatusBar(HTMLArea.I18N.msg["Path"]+": ");

for(var i=ancestors.length;

--i>=0;

){var el=ancestors[i];

if(!el){continue;

}var a=document.createElement("a");

a.href="#";

a.el=el;

a.editor=this;

a.onclick=function(){this.blur();

this.editor.selectNodeContents(this.el);

this.editor.updateToolbar(true);

return false;

};

a.ondblclick=function(){this.blur();

this.editor.selectNodeContents(this.el,null,true);

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;

}var tmp=el.className.replace(/\s*_msh_[^\s]+\s*/,' ');

if(/\S/.test(tmp))txt+="."+tmp;

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":case "formatblock":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 "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;

case "toggletableborders":btn.state("active",this.css_tableBorders&&!this.css_tableBorders.disabled);

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);

}for(var i in this.plugins){var plugin=this.plugins[i].instance;

if(typeof plugin.onUpdateToolbar=="function")plugin.onUpdateToolbar();

}if(!HTMLArea.is_ie)this.forceRedraw();

};

HTMLArea.prototype.insertNodeAtSelection=function(toBeInserted){if(!HTMLArea.is_ie){var sel=this._getSelection();

var range=this._createRange(sel);

sel.removeAllRanges();

range.deleteContents();

range.insertNode(toBeInserted);

range.selectNodeContents(toBeInserted);

this.updateToolbar();

}else{return null;

}};

HTMLArea.prototype.getParentElement=function(){var 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();

if(p&&p.nodeType==1){if(HTMLArea.is_gecko)this.convertSemanticTags(true,p);

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.getAncestorsHash=function(){var p=this.getAllAncestors(),el,i,tn,pnodes={};

try{for(i=0;

i<p.length;

++i){el=p[i];

tn=el.tagName.toLowerCase();

if(!pnodes[tn])pnodes[tn]=el;

}}catch(e){};

return pnodes;

};

HTMLArea.prototype.selectNodeContents=function(node,pos,inclusive){this.focusEditor();

this.forceRedraw();

var range;

var collapsed=(typeof pos=="boolean");

if(HTMLArea.is_ie){range=this._doc.body.createTextRange();

range.moveToElementText(node);

(collapsed)&&range.collapse(pos);

range.select();

}else{var sel=this._getSelection();

range=this._doc.createRange();

if(inclusive)range.selectNode(node);

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._makeLink=function(url){var sel,range;

this._doc.execCommand("createlink",false,url);

sel=this._getSelection();

range=this._createRange(sel);

if(HTMLArea.is_ie){if(sel.type=="Text"){range.moveEnd("character",-1);

link=range.parentElement();

}else link=range.item(0).parentNode;

}else{link=range.startContainer;

if(!/^a$/i.test(link.tagName)){link=link.nextSibling;

if(!link)link=range.startContainer.parentNode;

}}return link;

};

HTMLArea.prototype.createAnchor=function(name){var a=this._makeLink("#");

if(a&&a.tagName.toLowerCase()=="a"){a.removeAttribute("href");

a.setAttribute("name",name);

a.setAttribute("id",name);

a.className="htmlarea-anchor";

}};

HTMLArea.prototype._createLink=function(link){var editor=this;

var outparam=null;

if(typeof link=="undefined")link=this.getAncestorsHash().a;

if(!link){var sel=editor._getSelection();

var range=editor._createRange(sel);

var compare=0;

if(HTMLArea.is_ie){if(sel.type=="Text")compare=range.compareEndPoints("StartToEnd",range);

else if(sel.type=="Control")compare=(range.length==1);

}else{compare=range.compareBoundaryPoints(range.START_TO_END,range);

}if(compare==0){alert(HTMLArea.I18N.msg["Link-Text"]);

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("link.html",function(param){if(!param)return false;

var a=link;

if(!a)a=editor._makeLink(param.f_href);

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("insert_image.html",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("insert_table.html",function(param){if(!param){return false;

}var doc=editor._doc;

var table=doc.createElement("table");

table.style.borderCollapse="collapse";

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.style.border=parseInt(value)+"px solid #000";

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");

td.style.border=table.style.border;

if(cellwidth)td.style.width=cellwidth+"%";

tr.appendChild(td);

(HTMLArea.is_midas)&&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,tmp;

switch(txt){case "fontname":case "fontsize":case "formatblock":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.toggleTableBorders=function(){var doc=this._doc,head=doc.getElementsByTagName("head")[0],css=this.css_tableBorders;

if(!css){this.css_tableBorders=css=doc.createElement("link");

css.type="text/css";

css.media="all";

css.rel="stylesheet";

css.href=_editor_url+'table-borders.css';

head.appendChild(css);

}else css.disabled=!css.disabled;

};

HTMLArea.prototype.execCommand=function(cmdID,UI,param){var editor=this;

this.focusEditor();

cmdID=cmdID.toLowerCase();

var styleCmd=/^(justify.*|lefttoright|righttoleft|.*color)$/.test(cmdID);

if(HTMLArea.is_gecko)try{this._doc.execCommand('useCSS',false,!styleCmd);

}catch(e){};

switch(cmdID){case "toggletableborders":this.toggleTableBorders();

break;

case "htmlmode":this.setMode();
break;
case "hilitecolor":(HTMLArea.is_ie)&&(cmdID="backcolor");
case "forecolor":this._popupDialog("select_color.html",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;
if(HTMLArea.is_ie){{window.open(this.popupURL("fullscreen.html"),"ha_fullscreen","toolbar=no,location=no,directories=no,status=no,menubar=no,"+"scrollbars=no,resizable=yes,width=640,height=480");
}}else{window.open(this.popupURL("fullscreen.html"),"ha_fullscreen","toolbar=no,menubar=no,personalbar=no,width=640,height=480,"+"scrollbars=no,resizable=yes");
}break;
case "undo":case "redo":try{if(this._customUndo)this[cmdID]();
else this._doc.execCommand(cmdID,UI,param);
}catch(e){};
break;
case "inserttable":this._insertTable();
break;
case "insertimage":this._insertImage();
break;
case "about":this._popupDialog("about.html",null,this);
break;
case "showhelp":window.open(_editor_url+"reference.html","ha_help");
break;
case "killword":this._wordClean(true);
break;
case "formatblock":if(HTMLArea.is_ie)param="<"+param+">";
this._doc.execCommand(cmdID,UI,param);
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){if(typeof HTMLArea.I18N.msg["Moz-Clipboard"]=="undefined"){HTMLArea.I18N.msg["Moz-Clipboard"]="Unprivileged scripts cannot access Cut/Copy/Paste programatically "+"for security reasons.  Click OK to see a technical note at mozilla.org "+"which shows you how to allow a script to access the clipboard.\n\n"+"[FIXME: please translate this message in your language definition file.]";
}if(confirm(HTMLArea.I18N.msg["Moz-Clipboard"]))window.open("http://mozilla.org/editor/midasdemo/securityprefs.html");
}}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(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="p";
break;
case '0':cmd="killword";
break;
case '1':case '2':case '3':case '4':case '5':case '6':cmd="formatblock";
value="h"+key;
break;
}if(cmd){this.execCommand(cmd,false,value);
HTMLArea._stopEvent(ev);
}}else if(keyEvent){switch(ev.keyCode){case 13:if(HTMLArea.is_gecko&&!ev.shiftKey)if(this.dom_checkInsertP(true))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;
case 9:if(HTMLArea.is_ie){if(editor.ie_tabPressed(ev.shiftKey))HTMLArea._stopEvent(ev);
}else{if(editor.moz_tabPressed(ev.shiftKey))HTMLArea._stopEvent(ev);
}break;
}}if(editor._timerToolbar){clearTimeout(editor._timerToolbar);
}editor._timerToolbar=setTimeout(function(){editor.updateToolbar();
editor._timerToolbar=null;
},50);
};
HTMLArea.prototype.ie_tabPressed=function(shift){var parents=this.getAncestorsHash();
if(parents.table&&parents.td){var range=this._createRange(this._getSelection());
range.moveToElementText(parents.td);
if(shift)range.moveStart("character",-1);
else range.moveEnd("character",1);
range.collapse(shift);
range.select();
parents=this.getAncestorsHash();
if(parents.table&&parents.td)this.selectNodeContents(parents.td);
}else this.execCommand(shift?"outdent":"indent",false,null);
return true;
};
HTMLArea.prototype.moz_tabPressed=function(shift){var editor=this;
setTimeout(function(){var parents=editor.getAncestorsHash();
if(parents.table&&parents.td)editor.selectNodeContents(parents.td);
},20);
return false;
};
HTMLArea.prototype.scrollToCaret=function(){var e=this.getParentElement(),w=this._iframe.contentWindow,h=w.innerHeight||w.height,d=this._doc,t=d.documentElement.scrollTop||d.body.scrollTop;
if(typeof h=="undefined")return false;
if(e.offsetTop>h+t)w.scrollTo(e.offsetLeft,e.offsetTop-h+e.offsetHeight);
};
HTMLArea.prototype.convertNode=function(el,newTagName){var newel=newTagName?this._doc.createElement(newTagName):this._doc.createDocumentFragment(),p=el.parentNode;
while(el.firstChild)newel.appendChild(el.firstChild);
p.insertBefore(newel,el);
p.removeChild(el);
p.normalize();
return newel;
};
HTMLArea.prototype.ie_checkBackspace=function(){var i,a,r2,sel=this._getSelection(),range=this._createRange(sel);
if(/^(text|none)$/i.test(sel.type)){r2=range.duplicate();
r2.moveStart("character",-1);
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;
}}else for(var i=range.length;
--i>=0;
a=range.item(i),a.parentNode.removeChild(a));
return false;
};
HTMLArea.prototype.dom_checkBackspace=function(){var self=this;
if(HTMLArea._backspaceTimeout)clearTimeout(HTMLArea._backspaceTimeout);
HTMLArea._backspaceTimeout=setTimeout(function(){try{var sel=self._getSelection();
var r=self._createRange(sel);
var SC=r.startContainer;
var SO=r.startOffset;
var EC=r.endContainer;
var EO=r.endOffset;
var newr=SC.nextSibling;
if(SC.nodeType==3)SC=SC.parentNode;
if(SC.nodeType==1&&!/\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);
r=r.cloneRange();
r.setStartBefore(newr);
r.setEndAfter(newr);
r.extractContents();
sel.removeAllRanges();
sel.addRange(r);
}else if(SC.nodeType==1&&/^br$/i.test(SC.childNodes[SO-1].tagName)){newr=SC.childNodes[SO-1];
if(!newr.nextSibling){r=r.cloneRange();
r.setStartBefore(newr);
r.collapse(true);
sel.removeAllRanges();
sel.addRange(r);
}}}catch(e){}HTMLArea._backspaceTimeout=0;
},10);
};
HTMLArea._formatTags={b:"bold",strong:"bold",i:"italic",em:"italic",strike:"strikethrough",u:"underline"};
HTMLArea._otherSaveCMDS=["justifyleft","justifycenter","justifyright","justifyfull","fontname","fontsize"];
HTMLArea.prototype.dom_checkInsertP=function(step2){var i,df,tmp,p=this.getAllAncestors(),block=null,pnodes={},stts=[],doc=this._doc,self=this;
for(i=0;
i<p.length;
++i){df=p[i];
tmp=df.tagName.toLowerCase();
if(!block&&HTMLArea.isBlockElement(df)&&!/^(body|html)$/.test(tmp))block=df;
if(!pnodes[tmp])pnodes[tmp]=df;
}if(step2){for(i=p.length;
--i>=0;
){SC=HTMLArea._formatTags[p[i].tagName.toLowerCase()];
if(SC)stts.push(SC);
}for(i=HTMLArea._otherSaveCMDS.length;
--i>=0;
){try{df=HTMLArea._otherSaveCMDS[i];
if(/justify/.test(df)&&!block.align&&!block.style.textAlign||/font/.test(df)&&!pnodes.font)continue;
tmp=/justify/.test(df)?doc.queryCommandState(df):doc.queryCommandValue(df);
if(tmp)stts.push({cmd:df,value:tmp});
}catch(e){};
}}function make_p_later(){setTimeout(function(){self.execCommand("formatblock",false,"p");
var i,tmp;
for(i=stts.length;
--i>=0;
){tmp=stts[i];
if(typeof tmp=="string")self.execCommand(tmp);
else self.execCommand(tmp.cmd,false,tmp.value);
}self.forceRedraw();
},10);
};
var btn=block&&block.tagName.toLowerCase();
if(!block||(btn=="blockquote")){this.execCommand("formatblock",false,"p");
}else if(/^(pre|tr|td|table|tbody|thead|th|caption|div|li)$/.test(btn)){if(btn=="li"&&!/\S/.test(HTMLArea.getInnerText(block)))make_p_later();
return false;
}if(step2){if(block&&(/^h[1-6]$/.test(btn)||(pnodes.li&&pnodes.p&&/\S/.test(HTMLArea.getInnerText(pnodes.p))))){var tmp,sel=this._getSelection(),r=this._createRange(sel),p=this._doc.createElement("p");
if(block.lastChild.nodeType==3)tmp=r.comparePoint(block.lastChild,block.lastChild.data.length)==0;
else tmp=r.compareNode(block.lastChild)==1;
if(tmp){p.appendChild(this._doc.createElement("br"));
sel.removeAllRanges();
r.setEndAfter(block);
r.collapse(false);
r.insertNode(p);
r.selectNodeContents(p);
r.collapse(true);
sel.addRange(r);
this.scrollToCaret();
return true;
}else return false;
}else{make_p_later();
return false;
}}return true;
};
HTMLArea.prototype.getHTML=function(){switch(this._editMode){case "wysiwyg":this._wordClean();
if(!this.config.fullPage){return HTMLArea.getHTML(this._doc.body,false,this);
}else return this.doctype+"\n"+HTMLArea.getHTML(this._doc.documentElement,true,this);
case "textmode":return this._textArea.value;
default:alert("Mode <"+mode+"> not defined!");
}return false;
};
HTMLArea.prototype.getInnerHTML=function(){switch(this._editMode){case "wysiwyg":if(!this.config.fullPage)return this._doc.body.innerHTML;
else return this.doctype+"\n"+this._doc.documentElement.innerHTML;
case "textmode":return this._textArea.value;
default:alert("Mode <"+mode+"> not defined!");
}return false;
};
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;
this.convertSemanticTags(true);
this._wordClean();
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_midas||HTMLArea.is_ie;
};
HTMLArea.prototype._getSelection=function(){if(HTMLArea.is_ie){return this._doc.selection;
}else{return this._iframe.contentWindow.getSelection();
}};
HTMLArea.normalizeRange=function(r){try{var tmp=null,SC=r.startContainer,SO=r.startOffset,EC=r.endContainer,EO=r.endOffset;
if(SC.nodeType==3&&EC.nodeType==3)return;
if(SC.nodeType==1){while(!tmp&&SO>=0){tmp=SC.childNodes[SO--];
}while(tmp&&tmp.nodeType!=3)tmp=tmp.firstChild;
if(tmp)r.setStart(tmp,tmp.data.length);
}tmp=null;
if(EC.nodeType==1){while(!tmp&&EO>=0){tmp=EC.childNodes[EO--];
}while(tmp&&tmp.nodeType!=3)tmp=tmp.lastChild;
if(tmp)r.setEnd(tmp,tmp.data.length);
}}catch(e){};
};
HTMLArea.prototype._createRange=function(sel){if(HTMLArea.is_ie){if(sel)return sel.createRange();
else return this._doc.body.createTextRange();
}else{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._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 blockquote "+"p h1 h2 h3 h4 h5 h6 quote pre table thead "+"tbody tfoot tr td iframe address ";
HTMLArea.isBlockElement=function(el){return el&&el.nodeType==1&&(HTMLArea._blockTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
};
HTMLArea._quickTags=" br hr input link meta img ";
HTMLArea.needsClosingTag=function(el){return el&&el.nodeType==1&&HTMLArea._quickTags.indexOf(" "+el.tagName.toLowerCase()+" ")==-1;
};
HTMLArea.htmlEncode=function(str){return str.replace(/&/ig,"&amp;").replace(/</ig,"&lt;").replace(/>/ig,"&gt;").replace(/\x22/ig,"&quot;").replace(/\u00A0/g,"&#xa0;");};
HTMLArea.getHTML=function(root,outputRoot,editor){try{return HTMLArea.getHTMLWrapper(root,outputRoot,editor);
}catch(e){alert(e);
return editor._iframe.contentWindow.document.body.innerHTML;
}};
HTMLArea.getHTML_fixCSS=function(css){return css;
};
HTMLArea.getHTMLWrapper=function(root,outputRoot,editor){var html=[];
switch(root.nodeType){case 1:case 11:var closed;
var i;
var root_tag=(root.nodeType==1)?root.tagName.toLowerCase():'';
if(root_tag=='br'&&!root.nextSibling&&root.previousSibling)break;
if(outputRoot)outputRoot=!(editor.config.htmlRemoveTags&&editor.config.htmlRemoveTags.test(root_tag));
if(HTMLArea.is_ie&&root_tag=="head"){if(outputRoot)html.push("<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.push(txt);
if(outputRoot)html.push("</head>");
break;
}else if(outputRoot){root_tag=HTMLArea.convertTag(root_tag);
closed=(!(root.hasChildNodes()||HTMLArea.needsClosingTag(root)));
html.push("<"+root_tag);
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=HTMLArea.getHTML_fixCSS(root.style.cssText);
}if(/(_moz|^$)/.test(value)){continue;
}html.push(" "+name+'="'+value+'"');
}if(html.length>0){html.push(closed?" />":">");
}}for(i=root.firstChild;
i;
i=i.nextSibling){html.push(HTMLArea.getHTMLWrapper(i,true,editor));
}if(outputRoot&&!closed){html.push("</"+root_tag+">");
}break;
case 3:if(/^(script|style)$/i.test(root.parentNode.tagName)){if(root.data.indexOf("/*<![CDATA[*/")!=0)html=["/*<![CDATA[*/"+root.data+"/*]]>*/"];
else html=[root.data];
}else html=[HTMLArea.htmlEncode(root.data)];
break;
case 4:alert("CDATA section encountered");
html=["<![CDATA["+root.data.replace(/--/g,'—')+"]]>"];
break;
case 8:html=["<!--"+root.data+"-->"];
break;
}return html.join("");
};
HTMLArea.prototype.convertSemanticTags=function(use_b,root){var src1=new RegExp("^"+(use_b?"strong":"b")+"$","i"),dst1=use_b?"b":"strong",src2=new RegExp("^"+(use_b?"em":"i")+"$","i"),dst2=use_b?"i":"em",ed=this;
function rec(root){if(root){if(src1.test(root.tagName))root=ed.convertNode(root,dst1);
else if(src2.test(root.tagName))root=ed.convertNode(root,dst2);
for(var i=root.firstChild;
i;
i=i.nextSibling)if(i.nodeType==1)i=rec(i);
}else root=null;
return root;
};
rec(root||this._doc.body);
};
HTMLArea.convertTag=function(tag){switch(tag){case "b":return "strong";
case "i":return "em";
}return tag;
};
HTMLArea.getPrevNode=function(node){if(!node)return null;
if(node.previousSibling)return node.previousSibling;
if(node.parentNode)return node.parentNode;
return null;
};
HTMLArea.getNextNode=function(node){if(!node)return null;
if(node.nextSibling)return node.nextSibling;
if(node.parentNode)return node.parentNode;
return null;
};
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.do_false=function(){return false;
};
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;
}if(HTMLArea._colors&&typeof v=="string"){return HTMLArea._colors[v.toLowerCase()];
}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 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._openedWindows=[];
HTMLArea.tryWindowOpen=function(arg1,arg2,arg3){try{var win=window.open(arg1,arg2,arg3);
if(win){setTimeout(function(){HTMLArea._addEvent(win,"unload",function(){var a=HTMLArea._openedWindows,i;
for(i=a.length;
--i>=0;
){if(a[i]===win)a.splice(i,1);
}});
},100);
HTMLArea._openedWindows.push(win);
return win;
}throw "blocked";
}catch(e){alert("Your browser blocked our popup!\n\n"+"We need you to allow popups dialog for this page\n"+"in order for the editor to work.  We will not open\n"+"unrequested popups.\n\n"+"To allow popups from this page please click\n"+"the bar that just popped under the toolbar.");
return null;
}};
HTMLArea._addEvent(window,"unload",function(){var a=HTMLArea._openedWindows,i;
for(i=a.length;
--i>=0;
){a[i].close();
a.splice(i,1);
}});
HTMLArea.centeredWindowOpen=function(url,size,name){if(!name)name="_blank";
if(!size)size={w:500,h:350};
var args;
if(HTMLArea.is_ie)args="toolbar=no,location=no,directories=no,status=no,menubar=no,";
else args="toolbar=no,menubar=no,personalbar=no,status=no,";
args+="scrollbars=no,resizable=yes,width="+size.w+",height="+size.h;
var left=0,top=0;
if(screen.width)left=(screen.width-size.w)/2;
if(screen.height)top=(screen.height-size.h)/2;
if(left)args+=",left="+left;
if(top)args+=",top="+top;
return HTMLArea.tryWindowOpen(url,name,args);
};
;
if (window.onbeforeunload) window.onbeforeunload=HTMLArea.onBeforeUnload;

