var MooEditable=new Class({Implements:[Events,Options],options:{toolbar:!0,cleanup:!0,paragraphise:!0,xhtml:!0,semantics:!0,actions:"bold italic underline strikethrough | insertunorderedlist insertorderedlist indent outdent | undo redo | createlink unlink | urlimage | toggleview",handleSubmit:!0,handleLabel:!0,baseCSS:"html{ height: 100%; cursor: text }\t\t\tbody{ font-family: sans-serif; border: 0; }",extraCSS:"",externalCSS:"",html:'<html>\t\t\t<head>\t\t\t<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\t\t\t{EXTERNALCSS}\t\t\t<style>{BASECSS} {EXTRACSS}</style></head>\t\t\t<body>{CONTENT}</body>\t\t\t</html>'},
initialize:function(a,b){this.setOptions(b);this.textarea=$(a);this.textarea.store("MooEditable",this);this.actions=this.options.actions.clean().split(" ");this.keys={};this.dialogs={};this.actions.each(function(a){var b=MooEditable.Actions[a];if(b){if(b.options){var e=b.options.shortcut;e&&(this.keys[e]=a)}b.dialogs&&$each(b.dialogs,function(b,d){b=b.attempt(this);b.name=a+":"+d;$type(this.dialogs[a])!="object"&&(this.dialogs[a]={});this.dialogs[a][d]=b},this);b.events&&$each(b.events,function(a,
b){this.addEvent(b,a)},this)}}.bind(this));this.render()},toElement:function(){return this.textarea},render:function(){var a=this,b=this.textarea.getSize();this.container=new Element("div",{id:this.textarea.id?this.textarea.id+"-mooeditable-container":null,"class":"mooeditable-container",styles:{width:b.x}});this.textarea.addClass("mooeditable-textarea").setStyle("height",b.y);this.iframe=new IFrame({"class":"mooeditable-iframe",styles:{height:b.y}});this.toolbar=new MooEditable.UI.Toolbar({onItemAction:function(){var b=
$splat(arguments);a.action(b[0].name,b)}});this.attach();this.options.handleLabel&&this.textarea.id&&$$('label[for="'+this.textarea.id+'"]').addEvent("click",function(b){a.mode=="iframe"&&(b.preventDefault(),a.focus())});if(this.options.handleSubmit){this.form=this.textarea.getParent("form");if(!this.form)return;this.form.addEvent("submit",function(){a.mode=="iframe"&&a.saveContent()})}this.fireEvent("render",this)},attach:function(){var a=this;this.mode="iframe";this.editorDisabled=!1;this.container.wraps(this.textarea);
this.textarea.setStyle("display","none");this.iframe.setStyle("display","").inject(this.textarea,"before");$each(this.dialogs,function(b,c){$each(b,function(b){$(b).inject(a.iframe,"before");var d;b.addEvents({open:function(){d=a.selection.getRange();a.editorDisabled=!0;a.toolbar.disable(c);a.fireEvent("dialogOpen",this)},close:function(){a.toolbar.enable();a.editorDisabled=!1;a.focus();d&&a.selection.setRange(d);a.fireEvent("dialogClose",this)}})})});this.win=this.iframe.contentWindow;this.doc=this.win.document;
var b=this.options.html.substitute({BASECSS:this.options.baseCSS,EXTRACSS:this.options.extraCSS,EXTERNALCSS:this.options.externalCSS?'<link rel="stylesheet" href="'+this.options.externalCSS+'">':"",CONTENT:this.cleanup(this.textarea.get("value"))});this.doc.open();this.doc.write(b);this.doc.close();Browser.Engine.trident?this.doc.body.contentEditable=!0:this.doc.designMode="On";this.win.$family||new Window(this.win);this.doc.$family||new Document(this.doc);$(this.doc.body);this.doc.addEvents({mouseup:this.editorMouseUp.bind(this),
mousedown:this.editorMouseDown.bind(this),contextmenu:this.editorContextMenu.bind(this),click:this.editorClick.bind(this),dbllick:this.editorDoubleClick.bind(this),keypress:this.editorKeyPress.bind(this),keyup:this.editorKeyUp.bind(this),keydown:this.editorKeyDown.bind(this)});this.textarea.addEvent("keypress",this.textarea.retrieve("mooeditable:textareaKeyListener",this.keyListener.bind(this)));Browser.Engine.gecko&&Browser.Engine.version==18&&this.doc.addEvent("focus",function(){a.win.fireEvent("focus").focus()});
if(!/trident|presto/i.test(Browser.Engine.name)){var c=function(){a.execute("styleWithCSS",!1,!1);a.doc.removeEvent("focus",c)};this.win.addEvent("focus",c)}this.options.toolbar&&($(this.toolbar).inject(this.container,"top"),this.toolbar.render(this.actions));this.selection=new MooEditable.Selection(this.win);this.fireEvent("attach",this);return this},detach:function(){this.saveContent();this.textarea.setStyle("display","").removeClass("mooeditable-textarea").inject(this.container,"before");this.textarea.removeEvent("keypress",
this.textarea.retrieve("mooeditable:textareaKeyListener"));this.container.dispose();this.fireEvent("detach",this);return this},editorMouseUp:function(a){this.editorDisabled?a.stop():(this.options.toolbar&&this.checkStates(),this.fireEvent("editorMouseUp",a))},editorMouseDown:function(a){this.editorDisabled?a.stop():this.fireEvent("editorMouseDown",a)},editorContextMenu:function(a){this.editorDisabled?a.stop():this.fireEvent("editorContextMenu",a)},editorClick:function(a){if(Browser.Engine.webkit){var b=
a.target;b.get("tag")=="img"&&this.selection.selectNode(b)}this.fireEvent("editorClick",a)},editorDoubleClick:function(a){this.fireEvent("editorDoubleClick",a)},editorKeyPress:function(a){this.editorDisabled?a.stop():(this.keyListener(a),this.fireEvent("editorKeyPress",a))},editorKeyUp:function(a){this.editorDisabled?a.stop():(this.options.toolbar&&this.checkStates(),this.fireEvent("editorKeyUp",a))},editorKeyDown:function(a){if(this.editorDisabled)a.stop();else{if(a.key=="enter")if(this.options.paragraphise&&
!a.shift){if(Browser.Engine.gecko||Browser.Engine.webkit){var b=this.selection.getNode(),c=/^(H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD)$/;b.getParents().include(b).some(function(a){return a.nodeName.test(c)})||this.execute("insertparagraph")}}else if(Browser.Engine.trident){var d=this.selection.getRange();b=this.selection.getNode();b.get("tag")!="li"&&d&&(this.selection.insertContent("<br>"),this.selection.collapse(!1));a.preventDefault()}this.fireEvent("editorKeyDown",
a)}},keyListener:function(a){a.control&&this.keys[a.key]&&(a.preventDefault(),this.toolbar.getItem(this.keys[a.key]).action(a))},focus:function(){(function(){(this.mode=="iframe"?this.win:this.textarea).focus();this.fireEvent("focus",this)}).bind(this).delay(10);return this},action:function(a,b){var c=MooEditable.Actions[a];c.command&&$type(c.command)=="function"?c.command.run(b,this):(this.focus(),this.execute(a,!1,b),this.mode=="iframe"&&this.checkStates())},execute:function(a,b,c){if(!this.busy)return this.busy=
!0,this.doc.execCommand(a,b,c),this.saveContent(),this.busy=!1},toggleView:function(){this.fireEvent("beforeToggleView",this);this.mode=="textarea"?(this.mode="iframe",this.iframe.setStyle("display",""),this.setContent(this.textarea.value),this.textarea.setStyle("display","none")):(this.saveContent(),this.mode="textarea",this.textarea.setStyle("display",""),this.iframe.setStyle("display","none"));this.fireEvent("toggleView",this);this.focus();return this},getContent:function(){return this.cleanup(this.doc.body.get("html"))},
setContent:function(a){this.doc.body.set("html",a);return this},saveContent:function(){this.mode=="iframe"&&this.textarea.set("value",this.getContent());return this},checkStates:function(){this.actions.each(function(a){var b=this.toolbar.getItem(a);if(b&&(b.deactivate(),a=MooEditable.Actions[a].states)){var c=this.selection.getNode();if(c)if($type(a)=="function")a.attempt(c,b);else{if(a.tags){do{if($type(c)!="element")break;var d=c.tagName.toLowerCase();if(a.tags.contains(d)){b.activate(d);break}}while(c=
c.parentNode)}if(a.css){d=/^(H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD)$/;do{if($type(c)!="element")break;var e=!1,f;for(f in a.css){var g=a.css[f];$(c).getStyle(f).contains(g)&&(b.activate(g),e=!0)}if(e||c.tagName.test(d))break}while(c=c.parentNode)}}}}.bind(this))},cleanup:function(a){if(!this.options.cleanup)return a.trim();do{var b=a;a=a.replace(/<br class\="webkit-block-placeholder">/gi,"<br />");a=a.replace(/<span class="Apple-style-span">(.*)<\/span>/gi,
"$1");a=a.replace(/ class="Apple-style-span"/gi,"");a=a.replace(/<span style="">/gi,"");a=a.replace(/<p>\s*<br ?\/?>\s*<\/p>/gi,"<p>\u00a0</p>");a=a.replace(/<p>(&nbsp;|\s)*<\/p>/gi,"<p>\u00a0</p>");this.options.semantics||(a=a.replace(/\s*<br ?\/?>\s*<\/p>/gi,"</p>"));this.options.xhtml&&(a=a.replace(/<br>/gi,"<br />"));this.options.semantics&&(Browser.Engine.trident&&(a=a.replace(/<li>\s*<div>(.+?)<\/div><\/li>/g,"<li>$1</li>")),Browser.Engine.webkit&&(a=a.replace(/^([\w\s]+.*?)<div>/i,"<p>$1</p><div>"),
a=a.replace(/<div>(.+?)<\/div>/ig,"<p>$1</p>")),["gecko","presto","webkit"].contains(Browser.Engine.name)&&(a=a.replace(/<p>[\s\n]*(<(?:ul|ol)>.*?<\/(?:ul|ol)>)(.*?)<\/p>/ig,"$1<p>$2</p>"),a=a.replace(/<\/(ol|ul)>\s*(?!<(?:p|ol|ul|img).*?>)((?:<[^>]*>)?\w.*)$/g,"</$1><p>$2</p>")),a=a.replace(/<br[^>]*><\/p>/g,"</p>"),a=a.replace(/<p>\s*(<img[^>]+>)\s*<\/p>/ig,"$1\n"),a=a.replace(/<p([^>]*)>(.*?)<\/p>(?!\n)/g,"<p$1>$2</p>\n"),a=a.replace(/<\/(ul|ol|p)>(?!\n)/g,"</$1>\n"),a=a.replace(/><li>/g,">\n\t<li>"),
a=a.replace(/([^\n])<\/(ol|ul)>/g,"$1\n</$2>"),a=a.replace(/([^\n])<img/ig,"$1\n<img"),a=a.replace(/^\s*$/g,""));a=a.replace(/<br ?\/?>$/gi,"");a=a.replace(/^<br ?\/?>/gi,"");a=a.replace(/><br ?\/?>/gi,">");a=a.replace(/<br ?\/?>\s*<\/(h1|h2|h3|h4|h5|h6|li|p)/gi,"</$1");a=a.replace(/<span style="font-weight: bold;">(.*)<\/span>/gi,"<strong>$1</strong>");a=a.replace(/<span style="font-style: italic;">(.*)<\/span>/gi,"<em>$1</em>");a=a.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi,"<strong>$1</strong>");a=
a.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi,"<em>$1</em>");a=a.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi,'<span style="text-decoration: underline;">$1</span>');a=a.replace(/<[^> ]*/g,function(a){return a.toLowerCase()});a=a.replace(/<[^>]*>/g,function(a){return a=a.replace(/ [^=]+=/g,function(a){return a.toLowerCase()})});a=a.replace(/<[^>]*>/g,function(a){return a=a.replace(/( [^=]+=)([^"][^ >]*)/g,'$1"$2"')});a=a.replace(/<p>(?:\s*)<p>/g,"<p>");a=a.replace(/<\/p>\s*<\/p>/g,"</p>");a=a.replace(/<p>\W*<\/p>/g,
"");a=a.trim()}while(a!=b);return a}});
MooEditable.Selection=new Class({initialize:function(a){this.win=a},getSelection:function(){this.win.focus();return this.win.getSelection?this.win.getSelection():this.win.document.selection},getRange:function(){var a=this.getSelection();if(!a)return null;try{return a.rangeCount>0?a.getRangeAt(0):a.createRange?a.createRange():null}catch(b){return this.doc.body.createTextRange()}},setRange:function(a){if(a.select)$try(function(){a.select()});else{var b=this.getSelection();b.addRange&&(b.removeAllRanges(),
b.addRange(a))}},selectNode:function(a,b){var c=this.getRange(),d=this.getSelection();c.moveToElementText?$try(function(){c.moveToElementText(a);c.select()}):d.addRange?(b?c.selectNodeContents(a):c.selectNode(a),d.removeAllRanges(),d.addRange(c)):d.setBaseAndExtent(a,0,a,1);return a},isCollapsed:function(){var a=this.getRange();if(a.item)return!1;return a.boundingWidth==0||this.getSelection().isCollapsed},collapse:function(a){var b=this.getRange(),c=this.getSelection();b.select?(b.collapse(a),b.select()):
a?c.collapseToStart():c.collapseToEnd()},getContent:function(){var a=this.getRange(),b=new Element("body");if(this.isCollapsed())return"";a.cloneContents?b.appendChild(a.cloneContents()):$defined(a.item)||$defined(a.htmlText)?b.set("html",a.item?a.item(0).outerHTML:a.htmlText):b.set("html",a.toString());return b.get("html")},getText:function(){var a=this.getRange(),b=this.getSelection();return this.isCollapsed()?"":a.text||b.toString()},getNode:function(){var a=this.getRange();if(!Browser.Engine.trident){var b=
null;if(a){b=a.commonAncestorContainer;for(a.collapsed||a.startContainer==a.endContainer&&a.startOffset-a.endOffset<2&&a.startContainer.hasChildNodes()&&(b=a.startContainer.childNodes[a.startOffset]);$type(b)!="element";)b=b.parentNode}return $(b)}return $(a.item?a.item(0):a.parentElement())},insertContent:function(a){var b=this.getRange();b.insertNode?(b.deleteContents(),b.insertNode(b.createContextualFragment(a))):b.pasteHTML?b.pasteHTML(a):b.item(0).outerHTML=a}});MooEditable.UI={};
MooEditable.UI.Toolbar=new Class({Implements:[Events,Options],options:{"class":""},initialize:function(a){this.setOptions(a);this.el=new Element("div",{"class":"mooeditable-ui-toolbar "+this.options["class"]});this.items={};this.content=null},toElement:function(){return this.el},render:function(a){this.content?this.el.adopt(this.content):this.content=a.map(function(a){return a=="|"?this.addSeparator():this.addItem(a)}.bind(this));return this},addItem:function(a){var b=MooEditable.Actions[a];if(b){var c=
b.options||{};b=new (MooEditable.UI[(b.type||"button").camelCase().capitalize()])($extend(c,{name:a,"class":a+"-item toolbar-item",title:b.title,onAction:this.itemAction.bind(this)}));this.items[a]=b;$(b).inject(this.el);return b}},getItem:function(a){return this.items[a]},addSeparator:function(){return(new Element("span",{"class":"toolbar-separator"})).inject(this.el)},itemAction:function(){this.fireEvent("itemAction",arguments)},disable:function(a){$each(this.items,function(b){b.name==a?b.activate():
b.deactivate().disable()});return this},enable:function(){$each(this.items,function(a){a.enable()});return this},show:function(){this.el.setStyle("display","");return this},hide:function(){this.el.setStyle("display","none");return this}});
MooEditable.UI.Button=new Class({Implements:[Events,Options],options:{title:"",name:"",text:"Button","class":"",shortcut:"",mode:"icon"},initialize:function(a){this.setOptions(a);this.name=this.options.name;this.render()},toElement:function(){return this.el},render:function(){var a=this.options.shortcut?" ( Ctrl+"+this.options.shortcut.toUpperCase()+" )":"",b=this.options.title||name;this.el=new Element("button",{"class":"mooeditable-ui-button "+this.options["class"],title:b+a,html:'<span class="button-icon"></span><span class="button-text">'+
b+"</span>",events:{click:this.click.bind(this),mousedown:function(a){a.preventDefault()}}});this.options.mode!="icon"&&this.el.addClass("mooeditable-ui-button-"+this.options.mode);this.disabled=this.active=!1;Browser.Engine.trident&&this.el.addEvents({mouseenter:function(){this.addClass("hover")},mouseleave:function(){this.removeClass("hover")}});return this},click:function(a){a.preventDefault();this.disabled||this.action(a)},action:function(){this.fireEvent("action",[this].concat($A(arguments)))},
enable:function(){this.active&&this.el.removeClass("onActive");if(this.disabled)return this.disabled=!1,this.el.removeClass("disabled").set({disabled:!1,opacity:1}),this},disable:function(){if(!this.disabled)return this.disabled=!0,this.el.addClass("disabled").set({disabled:!0,opacity:0.4}),this},activate:function(){if(!this.disabled)return this.active=!0,this.el.addClass("onActive"),this},deactivate:function(){this.active=!1;this.el.removeClass("onActive");return this}});
MooEditable.UI.Dialog=new Class({Implements:[Events,Options],options:{"class":"",contentClass:""},initialize:function(a,b){this.setOptions(b);this.html=a;this.el=new Element("div",{"class":"mooeditable-ui-dialog "+this.options["class"],html:'<div class="dialog-content '+this.options.contentClass+'">'+a+"</div>",styles:{display:"none"},events:{click:this.click.bind(this)}})},toElement:function(){return this.el},click:function(){this.fireEvent("click",arguments);return this},open:function(){this.el.setStyle("display",
"");this.fireEvent("open",this);return this},close:function(){this.el.setStyle("display","none");this.fireEvent("close",this);return this}});
MooEditable.UI.AlertDialog=function(a){if(a)return new MooEditable.UI.Dialog(a+' <button class="dialog-ok-button">OK</button>',{"class":"mooeditable-alert-dialog",onOpen:function(){var a=this.el.getElement(".dialog-ok-button");(function(){a.focus()}).delay(10)},onClick:function(a){a.preventDefault();a.target.tagName.toLowerCase()=="button"&&$(a.target).hasClass("dialog-ok-button")&&this.close()}})};
MooEditable.UI.PromptDialog=function(a,b,c){if(a)return new MooEditable.UI.Dialog('<label class="dialog-label">'+a+' <input type="text" class="text dialog-input" value="'+b+'"></label> <button class="dialog-button dialog-ok-button">OK</button><button class="dialog-button dialog-cancel-button">Cancel</button>',{"class":"mooeditable-prompt-dialog",onOpen:function(){var a=this.el.getElement(".dialog-input");(function(){a.focus();a.select()}).delay(10)},onClick:function(a){a.preventDefault();if(a.target.tagName.toLowerCase()==
"button"){var e=$(a.target);a=this.el.getElement(".dialog-input");e.hasClass("dialog-cancel-button")?(a.set("value",b),this.close()):e.hasClass("dialog-ok-button")&&(e=a.get("value"),a.set("value",b),this.close(),c&&c.attempt(e,this))}}})};
MooEditable.Actions=new Hash({bold:{title:"Bold",options:{shortcut:"b"},states:{tags:["b","strong"],css:{"font-weight":"bold"}}},italic:{title:"Italic",options:{shortcut:"i"},states:{tags:["i","em"],css:{"font-style":"italic"}}},underline:{title:"Underline",options:{shortcut:"u"},states:{tags:["u"],css:{"text-decoration":"underline"}}},strikethrough:{title:"Strikethrough",options:{shortcut:"s"},states:{tags:["s","strike"],css:{"text-decoration":"line-through"}}},insertunorderedlist:{title:"Unordered List",
states:{tags:["ul"]}},insertorderedlist:{title:"Ordered List",states:{tags:["ol"]}},indent:{title:"Indent",states:{tags:["blockquote"]}},outdent:{title:"Outdent"},undo:{title:"Undo",options:{shortcut:"z"}},redo:{title:"Redo",options:{shortcut:"y"}},unlink:{title:"Remove Hyperlink"},createlink:{title:"Add Hyperlink",options:{shortcut:"l"},states:{tags:["a"]},dialogs:{alert:MooEditable.UI.AlertDialog.pass("Please select the text you wish to hyperlink."),prompt:function(a){return MooEditable.UI.PromptDialog("Enter URL",
"http://",function(b){a.execute("createlink",!1,b.trim())})}},command:function(){if(this.selection.isCollapsed())this.dialogs.createlink.alert.open();else{var a=this.selection.getText(),b=this.dialogs.createlink.prompt;/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(a)&&b.el.getElement(".mooeditable-dialog-input").set("value",a);b.open()}}},urlimage:{title:"Add Image",options:{shortcut:"m"},dialogs:{prompt:function(a){return MooEditable.UI.PromptDialog("Enter image URL",
"http://",function(b){a.execute("insertimage",!1,b.trim())})}},command:function(){this.dialogs.urlimage.prompt.open()}},toggleview:{title:"Toggle View",command:function(){this.mode=="textarea"?this.toolbar.enable():this.toolbar.disable("toggleview");this.toggleView()}}});
Element.Properties.mooeditable={set:function(a){return this.eliminate("mooeditable").store("mooeditable:options",a)},get:function(a){if(a||!this.retrieve("mooeditable"))(a||!this.retrieve("mooeditable:options"))&&this.set("mooeditable",a),this.store("mooeditable",new MooEditable(this,this.retrieve("mooeditable:options")));return this.retrieve("mooeditable")}};Element.implement({mooEditable:function(a){return this.get("mooeditable",a)}});
MooEditable.UI.MenuList=new Class({Implements:[Events,Options],options:{title:"",name:"","class":"",list:[]},initialize:function(a){this.setOptions(a);this.name=this.options.name;this.render()},toElement:function(){return this.el},render:function(){var a="";this.options.list.each(function(b){a+='<option value="{value}">{text}</option>'.substitute(b)});this.el=new Element("select",{"class":this.options["class"],title:this.options.title,html:a,events:{change:this.change.bind(this)}});this.disabled=
!1;Browser.Engine.trident&&this.el.addEvents({mouseenter:function(){this.addClass("hover")},mouseleave:function(){this.removeClass("hover")}});return this},change:function(a){a.preventDefault();this.disabled||this.action(a.target.value)},action:function(){this.fireEvent("action",[this].concat($A(arguments)))},enable:function(){if(this.disabled)return this.disabled=!1,this.el.set("disabled",!1).removeClass("disabled").set({disabled:!1,opacity:1}),this},disable:function(){if(!this.disabled)return this.disabled=
!0,this.el.set("disabled",!0).addClass("disabled").set({disabled:!0,opacity:0.4}),this},activate:function(a){if(!this.disabled){var b=0;a&&this.options.list.each(function(c,d){c.value==a&&(b=d)});this.el.selectedIndex=b;return this}},deactivate:function(){this.el.selectedIndex=0;this.el.removeClass("onActive");return this}});
MooEditable.Actions.extend({formatBlock:{title:"Block Formatting",type:"menu-list",options:{list:[{text:"Paragraph",value:"p"},{text:"Heading 1",value:"h1"},{text:"Heading 2",value:"h2"},{text:"Heading 3",value:"h3"}]},states:{tags:["p","h1","h2","h3"]},command:function(a,b){this.execute("formatBlock",!1,"<"+b+">");this.focus()}},justifyleft:{title:"Align Left",states:{css:{"text-align":"left"}}},justifyright:{title:"Align Right",states:{css:{"text-align":"right"}}},justifycenter:{title:"Align Center",
states:{tags:["center"],css:{"text-align":"center"}}},justifyfull:{title:"Align Justify",states:{css:{"text-align":"justify"}}}});

