var WikiTextEditor=new Class({Implements:[Options],options:{toolbarItems:["heading","bold","italic","ul","ol","link"],className:"wikiTextEditorToolbar",helpLink:null,helpText:null,listHelper:true},textarea:null,toolbar:null,bindings:{},selection:null,initialize:function(a,c,b){this.setOptions(b);this.textarea=$(a);if(!c){this.toolbar=new Element("ul",{"class":this.options.className});this.toolbar.inject(this.textarea,"before")}else{this.toolbar=$(c)}this.buildToolbar();this.installKeyListener();if(this.options.listHelper){this.installListHelper()}},buildToolbar:function(){if(this.options.helpLink){this.toolbar.adopt(new Element("li",{"class":"toolbarHelp"}).adopt(new Element("a",{href:this.options.helpLink,text:this.options.helpText||"Help","class":"muted",target:"_BLANK"})))}this.options.toolbarItems.each(function(c){c=this.toolbarItems[c];var b=c[0].capitalize();var a="add"+b+"Item";this[a].run(c.slice(1),this)},this)},toolbarItems:{heading:["heading",2,"Make heading"],bold:["wrapper","Bold","'''","bold text","Make bold text","C-b"],italic:["wrapper","Italic","''","italic text","Make italic text","C-i"],ul:["list","List","*","Make list","C-2"],ol:["list","Numbered list","#","Make numbered list","C-3"],link:["link","C-l"],image:["image"]},addHeadingItem:function(f,c){var e=this.makeItemId("Heading"+f);var a="Heading "+f;var d="";for(var b=0;b<f;b++){d+="="}this.addFunction(a,function(){this.wrapSelection({before:d+" ",defaultMiddle:"Heading text",after:" "+d})},{id:e,title:c})},addWrapperItem:function(b,f,a,d,c){var e=this.makeItemId(b);this.addFunction(b,function(){this.wrapSelection({before:f,defaultMiddle:a,after:f});if(c){return false}},{id:e,title:d},c)},addListItem:function(c,a,f,e){var g=this.makeItemId(c);var d="Hit <enter> to insert another list item, and <enter> twice in a row to end the list. To get sub-items, repeat the bullet character once for each level of indent you want (e.g. <b><b>)";var b="<b> "+d;this.addFunction(c,function(){this.replaceMultilineSelection({eachLine:function(h){return a+" "+h},defaultText:{text:b.replace(/<b>/g,a),select:d.replace(/<b>/g,a)}});if(e){return false}},{id:g,title:f},e)},addLinkItem:function(){this.addFunction("Link",function(){var a=this.textarea.getSelectedText();if(a!=""){if(a.match(/^http:\/\//)){this.replaceSelectionWithTemplate({before:"["+a+"|",select:"Link text",after:"]"})}else{this.replaceSelectionWithTemplate({before:"[",select:"URL",after:"|"+a+"]"})}return}Modal.open(null,{type:"form",form:Form.create({id:"wikiTextEditorLinkForm",fields:{url:{label:"Link URL",type:"text",properties:{id:"wikiTextEditorURLEntry"}},linkText:{label:"Optional link text",type:"text",properties:{id:"wikiTextEditorLinkTextEntry"}}},submit:"Insert link"}),onSubmit:function(c){var b=c.linkText?("|"+c.linkText):"";this.setStoredSelection();this.insertAtCursor("["+c.url+b+"]")}.bind(this)})},{id:this.makeItemId("Link"),title:"Insert a link"})},addImageItem:function(){this.addFunction("Image",function(){globalImageDrawer.open()},{id:this.makeItemId("Image"),title:"Insert an image"})},addFunction:function(c,g,d,f){var e=new Element("li");var b=c.replace(/[^ a-zA-Z0-9-_]/g,"").replace(/\s+/,"-");var a=new Element("a",{events:{mousedown:function(h){this.selection=this.textarea.getSelectedRange()}.bind(this),click:function(h){new Event(h).stop();this.setStoredSelection();g.run(null,this)}.bind(this)},href:"#"+b.toLowerCase(),tabindex:1000});a.adopt(new Element("span",{text:c}));a.setProperties(d||{});a.inject(e,"bottom");e.inject(this.toolbar);if(f){this.addBinding(f,g)}},makeItemId:function(a){a=a.replace(/\s+/g,"-").camelCase().capitalize();return"wikiTextEditor"+a+"Item"},setStoredSelection:function(){if(this.selection){this.textarea.selectRange(this.selection.start,this.selection.end)}},insertAtCursor:function(b,a){this.textarea.insertAtCursor(b,$pick(a,false))},wrapSelection:function(a){var b=this.textarea.getSelectedText();if(b!=""){var c=a.before+b+a.after;this.textarea.insertAtCursor(c,false)}else{this.textarea.insertAroundCursor(a)}},replaceMultilineSelection:function(h){var d=this.textarea.getSelectedText();if(d!=""){var e=h.eachLine;var i=d.split("\n");var c=[];i.each(function(j){if(j!=""){c.push(e.run(j,this))}},this);this.textarea.insertAtCursor(c.join("\n"),false)}else{var a=this.textarea.getSelectionStart();var f=h.defaultText.text;this.textarea.insertAtCursor(f,false);if(h.defaultText.select){var g=h.defaultText.select;var b=f.indexOf(g);if(b!=-1){a+=b;this.textarea.selectRange(a,a+g.length)}}}},replaceSelectionWithTemplate:function(a){a=$merge({before:"",select:"",after:""},a);this.textarea.insertAtCursor(a.before,false);this.textarea.insertAroundCursor({before:"",defaultMiddle:a.select,after:a.after})},installListHelper:function(){var a=Hash.getValues(this.toolbarItems).map(function(d){return d[0]=="list"?d[2]:null}).clean().join("");var c=new RegExp("^(["+a+"]+)(.*)$");var b=new RegExp("^[\\s"+a+"]*$");this.addBinding("enter",function(){var f=this.textarea.getSelectionStart();var e=this.textarea.getSelectionEnd();var d=this.textarea.value.substring(0,f).split("\n");var g=d.pop();if(groups=g.match(c)){if((/^\s*$/).test(groups[2])){var i=d.join("\n")+"\n\n";if(i.test(b)){i=""}this.textarea.selectRange(0,e);this.textarea.insertAtCursor(i,false);this.textarea.setCaretPosition(i.length+1)}else{var h="\n"+groups[1]+" ";this.textarea.insertAtCursor(h,false);this.textarea.setCaretPosition(f+h.length+1)}return false}})},installKeyListener:function(){this.textarea.addEvent("keypress",function(d){d=new Event(d);var c=[];["shift","control","alt","meta"].each(function(e){if(d[e]){c.push(e.capitalize().substring(0,1))}});c.push(d.key);var b=c.join("-");var a=true;if(this.bindings[b]){this.bindings[b].each(function(e){if(e.run(d,this)===false){a=false}},this);if(!a){d.stop()}}}.bind(this))},addBinding:function(a,b){if(this.bindings[a]){this.bindings[a].push(b)}else{this.bindings[a]=[b]}}});
