diff --git a/bower.json b/bower.json index 4110ada..a154923 100644 --- a/bower.json +++ b/bower.json @@ -14,9 +14,11 @@ }, "dependencies": { "rangy-official": ">=1.3", - "undo": "https://github.com/jzaefferer/undo/archive/master.zip", - "testify.js": ">=1.0" + "undo": "https://github.com/jzaefferer/undo/archive/master.zip" }, + "devDependencies": { + "testify.js": ">=1.0" + }, "keywords": ["editor", "wysiwyg", "contenteditable", "content", "medium", "medium.com"], "license": "MIT", "files": ["medium.js", "medium.css"] diff --git a/medium.js b/medium.js index e5e0510..32f0943 100644 --- a/medium.js +++ b/medium.js @@ -1580,7 +1580,7 @@ Medium.defaultSettings = { cleanCanvas: function() { var target, inserted = false, - buttons = d.getElementsByClassName(this.buttonClass); + buttons = this.element.getElementsByClassName(this.buttonClass); this.icon.style.opacity = 1; diff --git a/medium.min.js b/medium.min.js index be5490c..0941ac3 100644 --- a/medium.min.js +++ b/medium.min.js @@ -1,3 +1 @@ -(function(w,d){"use strict";var rangy=w["rangy"]||null,undo=w["Undo"]||null,key=w.Key={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,pause:19,capsLock:20,escape:27,pageUp:33,pageDown:34,end:35,home:36,leftArrow:37,upArrow:38,rightArrow:39,downArrow:40,insert:45,"delete":46,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,leftWindow:91,rightWindowKey:92,select:93,numpad0:96,numpad1:97,numpad2:98,numpad3:99,numpad4:100,numpad5:101,numpad6:102,numpad7:103,numpad8:104,numpad9:105,multiply:106,add:107,subtract:109,decimalPoint:110,divide:111,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,numLock:144,scrollLock:145,semiColon:186,equalSign:187,comma:188,dash:189,period:190,forwardSlash:191,graveAccent:192,openBracket:219,backSlash:220,closeBracket:221,singleQuote:222},Medium=function(){var Medium=function(userSettings){"use strict";var medium=this,defaultSettings=utils.deepExtend({},Medium.defaultSettings),settings=this.settings=utils.deepExtend(defaultSettings,userSettings),cache=new Medium.Cache,selection=new Medium.Selection,action=new Medium.Action(this),cursor=new Medium.Cursor(this),undoable=new Medium.Undoable(this),el,newVal,i;for(i in defaultSettings)if(defaultSettings.hasOwnProperty(i)){if(typeof defaultSettings[i]!=="object"&&defaultSettings.hasOwnProperty(i)&&settings.element.getAttribute("data-medium-"+key)){newVal=settings.element.getAttribute("data-medium-"+key);if(newVal.toLowerCase()==="false"||newVal.toLowerCase()==="true"){newVal=newVal.toLowerCase()==="true"}settings[i]=newVal}}if(settings.modifiers){for(i in settings.modifiers)if(settings.modifiers.hasOwnProperty(i)){if(typeof key[i]!=="undefined"){settings.modifiers[key[i]]=settings.modifiers[i]}}}if(settings.keyContext){for(i in settings.keyContext)if(settings.keyContext.hasOwnProperty(i)){if(typeof key[i]!=="undefined"){settings.keyContext[key[i]]=settings.keyContext[i]}}}el=settings.element;el.contentEditable=true;el.className+=" "+settings.cssClasses.editor+(" "+settings.cssClasses.editor+"-"+settings.mode);settings.tags=settings.tags||{};if(settings.tags.outerLevel){settings.tags.outerLevel=settings.tags.outerLevel.concat([settings.tags.paragraph,settings.tags.horizontalRule])}this.settings=settings;this.element=el;el.medium=this;this.action=action;this.cache=cache;this.cursor=cursor;this.utils=utils;this.selection=selection;medium.clean();medium.placeholders();action.preserveElementFocus();this.dirty=false;this.undoable=undoable;this.makeUndoable=undoable.makeUndoable;if(settings.drag){medium.drag=new Medium.Drag(medium);medium.drag.setup()}action.setup();cache.initialized=true;this.makeUndoable(true)};Medium.prototype={placeholders:function(){if(!w.getComputedStyle)return;var s=this.settings,placeholder=this.placeholder||(this.placeholder=d.createElement("div")),el=this.element,style=placeholder.style,elStyle=w.getComputedStyle(el,null),qStyle=function(prop){return elStyle.getPropertyValue(prop)},text=utils.text(el),cursor=this.cursor,childCount=el.children.length,hasFocus=Medium.activeElement===el;el.placeholder=placeholder;if(!hasFocus&&text.length<1&&childCount<2){if(el.placeHolderActive)return;if(!el.innerHTML.match("<"+s.tags.paragraph)){el.innerHTML=""}if(s.placeholder.length>0){if(!placeholder.setup){placeholder.setup=true;style.background=qStyle("background");style.backgroundColor=qStyle("background-color");style.fontSize=qStyle("font-size");style.color=elStyle.color;style.marginTop=qStyle("margin-top");style.marginBottom=qStyle("margin-bottom");style.marginLeft=qStyle("margin-left");style.marginRight=qStyle("margin-right");style.paddingTop=qStyle("padding-top");style.paddingBottom=qStyle("padding-bottom");style.paddingLeft=qStyle("padding-left");style.paddingRight=qStyle("padding-right");style.borderTopWidth=qStyle("border-top-width");style.borderTopColor=qStyle("border-top-color");style.borderTopStyle=qStyle("border-top-style");style.borderBottomWidth=qStyle("border-bottom-width");style.borderBottomColor=qStyle("border-bottom-color");style.borderBottomStyle=qStyle("border-bottom-style");style.borderLeftWidth=qStyle("border-left-width");style.borderLeftColor=qStyle("border-left-color");style.borderLeftStyle=qStyle("border-left-style");style.borderRightWidth=qStyle("border-right-width");style.borderRightColor=qStyle("border-right-color");style.borderRightStyle=qStyle("border-right-style");placeholder.className=s.cssClasses.placeholder+" "+s.cssClasses.placeholder+"-"+s.mode;placeholder.innerHTML="
"+s.placeholder+"
";el.parentNode.insertBefore(placeholder,el)}el.className+=" "+s.cssClasses.clear;style.display="";style.minHeight=el.clientHeight+"px";style.minWidth=el.clientWidth+"px";if(s.mode!==Medium.inlineMode&&s.mode!==Medium.inlineRichMode){this.setupContents();if(childCount===0&&el.firstChild){cursor.set(this,0,el.firstChild)}}}el.placeHolderActive=true}else if(el.placeHolderActive){el.placeHolderActive=false;style.display="none";el.className=utils.trim(el.className.replace(s.cssClasses.clear,""));this.setupContents()}},clean:function(el){var s=this.settings,placeholderClass=s.cssClasses.placeholder,attributesToRemove=(s.attributes||{}).remove||[],tags=s.tags||{},onlyOuter=tags.outerLevel||null,onlyInner=tags.innerLevel||null,outerSwitch={},innerSwitch={},paragraphTag=(tags.paragraph||"").toUpperCase(),html=this.html,attr,text,j;el=el||s.element;if(s.mode===Medium.inlineRichMode){onlyOuter=s.tags.innerLevel}if(onlyOuter!==null){for(j=0;j1&&innerSwitch[nodeName]!==undefined){shouldDelete=false}if(shouldDelete){if(w.getComputedStyle(child,null).getPropertyValue("display")==="block"){if(paragraphTag.length>0&¶graphTag!==nodeName){utils.changeTag(child,paragraphTag)}if(depth>1){while(parent.childNodes.length>i){parent.parentNode.insertBefore(parent.lastChild,parent.nextSibling)}}}else{switch(nodeName){case"BR":if(child===child.parentNode.lastChild){if(child===child.parentNode.firstChild){break}text=d.createTextNode("");text.innerHTML=" ";child.parentNode.insertBefore(text,child);break}default:while(child.firstChild!==null){child.parentNode.insertBefore(child.firstChild,child)}utils.detachNode(child);break}}}}})},insertHtml:function(html,callback,skipChangeEvent){var result=new Medium.Html(this,html).insert(this.settings.beforeInsertHtml),lastElement=result[result.length-1];if(skipChangeEvent===true){utils.triggerEvent(this.element,"change")}if(callback){callback.apply(result)}switch(lastElement.nodeName){case"UL":case"OL":case"DL":if(lastElement.lastChild!==null){this.cursor.moveCursorToEnd(lastElement.lastChild);break}default:this.cursor.moveCursorToEnd(lastElement)}return this},addTag:function(tag,shouldFocus,isEditable,afterElement){if(!this.settings.beforeAddTag(tag,shouldFocus,isEditable,afterElement)){var newEl=d.createElement(tag),toFocus;if(typeof isEditable!=="undefined"&&isEditable===false){newEl.contentEditable=false}if(newEl.innerHTML.length==0){newEl.innerHTML=" "}if(afterElement&&afterElement.nextSibling){afterElement.parentNode.insertBefore(newEl,afterElement.nextSibling);toFocus=afterElement.nextSibling}else{this.element.appendChild(newEl);toFocus=this.lastChild()}if(shouldFocus){this.cache.focusedElement=toFocus;this.cursor.set(this,0,toFocus)}return newEl}return null},invokeElement:function(tagName,attributes,skipChangeEvent){var settings=this.settings,remove=attributes.remove||[];attributes=attributes||{};switch(settings.mode){case Medium.inlineMode:case Medium.partialMode:return this;default:}if(remove.length>0){if(!utils.arrayContains(settings,"class")){remove.push("class")}}new Medium.Element(this,tagName,attributes).invoke(this.settings.beforeInvokeElement);if(skipChangeEvent===true){utils.triggerEvent(this.element,"change")}return this},value:function(value){if(typeof value!=="undefined"){this.element.innerHTML=value;this.clean();this.placeholders();this.makeUndoable()}else{return this.element.innerHTML}return this},focus:function(){var el=this.element;el.focus();return this},select:function(){utils.selectNode(Medium.activeElement=this.element);return this},isActive:function(){return Medium.activeElement===this.element},setupContents:function(){var el=this.element,children=el.children,childNodes=el.childNodes,initialParagraph,s=this.settings;if(!s.tags.paragraph||children.length>0||s.mode===Medium.inlineMode||s.mode===Medium.inlineRichMode){return Medium.Utilities}if(childNodes.length>0){initialParagraph=d.createElement(s.tags.paragraph);if(el.innerHTML.match("^[&]nbsp[;]")){el.innerHTML=el.innerHTML.substring(6,el.innerHTML.length-1)}initialParagraph.innerHTML=el.innerHTML;el.innerHTML="";el.appendChild(initialParagraph)}else{initialParagraph=d.createElement(s.tags.paragraph);initialParagraph.innerHTML=" ";el.appendChild(initialParagraph);this.cursor.set(this,0,el.firstChild)}return this},destroy:function(){var el=this.element,settings=this.settings,placeholder=this.placeholder||null;if(placeholder!==null&&placeholder.setup&&placeholder.parentNode!==null){placeholder.parentNode.removeChild(placeholder);delete el.placeHolderActive}el.removeAttribute("contenteditable");el.className=utils.trim(el.className.replace(settings.cssClasses.editor,"").replace(settings.cssClasses.clear,"").replace(settings.cssClasses.editor+"-"+settings.mode,""));this.action.destroy();if(this.settings.drag){this.drag.destroy()}},clear:function(){this.element.innerHTML="";this.placeholders()},splitAtCaret:function(){if(!this.isActive())return null;var selector=w.getSelection||d.selection,sel=selector(),offset=sel.focusOffset,node=sel.focusNode,el=this.element,range=d.createRange(),endRange=d.createRange(),contents;range.setStart(node,offset);endRange.selectNodeContents(el);range.setEnd(endRange.endContainer,endRange.endOffset);contents=range.extractContents();return contents},deleteSelection:function(){if(!this.isActive())return;var sel=rangy.getSelection(),range;if(sel.rangeCount>0){range=sel.getRangeAt(0);range.deleteContents()}},lastChild:function(){return this.element.lastChild},bold:function(){switch(this.settings.mode){case Medium.partialMode:case Medium.inlineMode:return this}new Medium.Element(this,"bold").setClean(false).invoke(this.settings.beforeInvokeElement);return this},underline:function(){switch(this.settings.mode){case Medium.partialMode:case Medium.inlineMode:return this}new Medium.Element(this,"underline").setClean(false).invoke(this.settings.beforeInvokeElement);return this},italicize:function(){switch(this.settings.mode){case Medium.partialMode:case Medium.inlineMode:return this}new Medium.Element(this,"italic").setClean(false).invoke(this.settings.beforeInvokeElement);return this},quote:function(){return this},paste:function(text){var value=this.value(),length=value.length,totalLength,settings=this.settings,selection=this.selection,el=this.element,medium=this,postPaste=function(text){text=text||"";if(text.length>0){el.focus();Medium.activeElement=el;selection.restoreSelection(sel);text=utils.encodeHtml(text);totalLength=text.length+length;if(settings.maxLength>0&&totalLength>settings.maxLength){text=text.substring(0,settings.maxLength-length)}if(settings.mode!==Medium.inlineMode){text=text.replace(/\n/g,"
")}new Medium.Html(medium,text).setClean(false).insert(settings.beforeInsertHtml,true);medium.clean();medium.placeholders()}};medium.makeUndoable();if(text!==undefined){postPaste(text)}else if(settings.pasteAsText){var sel=selection.saveSelection();utils.pasteHook(this,postPaste)}else{setTimeout(function(){medium.clean();medium.placeholders()},20)}return true},undo:function(){var undoable=this.undoable,stack=undoable.stack,can=stack.canUndo();if(can){stack.undo()}return this},redo:function(){var undoable=this.undoable,stack=undoable.stack,can=stack.canRedo();if(can){stack.redo()}return this}};Medium.inlineMode="inline";Medium.partialMode="partial";Medium.richMode="rich";Medium.inlineRichMode="inlineRich";Medium.Messages={pastHere:"Paste Here"};Medium.defaultSettings={element:null,modifier:"auto",placeholder:"",autofocus:false,autoHR:true,mode:Medium.richMode,maxLength:-1,modifiers:{b:"bold",i:"italicize",u:"underline"},tags:{"break":"br",horizontalRule:"hr",paragraph:"p",outerLevel:["pre","blockquote","figure"],innerLevel:["a","b","u","i","img","strong"]},cssClasses:{editor:"Medium",pasteHook:"Medium-paste-hook",placeholder:"Medium-placeholder",clear:"Medium-clear"},attributes:{remove:["style","class"]},pasteAsText:true,beforeInvokeElement:function(){},beforeInsertHtml:function(){},maxLengthReached:function(element){},beforeAddTag:function(tag,shouldFocus,isEditable,afterElement){},onBlur:function(){},onFocus:function(){},keyContext:null,drag:false};(function(Medium,w,d){"use strict";function isEditable(e){if(e.hasOwnProperty("target")&&e.target.getAttribute("contenteditable")==="false"){utils.preventDefaultEvent(e);return false}return true}Medium.Action=function(medium){this.medium=medium;this.handledEvents={keydown:null,keyup:null,blur:null,focus:null,paste:null,click:null}};Medium.Action.prototype={setup:function(){this.handleFocus().handleBlur().handleKeyDown().handleKeyUp().handlePaste().handleClick()},destroy:function(){var el=this.medium.element;utils.removeEvent(el,"focus",this.handledEvents.focus).removeEvent(el,"blur",this.handledEvents.blur).removeEvent(el,"keydown",this.handledEvents.keydown).removeEvent(el,"keyup",this.handledEvents.keyup).removeEvent(el,"paste",this.handledEvents.paste).removeEvent(el,"click",this.handledEvents.click)},handleFocus:function(){var medium=this.medium,el=medium.element;utils.addEvent(el,"focus",this.handledEvents.focus=function(e){e=e||w.event;if(!isEditable(e)){return false}Medium.activeElement=el;medium.cache.originalVal=e.target.textContent;medium.settings.onFocus(e);medium.placeholders()});return this},handleBlur:function(){var medium=this.medium,el=medium.element;utils.addEvent(el,"blur",this.handledEvents.blur=function(e){e=e||w.event;if(Medium.activeElement===el){Medium.activeElement=null}medium.settings.onBlur(e);medium.placeholders()});return this},handleKeyDown:function(){var action=this,medium=this.medium,settings=medium.settings,cache=medium.cache,el=medium.element;utils.addEvent(el,"keydown",this.handledEvents.keydown=function(e){e=e||w.event;if(!isEditable(e)){return false}var keepEvent=true;if(e.keyCode===229)return;utils.isCommand(settings,e,function(){cache.cmd=true},function(){cache.cmd=false});utils.isShift(e,function(){cache.shift=true},function(){cache.shift=false});utils.isModifier(settings,e,function(cmd){if(cache.cmd){if(settings.mode===Medium.inlineMode||settings.mode===Medium.partialMode){utils.preventDefaultEvent(e);return false}var cmdType=typeof cmd;var fn=null;if(cmdType==="function"){fn=cmd}else{fn=medium[cmd]}keepEvent=fn.call(medium,e);if(keepEvent===false||keepEvent===medium){utils.preventDefaultEvent(e);utils.stopPropagation(e)}return true}return false});if(settings.maxLength!==-1){var len=utils.text(el).length,hasSelection=false,selection=w.getSelection(),isSpecial=utils.isSpecial(e),isNavigational=utils.isNavigational(e);if(selection){hasSelection=!selection.isCollapsed}if(isSpecial||isNavigational){return true}if(len>=settings.maxLength&&!hasSelection){settings.maxLengthReached(el);utils.preventDefaultEvent(e);return false}}switch(e.keyCode){case key["enter"]:if(action.enterKey(e)===false){utils.preventDefaultEvent(e)}break;case key["escape"]:if(action.escKey(e)===false){utils.preventDefaultEvent(e)}break;case key["backspace"]:case key["delete"]:action.backspaceOrDeleteKey(e);break}return keepEvent});return this},handleKeyUp:function(){var action=this,medium=this.medium,settings=medium.settings,cache=medium.cache,cursor=medium.cursor,el=medium.element;utils.addEvent(el,"keyup",this.handledEvents.keyup=function(e){e=e||w.event;if(!isEditable(e)){return false}utils.isCommand(settings,e,function(){cache.cmd=false},function(){cache.cmd=true});medium.clean();medium.placeholders();var keyContext;if(settings.keyContext!==null&&(keyContext=settings.keyContext[e.keyCode])){var el=cursor.parent();if(el){keyContext.call(medium,e,el)}}action.preserveElementFocus()});return this},handlePaste:function(){var medium=this.medium,el=medium.element,text,i,max,data,cD,type,types;utils.addEvent(el,"paste",this.handledEvents.paste=function(e){e=e||w.event;if(!isEditable(e)){return false}i=0;utils.preventDefaultEvent(e);text="";cD=e.clipboardData;if(cD&&(data=cD.getData)){types=cD.types;max=types.length;for(i=0;i=2){secondToLast=children[children.length-2];if(secondToLast.nodeName.toLowerCase()===settings.tags.horizontalRule){makeHR=false}}if(makeHR){medium.addTag(settings.tags.horizontalRule,false,true,focusedElement);focusedElement=focusedElement.nextSibling}if((paragraph=medium.addTag(settings.tags.paragraph,true,null,focusedElement))!==null){paragraph.innerHTML="";cursor.set(medium,0,paragraph)}}}return true},backspaceOrDeleteKey:function(e){var medium=this.medium,cursor=medium.cursor,settings=medium.settings,el=medium.element;if(settings.onBackspaceOrDelete!==undefined){var result=settings.onBackspaceOrDelete.call(medium,e,el);if(result){return}}if(el.lastChild===null)return;var lastChild=el.lastChild,beforeLastChild=lastChild.previousSibling,anchorNode=rangy.getSelection().anchorNode;if(lastChild&&settings.tags.horizontalRule&&lastChild.nodeName.toLocaleLowerCase()===settings.tags.horizontalRule){el.removeChild(lastChild)}else if(lastChild&&beforeLastChild&&utils.text(lastChild).length<1&&beforeLastChild.nodeName.toLowerCase()===settings.tags.horizontalRule&&lastChild.nodeName.toLowerCase()===settings.tags.paragraph){el.removeChild(lastChild);el.removeChild(beforeLastChild)}else if(el.childNodes.length===1&&lastChild&&!utils.text(lastChild).length){utils.preventDefaultEvent(e);medium.setupContents()}else if(anchorNode&&anchorNode===el){medium.deleteSelection();medium.setupContents();cursor.set(medium,0,el.firstChild)}},preserveElementFocus:function(){var anchorNode=w.getSelection?w.getSelection().anchorNode:document.activeElement;if(anchorNode){var medium=this.medium,cache=medium.cache,el=medium.element,s=medium.settings,cur=anchorNode.parentNode,children=el.children,diff=cur!==cache.focusedElement,elementIndex=0,i;if(cur===s.element){cur=anchorNode}for(i=0;i ',iconColor:"#231F20",setup:function(){this.handleDragstart().handleDragend().handleMouseover().handleMouseout().handleMousemove()},destroy:function(){utils.removeEvent(this.icon,"dragstart",this.handledEvents.dragstart).removeEvent(this.icon,"dragend",this.handledEvents.dragend).removeEvent(this.icon,"mouseover",this.handledEvents.mouseover).removeEvent(this.icon,"mouseout",this.handledEvents.mouseout).removeEvent(this.medium.element,"mousemove",this.handledEvents.mousemove)},hide:function(){utils.hide(this.icon)},handleDragstart:function(){var me=this;utils.addEvent(this.icon,"dragstart",this.handledEvents.dragstart=function(e){if(me.protectedElement!==null)return;e=e||w.event;me.protectedElement=utils.detachNode(me.element);me.icon.style.opacity=0});return this},handleDragend:function(){var me=this;utils.addEvent(this.icon,"dragend",this.handledEvents.dragend=d.body.ondragend=function(e){if(me.protectedElement===null)return;setTimeout(function(){me.cleanCanvas();me.protectedElement=null},1)});return this},handleMouseover:function(){var me=this;utils.addEvent(this.icon,"mouseover",this.handledEvents.mouseover=function(e){if(me.protectedElement!==null)return;utils.stopPropagation(e).addClass(me.element,me.elementClass)});return this},handleMouseout:function(){var me=this;utils.addEvent(this.icon,"mouseout",this.handledEvents.mouseout=function(e){if(me.protectedElement!==null)return;utils.stopPropagation(e).removeClass(me.element,me.elementClass)});return this},handleMousemove:function(){var me=this;utils.addEvent(this.medium.element,"mousemove",this.handledEvents.mousemove=function(e){e=e||w.event;var target=e.target||{};if(target.getAttribute("contenteditable")==="false"){me.show(target)}});return this},show:function(el){if(el===this.icon&&this.protectedElement===null)return;this.element=el;var style=this.icon.style,left=el.offsetLeft,top=el.offsetTop;el.dragIcon=this.icon;el.parentNode.appendChild(this.icon);style.opacity=1;style.left=left+"px";style.top=top+"px";utils.show(this.icon)},cleanCanvas:function(){var target,inserted=false,buttons=d.getElementsByClassName(this.buttonClass);this.icon.style.opacity=1;while(buttons.length>0){if(utils.isVisible(target=buttons[0])){if(!inserted){target.parentNode.insertBefore(this.element,target);inserted=true}utils.detachNode(target)}}utils.detachNode(this.icon)}}})(Medium);(function(Medium){"use strict";Medium.Element=function(medium,tagName,attributes){this.medium=medium;this.element=medium.element;switch(tagName.toLowerCase()){case"bold":this.tagName="b";break;case"italic":this.tagName="i";break;case"underline":this.tagName="u";break;default:this.tagName=tagName}this.attributes=attributes||{};this.clean=true};Medium.Element.prototype={invoke:function(fn){if(Medium.activeElement===this.element){if(fn){fn.apply(this)}var attr=this.attributes,tagName=this.tagName.toLowerCase(),applier,cl;if(attr.className!==undefined){cl=(attr.className.split[" "]||[attr.className]).shift();delete attr.className}else{cl="medium-"+tagName}applier=rangy.createClassApplier(cl,{elementTagName:tagName,elementAttributes:this.attributes});this.medium.makeUndoable();applier.toggleSelection(w);if(this.clean){this.medium.clean();this.medium.placeholders()}}},setClean:function(clean){this.clean=clean;return this}}})(Medium);(function(Medium){"use strict";Medium.Html=function(medium,html){this.html=html;this.medium=medium;this.clean=true;this.injector=new Medium.Injector};Medium.Html.prototype={insert:function(fn,selectInserted){if(Medium.activeElement===this.medium.element){if(fn){fn.apply(this)}var inserted=this.injector.inject(this.html,selectInserted);if(this.clean){this.medium.clean();this.medium.placeholders()}this.medium.makeUndoable();return inserted}else{return null}},setClean:function(clean){this.clean=clean;return this}}})(Medium);(function(Medium){"use strict";Medium.Injector=function(){};Medium.Injector.prototype={inject:function(htmlRaw){var nodes=[],html,isConverted=false;if(typeof htmlRaw==="string"){var htmlConverter=d.createElement("div");htmlConverter.innerHTML=htmlRaw;html=htmlConverter.childNodes;isConverted=true}else{html=htmlRaw}this.insertHTML('');var wedge=d.getElementById("Medium-wedge"),parent=wedge.parentNode,i=0;wedge.removeAttribute("id");if(isConverted){while(i0){parent.insertBefore(html[html.length-1],wedge)}}else{nodes.push(html);parent.insertBefore(html,wedge)}parent.removeChild(wedge);wedge=null;return nodes},insertHTML:function(html,selectPastedContent){var sel,range;if(w.getSelection){sel=w.getSelection();if(sel.getRangeAt&&sel.rangeCount){range=sel.getRangeAt(0);range.deleteContents();var el=d.createElement("div");el.innerHTML=html;var frag=d.createDocumentFragment(),node,lastNode;while(node=el.firstChild){lastNode=frag.appendChild(node)}var firstNode=frag.firstChild;range.insertNode(frag);if(lastNode){range=range.cloneRange();range.setStartAfter(lastNode);if(selectPastedContent){range.setStartBefore(firstNode)}else{range.collapse(true)}sel.removeAllRanges();sel.addRange(range)}}}else if((sel=d.selection)&&sel.type!="Control"){var originalRange=sel.createRange();originalRange.collapse(true);sel.createRange().pasteHTML(html);if(selectPastedContent){range=sel.createRange();range.setEndPoint("StartToStart",originalRange);range.select()}}}}})(Medium);(function(Medium){"use strict";Medium.Selection=function(){};Medium.Selection.prototype={saveSelection:function(){if(w.getSelection){var sel=w.getSelection();if(sel.rangeCount>0){return sel.getRangeAt(0)}}else if(d.selection&&d.selection.createRange){return d.selection.createRange()}return null},restoreSelection:function(range){if(range){if(w.getSelection){var sel=w.getSelection();sel.removeAllRanges();sel.addRange(range)}else if(d.selection&&range.select){range.select()}}}}})(Medium);(function(Medium){"use strict";Medium.Toolbar=function(medium,buttons){this.medium=medium;var elementCreator=d.createElement("div");elementCreator.innerHTML=this.html;this.buttons=buttons;this.element=elementCreator.children[0];d.body.appendChild(this.element);this.active=false;this.busy=true;this.handledEvents={scroll:null,mouseup:null,keyup:null}};Medium.Toolbar.prototype={fixedClass:"Medium-toolbar-fixed",showClass:"Medium-toolbar-show",hideClass:"Medium-toolbar-hide",html:'
',setup:function(){this.handleScroll().handleMouseup().handleKeyup()},destroy:function(){utils.removeEvent(w,"scroll",this.handledEvents.scroll).removeEvent(d,"mouseup",this.handledEvents.mouseup).removeEvent(d,"keyup",this.handledEvents.keyup)},handleScroll:function(){var me=this;utils.addEvent(w,"scroll",this.handledEvents.scroll=function(){if(me.active){me.goToSelection()}});return this},handleMouseup:function(){var me=this;utils.addEvent(d,"mouseup",this.handledEvents.mouseup=function(){if(Medium.activeElement===me.medium.element&&!me.busy){me.goToSelection()}});return this},handleKeyup:function(){var me=this;utils.addEvent(d,"keyup",this.handledEvents.keyup=function(){if(Medium.activeElement===me.medium.element&&!me.busy){me.goToSelection()}});return this},goToSelection:function(){var high=this.getHighlighted(),y=high.boundary.top-5,el=this.element,style=el.style;if(w.scrollTop>0){utils.addClass(el,this.fixedClass); - -}else{utils.removeClass(el,this.fixedClass)}if(high!==null){if(high.range.startOffset===high.range.endOffset&&!high.text){utils.removeClass(el,this.showClass).addClass(el,this.hideClass);this.active=false}else{utils.removeClass(el,this.hideClass).removeClass(el,this.showClass);style.opacity=.01;utils.addClass(el,this.showClass);style.opacity=1;style.top=y-65+"px";style.left=high.boundary.left+high.boundary.width/2-el.clientWidth/2+"px";this.active=true}}},getHighlighted:function(){var selection=w.getSelection(),range=selection.anchorNode?selection.getRangeAt(0):false;if(!range){return null}return{selection:selection,range:range,text:utils.trim(range.toString()),boundary:range.getBoundingClientRect()}}}})(Medium);(function(Medium){"use strict";Medium.Undoable=function(medium){var me=this,element=medium.settings.element,timer,startValue,stack=new Undo.Stack,EditCommand=Undo.Command.extend({constructor:function(oldValue,newValue){this.oldValue=oldValue;this.newValue=newValue},execute:function(){},undo:function(){element.innerHTML=this.oldValue;medium.canUndo=stack.canUndo();medium.canRedo=stack.canRedo();medium.dirty=stack.dirty()},redo:function(){element.innerHTML=this.newValue;medium.canUndo=stack.canUndo();medium.canRedo=stack.canRedo();medium.dirty=stack.dirty()}}),makeUndoable=function(isInit){var newValue=element.innerHTML;if(isInit){startValue=element.innerHTML;stack.execute(new EditCommand(startValue,startValue))}else if(newValue!=startValue){if(!me.movingThroughStack){stack.execute(new EditCommand(startValue,newValue));startValue=newValue;medium.dirty=stack.dirty()}utils.triggerEvent(medium.settings.element,"change")}};this.medium=medium;this.timer=timer;this.stack=stack;this.makeUndoable=makeUndoable;this.EditCommand=EditCommand;this.movingThroughStack=false;utils.addEvent(element,"keyup",function(e){if(e.ctrlKey||e.keyCode===key.z){utils.preventDefaultEvent(e);return}clearTimeout(timer);timer=setTimeout(function(){makeUndoable()},250)}).addEvent(element,"keydown",function(e){if(!e.ctrlKey||e.keyCode!==key.z){me.movingThroughStack=false;return}utils.preventDefaultEvent(e);me.movingThroughStack=true;if(e.shiftKey){stack.canRedo()&&stack.redo()}else{stack.canUndo()&&stack.undo()}})}})(Medium);(function(Medium){"use strict";Medium.Utilities={isCommand:function(s,e,fnTrue,fnFalse){if(s.modifier==="ctrl"&&e.ctrlKey||s.modifier==="cmd"&&e.metaKey||s.modifier==="auto"&&(e.ctrlKey||e.metaKey)){return fnTrue.call()}else{return fnFalse.call()}},isShift:function(e,fnTrue,fnFalse){if(e.shiftKey){return fnTrue.call()}else{return fnFalse.call()}},isModifier:function(settings,e,fn){var cmd=settings.modifiers[e.keyCode];if(cmd){return fn.call(null,cmd)}return false},special:function(){var special={};special[key["backspace"]]=true;special[key["shift"]]=true;special[key["ctrl"]]=true;special[key["alt"]]=true;special[key["delete"]]=true;special[key["cmd"]]=true;return special}(),isSpecial:function(e){return typeof Medium.Utilities.special[e.keyCode]!=="undefined"},navigational:function(){var navigational={};navigational[key["upArrow"]]=true;navigational[key["downArrow"]]=true;navigational[key["leftArrow"]]=true;navigational[key["rightArrow"]]=true;return navigational}(),isNavigational:function(e){return typeof Medium.Utilities.navigational[e.keyCode]!=="undefined"},addEvents:function(element,eventNamesString,func){var i=0,eventName,eventNames=eventNamesString.split(" "),max=eventNames.length,utils=Medium.Utilities;for(;i0){utils.addEvent(element,eventName,func)}}return Medium.Utilities},addEvent:function addEvent(element,eventName,func){if(element.addEventListener){element.addEventListener(eventName,func,false)}else if(element.attachEvent){element.attachEvent("on"+eventName,func)}else{element["on"+eventName]=func}return Medium.Utilities},removeEvent:function removeEvent(element,eventName,func){if(element.removeEventListener){element.removeEventListener(eventName,func,false)}else if(element.detachEvent){element.detachEvent("on"+eventName,func)}else{element["on"+eventName]=null}return Medium.Utilities},preventDefaultEvent:function(e){if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}return Medium.Utilities},stopPropagation:function(e){e=e||window.event;e.cancelBubble=true;if(e.stopPropagation!==undefined){e.stopPropagation()}return Medium.Utilities},isEventSupported:function(element,eventName){eventName="on"+eventName;var el=d.createElement(element.tagName),isSupported=eventName in el;if(!isSupported){el.setAttribute(eventName,"return;");isSupported=typeof el[eventName]=="function"}el=null;return isSupported},triggerEvent:function(element,eventName){var e;if(d.createEvent){e=d.createEvent("HTMLEvents");e.initEvent(eventName,true,true);e.eventName=eventName;element.dispatchEvent(e)}else{e=d.createEventObject();element.fireEvent("on"+eventName,e)}return Medium.Utilities},deepExtend:function(destination,source){var property,propertyValue;for(property in source)if(source.hasOwnProperty(property)){propertyValue=source[property];if(propertyValue!==undefined&&propertyValue!==null&&propertyValue.constructor!==undefined&&propertyValue.constructor===Object){destination[property]=destination[property]||{};Medium.Utilities.deepExtend(destination[property],propertyValue)}else{destination[property]=propertyValue}}return destination},pasteHook:function(medium,fn){medium.makeUndoable();var tempEditable=d.createElement("div"),el=medium.element,existingValue,existingLength,overallLength,s=medium.settings,value,body=d.body,bodyParent=body.parentNode,scrollTop=bodyParent.scrollTop,scrollLeft=bodyParent.scrollLeft;tempEditable.className=s.cssClasses.pasteHook;tempEditable.setAttribute("contenteditable",true);body.appendChild(tempEditable);utils.selectNode(tempEditable);bodyParent.scrollTop=scrollTop;bodyParent.scrollLeft=scrollLeft;setTimeout(function(){value=utils.text(tempEditable);el.focus();if(s.maxLength>0){existingValue=utils.text(el);existingLength=existingValue.length;overallLength=existingLength+value.length;if(overallLength>existingLength){value=value.substring(0,s.maxLength-existingLength)}}utils.detachNode(tempEditable);bodyParent.scrollTop=scrollTop;bodyParent.scrollLeft=scrollLeft;fn(value)},0);return Medium.Utilities},traverseAll:function(element,options,depth){var children=element.childNodes,length=children.length,i=0,node;depth=depth||1;options=options||{};if(length>0){for(;i0){if(!n.setup){n.setup=true;i.background=m("background");i.backgroundColor=m("background-color");i.fontSize=m("font-size");i.color=o.color;i.marginTop=m("margin-top");i.marginBottom=m("margin-bottom");i.marginLeft=m("margin-left");i.marginRight=m("margin-right");i.paddingTop=m("padding-top");i.paddingBottom=m("padding-bottom");i.paddingLeft=m("padding-left");i.paddingRight=m("padding-right");i.borderTopWidth=m("border-top-width");i.borderTopColor=m("border-top-color");i.borderTopStyle=m("border-top-style");i.borderBottomWidth=m("border-bottom-width");i.borderBottomColor=m("border-bottom-color");i.borderBottomStyle=m("border-bottom-style");i.borderLeftWidth=m("border-left-width");i.borderLeftColor=m("border-left-color");i.borderLeftStyle=m("border-left-style");i.borderRightWidth=m("border-right-width");i.borderRightColor=m("border-right-color");i.borderRightStyle=m("border-right-style");n.className=r.cssClasses.placeholder+" "+r.cssClasses.placeholder+"-"+r.mode;n.innerHTML="
"+r.placeholder+"
";k.parentNode.insertBefore(n,k)}k.className+=" "+r.cssClasses.clear;i.display="";i.minHeight=k.clientHeight+"px";i.minWidth=k.clientWidth+"px";if(r.mode!==d.inlineMode&&r.mode!==d.inlineRichMode){this.setupContents();if(l===0&&k.firstChild){q.set(this,0,k.firstChild)}}}k.placeHolderActive=true}else{if(k.placeHolderActive){k.placeHolderActive=false;i.display="none";k.className=a.trim(k.className.replace(r.cssClasses.clear,""));this.setupContents()}}},clean:function(i){var v=this.settings,m=v.cssClasses.placeholder,n=(v.attributes||{}).remove||[],w=v.tags||{},q=w.outerLevel||null,r=w.innerLevel||null,x={},u={},p=(w.paragraph||"").toUpperCase(),l=this.html,o,t,k;i=i||v.element;if(v.mode===d.inlineRichMode){q=v.tags.innerLevel}if(q!==null){for(k=0;k1&&u[B]!==undefined){j=false}}if(j){if(e.getComputedStyle(C,null).getPropertyValue("display")==="block"){if(p.length>0&&p!==B){a.changeTag(C,p)}if(A>1){while(y.childNodes.length>s){y.parentNode.insertBefore(y.lastChild,y.nextSibling)}}}else{switch(B){case"BR":if(C===C.parentNode.lastChild){if(C===C.parentNode.firstChild){break}t=h.createTextNode("");t.innerHTML=" ";C.parentNode.insertBefore(t,C);break}default:while(C.firstChild!==null){C.parentNode.insertBefore(C.firstChild,C)}a.detachNode(C);break}}}}})},insertHtml:function(j,m,k){var i=(new d.Html(this,j)).insert(this.settings.beforeInsertHtml),l=i[i.length-1];if(k===true){a.triggerEvent(this.element,"change")}if(m){m.apply(i)}switch(l.nodeName){case"UL":case"OL":case"DL":if(l.lastChild!==null){this.cursor.moveCursorToEnd(l.lastChild);break}default:this.cursor.moveCursorToEnd(l)}return this},addTag:function(j,i,k,m){if(!this.settings.beforeAddTag(j,i,k,m)){var n=h.createElement(j),l;if(typeof k!=="undefined"&&k===false){n.contentEditable=false}if(n.innerHTML.length==0){n.innerHTML=" "}if(m&&m.nextSibling){m.parentNode.insertBefore(n,m.nextSibling);l=m.nextSibling}else{this.element.appendChild(n);l=this.lastChild()}if(i){this.cache.focusedElement=l;this.cursor.set(this,0,l)}return n}return null},invokeElement:function(k,j,m){var l=this.settings,i=j.remove||[];j=j||{};switch(l.mode){case d.inlineMode:case d.partialMode:return this;default:}if(i.length>0){if(!a.arrayContains(l,"class")){i.push("class")}}(new d.Element(this,k,j)).invoke(this.settings.beforeInvokeElement);if(m===true){a.triggerEvent(this.element,"change")}return this},value:function(i){if(typeof i!=="undefined"){this.element.innerHTML=i;this.clean();this.placeholders();this.makeUndoable()}else{return this.element.innerHTML}return this},focus:function(){var i=this.element;i.focus();return this},select:function(){a.selectNode(d.activeElement=this.element);return this},isActive:function(){return(d.activeElement===this.element)},setupContents:function(){var l=this.element,j=l.children,m=l.childNodes,i,k=this.settings;if(!k.tags.paragraph||j.length>0||k.mode===d.inlineMode||k.mode===d.inlineRichMode){return d.Utilities}if(m.length>0){i=h.createElement(k.tags.paragraph);if(l.innerHTML.match("^[&]nbsp[;]")){l.innerHTML=l.innerHTML.substring(6,l.innerHTML.length-1)}i.innerHTML=l.innerHTML;l.innerHTML="";l.appendChild(i)}else{i=h.createElement(k.tags.paragraph);i.innerHTML=" ";l.appendChild(i);this.cursor.set(this,0,l.firstChild)}return this},destroy:function(){var j=this.element,i=this.settings,k=this.placeholder||null;if(k!==null&&k.setup&&k.parentNode!==null){k.parentNode.removeChild(k);delete j.placeHolderActive}j.removeAttribute("contenteditable");j.className=a.trim(j.className.replace(i.cssClasses.editor,"").replace(i.cssClasses.clear,"").replace(i.cssClasses.editor+"-"+i.mode,""));this.action.destroy();if(this.settings.drag){this.drag.destroy()}},clear:function(){this.element.innerHTML="";this.placeholders()},splitAtCaret:function(){if(!this.isActive()){return null}var i=(e.getSelection||h.selection),o=i(),p=o.focusOffset,n=o.focusNode,k=this.element,j=h.createRange(),m=h.createRange(),l;j.setStart(n,p);m.selectNodeContents(k);j.setEnd(m.endContainer,m.endOffset);l=j.extractContents();return l},deleteSelection:function(){if(!this.isActive()){return}var j=g.getSelection(),i;if(j.rangeCount>0){i=j.getRangeAt(0);i.deleteContents()}},lastChild:function(){return this.element.lastChild},bold:function(){switch(this.settings.mode){case d.partialMode:case d.inlineMode:return this}(new d.Element(this,"bold")).setClean(false).invoke(this.settings.beforeInvokeElement);return this},underline:function(){switch(this.settings.mode){case d.partialMode:case d.inlineMode:return this}(new d.Element(this,"underline")).setClean(false).invoke(this.settings.beforeInvokeElement);return this},italicize:function(){switch(this.settings.mode){case d.partialMode:case d.inlineMode:return this}(new d.Element(this,"italic")).setClean(false).invoke(this.settings.beforeInvokeElement);return this},quote:function(){return this},paste:function(q){var n=this.value(),j=n.length,p,l=this.settings,o=this.selection,k=this.element,r=this,m=function(s){s=s||"";if(s.length>0){k.focus();d.activeElement=k;o.restoreSelection(i);s=a.encodeHtml(s);p=s.length+j;if(l.maxLength>0&&p>l.maxLength){s=s.substring(0,l.maxLength-j)}if(l.mode!==d.inlineMode){s=s.replace(/\n/g,"
")}(new d.Html(r,s)).setClean(false).insert(l.beforeInsertHtml,true);r.clean();r.placeholders()}};r.makeUndoable();if(q!==undefined){m(q)}else{if(l.pasteAsText){var i=o.saveSelection();a.pasteHook(this,m)}else{setTimeout(function(){r.clean();r.placeholders()},20)}}return true},undo:function(){var j=this.undoable,i=j.stack,k=i.canUndo();if(k){i.undo()}return this},redo:function(){var j=this.undoable,i=j.stack,k=i.canRedo();if(k){i.redo()}return this}};d.inlineMode="inline";d.partialMode="partial";d.richMode="rich";d.inlineRichMode="inlineRich";d.Messages={pastHere:"Paste Here"};d.defaultSettings={element:null,modifier:"auto",placeholder:"",autofocus:false,autoHR:true,mode:d.richMode,maxLength:-1,modifiers:{b:"bold",i:"italicize",u:"underline"},tags:{"break":"br",horizontalRule:"hr",paragraph:"p",outerLevel:["pre","blockquote","figure"],innerLevel:["a","b","u","i","img","strong"]},cssClasses:{editor:"Medium",pasteHook:"Medium-paste-hook",placeholder:"Medium-placeholder",clear:"Medium-clear"},attributes:{remove:["style","class"]},pasteAsText:true,beforeInvokeElement:function(){},beforeInsertHtml:function(){},maxLengthReached:function(i){},beforeAddTag:function(j,i,k,l){},onBlur:function(){},onFocus:function(){},keyContext:null,drag:false};(function(j,i,l){function k(m){if(m.hasOwnProperty("target")&&m.target.getAttribute("contenteditable")==="false"){a.preventDefaultEvent(m);return false}return true}j.Action=function(m){this.medium=m;this.handledEvents={keydown:null,keyup:null,blur:null,focus:null,paste:null,click:null}};j.Action.prototype={setup:function(){this.handleFocus().handleBlur().handleKeyDown().handleKeyUp().handlePaste().handleClick()},destroy:function(){var m=this.medium.element;a.removeEvent(m,"focus",this.handledEvents.focus).removeEvent(m,"blur",this.handledEvents.blur).removeEvent(m,"keydown",this.handledEvents.keydown).removeEvent(m,"keyup",this.handledEvents.keyup).removeEvent(m,"paste",this.handledEvents.paste).removeEvent(m,"click",this.handledEvents.click)},handleFocus:function(){var m=this.medium,n=m.element;a.addEvent(n,"focus",this.handledEvents.focus=function(o){o=o||i.event;if(!k(o)){return false}j.activeElement=n;m.cache.originalVal=o.target.textContent;m.settings.onFocus(o);m.placeholders()});return this},handleBlur:function(){var m=this.medium,n=m.element;a.addEvent(n,"blur",this.handledEvents.blur=function(o){o=o||i.event;if(j.activeElement===n){j.activeElement=null}m.settings.onBlur(o);m.placeholders()});return this},handleKeyDown:function(){var q=this,n=this.medium,p=n.settings,m=n.cache,o=n.element;a.addEvent(o,"keydown",this.handledEvents.keydown=function(x){x=x||i.event;if(!k(x)){return false}var s=true;if(x.keyCode===229){return}a.isCommand(p,x,function(){m.cmd=true},function(){m.cmd=false});a.isShift(x,function(){m.shift=true},function(){m.shift=false});a.isModifier(p,x,function(A){if(m.cmd){if((p.mode===j.inlineMode)||(p.mode===j.partialMode)){a.preventDefaultEvent(x);return false}var z=typeof A;var y=null;if(z==="function"){y=A}else{y=n[A]}s=y.call(n,x);if(s===false||s===n){a.preventDefaultEvent(x);a.stopPropagation(x)}return true}return false});if(p.maxLength!==-1){var r=a.text(o).length,t=false,w=i.getSelection(),v=a.isSpecial(x),u=a.isNavigational(x);if(w){t=!w.isCollapsed}if(v||u){return true}if(r>=p.maxLength&&!t){p.maxLengthReached(o);a.preventDefaultEvent(x);return false}}switch(x.keyCode){case f.enter:if(q.enterKey(x)===false){a.preventDefaultEvent(x)}break;case f.escape:if(q.escKey(x)===false){a.preventDefaultEvent(x)}break;case f.backspace:case f["delete"]:q.backspaceOrDeleteKey(x);break}return s});return this},handleKeyUp:function(){var q=this,n=this.medium,p=n.settings,m=n.cache,r=n.cursor,o=n.element;a.addEvent(o,"keyup",this.handledEvents.keyup=function(u){u=u||i.event;if(!k(u)){return false}a.isCommand(p,u,function(){m.cmd=false},function(){m.cmd=true});n.clean();n.placeholders();var t;if(p.keyContext!==null&&(t=p.keyContext[u.keyCode])){var s=r.parent();if(s){t.call(n,u,s)}}q.preserveElementFocus()});return this},handlePaste:function(){var u=this.medium,m=u.element,t,o,s,n,q,r,p;a.addEvent(m,"paste",this.handledEvents.paste=function(v){v=v||i.event;if(!k(v)){return false}o=0;a.preventDefaultEvent(v);t="";q=v.clipboardData;if(q&&(n=q.getData)){p=q.types;s=p.length;for(o=0;o=2){v=p[p.length-2];if(v.nodeName.toLowerCase()===q.tags.horizontalRule){s=false}}if(s){x.addTag(q.tags.horizontalRule,false,true,u);u=u.nextSibling}if((r=x.addTag(q.tags.paragraph,true,null,u))!==null){r.innerHTML="";w.set(x,0,r)}}}return true},backspaceOrDeleteKey:function(q){var t=this.medium,s=t.cursor,p=t.settings,n=t.element;if(p.onBackspaceOrDelete!==undefined){var u=p.onBackspaceOrDelete.call(t,q,n);if(u){return}}if(n.lastChild===null){return}var m=n.lastChild,o=m.previousSibling,r=g.getSelection().anchorNode;if(m&&p.tags.horizontalRule&&m.nodeName.toLocaleLowerCase()===p.tags.horizontalRule){n.removeChild(m)}else{if(m&&o&&a.text(m).length<1&&o.nodeName.toLowerCase()===p.tags.horizontalRule&&m.nodeName.toLowerCase()===p.tags.paragraph){n.removeChild(m);n.removeChild(o)}else{if(n.childNodes.length===1&&m&&!a.text(m).length){a.preventDefaultEvent(q);t.setupContents()}else{if(r&&r===n){t.deleteSelection();t.setupContents();s.set(t,0,n.firstChild)}}}}},preserveElementFocus:function(){var u=i.getSelection?i.getSelection().anchorNode:document.activeElement;if(u){var v=this.medium,m=v.cache,n=v.element,w=v.settings,t=u.parentNode,o=n.children,r=t!==m.focusedElement,p=0,q;if(t===w.element){t=u}for(q=0;q ',iconColor:"#231F20",setup:function(){this.handleDragstart().handleDragend().handleMouseover().handleMouseout().handleMousemove()},destroy:function(){a.removeEvent(this.icon,"dragstart",this.handledEvents.dragstart).removeEvent(this.icon,"dragend",this.handledEvents.dragend).removeEvent(this.icon,"mouseover",this.handledEvents.mouseover).removeEvent(this.icon,"mouseout",this.handledEvents.mouseout).removeEvent(this.medium.element,"mousemove",this.handledEvents.mousemove)},hide:function(){a.hide(this.icon)},handleDragstart:function(){var j=this;a.addEvent(this.icon,"dragstart",this.handledEvents.dragstart=function(k){if(j.protectedElement!==null){return}k=k||e.event;j.protectedElement=a.detachNode(j.element);j.icon.style.opacity=0});return this},handleDragend:function(){var j=this;a.addEvent(this.icon,"dragend",this.handledEvents.dragend=h.body.ondragend=function(k){if(j.protectedElement===null){return}setTimeout(function(){j.cleanCanvas();j.protectedElement=null},1)});return this},handleMouseover:function(){var j=this;a.addEvent(this.icon,"mouseover",this.handledEvents.mouseover=function(k){if(j.protectedElement!==null){return}a.stopPropagation(k).addClass(j.element,j.elementClass)});return this},handleMouseout:function(){var j=this;a.addEvent(this.icon,"mouseout",this.handledEvents.mouseout=function(k){if(j.protectedElement!==null){return}a.stopPropagation(k).removeClass(j.element,j.elementClass)});return this},handleMousemove:function(){var j=this;a.addEvent(this.medium.element,"mousemove",this.handledEvents.mousemove=function(l){l=l||e.event;var k=l.target||{};if(k.getAttribute("contenteditable")==="false"){j.show(k)}});return this},show:function(k){if(k===this.icon&&this.protectedElement===null){return}this.element=k;var j=this.icon.style,m=k.offsetLeft,l=k.offsetTop;k.dragIcon=this.icon;k.parentNode.appendChild(this.icon);j.opacity=1;j.left=m+"px";j.top=l+"px";a.show(this.icon)},cleanCanvas:function(){var l,j=false,k=this.element.getElementsByClassName(this.buttonClass);this.icon.style.opacity=1;while(k.length>0){if(a.isVisible(l=k[0])){if(!j){l.parentNode.insertBefore(this.element,l);j=true}a.detachNode(l)}}a.detachNode(this.icon)}}})(d);(function(i){i.Element=function(k,l,j){this.medium=k;this.element=k.element;switch(l.toLowerCase()){case"bold":this.tagName="b";break;case"italic":this.tagName="i";break;case"underline":this.tagName="u";break;default:this.tagName=l}this.attributes=j||{};this.clean=true};i.Element.prototype={invoke:function(n){if(i.activeElement===this.element){if(n){n.apply(this)}var j=this.attributes,m=this.tagName.toLowerCase(),l,k;if(j.className!==undefined){k=(j.className.split[" "]||[j.className]).shift();delete j.className}else{k="medium-"+m}l=g.createClassApplier(k,{elementTagName:m,elementAttributes:this.attributes});this.medium.makeUndoable();l.toggleSelection(e);if(this.clean){this.medium.clean();this.medium.placeholders()}}},setClean:function(j){this.clean=j;return this}}})(d);(function(i){i.Html=function(j,k){this.html=k;this.medium=j;this.clean=true;this.injector=new i.Injector()};i.Html.prototype={insert:function(l,k){if(i.activeElement===this.medium.element){if(l){l.apply(this)}var j=this.injector.inject(this.html,k);if(this.clean){this.medium.clean();this.medium.placeholders()}this.medium.makeUndoable();return j}else{return null}},setClean:function(j){this.clean=j;return this}}})(d);(function(i){i.Injector=function(){};i.Injector.prototype={inject:function(l){var k=[],n,j=false;if(typeof l==="string"){var q=h.createElement("div");q.innerHTML=l;n=q.childNodes;j=true}else{n=l}this.insertHTML('');var p=h.getElementById("Medium-wedge"),o=p.parentNode,m=0;p.removeAttribute("id");if(j){while(m0){o.insertBefore(n[0],p)}}else{k.push(n);o.insertBefore(n,p)}o.removeChild(p);p=null;return k},insertHTML:function(p,r){var l,q;if(e.getSelection){l=e.getSelection();if(l.getRangeAt&&l.rangeCount){q=l.getRangeAt(0);q.deleteContents();var m=h.createElement("div");m.innerHTML=p;var s=h.createDocumentFragment(),n,k;while((n=m.firstChild)){k=s.appendChild(n)}var j=s.firstChild;q.insertNode(s);if(k){q=q.cloneRange();q.setStartAfter(k);if(r){q.setStartBefore(j)}else{q.collapse(true)}l.removeAllRanges();l.addRange(q)}}}else{if((l=h.selection)&&l.type!="Control"){var o=l.createRange();o.collapse(true);l.createRange().pasteHTML(p);if(r){q=l.createRange();q.setEndPoint("StartToStart",o);q.select()}}}}}})(d);(function(i){i.Selection=function(){};i.Selection.prototype={saveSelection:function(){if(e.getSelection){var j=e.getSelection();if(j.rangeCount>0){return j.getRangeAt(0)}}else{if(h.selection&&h.selection.createRange){return h.selection.createRange()}}return null},restoreSelection:function(j){if(j){if(e.getSelection){var k=e.getSelection();k.removeAllRanges();k.addRange(j)}else{if(h.selection&&j.select){j.select()}}}}}})(d);(function(i){i.Toolbar=function(j,l){this.medium=j;var k=h.createElement("div");k.innerHTML=this.html;this.buttons=l;this.element=k.children[0];h.body.appendChild(this.element);this.active=false;this.busy=true;this.handledEvents={scroll:null,mouseup:null,keyup:null}};i.Toolbar.prototype={fixedClass:"Medium-toolbar-fixed",showClass:"Medium-toolbar-show",hideClass:"Medium-toolbar-hide",html:'
',setup:function(){this.handleScroll().handleMouseup().handleKeyup()},destroy:function(){a.removeEvent(e,"scroll",this.handledEvents.scroll).removeEvent(h,"mouseup",this.handledEvents.mouseup).removeEvent(h,"keyup",this.handledEvents.keyup)},handleScroll:function(){var j=this;a.addEvent(e,"scroll",this.handledEvents.scroll=function(){if(j.active){j.goToSelection()}});return this},handleMouseup:function(){var j=this;a.addEvent(h,"mouseup",this.handledEvents.mouseup=function(){if(i.activeElement===j.medium.element&&!j.busy){j.goToSelection()}});return this},handleKeyup:function(){var j=this;a.addEvent(h,"keyup",this.handledEvents.keyup=function(){if(i.activeElement===j.medium.element&&!j.busy){j.goToSelection()}});return this},goToSelection:function(){var l=this.getHighlighted(),m=l.boundary.top-5,k=this.element,j=k.style;if(e.scrollTop>0){a.addClass(k,this.fixedClass)}else{a.removeClass(k,this.fixedClass)}if(l!==null){if(l.range.startOffset===l.range.endOffset&&!l.text){a.removeClass(k,this.showClass).addClass(k,this.hideClass);this.active=false}else{a.removeClass(k,this.hideClass).removeClass(k,this.showClass);j.opacity=0.01;a.addClass(k,this.showClass);j.opacity=1;j.top=(m-65)+"px";j.left=((l.boundary.left+(l.boundary.width/2))-(k.clientWidth/2))+"px";this.active=true}}},getHighlighted:function(){var k=e.getSelection(),j=(k.anchorNode?k.getRangeAt(0):false);if(!j){return null}return{selection:k,range:j,text:a.trim(j.toString()),boundary:j.getBoundingClientRect()}}}})(d);(function(i){i.Undoable=function(m){var p=this,n=m.settings.element,q,l,j=new Undo.Stack(),o=Undo.Command.extend({constructor:function(r,s){this.oldValue=r;this.newValue=s},execute:function(){},undo:function(){n.innerHTML=this.oldValue;m.canUndo=j.canUndo();m.canRedo=j.canRedo();m.dirty=j.dirty()},redo:function(){n.innerHTML=this.newValue;m.canUndo=j.canUndo();m.canRedo=j.canRedo();m.dirty=j.dirty()}}),k=function(s){var r=n.innerHTML;if(s){l=n.innerHTML;j.execute(new o(l,l))}else{if(r!=l){if(!p.movingThroughStack){j.execute(new o(l,r));l=r;m.dirty=j.dirty()}a.triggerEvent(m.settings.element,"change")}}};this.medium=m;this.timer=q;this.stack=j;this.makeUndoable=k;this.EditCommand=o;this.movingThroughStack=false;a.addEvent(n,"keyup",function(r){if(r.ctrlKey||r.keyCode===f.z){a.preventDefaultEvent(r);return}clearTimeout(q);q=setTimeout(function(){k()},250)}).addEvent(n,"keydown",function(r){if(!r.ctrlKey||r.keyCode!==f.z){p.movingThroughStack=false;return}a.preventDefaultEvent(r);p.movingThroughStack=true;if(r.shiftKey){j.canRedo()&&j.redo()}else{j.canUndo()&&j.undo()}})}})(d);(function(i){i.Utilities={isCommand:function(m,o,n,l){if((m.modifier==="ctrl"&&o.ctrlKey)||(m.modifier==="cmd"&&o.metaKey)||(m.modifier==="auto"&&(o.ctrlKey||o.metaKey))){return n.call()}else{return l.call()}},isShift:function(n,m,l){if(n.shiftKey){return m.call()}else{return l.call()}},isModifier:function(m,o,l){var n=m.modifiers[o.keyCode];if(n){return l.call(null,n)}return false},special:(function(){var l={};l[f.backspace]=true;l[f.shift]=true;l[f.ctrl]=true;l[f.alt]=true;l[f["delete"]]=true;l[f.cmd]=true;return l})(),isSpecial:function(l){return typeof i.Utilities.special[l.keyCode]!=="undefined"},navigational:(function(){var l={};l[f.upArrow]=true;l[f.downArrow]=true;l[f.leftArrow]=true;l[f.rightArrow]=true;return l})(),isNavigational:function(l){return typeof i.Utilities.navigational[l.keyCode]!=="undefined"},addEvents:function(p,q,r){var o=0,n,s=q.split(" "),l=s.length,m=i.Utilities;for(;o0){m.addEvent(p,n,r)}}return i.Utilities},addEvent:function j(m,l,n){if(m.addEventListener){m.addEventListener(l,n,false)}else{if(m.attachEvent){m.attachEvent("on"+l,n)}else{m["on"+l]=n}}return i.Utilities},removeEvent:function k(m,l,n){if(m.removeEventListener){m.removeEventListener(l,n,false)}else{if(m.detachEvent){m.detachEvent("on"+l,n)}else{m["on"+l]=null}}return i.Utilities},preventDefaultEvent:function(l){if(l.preventDefault){l.preventDefault()}else{l.returnValue=false}return i.Utilities},stopPropagation:function(l){l=l||window.event;l.cancelBubble=true;if(l.stopPropagation!==undefined){l.stopPropagation()}return i.Utilities},isEventSupported:function(n,l){l="on"+l;var o=h.createElement(n.tagName),m=(l in o);if(!m){o.setAttribute(l,"return;");m=typeof o[l]=="function"}o=null;return m},triggerEvent:function(m,l){var n;if(h.createEvent){n=h.createEvent("HTMLEvents");n.initEvent(l,true,true);n.eventName=l;m.dispatchEvent(n)}else{n=h.createEventObject();m.fireEvent("on"+l,n)}return i.Utilities},deepExtend:function(l,o){var n,m;for(n in o){if(o.hasOwnProperty(n)){m=o[n];if(m!==undefined&&m!==null&&m.constructor!==undefined&&m.constructor===Object){l[n]=l[n]||{};i.Utilities.deepExtend(l[n],m)}else{l[n]=m}}}return l},pasteHook:function(x,t){x.makeUndoable();var p=h.createElement("div"),m=x.element,w,n,q,y=x.settings,u,r=h.body,v=r.parentNode,l=v.scrollTop,o=v.scrollLeft;p.className=y.cssClasses.pasteHook;p.setAttribute("contenteditable",true);r.appendChild(p);a.selectNode(p);v.scrollTop=l;v.scrollLeft=o;setTimeout(function(){u=a.text(p);m.focus();if(y.maxLength>0){w=a.text(m);n=w.length;q=n+u.length;if(q>n){u=u.substring(0,y.maxLength-n)}}a.detachNode(p);v.scrollTop=l;v.scrollLeft=o;t(u)},0);return i.Utilities},traverseAll:function(o,l,r){var n=o.childNodes,q=n.length,m=0,p;r=r||1;l=l||{};if(q>0){for(;m=1.3.0-alpha.20140827", + "rangy": ">=1.3.0", "undo.js": ">=0.1.0" }, "keywords": ["editor", "wysiwyg", "contenteditable", "content", "medium", "medium.com"], diff --git a/src/Medium/Drag.js b/src/Medium/Drag.js index d703423..cd5439f 100644 --- a/src/Medium/Drag.js +++ b/src/Medium/Drag.js @@ -158,7 +158,7 @@ cleanCanvas: function() { var target, inserted = false, - buttons = d.getElementsByClassName(this.buttonClass); + buttons = this.element.getElementsByClassName(this.buttonClass); this.icon.style.opacity = 1; diff --git a/src/Medium/Injector.js b/src/Medium/Injector.js index 5498a3e..5cca7c6 100644 --- a/src/Medium/Injector.js +++ b/src/Medium/Injector.js @@ -45,7 +45,7 @@ } while (html.length > 0) { - parent.insertBefore(html[html.length - 1], wedge); + parent.insertBefore(html[0], wedge); } } else { nodes.push(html);