All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.bower_components.textAngular.dist.textAngular.umd.min.js Maven / Gradle / Ivy

(function(root,factory){if(typeof define==="function"&&define.amd){define("textAngular",["rangy","rangy/lib/rangy-selectionsaverestore"],function(a0,b1){return root["textAngular.name"]=factory(a0,b1)})}else if(typeof exports==="object"){module.exports=factory(require("rangy"),require("rangy/lib/rangy-selectionsaverestore"))}else{root["textAngular"]=factory(rangy)}})(this,function(rangy){function validElementString(string){try{return angular.element(string).length!==0}catch(any){return false}}var taTools={};function registerTextAngularTool(name,toolDefinition){if(!name||name===""||taTools.hasOwnProperty(name))throw"textAngular Error: A unique name is required for a Tool Definition";if(toolDefinition.display&&(toolDefinition.display===""||!validElementString(toolDefinition.display))||!toolDefinition.display&&!toolDefinition.buttontext&&!toolDefinition.iconclass)throw'textAngular Error: Tool Definition for "'+name+'" does not have a valid display/iconclass/buttontext value';taTools[name]=toolDefinition}angular.module("textAngularSetup",[]).constant("taRegisterTool",registerTextAngularTool).value("taTools",taTools).value("taOptions",{forceTextAngularSanitize:true,keyMappings:[],toolbar:[["h1","h2","h3","h4","h5","h6","p","pre","quote"],["bold","italics","underline","strikeThrough","ul","ol","redo","undo","clear"],["justifyLeft","justifyCenter","justifyRight","justifyFull","indent","outdent"],["html","insertImage","insertLink","insertVideo","wordcount","charcount"]],classes:{focussed:"focussed",toolbar:"btn-toolbar",toolbarGroup:"btn-group",toolbarButton:"btn btn-default",toolbarButtonActive:"active",disabled:"disabled",textEditor:"form-control",htmlEditor:"form-control"},defaultTagAttributes:{a:{target:""}},setup:{textEditorSetup:function($element){},htmlEditorSetup:function($element){}},defaultFileDropHandler:function(file,insertAction){var reader=new FileReader;if(file.type.substring(0,5)==="image"){reader.onload=function(){if(reader.result!=="")insertAction("insertImage",reader.result,true)};reader.readAsDataURL(file);return true}return false}}).value("taSelectableElements",["a","img"]).value("taCustomRenderers",[{selector:"img",customAttribute:"ta-insert-video",renderLogic:function(element){var iframe=angular.element("");var attributes=element.prop("attributes");angular.forEach(attributes,function(attr){iframe.attr(attr.name,attr.value)});iframe.attr("src",iframe.attr("ta-insert-video"));element.replaceWith(iframe)}}]).value("taTranslations",{html:{tooltip:"Toggle html / Rich Text"},heading:{tooltip:"Heading "},p:{tooltip:"Paragraph"},pre:{tooltip:"Preformatted text"},ul:{tooltip:"Unordered List"},ol:{tooltip:"Ordered List"},quote:{tooltip:"Quote/unquote selection or paragraph"},undo:{tooltip:"Undo"},redo:{tooltip:"Redo"},bold:{tooltip:"Bold"},italic:{tooltip:"Italic"},underline:{tooltip:"Underline"},strikeThrough:{tooltip:"Strikethrough"},justifyLeft:{tooltip:"Align text left"},justifyRight:{tooltip:"Align text right"},justifyFull:{tooltip:"Justify text"},justifyCenter:{tooltip:"Center"},indent:{tooltip:"Increase indent"},outdent:{tooltip:"Decrease indent"},clear:{tooltip:"Clear formatting"},insertImage:{dialogPrompt:"Please enter an image URL to insert",tooltip:"Insert image",hotkey:"the - possibly language dependent hotkey ... for some future implementation"},insertVideo:{tooltip:"Insert video",dialogPrompt:"Please enter a youtube URL to embed"},insertLink:{tooltip:"Insert / edit link",dialogPrompt:"Please enter a URL to insert"},editLink:{reLinkButton:{tooltip:"Relink"},unLinkButton:{tooltip:"Unlink"},targetToggle:{buttontext:"Open in New Window"}},wordcount:{tooltip:"Display words Count"},charcount:{tooltip:"Display characters Count"}}).factory("taToolFunctions",["$window","taTranslations",function($window,taTranslations){return{imgOnSelectAction:function(event,$element,editorScope){var finishEdit=function(){editorScope.updateTaBindtaTextElement();editorScope.hidePopover()};event.preventDefault();editorScope.displayElements.popover.css("width","375px");var container=editorScope.displayElements.popoverContainer;container.empty();var buttonGroup=angular.element('
');var fullButton=angular.element('');fullButton.on("click",function(event){event.preventDefault();$element.css({width:"100%",height:""});finishEdit()});var halfButton=angular.element('');halfButton.on("click",function(event){event.preventDefault();$element.css({width:"50%",height:""});finishEdit()});var quartButton=angular.element('');quartButton.on("click",function(event){event.preventDefault();$element.css({width:"25%",height:""});finishEdit()});var resetButton=angular.element('');resetButton.on("click",function(event){event.preventDefault();$element.css({width:"",height:""});finishEdit()});buttonGroup.append(fullButton);buttonGroup.append(halfButton);buttonGroup.append(quartButton);buttonGroup.append(resetButton);container.append(buttonGroup);buttonGroup=angular.element('
');var floatLeft=angular.element('');floatLeft.on("click",function(event){event.preventDefault();$element.css("float","left");$element.css("cssFloat","left");$element.css("styleFloat","left");finishEdit()});var floatRight=angular.element('');floatRight.on("click",function(event){event.preventDefault();$element.css("float","right");$element.css("cssFloat","right");$element.css("styleFloat","right");finishEdit()});var floatNone=angular.element('');floatNone.on("click",function(event){event.preventDefault();$element.css("float","");$element.css("cssFloat","");$element.css("styleFloat","");finishEdit()});buttonGroup.append(floatLeft);buttonGroup.append(floatNone);buttonGroup.append(floatRight);container.append(buttonGroup);buttonGroup=angular.element('
');var remove=angular.element('');remove.on("click",function(event){event.preventDefault();$element.remove();finishEdit()});buttonGroup.append(remove);container.append(buttonGroup);editorScope.showPopover($element);editorScope.showResizeOverlay($element)},aOnSelectAction:function(event,$element,editorScope){event.preventDefault();editorScope.displayElements.popover.css("width","436px");var container=editorScope.displayElements.popoverContainer;container.empty();container.css("line-height","28px");var link=angular.element(''+$element.attr("href")+"");link.css({display:"inline-block","max-width":"200px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap","vertical-align":"middle"});container.append(link);var buttonGroup=angular.element('
');var reLinkButton=angular.element('');reLinkButton.on("click",function(event){event.preventDefault();var urlLink=$window.prompt(taTranslations.insertLink.dialogPrompt,$element.attr("href"));if(urlLink&&urlLink!==""&&urlLink!=="http://"){$element.attr("href",urlLink);editorScope.updateTaBindtaTextElement()}editorScope.hidePopover()});buttonGroup.append(reLinkButton);var unLinkButton=angular.element('');unLinkButton.on("click",function(event){event.preventDefault();$element.replaceWith($element.contents());editorScope.updateTaBindtaTextElement();editorScope.hidePopover()});buttonGroup.append(unLinkButton);var targetToggle=angular.element('");if($element.attr("target")==="_blank"){targetToggle.addClass("active")}targetToggle.on("click",function(event){event.preventDefault();$element.attr("target",$element.attr("target")==="_blank"?"":"_blank");targetToggle.toggleClass("active");editorScope.updateTaBindtaTextElement()});buttonGroup.append(targetToggle);container.append(buttonGroup);editorScope.showPopover($element)},extractYoutubeVideoId:function(url){var re=/(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/i;var match=url.match(re);return match&&match[1]||null}}}]).run(["taRegisterTool","$window","taTranslations","taSelection","taToolFunctions","$sanitize","taOptions","$log",function(taRegisterTool,$window,taTranslations,taSelection,taToolFunctions,$sanitize,taOptions,$log){var gv={};$sanitize("",gv);if(taOptions.forceTextAngularSanitize===true&&gv.version!=="taSanitize"){throw angular.$$minErr("textAngular")("textAngularSetup","The textAngular-sanitize provider has been replaced by another -- have you included angular-sanitize by mistake?")}taRegisterTool("html",{iconclass:"fa fa-code",tooltiptext:taTranslations.html.tooltip,action:function(){this.$editor().switchView()},activeState:function(){return this.$editor().showHtml}});var _retActiveStateFunction=function(q){return function(){return this.$editor().queryFormatBlockState(q)}};var headerAction=function(){return this.$editor().wrapSelection("formatBlock","<"+this.name.toUpperCase()+">")};angular.forEach(["h1","h2","h3","h4","h5","h6"],function(h){taRegisterTool(h.toLowerCase(),{buttontext:h.toUpperCase(),tooltiptext:taTranslations.heading.tooltip+h.charAt(1),action:headerAction,activeState:_retActiveStateFunction(h.toLowerCase())})});taRegisterTool("p",{buttontext:"P",tooltiptext:taTranslations.p.tooltip,action:function(){return this.$editor().wrapSelection("formatBlock","

")},activeState:function(){return this.$editor().queryFormatBlockState("p")}});taRegisterTool("pre",{buttontext:"pre",tooltiptext:taTranslations.pre.tooltip,action:function(){return this.$editor().wrapSelection("formatBlock","

")},activeState:function(){return this.$editor().queryFormatBlockState("pre")}});taRegisterTool("ul",{iconclass:"fa fa-list-ul",tooltiptext:taTranslations.ul.tooltip,action:function(){return this.$editor().wrapSelection("insertUnorderedList",null)},activeState:function(){return this.$editor().queryCommandState("insertUnorderedList")}});taRegisterTool("ol",{iconclass:"fa fa-list-ol",tooltiptext:taTranslations.ol.tooltip,action:function(){return this.$editor().wrapSelection("insertOrderedList",null)},activeState:function(){return this.$editor().queryCommandState("insertOrderedList")}});taRegisterTool("quote",{iconclass:"fa fa-quote-right",tooltiptext:taTranslations.quote.tooltip,action:function(){return this.$editor().wrapSelection("formatBlock","
")},activeState:function(){return this.$editor().queryFormatBlockState("blockquote")}});taRegisterTool("undo",{iconclass:"fa fa-undo",tooltiptext:taTranslations.undo.tooltip,action:function(){return this.$editor().wrapSelection("undo",null)}});taRegisterTool("redo",{iconclass:"fa fa-repeat",tooltiptext:taTranslations.redo.tooltip,action:function(){return this.$editor().wrapSelection("redo",null)}});taRegisterTool("bold",{iconclass:"fa fa-bold",tooltiptext:taTranslations.bold.tooltip,action:function(){return this.$editor().wrapSelection("bold",null)},activeState:function(){return this.$editor().queryCommandState("bold")},commandKeyCode:98});taRegisterTool("justifyLeft",{iconclass:"fa fa-align-left",tooltiptext:taTranslations.justifyLeft.tooltip,action:function(){return this.$editor().wrapSelection("justifyLeft",null)},activeState:function(commonElement){if(commonElement&&commonElement.nodeName==="#document")return false;var result=false;if(commonElement){try{result=commonElement.css("text-align")==="left"||commonElement.attr("align")==="left"||commonElement.css("text-align")!=="right"&&commonElement.css("text-align")!=="center"&&commonElement.css("text-align")!=="justify"&&!this.$editor().queryCommandState("justifyRight")&&!this.$editor().queryCommandState("justifyCenter")&&!this.$editor().queryCommandState("justifyFull")}catch(e){result=false}}result=result||this.$editor().queryCommandState("justifyLeft");return result}});taRegisterTool("justifyRight",{iconclass:"fa fa-align-right",tooltiptext:taTranslations.justifyRight.tooltip,action:function(){return this.$editor().wrapSelection("justifyRight",null)},activeState:function(commonElement){if(commonElement&&commonElement.nodeName==="#document")return false;var result=false;if(commonElement){try{result=commonElement.css("text-align")==="right"}catch(e){result=false}}result=result||this.$editor().queryCommandState("justifyRight");return result}});taRegisterTool("justifyFull",{iconclass:"fa fa-align-justify",tooltiptext:taTranslations.justifyFull.tooltip,action:function(){return this.$editor().wrapSelection("justifyFull",null)},activeState:function(commonElement){var result=false;if(commonElement){try{result=commonElement.css("text-align")==="justify"}catch(e){result=false}}result=result||this.$editor().queryCommandState("justifyFull");return result}});taRegisterTool("justifyCenter",{iconclass:"fa fa-align-center",tooltiptext:taTranslations.justifyCenter.tooltip,action:function(){return this.$editor().wrapSelection("justifyCenter",null)},activeState:function(commonElement){if(commonElement&&commonElement.nodeName==="#document")return false;var result=false;if(commonElement){try{result=commonElement.css("text-align")==="center"}catch(e){result=false}}result=result||this.$editor().queryCommandState("justifyCenter");return result}});taRegisterTool("indent",{iconclass:"fa fa-indent",tooltiptext:taTranslations.indent.tooltip,action:function(){return this.$editor().wrapSelection("indent",null)},activeState:function(){return this.$editor().queryFormatBlockState("blockquote")},commandKeyCode:"TabKey"});taRegisterTool("outdent",{iconclass:"fa fa-outdent",tooltiptext:taTranslations.outdent.tooltip,action:function(){return this.$editor().wrapSelection("outdent",null)},activeState:function(){return false},commandKeyCode:"ShiftTabKey"});taRegisterTool("italics",{iconclass:"fa fa-italic",tooltiptext:taTranslations.italic.tooltip,action:function(){return this.$editor().wrapSelection("italic",null)},activeState:function(){return this.$editor().queryCommandState("italic")},commandKeyCode:105});taRegisterTool("underline",{iconclass:"fa fa-underline",tooltiptext:taTranslations.underline.tooltip,action:function(){return this.$editor().wrapSelection("underline",null)},activeState:function(){return this.$editor().queryCommandState("underline")},commandKeyCode:117});taRegisterTool("strikeThrough",{iconclass:"fa fa-strikethrough",tooltiptext:taTranslations.strikeThrough.tooltip,action:function(){return this.$editor().wrapSelection("strikeThrough",null)},activeState:function(){return document.queryCommandState("strikeThrough")}});taRegisterTool("clear",{iconclass:"fa fa-ban",tooltiptext:taTranslations.clear.tooltip,action:function(deferred,restoreSelection){var i,selectedElements,elementsSeen;this.$editor().wrapSelection("removeFormat",null);var possibleNodes=angular.element(taSelection.getSelectionElement());selectedElements=taSelection.getAllSelectedElements();var removeListElements=function(list,pe){list=angular.element(list);var prevElement=pe;if(!pe){prevElement=list}angular.forEach(list.children(),function(liElem){if(liElem.tagName.toLowerCase()==="ul"||liElem.tagName.toLowerCase()==="ol"){prevElement=removeListElements(liElem,prevElement)}else{var newElem=angular.element("

");newElem.html(angular.element(liElem).html());prevElement.after(newElem);prevElement=newElem}});list.remove();return prevElement};angular.forEach(selectedElements,function(element){if(element.nodeName.toLowerCase()==="ul"||element.nodeName.toLowerCase()==="ol"){removeListElements(element)}});angular.forEach(possibleNodes.find("ul"),removeListElements);angular.forEach(possibleNodes.find("ol"),removeListElements);var $editor=this.$editor();var recursiveRemoveClass=function(node){node=angular.element(node);if(node[0]!==$editor.displayElements.text[0]){node.removeAttr("class")}angular.forEach(node.children(),recursiveRemoveClass)};angular.forEach(possibleNodes,recursiveRemoveClass);if(possibleNodes[0]&&possibleNodes[0].tagName.toLowerCase()!=="li"&&possibleNodes[0].tagName.toLowerCase()!=="ol"&&possibleNodes[0].tagName.toLowerCase()!=="ul"&&possibleNodes[0].getAttribute("contenteditable")!=="true"){this.$editor().wrapSelection("formatBlock","default")}restoreSelection()}});var blockJavascript=function(link){if(link.toLowerCase().indexOf("javascript")!==-1){return true}return false};taRegisterTool("insertImage",{iconclass:"fa fa-picture-o",tooltiptext:taTranslations.insertImage.tooltip,action:function(){var imageLink;imageLink=$window.prompt(taTranslations.insertImage.dialogPrompt,"http://");if(imageLink&&imageLink!==""&&imageLink!=="http://"){if(!blockJavascript(imageLink)){if(taSelection.getSelectionElement().tagName&&taSelection.getSelectionElement().tagName.toLowerCase()==="a"){taSelection.setSelectionAfterElement(taSelection.getSelectionElement())}var embed='';return this.$editor().wrapSelection("insertHTML",embed,true)}}},onElementSelect:{element:"img",action:taToolFunctions.imgOnSelectAction}});taRegisterTool("insertVideo",{iconclass:"fa fa-youtube-play",tooltiptext:taTranslations.insertVideo.tooltip,action:function(){var urlPrompt;urlPrompt=$window.prompt(taTranslations.insertVideo.dialogPrompt,"https://");if(!blockJavascript(urlPrompt)){if(urlPrompt&&urlPrompt!==""&&urlPrompt!=="https://"){videoId=taToolFunctions.extractYoutubeVideoId(urlPrompt);if(videoId){var urlLink="https://www.youtube.com/embed/"+videoId;var embed='';if(taSelection.getSelectionElement().tagName&&taSelection.getSelectionElement().tagName.toLowerCase()==="a"){taSelection.setSelectionAfterElement(taSelection.getSelectionElement())}return this.$editor().wrapSelection("insertHTML",embed,true)}}}},onElementSelect:{element:"img",onlyWithAttrs:["ta-insert-video"],action:taToolFunctions.imgOnSelectAction}});taRegisterTool("insertLink",{tooltiptext:taTranslations.insertLink.tooltip,iconclass:"fa fa-link",action:function(){var urlLink;if(taSelection.getSelectionElement().tagName&&taSelection.getSelectionElement().tagName.toLowerCase()==="a"){urlLink=$window.prompt(taTranslations.insertLink.dialogPrompt,taSelection.getSelectionElement().href)}else{urlLink=$window.prompt(taTranslations.insertLink.dialogPrompt,"http://")}if(urlLink&&urlLink!==""&&urlLink!=="http://"){if(!blockJavascript(urlLink)){return this.$editor().wrapSelection("createLink",urlLink,true)}}},activeState:function(commonElement){if(commonElement)return commonElement[0].tagName==="A";return false},onElementSelect:{element:"a",action:taToolFunctions.aOnSelectAction}});taRegisterTool("wordcount",{display:'
Words:
',disabled:true,wordcount:0,activeState:function(){var textElement=this.$editor().displayElements.text;var workingHTML=textElement[0].innerHTML||"";var noOfWords=0;if(workingHTML.replace(/\s*<[^>]*?>\s*/g,"")!==""){if(workingHTML.trim()!==""){noOfWords=workingHTML.replace(/<\/?(b|i|em|strong|span|u|strikethrough|a|img|small|sub|sup|label)( [^>*?])?>/gi,"").replace(/(<[^>]*?>\s*<[^>]*?>)/gi," ").replace(/(<[^>]*?>)/gi,"").replace(/\s+/gi," ").match(/\S+/g).length}}this.wordcount=noOfWords;this.$editor().wordcount=noOfWords;return false}});taRegisterTool("charcount",{display:'
Characters:
',disabled:true,charcount:0,activeState:function(){var textElement=this.$editor().displayElements.text;var sourceText=textElement[0].innerText||textElement[0].textContent;var noOfChars=sourceText.replace(/(\r\n|\n|\r)/gm,"").replace(/^\s+/g," ").replace(/\s+$/g," ").length;this.charcount=noOfChars;this.$editor().charcount=noOfChars;return false}})}]);"use strict";var textAngularVersion="v1.5.16";var _browserDetect={ie:function(){var undef,v=3,div=document.createElement("div"),all=div.getElementsByTagName("i");while(div.innerHTML="\x3c!--[if gt IE "+ ++v+"]>4?v:undef}(),webkit:/AppleWebKit\/([\d.]+)/i.test(navigator.userAgent),isFirefox:navigator.userAgent.toLowerCase().indexOf("firefox")>-1};var performance=performance||{};performance.now=function(){return performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow||function(){return(new Date).getTime()}}();function stripHtmlToText(html){var tmp=document.createElement("DIV");tmp.innerHTML=html;var res=tmp.textContent||tmp.innerText||"";res.replace("​","");res=res.trim();return res}function getDomFromHtml(html){var tmp=document.createElement("DIV");tmp.innerHTML=html;return tmp}var BLOCKELEMENTS=/^(address|article|aside|audio|blockquote|canvas|center|dd|div|dl|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|noscript|ol|output|p|pre|section|table|tfoot|ul|video)$/i;var LISTELEMENTS=/^(ul|li|ol)$/i;var VALIDELEMENTS=/^(#text|span|address|article|aside|audio|blockquote|canvas|center|dd|div|dl|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|noscript|ol|output|p|pre|section|table|tfoot|ul|video|li)$/i;if(!String.prototype.trim){String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}var sheet,addCSSRule,removeCSSRule,_addCSSRule,_removeCSSRule,_getRuleIndex;if(_browserDetect.ie>8||_browserDetect.ie===undefined){var _sheets=document.styleSheets;for(var i=0;i<_sheets.length;i++){if(_sheets[i].media.length===0||_sheets[i].media.mediaText.match(/(all|screen)/gi)){if(_sheets[i].href){if(_sheets[i].href.match(/textangular\.(min\.|)css/gi)){sheet=_sheets[i];break}}}}if(!sheet){sheet=function(){var style=document.createElement("style");if(_browserDetect.webkit)style.appendChild(document.createTextNode(""));document.getElementsByTagName("head")[0].appendChild(style);return style.sheet}()}addCSSRule=function(selector,rules){return _addCSSRule(sheet,selector,rules)};_addCSSRule=function(_sheet,selector,rules){var insertIndex;var insertedRule;if(_sheet.cssRules)insertIndex=Math.max(_sheet.cssRules.length-1,0);else if(_sheet.rules)insertIndex=Math.max(_sheet.rules.length-1,0);if(_sheet.insertRule){_sheet.insertRule(selector+"{"+rules+"}",insertIndex)}else{_sheet.addRule(selector,rules,insertIndex)}if(sheet.rules)insertedRule=sheet.rules[insertIndex];else if(sheet.cssRules)insertedRule=sheet.cssRules[insertIndex];return insertedRule};_getRuleIndex=function(rule,rules){var i,ruleIndex;for(i=0;i
");element[0].innerHTML=val;angular.forEach(taCustomRenderers,function(renderer){var elements=[];if(renderer.selector&&renderer.selector!=="")elements=element.find(renderer.selector);else if(renderer.customAttribute&&renderer.customAttribute!=="")elements=taDOM.getByAttribute(element,renderer.customAttribute);angular.forEach(elements,function(_element){_element=angular.element(_element);if(renderer.selector&&renderer.selector!==""&&renderer.customAttribute&&renderer.customAttribute!==""){if(_element.attr(renderer.customAttribute)!==undefined)renderer.renderLogic(_element)}else renderer.renderLogic(_element)})});return element[0].innerHTML}}]).factory("taFixChrome",function(){var taFixChrome=function(html,keepStyles){if(!html||!angular.isString(html)||html.length<=0)return html;var betterSpanMatch=/style\s?=\s?(["'])(?:(?=(\\?))\2.)*?\1/gi;var spanMatch=/<([^>\/]+?)style=("([^\"]+)"|'([^']+)')([^>]*)>/gi;var appleConvertedSpaceMatch=/([^<]+)<\/span>/gi;var match,styleVal,appleSpaceVal,newTag,finalHtml="",lastIndex=0;while(match=appleConvertedSpaceMatch.exec(html)){appleSpaceVal=match[1];appleSpaceVal=appleSpaceVal.replace(/ /gi," ");finalHtml+=html.substring(lastIndex,match.index)+appleSpaceVal;lastIndex=match.index+match[0].length}if(lastIndex){finalHtml+=html.substring(lastIndex);html=finalHtml;finalHtml="";lastIndex=0}if(!keepStyles){while(match=betterSpanMatch.exec(html)){finalHtml+=html.substring(lastIndex,match.index-1);styleVal=match[0];match=/font-family: inherit;|line-height: 1.[0-9]{3,12};|color: inherit; line-height: 1.1;|color: rgb\(\d{1,3}, \d{1,3}, \d{1,3}\);|background-color: rgb\(\d{1,3}, \d{1,3}, \d{1,3}\);/gi.exec(styleVal);if(match){styleVal=styleVal.replace(/( |)font-family: inherit;|( |)line-height: 1.[0-9]{3,12};|( |)color: inherit;|( |)color: rgb\(\d{1,3}, \d{1,3}, \d{1,3}\);|( |)background-color: rgb\(\d{1,3}, \d{1,3}, \d{1,3}\);/gi,"");if(styleVal.length>8){finalHtml+=" "+styleVal}}else{finalHtml+=" "+styleVal}lastIndex=betterSpanMatch.lastIndex}finalHtml+=html.substring(lastIndex)}if(lastIndex>0){var fe=finalHtml.replace(/(.*?)<\/span>(|)/gi,"$1");return fe}else return html};return taFixChrome}).factory("taSanitize",["$sanitize",function taSanitizeFactory($sanitize){var convert_infos=[{property:"font-weight",values:["bold"],tag:"b"},{property:"font-style",values:["italic"],tag:"i"}];var styleMatch=[];for(var i=0;i0)_partialStyle+="|";_partialStyle+=convert_infos[i].values[j]}_partialStyle+=");)";styleMatch.push(_partialStyle)}var styleRegexString="("+styleMatch.join("|")+")";function wrapNested(html,wrapTag){var depth=0;var lastIndex=0;var match;var tagRegex=/<[^>]*>/gi;while(match=tagRegex.exec(html)){lastIndex=match.index;if(match[0].substr(1,1)==="/"){if(depth===0)break;else depth--}else depth++}return wrapTag+html.substring(0,lastIndex)+angular.element(wrapTag)[0].outerHTML.substring(wrapTag.length)+html.substring(lastIndex)}function transformLegacyStyles(html){if(!html||!angular.isString(html)||html.length<=0)return html;var i;var styleElementMatch=/<([^>\/]+?)style=("([^"]+)"|'([^']+)')([^>]*)>/gi;var match,subMatch,styleVal,newTag,lastNewTag="",newHtml,finalHtml="",lastIndex=0;while(match=styleElementMatch.exec(html)){styleVal=match[3]||match[4];var styleRegex=new RegExp(styleRegexString,"i");if(angular.isString(styleVal)&&styleRegex.test(styleVal)){newTag="";var styleRegexExec=new RegExp(styleRegexString,"ig");while(subMatch=styleRegexExec.exec(styleVal)){for(i=0;i"}}}newHtml=transformLegacyStyles(html.substring(lastIndex,match.index));if(lastNewTag.length>0){finalHtml+=wrapNested(newHtml,lastNewTag)}else finalHtml+=newHtml;styleVal=styleVal.replace(new RegExp(styleRegexString,"ig"),"");finalHtml+="<"+match[1].trim();if(styleVal.length>0)finalHtml+=' style="'+styleVal+'"';finalHtml+=match[5]+">";lastIndex=match.index+match[0].length;lastNewTag=newTag}}if(lastNewTag.length>0){finalHtml+=wrapNested(html.substring(lastIndex),lastNewTag)}else finalHtml+=html.substring(lastIndex);return finalHtml}function transformLegacyAttributes(html){if(!html||!angular.isString(html)||html.length<=0)return html;var attrElementMatch=/<([^>\/]+?)align=("([^"]+)"|'([^']+)')([^>]*)>/gi;var match,finalHtml="",lastIndex=0;while(match=attrElementMatch.exec(html)){finalHtml+=html.substring(lastIndex,match.index);lastIndex=match.index+match[0].length;var newTag="<"+match[1]+match[5];if(/style=("([^"]+)"|'([^']+)')/gi.test(newTag)){newTag=newTag.replace(/style=("([^"]+)"|'([^']+)')/i,'style="$2$3 text-align:'+(match[3]||match[4])+';"')}else{newTag+=' style="text-align:'+(match[3]||match[4])+';"'}newTag+=">";finalHtml+=newTag}return finalHtml+html.substring(lastIndex)}var rsb1=new RegExp(/[^<>]+?<\/span>/gi);var rsb2=new RegExp(/[^<>]+?<\/span>/gi);var rsb3=new RegExp(/[^<>]+?<\/span>/gi);return function taSanitize(unsafe,oldsafe,ignore){if(!ignore){try{unsafe=transformLegacyStyles(unsafe)}catch(e){}}unsafe=transformLegacyAttributes(unsafe);if(unsafe){try{unsafe=unsafe.replace(rsb1,"");unsafe=unsafe.replace(rsb2,"");unsafe=unsafe.replace(rsb1,"");unsafe=unsafe.replace(rsb3,"")}catch(e){}}var safe;try{safe=$sanitize(unsafe);if(ignore)safe=unsafe}catch(e){safe=oldsafe||""}var _preTags=safe.match(/(]*>.*?<\/pre[^>]*>)/gi);var processedSafe=safe.replace(/(&#(9|10);)*/gi,"");var re=/]*>.*?<\/pre[^>]*>/gi;var index=0;var lastIndex=0;var origTag;safe="";while((origTag=re.exec(processedSafe))!==null&&index<_preTags.length){safe+=processedSafe.substring(lastIndex,origTag.index)+_preTags[index];lastIndex=origTag.index+origTag[0].length;index++}return safe+processedSafe.substring(lastIndex)}}]).factory("taToolExecuteAction",["$q","$log",function($q,$log){return function(editor){if(editor!==undefined)this.$editor=function(){return editor};var deferred=$q.defer(),promise=deferred.promise,_editor=this.$editor();var result;try{result=this.action(deferred,_editor.startAction());promise["finally"](function(){_editor.endAction.call(_editor)})}catch(exc){$log.error(exc)}if(result||result===undefined){deferred.resolve()}}}]);angular.module("textAngular.DOM",["textAngular.factories"]).factory("taExecCommand",["taSelection","taBrowserTag","$document",function(taSelection,taBrowserTag,$document){var listToDefault=function(listElement,defaultWrap){var $target,i;var children=listElement.find("li");for(i=children.length-1;i>=0;i--){$target=angular.element("<"+defaultWrap+">"+children[i].innerHTML+"");listElement.after($target)}listElement.remove();taSelection.setSelectionToElementEnd($target[0])};var listElementToSelfTag=function(list,listElement,selfTag,bDefault,defaultWrap){var $target,i;var priorElement;var nextElement;var children=list.find("li");var foundIndex;for(i=0;i0){priorElement=children[i-1]}if(i+1"+listElement[0].innerHTML+""}else{html+="<"+taBrowserTag(selfTag)+">";html+="
  • "+listElement[0].innerHTML+"
  • ";html+=""}$target=angular.element(html);if(!priorElement){listElement.remove();list.after(angular.element(list[0].outerHTML));list.after($target);list.remove();taSelection.setSelectionToElementEnd($target[0])}else if(!nextElement){listElement.remove();list.after($target);taSelection.setSelectionToElementEnd($target[0])}else{var p=list.parent();var html1="";var listTag=list[0].nodeName.toLowerCase();html1+="<"+listTag+">";for(i=0;i"+children[i].innerHTML+""}html1+="";var html2="";html2+="<"+listTag+">";for(i=foundIndex+1;i"+children[i].innerHTML+""}html2+="";list.after(angular.element(html2));list.after($target);list.after(angular.element(html1));list.remove();taSelection.setSelectionToElementEnd($target[0])}};var listElementsToSelfTag=function(list,listElements,selfTag,bDefault,defaultWrap){var $target,i,j,p;var priorElement;var afterElement;var children=list.find("li");var foundIndexes=[];for(i=0;i0){priorElement=children[foundIndexes[0]-1]}if(foundIndexes[listElements.length-1]+1"+listElements[j].innerHTML+"";listElements[j].remove()}}else{html+="<"+taBrowserTag(selfTag)+">";for(j=0;j"}$target=angular.element(html);if(!priorElement){list.after(angular.element(list[0].outerHTML));list.after($target);list.remove();taSelection.setSelectionToElementEnd($target[0])}else if(!afterElement){list.after($target);taSelection.setSelectionToElementEnd($target[0])}else{var html1="";var listTag=list[0].nodeName.toLowerCase();html1+="<"+listTag+">";for(i=0;i"+children[i].innerHTML+""}html1+="";var html2="";html2+="<"+listTag+">";for(i=foundIndexes[listElements.length-1]+1;i"+children[i].innerHTML+""}html2+="";list.after(angular.element(html2));list.after($target);list.after(angular.element(html1));list.remove();taSelection.setSelectionToElementEnd($target[0])}};var selectLi=function(liElement){if(/()$/i.test(liElement.innerHTML.trim()))taSelection.setSelectionBeforeElement(angular.element(liElement).find("br")[0]);else taSelection.setSelectionToElementEnd(liElement)};var listToList=function(listElement,newListTag){var $target=angular.element("<"+newListTag+">"+listElement[0].innerHTML+"");listElement.after($target);listElement.remove();selectLi($target.find("li")[0])};var childElementsToList=function(elements,listElement,newListTag){var html="";for(var i=0;i"+elements[i].innerHTML+""}var $target=angular.element("<"+newListTag+">"+html+"");listElement.after($target);listElement.remove();selectLi($target.find("li")[0])};var turnBlockIntoBlocks=function(element,options){for(var i=0;i"){return element}else{var $target=angular.element(options);$target[0].innerHTML=element.innerHTML;element.parentNode.insertBefore($target[0],element);element.parentNode.removeChild(element);return $target}};return function(taDefaultWrap,topNode){taDefaultWrap=taBrowserTag(taDefaultWrap);return function(command,showUI,options,defaultTagAttributes){var i,$target,html,_nodes,next,optionsTagName,selectedElement,ourSelection;var defaultWrapper=angular.element("<"+taDefaultWrap+">");try{if(taSelection.getSelection){ourSelection=taSelection.getSelection()}selectedElement=taSelection.getSelectionElement();var __h,_innerNode;if(selectedElement.tagName!==undefined){if(selectedElement.tagName.toLowerCase()==="div"&&/taTextElement.+/.test(selectedElement.id)&&ourSelection&&ourSelection.start&&ourSelection.start.offset===1&&ourSelection.end.offset===1){__h=selectedElement.innerHTML;if(/
    /i.test(__h)){__h=__h.replace(/
    /i,"​")}if(//i.test(__h)){__h=__h.replace(//i,"​")}if(/()+/i.test(__h)){__h=__.replace(/()+/i,"")}if(/<\/span>(<\/span>)+/i.test(__h)){__h=__.replace(/<\/span>(<\/span>)+/i,"")}if(/<\/span>/i.test(__h)){__h=__h.replace(/<\/span>/i,"")}_innerNode="
    "+__h+"
    ";selectedElement.innerHTML=_innerNode;taSelection.setSelectionToElementEnd(selectedElement.childNodes[0]);selectedElement=taSelection.getSelectionElement()}else if(selectedElement.tagName.toLowerCase()==="span"&&ourSelection&&ourSelection.start&&ourSelection.start.offset===1&&ourSelection.end.offset===1){__h=selectedElement.innerHTML;if(/
    /i.test(__h)){__h=__h.replace(/
    /i,"​")}if(//i.test(__h)){__h=__h.replace(//i,"​")}if(/()+/i.test(__h)){__h=__.replace(/()+/i,"")}if(/<\/span>(<\/span>)+/i.test(__h)){__h=__.replace(/<\/span>(<\/span>)+/i,"")}if(/<\/span>/i.test(__h)){__h=__h.replace(/<\/span>/i,"")}_innerNode="
    "+__h+"
    ";selectedElement.innerHTML=_innerNode;taSelection.setSelectionToElementEnd(selectedElement.childNodes[0]);selectedElement=taSelection.getSelectionElement()}else if(selectedElement.tagName.toLowerCase()==="p"&&ourSelection&&ourSelection.start&&ourSelection.start.offset===1&&ourSelection.end.offset===1){__h=selectedElement.innerHTML;if(/
    /i.test(__h)){__h=__h.replace(/
    /i,"​");selectedElement.innerHTML=__h}}else if(selectedElement.tagName.toLowerCase()==="li"&&ourSelection&&ourSelection.start&&ourSelection.start.offset===ourSelection.end.offset){__h=selectedElement.innerHTML;if(/
    /i.test(__h)){__h=__h.replace(/
    /i,"");selectedElement.innerHTML=__h}}}}catch(e){}if(!selectedElement){return}var $selected=angular.element(selectedElement);var tagName=selectedElement&&selectedElement.tagName&&selectedElement.tagName.toLowerCase()||"";if(command.toLowerCase()==="insertorderedlist"||command.toLowerCase()==="insertunorderedlist"){var selfTag=taBrowserTag(command.toLowerCase()==="insertorderedlist"?"ol":"ul");var selectedElements=taSelection.getOnlySelectedElements();if(selectedElements.length>1&&(tagName==="ol"||tagName==="ul")){return listElementsToSelfTag($selected,selectedElements,selfTag,selfTag===tagName,taDefaultWrap)}if(tagName===selfTag){if($selected[0].childNodes.length!==selectedElements.length&&selectedElements.length===1){$selected=angular.element(selectedElements[0]);return listElementToSelfTag($selected.parent(),$selected,selfTag,true,taDefaultWrap)}else{return listToDefault($selected,taDefaultWrap)}}else if(tagName==="li"&&$selected.parent()[0].tagName.toLowerCase()===selfTag&&$selected.parent().children().length===1){return listToDefault($selected.parent(),taDefaultWrap)}else if(tagName==="li"&&$selected.parent()[0].tagName.toLowerCase()!==selfTag&&$selected.parent().children().length===1){return listToList($selected.parent(),selfTag)}else if(tagName.match(BLOCKELEMENTS)&&!$selected.hasClass("ta-bind")){if(selectedElements.length){if($selected[0].childNodes.length!==selectedElements.length&&selectedElements.length===1){$selected=angular.element(selectedElements[0]);return listElementToSelfTag($selected.parent(),$selected,selfTag,selfTag===tagName,taDefaultWrap)}}if(tagName==="ol"||tagName==="ul"){return listToList($selected,selfTag)}else{var childBlockElements=false;angular.forEach($selected.children(),function(elem){if(elem.tagName.match(BLOCKELEMENTS)){childBlockElements=true}});if(childBlockElements){return childElementsToList($selected.children(),$selected,selfTag)}else{return childElementsToList([angular.element("
    "+selectedElement.innerHTML+"
    ")[0]],$selected,selfTag)}}}else if(tagName.match(BLOCKELEMENTS)){_nodes=taSelection.getOnlySelectedElements();if(_nodes.length===0){$target=angular.element("<"+selfTag+">
  • "+selectedElement.innerHTML+"
  • ");$selected.html("");$selected.append($target)}else if(_nodes.length===1&&(_nodes[0].tagName.toLowerCase()==="ol"||_nodes[0].tagName.toLowerCase()==="ul")){if(_nodes[0].tagName.toLowerCase()===selfTag){return listToDefault(angular.element(_nodes[0]),taDefaultWrap)}else{return listToList(angular.element(_nodes[0]),selfTag)}}else{html="";var $nodes=[];for(i=0;i<_nodes.length;i++){if(_nodes[i].nodeType!==3){var $n=angular.element(_nodes[i]);if(_nodes[i].tagName.toLowerCase()==="li")continue;else if(_nodes[i].tagName.toLowerCase()==="ol"||_nodes[i].tagName.toLowerCase()==="ul"){html+=$n[0].innerHTML}else if(_nodes[i].tagName.toLowerCase()==="span"&&(_nodes[i].childNodes[0].tagName.toLowerCase()==="ol"||_nodes[i].childNodes[0].tagName.toLowerCase()==="ul")){html+=$n[0].childNodes[0].innerHTML}else{html+="<"+taBrowserTag("li")+">"+$n[0].innerHTML+""}$nodes.unshift($n)}}$target=angular.element("<"+selfTag+">"+html+"");$nodes.pop().replaceWith($target);angular.forEach($nodes,function($node){$node.remove()})}taSelection.setSelectionToElementEnd($target[0]);return}}else if(command.toLowerCase()==="formatblock"){optionsTagName=options.toLowerCase().replace(/[<>]/gi,"");if(optionsTagName.trim()==="default"){optionsTagName=taDefaultWrap;options="<"+taDefaultWrap+">"}if(tagName==="li"){$target=$selected.parent()}else{$target=$selected}while(!$target[0].tagName||!$target[0].tagName.match(BLOCKELEMENTS)&&!$target.parent().attr("contenteditable")){$target=$target.parent();tagName=($target[0].tagName||"").toLowerCase()}if(tagName===optionsTagName){_nodes=$target.children();var hasBlock=false;for(i=0;i<_nodes.length;i++){hasBlock=hasBlock||_nodes[i].tagName.match(BLOCKELEMENTS)}if(hasBlock){$target.after(_nodes);next=$target.next();$target.remove();$target=next}else{defaultWrapper.append($target[0].childNodes);$target.after(defaultWrapper);$target.remove();$target=defaultWrapper}}else if($target.parent()[0].tagName.toLowerCase()===optionsTagName&&!$target.parent().hasClass("ta-bind")){var blockElement=$target.parent();var contents=blockElement.contents();for(i=0;i");defaultWrapper[0].innerHTML=contents[i].outerHTML;contents[i]=defaultWrapper[0]}blockElement.parent()[0].insertBefore(contents[i],blockElement[0])}blockElement.remove()}else if(tagName.match(LISTELEMENTS)){$target.wrap(options)}else{_nodes=taSelection.getOnlySelectedElements();if(_nodes.length===0){_nodes=[$target[0]]}for(i=0;i<_nodes.length;i++){if(_nodes[i].nodeType===3||!_nodes[i].tagName.match(BLOCKELEMENTS)){while(_nodes[i].nodeType===3||!_nodes[i].tagName||!_nodes[i].tagName.match(BLOCKELEMENTS)){_nodes[i]=_nodes[i].parentNode}}}_nodes=_nodes.filter(function(value,index,self){return self.indexOf(value)===index});if(_nodes.length>1){_nodes=_nodes.filter(function(value,index,self){return!(value.nodeName.toLowerCase()==="div"&&/^taTextElement/.test(value.id))})}if(angular.element(_nodes[0]).hasClass("ta-bind")){$target=angular.element(options);$target[0].innerHTML=_nodes[0].innerHTML;_nodes[0].innerHTML=$target[0].outerHTML}else if(optionsTagName==="blockquote"){html="";for(i=0;i<_nodes.length;i++){html+=_nodes[i].outerHTML}$target=angular.element(options);$target[0].innerHTML=html;_nodes[0].parentNode.insertBefore($target[0],_nodes[0]);for(i=_nodes.length-1;i>=0;i--){if(_nodes[i].parentNode)_nodes[i].parentNode.removeChild(_nodes[i])}}else if(optionsTagName==="pre"&&taSelection.getStateShiftKey()){html="";for(i=0;i<_nodes.length;i++){html+=_nodes[i].outerHTML}$target=angular.element(options);$target[0].innerHTML=html;_nodes[0].parentNode.insertBefore($target[0],_nodes[0]);for(i=_nodes.length-1;i>=0;i--){if(_nodes[i].parentNode)_nodes[i].parentNode.removeChild(_nodes[i])}}else{for(i=0;i<_nodes.length;i++){var newBlock=turnBlockIntoBlocks(_nodes[i],options);if(_nodes[i]===$target[0]){$target=angular.element(newBlock)}}}}taSelection.setSelectionToElementEnd($target[0]);$target[0].focus();return}else if(command.toLowerCase()==="createlink"){if(tagName==="a"){taSelection.getSelectionElement().href=options;return}var tagBegin='',tagEnd="",_selection=taSelection.getSelection();if(_selection.collapsed){taSelection.insertHtml(tagBegin+options+tagEnd,topNode)}else if(rangy.getSelection().getRangeAt(0).canSurroundContents()){var node=angular.element(tagBegin+tagEnd)[0];rangy.getSelection().getRangeAt(0).surroundContents(node)}return}else if(command.toLowerCase()==="inserthtml"){taSelection.insertHtml(options,topNode);return}try{$document[0].execCommand(command,showUI,options)}catch(e){}}}}]).service("taSelection",["$document","taDOM","$log",function($document,taDOM,$log){var _document=$document[0];var bShiftState;var brException=function(element,offset){if(element.tagName&&element.tagName.match(/^br$/i)&&offset===0&&!element.previousSibling){return{element:element.parentNode,offset:0}}else{return{element:element,offset:offset}}};var api={getSelection:function(){var range;try{range=rangy.getSelection().getRangeAt(0)}catch(e){return undefined}var container=range.commonAncestorContainer;var selection={start:brException(range.startContainer,range.startOffset),end:brException(range.endContainer,range.endOffset),collapsed:range.collapsed};if(container.nodeType===3){if(container.parentNode.nodeName.toLowerCase()==="div"&&/^taTextElement/.test(container.parentNode.id)){}else{container=container.parentNode}}if(container.nodeName.toLowerCase()==="div"&&/^taTextElement/.test(container.id)){selection.start.element=container.childNodes[selection.start.offset];selection.end.element=container.childNodes[selection.end.offset];selection.container=container}else{if(container.parentNode===selection.start.element||container.parentNode===selection.end.element){selection.container=container.parentNode}else{selection.container=container}}return selection},updateLeftArrowKey:function(element){var range=rangy.getSelection().getRangeAt(0);if(range&&range.collapsed){var _nodes=api.getFlattenedDom(range);if(!_nodes.findIndex)return;var _node=range.startContainer;var indexStartContainer=_nodes.findIndex(function(element,index){if(element.node===_node)return true;var _indexp=element.parents.indexOf(_node);return _indexp!==-1});var m;var nextNodeToRight;_nodes.forEach(function(n,i){n.parents.forEach(function(nn,j){})});if(indexStartContainer+1<_nodes.length){nextNodeToRight=_nodes[indexStartContainer+1].node}if(nextNodeToRight&&nextNodeToRight.textContent){m=/^\ufeff([^\ufeff]*)$/.exec(nextNodeToRight.textContent);if(m){return}}var nextNodeToLeft;if(indexStartContainer>0){nextNodeToLeft=_nodes[indexStartContainer-1].node}if(range.startOffset===0&&nextNodeToLeft){m=/^\ufeff([^\ufeff]*)$/.exec(nextNodeToLeft.textContent);if(m){api.setSelectionToElementEnd(nextNodeToLeft);return}}}},updateRightArrowKey:function(element){if(false){var range=rangy.getSelection().getRangeAt(0);if(range&&range.collapsed){var _nodes=api.getFlattenedDom(range);if(!_nodes.findIndex)return;var _node=range.startContainer;var indexStartContainer=_nodes.findIndex(function(element,index){if(element.node===_node)return true;var _indexp=element.parents.indexOf(_node);return _indexp!==-1});var _sel;var i;var m;var indexFound=_nodes.findIndex(function(n,index){if(n.textContent){var m=/^\ufeff([^\ufeff]*)$/.exec(n.textContent);if(m){return true}else{return false}}else{return false}});if(indexFound===-1){return}_node=_nodes[indexStartContainer];if(_node&&_node.textContent){m=/^\ufeff([^\ufeff]*)$/.exec(_node.textContent);if(m&&range.startOffset-1===m[1].length){return}}if(_nodes&&range.startOffset===0){indexStartContainer=_nodes.indexOf(range.startContainer);if(indexStartContainer!==-1&&indexStartContainer>0){_node=_nodes[indexStartContainer-1];if(_node.textContent){m=/\ufeff([^\ufeff]*)$/.exec(_node.textContent);if(m&&true||range.startOffset===m[1].length+1){}}}}}}},getFlattenedDom:function(range){var parent=range.commonAncestorContainer.parentNode;if(!parent){return range.commonAncestorContainer.childNodes}var nodes=Array.prototype.slice.call(parent.childNodes);var indexStartContainer=nodes.indexOf(range.startContainer);if(indexStartContainer+10){}else{if(parent.parentNode){parent=parent.parentNode}}nodes=[];function addNodes(_set){if(_set.node.childNodes.length){var childNodes=Array.prototype.slice.call(_set.node.childNodes);childNodes.forEach(function(n){var _t=_set.parents.slice();if(_t.slice(-1)[0]!==_set.node){_t.push(_set.node)}addNodes({parents:_t,node:n})})}else{nodes.push({parents:_set.parents,node:_set.node})}}addNodes({parents:[parent],node:parent});return nodes},getOnlySelectedElements:function(){var range=rangy.getSelection().getRangeAt(0);var container=range.commonAncestorContainer;container=container.nodeType===3?container.parentNode:container;return range.getNodes([1],function(node){return node.parentNode===container})},getAllSelectedElements:function(){var range=rangy.getSelection().getRangeAt(0);var container=range.commonAncestorContainer;container=container.nodeType===3?container.parentNode:container;var selectedNodes=range.getNodes([1],function(node){return node.parentNode===container});var innerHtml=container.innerHTML;innerHtml=innerHtml.replace(/]+>\ufeff?<\/span>/gi,"");if(innerHtml===range.toHtml()&&!(container.nodeName.toLowerCase()==="div"&&/^taTextElement/.test(container.id))){var arr=[];for(var i=selectedNodes.length;i--;arr.unshift(selectedNodes[i]));selectedNodes=arr;selectedNodes.push(container)}return selectedNodes},getSelectionElement:function(){var s=api.getSelection();if(s){return api.getSelection().container}else{return undefined}},setSelection:function(elStart,elEnd,start,end){var range=rangy.createRange();range.setStart(elStart,start);range.setEnd(elEnd,end);rangy.getSelection().setSingleRange(range)},setSelectionBeforeElement:function(el){var range=rangy.createRange();range.selectNode(el);range.collapse(true);rangy.getSelection().setSingleRange(range)},setSelectionAfterElement:function(el){var range=rangy.createRange();range.selectNode(el);range.collapse(false);rangy.getSelection().setSingleRange(range)},setSelectionToElementStart:function(el){var range=rangy.createRange();range.selectNodeContents(el);range.collapse(true);rangy.getSelection().setSingleRange(range)},setSelectionToElementEnd:function(el){var range=rangy.createRange();range.selectNodeContents(el);range.collapse(false);if(el.childNodes&&el.childNodes[el.childNodes.length-1]&&el.childNodes[el.childNodes.length-1].nodeName==="br"){range.startOffset=range.endOffset=range.startOffset-1}rangy.getSelection().setSingleRange(range)},setStateShiftKey:function(bS){bShiftState=bS},getStateShiftKey:function(){return bShiftState},insertHtml:function(html,topNode){var parent,secondParent,_childI,nodes,i,lastNode,_tempFrag;var element=angular.element("
    "+html+"
    ");var range=rangy.getSelection().getRangeAt(0);var frag=_document.createDocumentFragment();var children=element[0].childNodes;var isInline=true;if(children.length>0){nodes=[];for(_childI=0;_childI)$/i.test(range.startContainer.innerHTML)){range.selectNode(range.startContainer)}}else{isInline=true;lastNode=frag=_document.createTextNode(html)}if(isInline){range.deleteContents()}else{if(range.collapsed&&range.startContainer!==topNode){if(range.startContainer.innerHTML&&range.startContainer.innerHTML.match(/^<[^>]*>$/i)){parent=range.startContainer;if(range.startOffset===1){range.setStartAfter(parent);range.setEndAfter(parent)}else{range.setStartBefore(parent);range.setEndBefore(parent)}}else{if(range.startContainer.nodeType===3&&range.startContainer.parentNode!==topNode){parent=range.startContainer.parentNode;secondParent=parent.cloneNode();taDOM.splitNodes(parent.childNodes,parent,secondParent,range.startContainer,range.startOffset);while(!VALIDELEMENTS.test(parent.nodeName)){angular.element(parent).after(secondParent);parent=parent.parentNode;var _lastSecondParent=secondParent;secondParent=parent.cloneNode();taDOM.splitNodes(parent.childNodes,parent,secondParent,_lastSecondParent)}}else{parent=range.startContainer;secondParent=parent.cloneNode();taDOM.splitNodes(parent.childNodes,parent,secondParent,undefined,undefined,range.startOffset)}angular.element(parent).after(secondParent);range.setStartAfter(parent);range.setEndAfter(parent);if(/^(|)$/i.test(parent.innerHTML.trim())){range.setStartBefore(parent);range.setEndBefore(parent);angular.element(parent).remove()}if(/^(|)$/i.test(secondParent.innerHTML.trim()))angular.element(secondParent).remove();if(parent.nodeName.toLowerCase()==="li"){_tempFrag=_document.createDocumentFragment();for(i=0;i");taDOM.transferChildNodes(frag.childNodes[i],element[0]);taDOM.transferNodeAttributes(frag.childNodes[i],element[0]);_tempFrag.appendChild(element[0])}frag=_tempFrag;if(lastNode){lastNode=frag.childNodes[frag.childNodes.length-1];lastNode=lastNode.childNodes[lastNode.childNodes.length-1]}}}}else{range.deleteContents()}}range.insertNode(frag);if(lastNode){api.setSelectionToElementEnd(lastNode)}}};return api}]).service("taDOM",function(){var taDOM={getByAttribute:function(element,attribute){var resultingElements=[];var childNodes=element.children();if(childNodes.length){angular.forEach(childNodes,function(child){resultingElements=resultingElements.concat(taDOM.getByAttribute(angular.element(child),attribute))})}if(element.attr(attribute)!==undefined)resultingElements.push(element);return resultingElements},transferChildNodes:function(source,target){target.innerHTML="";while(source.childNodes.length>0)target.appendChild(source.childNodes[0]);return target},splitNodes:function(nodes,target1,target2,splitNode,subSplitIndex,splitIndex){if(!splitNode&&isNaN(splitIndex))throw new Error("taDOM.splitNodes requires a splitNode or splitIndex");var startNodes=document.createDocumentFragment();var endNodes=document.createDocumentFragment();var index=0;while(nodes.length>0&&(isNaN(splitIndex)||splitIndex!==index)&&nodes[0]!==splitNode){startNodes.appendChild(nodes[0]);index++}if(!isNaN(subSplitIndex)&&subSplitIndex>=0&&nodes[0]){startNodes.appendChild(document.createTextNode(nodes[0].nodeValue.substring(0,subSplitIndex)));nodes[0].nodeValue=nodes[0].nodeValue.substring(subSplitIndex)}while(nodes.length>0)endNodes.appendChild(nodes[0]);taDOM.transferChildNodes(startNodes,target1);taDOM.transferChildNodes(endNodes,target2)},transferNodeAttributes:function(source,target){for(var i=0;i");source.html(viewValue);return source.text().length<=max}}}}).directive("taMinText",function(){return{restrict:"A",require:"ngModel",link:function(scope,elem,attrs,ctrl){var min=parseInt(scope.$eval(attrs.taMinText));if(isNaN(min)){throw"Min text must be an integer"}attrs.$observe("taMinText",function(value){min=parseInt(value);if(isNaN(min)){throw"Min text must be an integer"}if(ctrl.$dirty){ctrl.$validate()}});ctrl.$validators.taMinText=function(viewValue){var source=angular.element("
    ");source.html(viewValue);return!source.text().length||source.text().length>=min}}}});angular.module("textAngular.taBind",["textAngular.factories","textAngular.DOM"]).service("_taBlankTest",[function(){return function(_blankVal){if(!_blankVal)return true;var _text_=stripHtmlToText(_blankVal);if(_text_===""){if(/]+>/.test(_blankVal)){return false}return true}else{return false}}}]).directive("taButton",[function(){return{link:function(scope,element,attrs){element.attr("unselectable","on");element.on("mousedown",function(e,eventData){if(eventData)angular.extend(e,eventData);e.preventDefault();return false})}}}]).directive("taBind",["taSanitize","$timeout","$document","taFixChrome","taBrowserTag","taSelection","taSelectableElements","taApplyCustomRenderers","taOptions","_taBlankTest","$parse","taDOM","textAngularManager",function(taSanitize,$timeout,$document,taFixChrome,taBrowserTag,taSelection,taSelectableElements,taApplyCustomRenderers,taOptions,_taBlankTest,$parse,taDOM,textAngularManager){return{priority:2,require:["ngModel","?ngModelOptions"],link:function(scope,element,attrs,controller){var ngModel=controller[0];var ngModelOptions=controller[1]||{};var _isContentEditable=element.attr("contenteditable")!==undefined&&element.attr("contenteditable");var _isInputFriendly=_isContentEditable||element[0].tagName.toLowerCase()==="textarea"||element[0].tagName.toLowerCase()==="input";var _isReadonly=false;var _focussed=false;var _skipRender=false;var _disableSanitizer=attrs.taUnsafeSanitizer||taOptions.disableSanitizer;var _keepStyles=attrs.taKeepStyles||taOptions.keepStyles;var _lastKey;var BLOCKED_KEYS=/^(9|19|20|27|33|34|35|36|37|38|39|40|45|112|113|114|115|116|117|118|119|120|121|122|123|144|145)$/i;var UNDO_TRIGGER_KEYS=/^(8|13|32|46|59|61|107|109|173|186|187|188|189|190|191|192|219|220|221|222)$/i;var _pasteHandler;var _defaultVal,_defaultTest;var _CTRL_KEY=1;var _META_KEY=2;var _ALT_KEY=4;var _SHIFT_KEY=8;var _ENTER_KEYCODE=13;var _SHIFT_KEYCODE=16;var _TAB_KEYCODE=9;var _LEFT_ARROW_KEYCODE=37;var _RIGHT_ARROW_KEYCODE=39;var _keyMappings=[{specialKey:"UndoKey",forbiddenModifiers:_ALT_KEY+_SHIFT_KEY,mustHaveModifiers:[_META_KEY+_CTRL_KEY],keyCode:90},{specialKey:"RedoKey",forbiddenModifiers:_ALT_KEY,mustHaveModifiers:[_META_KEY+_CTRL_KEY,_SHIFT_KEY],keyCode:90},{specialKey:"RedoKey",forbiddenModifiers:_ALT_KEY+_SHIFT_KEY,mustHaveModifiers:[_META_KEY+_CTRL_KEY],keyCode:89},{specialKey:"TabKey",forbiddenModifiers:_META_KEY+_SHIFT_KEY+_ALT_KEY+_CTRL_KEY,mustHaveModifiers:[],keyCode:_TAB_KEYCODE},{specialKey:"ShiftTabKey",forbiddenModifiers:_META_KEY+_ALT_KEY+_CTRL_KEY,mustHaveModifiers:[_SHIFT_KEY],keyCode:_TAB_KEYCODE}];function _mapKeys(event){var specialKey;_keyMappings.forEach(function(map){if(map.keyCode===event.keyCode){var netModifiers=(event.metaKey?_META_KEY:0)+(event.ctrlKey?_CTRL_KEY:0)+(event.shiftKey?_SHIFT_KEY:0)+(event.altKey?_ALT_KEY:0);if(map.forbiddenModifiers&netModifiers)return;if(map.mustHaveModifiers.every(function(modifier){return netModifiers&modifier})){specialKey=map.specialKey}}});return specialKey}if(attrs.taDefaultWrap===undefined)attrs.taDefaultWrap="p";if(attrs.taDefaultWrap===""){_defaultVal="";_defaultTest=_browserDetect.ie===undefined?"

    ":_browserDetect.ie>=11?"


    ":_browserDetect.ie<=8?"

     

    ":"

     

    "}else{_defaultVal=_browserDetect.ie===undefined||_browserDetect.ie>=11?attrs.taDefaultWrap.toLowerCase()==="br"?"

    ":"<"+attrs.taDefaultWrap+">
    ":_browserDetect.ie<=8?"<"+attrs.taDefaultWrap.toUpperCase()+">":"<"+attrs.taDefaultWrap+">";_defaultTest=_browserDetect.ie===undefined||_browserDetect.ie>=11?attrs.taDefaultWrap.toLowerCase()==="br"?"

    ":"<"+attrs.taDefaultWrap+">
    ":_browserDetect.ie<=8?"<"+attrs.taDefaultWrap.toUpperCase()+"> ":"<"+attrs.taDefaultWrap+"> "}if(!ngModelOptions.$options)ngModelOptions.$options={};var _ensureContentWrapped=function(value){if(_taBlankTest(value))return value;var domTest=angular.element("
    "+value+"
    ");if(domTest.children().length===0){value="<"+attrs.taDefaultWrap+">"+value+""}else{var _children=domTest[0].childNodes;var i;var _foundBlockElement=false;for(i=0;i<_children.length;i++){if(_foundBlockElement=_children[i].nodeName.toLowerCase().match(BLOCKELEMENTS))break}if(!_foundBlockElement){value="<"+attrs.taDefaultWrap+">"+value+""}else{value="";for(i=0;i<_children.length;i++){var node=_children[i];var nodeName=node.nodeName.toLowerCase();if(nodeName==="#comment"){value+="\x3c!--"+node.nodeValue+"--\x3e"}else if(nodeName==="#text"){var text=node.textContent;if(!text.trim()){value+=text}else{value+="<"+attrs.taDefaultWrap+">"+text+""}}else if(!nodeName.match(BLOCKELEMENTS)){var _subVal=node.outerHTML||node.nodeValue;if(_subVal.trim()!=="")value+="<"+attrs.taDefaultWrap+">"+_subVal+"";else value+=_subVal}else{value+=node.outerHTML}}}}return value};if(attrs.taPaste){_pasteHandler=$parse(attrs.taPaste)}element.addClass("ta-bind");var _undoKeyupTimeout;scope["$undoManager"+(attrs.id||"")]=ngModel.$undoManager={_stack:[],_index:0,_max:1e3,push:function(value){if(typeof value==="undefined"||value===null||typeof this.current()!=="undefined"&&this.current()!==null&&value===this.current())return value;if(this._indexthis._max)this._stack.shift();this._index=this._stack.length-1;return value},undo:function(){return this.setToIndex(this._index-1)},redo:function(){return this.setToIndex(this._index+1)},setToIndex:function(index){if(index<0||index>this._stack.length-1){return undefined}this._index=index;return this.current()},current:function(){return this._stack[this._index]}};var _compileHtml=function(){if(_isContentEditable){return element[0].innerHTML}if(_isInputFriendly){return element.val()}throw"textAngular Error: attempting to update non-editable taBind"};var selectorClickHandler=function(event){scope.$emit("ta-element-select",this);event.preventDefault();return false};var _reApplyOnSelectorHandlers=scope["reApplyOnSelectorHandlers"+(attrs.id||"")]=function(){if(!_isReadonly)angular.forEach(taSelectableElements,function(selector){element.find(selector).off("click",selectorClickHandler).on("click",selectorClickHandler)})};var _setViewValue=function(_val,triggerUndo,skipRender){_skipRender=skipRender||false;if(typeof triggerUndo==="undefined"||triggerUndo===null)triggerUndo=true&&_isContentEditable;if(typeof _val==="undefined"||_val===null)_val=_compileHtml();if(_taBlankTest(_val)){if(ngModel.$viewValue!=="")ngModel.$setViewValue("");if(triggerUndo&&ngModel.$undoManager.current()!=="")ngModel.$undoManager.push("")}else{_reApplyOnSelectorHandlers();if(ngModel.$viewValue!==_val){ngModel.$setViewValue(_val);if(triggerUndo)ngModel.$undoManager.push(_val)}}ngModel.$render()};var _setInnerHTML=function(newval){element[0].innerHTML=newval};var _redoUndoTimeout;var _undo=scope["$undoTaBind"+(attrs.id||"")]=function(){if(!_isReadonly&&_isContentEditable){var content=ngModel.$undoManager.undo();if(typeof content!=="undefined"&&content!==null){_setInnerHTML(content);_setViewValue(content,false);if(_redoUndoTimeout)$timeout.cancel(_redoUndoTimeout);_redoUndoTimeout=$timeout(function(){element[0].focus();taSelection.setSelectionToElementEnd(element[0])},1)}}};var _redo=scope["$redoTaBind"+(attrs.id||"")]=function(){if(!_isReadonly&&_isContentEditable){var content=ngModel.$undoManager.redo();if(typeof content!=="undefined"&&content!==null){_setInnerHTML(content);_setViewValue(content,false);if(_redoUndoTimeout)$timeout.cancel(_redoUndoTimeout);_redoUndoTimeout=$timeout(function(){element[0].focus();taSelection.setSelectionToElementEnd(element[0])},1)}}};scope["updateTaBind"+(attrs.id||"")]=function(){if(!_isReadonly)_setViewValue(undefined,undefined,true)};var _sanitize=function(unsafe){return ngModel.$oldViewValue=taSanitize(taFixChrome(unsafe,_keepStyles),ngModel.$oldViewValue,_disableSanitizer)};if(element.attr("required"))ngModel.$validators.required=function(modelValue,viewValue){return!_taBlankTest(modelValue||viewValue)};ngModel.$parsers.push(_sanitize);ngModel.$parsers.unshift(_ensureContentWrapped);ngModel.$formatters.push(_sanitize);ngModel.$formatters.unshift(_ensureContentWrapped);ngModel.$formatters.unshift(function(value){return ngModel.$undoManager.push(value||"")});if(_isInputFriendly){scope.events={};if(!_isContentEditable){element.on("change blur",scope.events.change=scope.events.blur=function(){if(!_isReadonly)ngModel.$setViewValue(_compileHtml())});element.on("keydown",scope.events.keydown=function(event,eventData){if(eventData)angular.extend(event,eventData);if(event.keyCode===_TAB_KEYCODE){var start=this.selectionStart;var end=this.selectionEnd;var value=element.val();if(event.shiftKey){var _linebreak=value.lastIndexOf("\n",start),_tab=value.lastIndexOf("\t",start);if(_tab!==-1&&_tab>=_linebreak){element.val(value.substring(0,_tab)+value.substring(_tab+1));this.selectionStart=this.selectionEnd=start-1}}else{element.val(value.substring(0,start)+"\t"+value.substring(end));this.selectionStart=this.selectionEnd=start+1}event.preventDefault()}});var _repeat=function(string,n){var result="";for(var _n=0;_n"+htmlValue+"
    ")[0].childNodes;if(_nodes.length>0){htmlValue="";forEach(_nodes,function(index,node){var nodeName=node.nodeName.toLowerCase();if(nodeName==="#comment"){htmlValue+="\x3c!--"+node.nodeValue+"--\x3e";return}if(nodeName==="#text"){htmlValue+=node.textContent;return}if(!node.outerHTML){return}if(htmlValue.length>0){htmlValue+="\n"}if(nodeName==="ul"||nodeName==="ol"){htmlValue+=""+recursiveListFormat(node,0)}else{htmlValue+=""+node.outerHTML}})}return htmlValue})}else{var _processingPaste=false;var processpaste=function(text){var _isOneNote=text!==undefined?text.match(/content=["']*OneNote.File/i):false;if(text&&text.trim().length){if(text.match(/class=["']*Mso(Normal|List)/i)||text.match(/content=["']*Word.Document/i)||text.match(/content=["']*OneNote.File/i)){var textFragment=text.match(/([\s\S]*?)/i);if(!textFragment)textFragment=text;else textFragment=textFragment[1];textFragment=textFragment.replace(/[\s\S]*?<\/o:p>/gi,"").replace(/class=(["']|)MsoNormal(["']|)/gi,"");var dom=angular.element("
    "+textFragment+"
    ");var targetDom=angular.element("
    ");var _list={element:null,lastIndent:[],lastLi:null,isUl:false};_list.lastIndent.peek=function(){var n=this.length;if(n>0)return this[n-1]};var _resetList=function(isUl){_list.isUl=isUl;_list.element=angular.element(isUl?"
      ":"
        ");_list.lastIndent=[];_list.lastIndent.peek=function(){var n=this.length;if(n>0)return this[n-1]};_list.lastLevelMatch=null};for(var i=0;i<=dom[0].childNodes.length;i++){if(!dom[0].childNodes[i]||dom[0].childNodes[i].nodeName==="#text"){continue}else{var tagName=dom[0].childNodes[i].tagName.toLowerCase();if(tagName!=="p"&&tagName!=="ul"&&tagName!=="h1"&&tagName!=="h2"&&tagName!=="h3"&&tagName!=="h4"&&tagName!=="h5"&&tagName!=="h6"&&tagName!=="table"){continue}}var el=angular.element(dom[0].childNodes[i]);var _listMatch=(el.attr("class")||"").match(/MsoList(Bullet|Number|Paragraph)(CxSp(First|Middle|Last)|)/i);if(_listMatch){if(el[0].childNodes.length<2||el[0].childNodes[1].childNodes.length<1){continue}var isUl=_listMatch[1].toLowerCase()==="bullet"||_listMatch[1].toLowerCase()!=="number"&&!(/^[^0-9a-z<]*[0-9a-z]+[^0-9a-z<>]]":"
          ");_list.lastLi.append(_list.element)}else if(_list.lastIndent.peek()!=null&&_list.lastIndent.peek()>indent){while(_list.lastIndent.peek()!=null&&_list.lastIndent.peek()>indent){if(_list.element.parent()[0].tagName.toLowerCase()==="li"){_list.element=_list.element.parent();continue}else if(/[uo]l/i.test(_list.element.parent()[0].tagName.toLowerCase())){_list.element=_list.element.parent()}else{break}_list.lastIndent.pop()}_list.isUl=_list.element[0].tagName.toLowerCase()==="ul";if(isUl!==_list.isUl){_resetList(isUl);targetDom.append(_list.element)}}_list.lastLevelMatch=_levelMatch;if(indent!==_list.lastIndent.peek())_list.lastIndent.push(indent);_list.lastLi=angular.element("
        1. ");_list.element.append(_list.lastLi);_list.lastLi.html(el.html().replace(/[\s\S]*?/gi,""));el.remove()}else{_resetList(false);targetDom.append(el)}}var _unwrapElement=function(node){node=angular.element(node);for(var _n=node[0].childNodes.length-1;_n>=0;_n--)node.after(node[0].childNodes[_n]);node.remove()};angular.forEach(targetDom.find("span"),function(node){node.removeAttribute("lang");if(node.attributes.length<=0)_unwrapElement(node)});angular.forEach(targetDom.find("font"),_unwrapElement);text=targetDom.html();if(_isOneNote){text=targetDom.html()||dom.html()}text=text.replace(/\n/g," ")}else{text=text.replace(/<(|\/)meta[^>]*?>/gi,"");if(text.match(/<[^>]*?(ta-bind)[^>]*?>/)){if(text.match(/<[^>]*?(text-angular)[^>]*?>/)){var _el=angular.element("
          "+text+"
          ");_el.find("textarea").remove();for(var _b=0;_b',"")}}else if(text.match(/^.<\/span>/gi)){text=text.replace(/<(|\/)span[^>]*?>/gi,"")}}text=text.replace(/
          ]*?>/gi,"").replace(/( | )<\/span>/gi," ")}if(//i.test(text)&&/(|).*/i.test(text)===false){text=text.replace(/.*<\/li(\s.*)?>/i,"
            $&
          ")}text=text.replace(/^[ |\u00A0]+/gm,function(match){var result="";for(var i=0;i").replace(/\t/g,"    ");if(_pasteHandler)text=_pasteHandler(scope,{$html:text})||text;text=text.replace(/]*?)("|')>([^<]+?)<\/span>/g,"$5");text=taSanitize(text,"",_disableSanitizer);taSelection.insertHtml(text,element[0]);$timeout(function(){ngModel.$setViewValue(_compileHtml());_processingPaste=false;element.removeClass("processing-paste")},0)}else{_processingPaste=false;element.removeClass("processing-paste")}};element.on("paste",scope.events.paste=function(e,eventData){if(eventData)angular.extend(e,eventData);if(_isReadonly||_processingPaste){e.stopPropagation();e.preventDefault();return false}_processingPaste=true;element.addClass("processing-paste");var pastedContent;var clipboardData=(e.originalEvent||e).clipboardData;if(!clipboardData&&window.clipboardData&&window.clipboardData.getData){pastedContent=window.clipboardData.getData("Text");processpaste(pastedContent);e.stopPropagation();e.preventDefault();return false}if(clipboardData&&clipboardData.getData&&clipboardData.types.length>0){var _types="";for(var _t=0;_t
    ');$document.find("body").append(_tempDiv);_tempDiv[0].focus();$timeout(function(){rangy.restoreSelection(_savedSelection);processpaste(_tempDiv[0].innerHTML);element[0].focus();_tempDiv.remove()},0)}});element.on("cut",scope.events.cut=function(e){if(!_isReadonly)$timeout(function(){ngModel.$setViewValue(_compileHtml())},0);else e.preventDefault()});element.on("keydown",scope.events.keydown=function(event,eventData){if(eventData)angular.extend(event,eventData);if(event.keyCode===_SHIFT_KEYCODE){taSelection.setStateShiftKey(true)}else{taSelection.setStateShiftKey(false)}event.specialKey=_mapKeys(event);var userSpecialKey;taOptions.keyMappings.forEach(function(mapping){if(event.specialKey===mapping.commandKeyCode){event.specialKey=undefined}if(mapping.testForKey(event)){userSpecialKey=mapping.commandKeyCode}if(mapping.commandKeyCode==="UndoKey"||mapping.commandKeyCode==="RedoKey"){if(!mapping.enablePropagation){event.preventDefault()}}});if(typeof userSpecialKey!=="undefined"){event.specialKey=userSpecialKey}if(typeof event.specialKey!=="undefined"&&(event.specialKey!=="UndoKey"||event.specialKey!=="RedoKey")){event.preventDefault();textAngularManager.sendKeyCommand(scope,event)}if(!_isReadonly){if(event.specialKey==="UndoKey"){_undo();event.preventDefault()}if(event.specialKey==="RedoKey"){_redo();event.preventDefault()}if(event.keyCode===_ENTER_KEYCODE&&!event.shiftKey&&!event.ctrlKey&&!event.metaKey&&!event.altKey){var contains=function(a,obj){for(var i=0;i$/i.test(selection.innerHTML.trim())&&!selection.nextSibling){$selection=angular.element(selection);var _parent=$selection.parent();_parent.after(_new);$selection.remove();if(_parent.children().length===0)_parent.remove();taSelection.setSelectionToElementStart(_new[0]);event.preventDefault()}if(/^<[^>]+><\/[^>]+>$/i.test(selection.innerHTML.trim())){$selection=angular.element(selection);$selection.after(_new);$selection.remove();taSelection.setSelectionToElementStart(_new[0]);event.preventDefault()}}}}});var _keyupTimeout;element.on("keyup",scope.events.keyup=function(event,eventData){if(eventData)angular.extend(event,eventData);taSelection.setStateShiftKey(false);if(event.keyCode===_TAB_KEYCODE){var _selection=taSelection.getSelection();if(_selection.start.element===element[0]&&element.children().length)taSelection.setSelectionToElementStart(element.children()[0]);return}if(event.keyCode===_LEFT_ARROW_KEYCODE&&!event.shiftKey){taSelection.updateLeftArrowKey(element)}if(event.keyCode===_RIGHT_ARROW_KEYCODE&&!event.shiftKey){taSelection.updateRightArrowKey(element)}if(_undoKeyupTimeout)$timeout.cancel(_undoKeyupTimeout);if(!_isReadonly&&!BLOCKED_KEYS.test(event.keyCode)){if(event.keyCode===_ENTER_KEYCODE&&(event.ctrlKey||event.metaKey||event.altKey)){}else{if(_defaultVal!==""&&_defaultVal!=="

    "&&event.keyCode===_ENTER_KEYCODE&&!event.ctrlKey&&!event.metaKey&&!event.altKey){var selection=taSelection.getSelectionElement();while(!selection.nodeName.match(VALIDELEMENTS)&&selection!==element[0]){selection=selection.parentNode}if(!event.shiftKey){if(selection.tagName.toLowerCase()!==attrs.taDefaultWrap&&selection.nodeName.toLowerCase()!=="li"&&(selection.innerHTML.trim()===""||selection.innerHTML.trim()==="
    ")){var _new=angular.element(_defaultVal);angular.element(selection).replaceWith(_new);taSelection.setSelectionToElementStart(_new[0])}}else{var tagName=selection.tagName.toLowerCase();if((tagName===attrs.taDefaultWrap||tagName==="li"||tagName==="pre"||tagName==="div")&&!/.+

    /.test(selection.innerHTML.trim())){var ps=selection.previousSibling;if(ps){ps.innerHTML=ps.innerHTML+"

    ";angular.element(selection).remove();taSelection.setSelectionToElementEnd(ps)}}}}var val=_compileHtml();if(_defaultVal!==""&&(val.trim()===""||val.trim()==="
    ")){_setInnerHTML(_defaultVal);taSelection.setSelectionToElementStart(element.children()[0])}else if(val.substring(0,1)!=="<"&&attrs.taDefaultWrap!==""){}var triggerUndo=_lastKey!==event.keyCode&&UNDO_TRIGGER_KEYS.test(event.keyCode);if(_keyupTimeout)$timeout.cancel(_keyupTimeout);_keyupTimeout=$timeout(function(){_setViewValue(val,triggerUndo,true)},ngModelOptions.$options.debounce||400);if(!triggerUndo)_undoKeyupTimeout=$timeout(function(){ngModel.$undoManager.push(val)},250);_lastKey=event.keyCode}}});var _inputTimeout;element.on("input",function(){if(_compileHtml()!==ngModel.$viewValue){if(_inputTimeout)$timeout.cancel(_inputTimeout);_inputTimeout=$timeout(function(){var _savedSelection=rangy.saveSelection();var _val=_compileHtml();if(_val!==ngModel.$viewValue){_setViewValue(_val,true)}if(ngModel.$viewValue.length!==0){rangy.restoreSelection(_savedSelection)}},1e3)}});element.on("blur",scope.events.blur=function(){_focussed=false;if(!_isReadonly){_setViewValue(undefined,undefined,true)}else{_skipRender=true;ngModel.$render()}});if(attrs.placeholder&&(_browserDetect.ie>8||_browserDetect.ie===undefined)){var rule;if(attrs.id)rule=addCSSRule("#"+attrs.id+".placeholder-text:before",'content: "'+attrs.placeholder+'"');else throw"textAngular Error: An unique ID is required for placeholders to work";scope.$on("$destroy",function(){removeCSSRule(rule)})}element.on("focus",scope.events.focus=function(){_focussed=true;element.removeClass("placeholder-text");_reApplyOnSelectorHandlers()});element.on("mouseup",scope.events.mouseup=function(){var _selection=taSelection.getSelection();if(_selection&&_selection.start.element===element[0]&&element.children().length)taSelection.setSelectionToElementStart(element.children()[0])});element.on("mousedown",scope.events.mousedown=function(event,eventData){if(eventData)angular.extend(event,eventData);event.stopPropagation()})}}var fileDropHandler=function(event,eventData){if(eventData)angular.extend(event,eventData);if(!dropFired&&!_isReadonly){dropFired=true;var dataTransfer;if(event.originalEvent)dataTransfer=event.originalEvent.dataTransfer;else dataTransfer=event.dataTransfer;scope.$emit("ta-drop-event",this,event,dataTransfer);$timeout(function(){dropFired=false;_setViewValue(undefined,undefined,true)},100)}};var _renderTimeout;var _renderInProgress=false;ngModel.$render=function(){if(_renderInProgress)return;else _renderInProgress=true;var val=ngModel.$viewValue||"";if(!_skipRender){if(_isContentEditable&&_focussed){element.removeClass("placeholder-text");if(_renderTimeout)$timeout.cancel(_renderTimeout);_renderTimeout=$timeout(function(){if(!_focussed){element[0].focus();taSelection.setSelectionToElementEnd(element.children()[element.children().length-1])}_renderTimeout=undefined},1)}if(_isContentEditable){if(attrs.placeholder){if(val===""){_setInnerHTML(_defaultVal)}else{_setInnerHTML(val)}}else{_setInnerHTML(val===""?_defaultVal:val)}if(!_isReadonly){_reApplyOnSelectorHandlers();element.on("drop",fileDropHandler)}else{element.off("drop",fileDropHandler)}}else if(element[0].tagName.toLowerCase()!=="textarea"&&element[0].tagName.toLowerCase()!=="input"){_setInnerHTML(taApplyCustomRenderers(val))}else{element.val(val)}}if(_isContentEditable&&attrs.placeholder){if(val===""){if(_focussed)element.removeClass("placeholder-text");else element.addClass("placeholder-text")}else{element.removeClass("placeholder-text")}}_renderInProgress=_skipRender=false};if(attrs.taReadonly){_isReadonly=scope.$eval(attrs.taReadonly);if(_isReadonly){element.addClass("ta-readonly");if(element[0].tagName.toLowerCase()==="textarea"||element[0].tagName.toLowerCase()==="input"){element.attr("disabled","disabled")}if(element.attr("contenteditable")!==undefined&&element.attr("contenteditable")){element.removeAttr("contenteditable")}}else{element.removeClass("ta-readonly");if(element[0].tagName.toLowerCase()==="textarea"||element[0].tagName.toLowerCase()==="input"){element.removeAttr("disabled")}else if(_isContentEditable){element.attr("contenteditable","true")}}scope.$watch(attrs.taReadonly,function(newVal,oldVal){if(oldVal===newVal)return;if(newVal){element.addClass("ta-readonly");if(element[0].tagName.toLowerCase()==="textarea"||element[0].tagName.toLowerCase()==="input"){element.attr("disabled","disabled")}if(element.attr("contenteditable")!==undefined&&element.attr("contenteditable")){element.removeAttr("contenteditable")}angular.forEach(taSelectableElements,function(selector){element.find(selector).on("click",selectorClickHandler)});element.off("drop",fileDropHandler)}else{element.removeClass("ta-readonly");if(element[0].tagName.toLowerCase()==="textarea"||element[0].tagName.toLowerCase()==="input"){element.removeAttr("disabled")}else if(_isContentEditable){element.attr("contenteditable","true")}angular.forEach(taSelectableElements,function(selector){element.find(selector).off("click",selectorClickHandler)});element.on("drop",fileDropHandler)}_isReadonly=newVal})}if(_isContentEditable&&!_isReadonly){angular.forEach(taSelectableElements,function(selector){element.find(selector).on("click",selectorClickHandler)});element.on("drop",fileDropHandler)}}}}]);var dropFired=false;var textAngular=angular.module("textAngular",["ngSanitize","textAngularSetup","textAngular.factories","textAngular.DOM","textAngular.validators","textAngular.taBind"]);textAngular.config([function(){angular.forEach(taTools,function(value,key){delete taTools[key]})}]);textAngular.directive("textAngular",["$compile","$timeout","taOptions","taSelection","taExecCommand","textAngularManager","$document","$animate","$log","$q","$parse",function($compile,$timeout,taOptions,taSelection,taExecCommand,textAngularManager,$document,$animate,$log,$q,$parse){return{require:"?ngModel",scope:{},restrict:"EA",priority:2,link:function(scope,element,attrs,ngModel){var _keydown,_keyup,_keypress,_mouseup,_focusin,_focusout,_originalContents,_editorFunctions,_serial=attrs.serial?attrs.serial:Math.floor(Math.random()*1e16),_taExecCommand,_resizeMouseDown,_updateSelectedStylesTimeout;var _resizeTimeout;scope._name=attrs.name?attrs.name:"textAngularEditor"+_serial;var oneEvent=function(_element,event,action){$timeout(function(){_element.one(event,action)},100)};_taExecCommand=taExecCommand(attrs.taDefaultWrap);angular.extend(scope,angular.copy(taOptions),{wrapSelection:function(command,opt,isSelectableElementTool){if(command.toLowerCase()==="undo"){scope["$undoTaBindtaTextElement"+_serial]()}else if(command.toLowerCase()==="redo"){scope["$redoTaBindtaTextElement"+_serial]()}else{_taExecCommand(command,false,opt,scope.defaultTagAttributes);if(isSelectableElementTool){scope["reApplyOnSelectorHandlerstaTextElement"+_serial]()}scope.displayElements.text[0].focus()}},showHtml:scope.$eval(attrs.taShowHtml)||false});if(attrs.taFocussedClass)scope.classes.focussed=attrs.taFocussedClass;if(attrs.taTextEditorClass)scope.classes.textEditor=attrs.taTextEditorClass;if(attrs.taHtmlEditorClass)scope.classes.htmlEditor=attrs.taHtmlEditorClass;if(attrs.taDefaultTagAttributes){try{angular.extend(scope.defaultTagAttributes,angular.fromJson(attrs.taDefaultTagAttributes))}catch(error){$log.error(error)}}if(attrs.taTextEditorSetup)scope.setup.textEditorSetup=scope.$parent.$eval(attrs.taTextEditorSetup);if(attrs.taHtmlEditorSetup)scope.setup.htmlEditorSetup=scope.$parent.$eval(attrs.taHtmlEditorSetup);if(attrs.taFileDrop)scope.fileDropHandler=scope.$parent.$eval(attrs.taFileDrop);else scope.fileDropHandler=scope.defaultFileDropHandler;_originalContents=element[0].innerHTML;element[0].innerHTML="";scope.displayElements={forminput:angular.element(""),html:angular.element(""),text:angular.element("
    "),scrollWindow:angular.element("
    "),popover:angular.element('
    '),popoverArrow:angular.element('
    '),popoverContainer:angular.element('
    '),resize:{overlay:angular.element('
    '),background:angular.element('
    '),anchors:[angular.element('
    '),angular.element('
    '),angular.element('
    '),angular.element('
    ')],info:angular.element('
    ')}};scope.displayElements.popover.append(scope.displayElements.popoverArrow);scope.displayElements.popover.append(scope.displayElements.popoverContainer);scope.displayElements.scrollWindow.append(scope.displayElements.popover);scope.displayElements.popover.on("mousedown",function(e,eventData){if(eventData)angular.extend(e,eventData);e.preventDefault();return false});scope.handlePopoverEvents=function(){if(scope.displayElements.popover.css("display")==="block"){if(_resizeTimeout)$timeout.cancel(_resizeTimeout);_resizeTimeout=$timeout(function(){scope.reflowPopover(scope.resizeElement);scope.reflowResizeOverlay(scope.resizeElement)},100)}};angular.element(window).on("resize",scope.handlePopoverEvents);angular.element(window).on("scroll",scope.handlePopoverEvents);var isScrollable=function(node){var cs;var _notScrollable={vertical:false,horizontal:false};try{cs=window.getComputedStyle(node);if(cs===null){return _notScrollable}}catch(e){return _notScrollable}var overflowY=cs["overflow-y"];var overflowX=cs["overflow-x"];return{vertical:(overflowY==="scroll"||overflowY==="auto")&&node.scrollHeight>node.clientHeight,horizontal:(overflowX==="scroll"||overflowX==="auto")&&node.scrollWidth>node.clientWidth}};scope.getScrollTop=function(_el,bAddListener){var scrollTop=_el.scrollTop;if(typeof scrollTop==="undefined"){scrollTop=0}if(bAddListener&&isScrollable(_el).vertical){_el.removeEventListener("scroll",scope._scrollListener,false);_el.addEventListener("scroll",scope._scrollListener,false)}if(scrollTop!==0){return{node:_el.nodeName,top:scrollTop}}if(_el.parentNode){return scope.getScrollTop(_el.parentNode,bAddListener)}else{return{node:"",top:0}}};scope.showPopover=function(_el){scope.getScrollTop(scope.displayElements.scrollWindow[0],true);scope.displayElements.popover.css("display","block");$timeout(function(){scope.displayElements.resize.overlay.css("display","block")});scope.resizeElement=_el;scope.reflowPopover(_el);$animate.addClass(scope.displayElements.popover,"in");oneEvent($document.find("body"),"click keyup",function(){scope.hidePopover()})};scope._scrollListener=function(e,eventData){scope.handlePopoverEvents()};scope.reflowPopover=function(_el){var scrollTop=scope.getScrollTop(scope.displayElements.scrollWindow[0],false);var spaceAboveImage=_el[0].offsetTop-scrollTop.top;if(spaceAboveImage<51){scope.displayElements.popover.css("top",_el[0].offsetTop+_el[0].offsetHeight+scope.displayElements.scrollWindow[0].scrollTop+"px");scope.displayElements.popover.removeClass("top").addClass("bottom")}else{scope.displayElements.popover.css("top",_el[0].offsetTop-54+scope.displayElements.scrollWindow[0].scrollTop+"px");scope.displayElements.popover.removeClass("bottom").addClass("top")}var _maxLeft=scope.displayElements.text[0].offsetWidth-scope.displayElements.popover[0].offsetWidth;var _targetLeft=_el[0].offsetLeft+_el[0].offsetWidth/2-scope.displayElements.popover[0].offsetWidth/2;var _rleft=Math.max(0,Math.min(_maxLeft,_targetLeft));var _marginLeft=Math.min(_targetLeft,Math.max(0,_targetLeft-_maxLeft))-11;_rleft+=window.scrollX;_marginLeft-=window.scrollX;scope.displayElements.popover.css("left",_rleft+"px");scope.displayElements.popoverArrow.css("margin-left",_marginLeft+"px")};scope.hidePopover=function(){scope.displayElements.popover.css("display","none");scope.displayElements.popoverContainer.attr("style","");scope.displayElements.popoverContainer.attr("class","popover-content");scope.displayElements.popover.removeClass("in");scope.displayElements.resize.overlay.css("display","none")};scope.displayElements.resize.overlay.append(scope.displayElements.resize.background);angular.forEach(scope.displayElements.resize.anchors,function(anchor){scope.displayElements.resize.overlay.append(anchor)});scope.displayElements.resize.overlay.append(scope.displayElements.resize.info);scope.displayElements.scrollWindow.append(scope.displayElements.resize.overlay);scope.displayElements.resize.background.on("click",function(e){scope.displayElements.text[0].focus()});scope.reflowResizeOverlay=function(_el){_el=angular.element(_el)[0];scope.displayElements.resize.overlay.css({display:"block",left:_el.offsetLeft-5+"px",top:_el.offsetTop-5+"px",width:_el.offsetWidth+10+"px",height:_el.offsetHeight+10+"px"});scope.displayElements.resize.info.text(_el.offsetWidth+" x "+_el.offsetHeight)};scope.showResizeOverlay=function(_el){var _body=$document.find("body");_resizeMouseDown=function(event){var startPosition={width:parseInt(_el.attr("width")),height:parseInt(_el.attr("height")),x:event.clientX,y:event.clientY};if(startPosition.width===undefined||isNaN(startPosition.width))startPosition.width=_el[0].offsetWidth;if(startPosition.height===undefined||isNaN(startPosition.height))startPosition.height=_el[0].offsetHeight;scope.hidePopover();var ratio=startPosition.height/startPosition.width;var mousemove=function(event){var pos={x:Math.max(0,startPosition.width+(event.clientX-startPosition.x)),y:Math.max(0,startPosition.height+(event.clientY-startPosition.y))};var bForceAspectRatio=attrs.taResizeForceAspectRatio!==undefined;var bFlipKeyBinding=attrs.taResizeMaintainAspectRatio;var bKeepRatio=bForceAspectRatio||bFlipKeyBinding&&!event.shiftKey;if(bKeepRatio){var newRatio=pos.y/pos.x;pos.x=ratio>newRatio?pos.x:pos.y/ratio;pos.y=ratio>newRatio?pos.x*ratio:pos.y}var el=angular.element(_el);function roundedMaxVal(val){return Math.round(Math.max(0,val))}el.css("height",roundedMaxVal(pos.y)+"px");el.css("width",roundedMaxVal(pos.x)+"px");scope.reflowResizeOverlay(_el)};_body.on("mousemove",mousemove);oneEvent(_body,"mouseup",function(event){event.preventDefault();event.stopPropagation();_body.off("mousemove",mousemove);scope.$apply(function(){scope.hidePopover();scope.updateTaBindtaTextElement()},100)});event.stopPropagation();event.preventDefault()};scope.displayElements.resize.anchors[3].off("mousedown");scope.displayElements.resize.anchors[3].on("mousedown",_resizeMouseDown);scope.reflowResizeOverlay(_el);oneEvent(_body,"click",function(){scope.hideResizeOverlay()})};scope.hideResizeOverlay=function(){scope.displayElements.resize.anchors[3].off("mousedown",_resizeMouseDown);scope.displayElements.resize.overlay.css("display","none")};scope.setup.htmlEditorSetup(scope.displayElements.html);scope.setup.textEditorSetup(scope.displayElements.text);scope.displayElements.html.attr({id:"taHtmlElement"+_serial,"ng-show":"showHtml","ta-bind":"ta-bind","ng-model":"html","ng-model-options":element.attr("ng-model-options")});scope.displayElements.text.attr({id:"taTextElement"+_serial,contentEditable:"true","ta-bind":"ta-bind","ng-model":"html","ng-model-options":element.attr("ng-model-options")});scope.displayElements.scrollWindow.attr({"ng-hide":"showHtml"});if(attrs.taDefaultWrap){scope.displayElements.text.attr("ta-default-wrap",attrs.taDefaultWrap)}if(attrs.taUnsafeSanitizer){scope.displayElements.text.attr("ta-unsafe-sanitizer",attrs.taUnsafeSanitizer);scope.displayElements.html.attr("ta-unsafe-sanitizer",attrs.taUnsafeSanitizer)}if(attrs.taKeepStyles){scope.displayElements.text.attr("ta-keep-styles",attrs.taKeepStyles);scope.displayElements.html.attr("ta-keep-styles",attrs.taKeepStyles)}scope.displayElements.scrollWindow.append(scope.displayElements.text);element.append(scope.displayElements.scrollWindow);element.append(scope.displayElements.html);scope.displayElements.forminput.attr("name",scope._name);element.append(scope.displayElements.forminput);if(attrs.tabindex){element.removeAttr("tabindex");scope.displayElements.text.attr("tabindex",attrs.tabindex);scope.displayElements.html.attr("tabindex",attrs.tabindex)}if(attrs.placeholder){scope.displayElements.text.attr("placeholder",attrs.placeholder);scope.displayElements.html.attr("placeholder",attrs.placeholder)}if(attrs.taDisabled){scope.displayElements.text.attr("ta-readonly","disabled");scope.displayElements.html.attr("ta-readonly","disabled");scope.disabled=scope.$parent.$eval(attrs.taDisabled);scope.$parent.$watch(attrs.taDisabled,function(newVal){scope.disabled=newVal;if(scope.disabled){element.addClass(scope.classes.disabled)}else{element.removeClass(scope.classes.disabled)}})}if(attrs.taPaste){scope._pasteHandler=function(_html){return $parse(attrs.taPaste)(scope.$parent,{$html:_html})};scope.displayElements.text.attr("ta-paste","_pasteHandler($html)")}$compile(scope.displayElements.scrollWindow)(scope);$compile(scope.displayElements.html)(scope);scope.updateTaBindtaTextElement=scope["updateTaBindtaTextElement"+_serial];scope.updateTaBindtaHtmlElement=scope["updateTaBindtaHtmlElement"+_serial];element.addClass("ta-root");scope.displayElements.scrollWindow.addClass("ta-text ta-editor "+scope.classes.textEditor);scope.displayElements.html.addClass("ta-html ta-editor "+scope.classes.htmlEditor);var testAndSet=function(choice,beforeState){if(beforeState!==$document[0].queryCommandState(choice)){$document[0].execCommand(choice,false,null)}};scope._actionRunning=false;var _savedSelection=false;scope.startAction=function(){var _beforeStateBold=false;var _beforeStateItalic=false;var _beforeStateUnderline=false;var _beforeStateStrikethough=false;scope._actionRunning=true;_beforeStateBold=$document[0].queryCommandState("bold");_beforeStateItalic=$document[0].queryCommandState("italic");_beforeStateUnderline=$document[0].queryCommandState("underline");_beforeStateStrikethough=$document[0].queryCommandState("strikeThrough");_savedSelection=rangy.saveSelection();testAndSet("bold",_beforeStateBold);testAndSet("italic",_beforeStateItalic);testAndSet("underline",_beforeStateUnderline);testAndSet("strikeThrough",_beforeStateStrikethough);return function(){if(_savedSelection)rangy.restoreSelection(_savedSelection)}};scope.endAction=function(){scope._actionRunning=false;if(_savedSelection){if(scope.showHtml){scope.displayElements.html[0].focus()}else{scope.displayElements.text[0].focus()}rangy.removeMarkers(_savedSelection)}_savedSelection=false;scope.updateSelectedStyles();if(!scope.showHtml)scope["updateTaBindtaTextElement"+_serial]()};_focusin=function(e){scope.focussed=true;element.addClass(scope.classes.focussed);_editorFunctions.focus();element.triggerHandler("focus");if(scope.updateSelectedStyles&&!scope._bUpdateSelectedStyles){$timeout(function(){scope.updateSelectedStyles()},0)}};scope.displayElements.html.on("focus",_focusin);scope.displayElements.text.on("focus",_focusin);_focusout=function(e){if(!scope._actionRunning&&$document[0].activeElement!==scope.displayElements.html[0]&&$document[0].activeElement!==scope.displayElements.text[0]){element.removeClass(scope.classes.focussed);_editorFunctions.unfocus();$timeout(function(){scope._bUpdateSelectedStyles=false;element.triggerHandler("blur");scope.focussed=false},0)}e.preventDefault();return false};scope.displayElements.html.on("blur",_focusout);scope.displayElements.text.on("blur",_focusout);scope.displayElements.text.on("paste",function(event){element.triggerHandler("paste",event)});scope.queryFormatBlockState=function(command){return!scope.showHtml&&command.toLowerCase()===$document[0].queryCommandValue("formatBlock").toLowerCase()};scope.queryCommandState=function(command){return!scope.showHtml?$document[0].queryCommandState(command):""};scope.switchView=function(){scope.showHtml=!scope.showHtml;$animate.enabled(false,scope.displayElements.html);$animate.enabled(false,scope.displayElements.text);if(scope.showHtml){$timeout(function(){$animate.enabled(true,scope.displayElements.html);$animate.enabled(true,scope.displayElements.text);return scope.displayElements.html[0].focus()},100)}else{$timeout(function(){$animate.enabled(true,scope.displayElements.html);$animate.enabled(true,scope.displayElements.text);return scope.displayElements.text[0].focus()},100)}};if(attrs.ngModel){var _firstRun=true;ngModel.$render=function(){if(_firstRun){_firstRun=false;var _initialValue=scope.$parent.$eval(attrs.ngModel);if((_initialValue===undefined||_initialValue===null)&&(_originalContents&&_originalContents!=="")){ngModel.$setViewValue(_originalContents)}}scope.displayElements.forminput.val(ngModel.$viewValue);scope.html=ngModel.$viewValue||""};if(element.attr("required"))ngModel.$validators.required=function(modelValue,viewValue){var value=modelValue||viewValue;return!(!value||value.trim()==="")}}else{scope.displayElements.forminput.val(_originalContents);scope.html=_originalContents}scope.$watch("html",function(newValue,oldValue){if(newValue!==oldValue){if(attrs.ngModel&&ngModel.$viewValue!==newValue){ngModel.$setViewValue(newValue)}scope.displayElements.forminput.val(newValue)}});if(attrs.taTargetToolbars){_editorFunctions=textAngularManager.registerEditor(scope._name,scope,attrs.taTargetToolbars.split(","))}else{var _toolbar=angular.element('
    ');if(attrs.taToolbar)_toolbar.attr("ta-toolbar",attrs.taToolbar);if(attrs.taToolbarClass)_toolbar.attr("ta-toolbar-class",attrs.taToolbarClass);if(attrs.taToolbarGroupClass)_toolbar.attr("ta-toolbar-group-class",attrs.taToolbarGroupClass);if(attrs.taToolbarButtonClass)_toolbar.attr("ta-toolbar-button-class",attrs.taToolbarButtonClass);if(attrs.taToolbarActiveButtonClass)_toolbar.attr("ta-toolbar-active-button-class",attrs.taToolbarActiveButtonClass);if(attrs.taFocussedClass)_toolbar.attr("ta-focussed-class",attrs.taFocussedClass);element.prepend(_toolbar);$compile(_toolbar)(scope.$parent);_editorFunctions=textAngularManager.registerEditor(scope._name,scope,["textAngularToolbar"+_serial])}scope.$on("$destroy",function(){textAngularManager.unregisterEditor(scope._name);angular.element(window).off("blur");angular.element(window).off("resize",scope.handlePopoverEvents);angular.element(window).off("scroll",scope.handlePopoverEvents)});scope.$on("ta-element-select",function(event,element){if(_editorFunctions.triggerElementSelect(event,element)){scope["reApplyOnSelectorHandlerstaTextElement"+_serial]()}});scope.$on("ta-drop-event",function(event,element,dropEvent,dataTransfer){if(dataTransfer&&dataTransfer.files&&dataTransfer.files.length>0){scope.displayElements.text[0].focus();taSelection.setSelectionToElementEnd(dropEvent.target);angular.forEach(dataTransfer.files,function(file){try{$q.when(scope.fileDropHandler(file,scope.wrapSelection)||scope.fileDropHandler!==scope.defaultFileDropHandler&&$q.when(scope.defaultFileDropHandler(file,scope.wrapSelection))).then(function(){scope["updateTaBindtaTextElement"+_serial]()})}catch(error){$log.error(error)}});dropEvent.preventDefault();dropEvent.stopPropagation()}else{$timeout(function(){scope["updateTaBindtaTextElement"+_serial]()},0)}});scope._bUpdateSelectedStyles=false;angular.element(window).on("blur",function(){scope._bUpdateSelectedStyles=false;scope.focussed=false});scope.updateSelectedStyles=function(){var _selection;if(_updateSelectedStylesTimeout)$timeout.cancel(_updateSelectedStylesTimeout);if((_selection=taSelection.getSelectionElement())!==undefined&&_selection.parentNode!==scope.displayElements.text[0]){_editorFunctions.updateSelectedStyles(angular.element(_selection))}else _editorFunctions.updateSelectedStyles();if(scope._bUpdateSelectedStyles)_updateSelectedStylesTimeout=$timeout(scope.updateSelectedStyles,200)};_keydown=function(){if(!scope.focussed){scope._bUpdateSelectedStyles=false;return}if(!scope._bUpdateSelectedStyles){scope._bUpdateSelectedStyles=true;scope.$apply(function(){scope.updateSelectedStyles()})}};scope.displayElements.html.on("keydown",_keydown);scope.displayElements.text.on("keydown",_keydown);_keyup=function(){scope._bUpdateSelectedStyles=false};scope.displayElements.html.on("keyup",_keyup);scope.displayElements.text.on("keyup",_keyup);_keypress=function(event,eventData){if(taSelection.getSelection){var _selection=taSelection.getSelection();if(taSelection.getSelectionElement()&&taSelection.getSelectionElement().nodeName.toLowerCase()==="a"){if(_selection.start.element.nodeType===3&&_selection.start.element.textContent.length===_selection.end.offset){taSelection.setSelectionAfterElement(taSelection.getSelectionElement())}if(_selection.start.element.nodeType===3&&_selection.start.offset===0){taSelection.setSelectionBeforeElement(taSelection.getSelectionElement())}}}if(eventData)angular.extend(event,eventData);scope.$apply(function(){if(_editorFunctions.sendKeyCommand(event)){if(!scope._bUpdateSelectedStyles){scope.updateSelectedStyles()}event.preventDefault();return false}})};scope.displayElements.html.on("keypress",_keypress);scope.displayElements.text.on("keypress",_keypress);_mouseup=function(){scope._bUpdateSelectedStyles=false;$timeout(function(){scope.updateSelectedStyles()},0)};scope.displayElements.html.on("mouseup",_mouseup);scope.displayElements.text.on("mouseup",_mouseup)}}}]);textAngular.service("textAngularManager",["taToolExecuteAction","taTools","taRegisterTool","$interval","$rootScope","$log",function(taToolExecuteAction,taTools,taRegisterTool,$interval,$rootScope,$log){var toolbars={},editors={};var timeRecentModification=0;var updateStyles=function(selectedElement){angular.forEach(editors,function(editor){editor.editorFunctions.updateSelectedStyles(selectedElement)})};var triggerInterval=50;var triggerIntervalTimer;var setupTriggerUpdateStyles=function(){timeRecentModification=Date.now();triggerIntervalTimer=$interval(function(){updateStyles();triggerIntervalTimer=undefined},triggerInterval,1)};$rootScope.$on("destroy",function(){if(triggerIntervalTimer){$interval.cancel(triggerIntervalTimer);triggerIntervalTimer=undefined}});var touchModification=function(){if(Math.abs(Date.now()-timeRecentModification)>triggerInterval){setupTriggerUpdateStyles()}};return{registerEditor:function(editorName,editorScope,targetToolbars){if(!editorName||editorName==="")throw"textAngular Error: An editor requires a name";if(!editorScope)throw"textAngular Error: An editor requires a scope";if(editors[editorName])throw'textAngular Error: An Editor with name "'+editorName+'" already exists';editors[editorName]={scope:editorScope,toolbars:targetToolbars,toolbarScopes:[],_registerToolbarScope:function(toolbarScope){if(this.toolbars.indexOf(toolbarScope.name)>=0){this.toolbarScopes.push(toolbarScope)}},editorFunctions:{disable:function(){angular.forEach(editors[editorName].toolbarScopes,function(toolbarScope){toolbarScope.disabled=true})},enable:function(){angular.forEach(editors[editorName].toolbarScopes,function(toolbarScope){toolbarScope.disabled=false})},focus:function(){angular.forEach(editors[editorName].toolbarScopes,function(toolbarScope){toolbarScope._parent=editorScope;toolbarScope.disabled=false;toolbarScope.focussed=true});editorScope.focussed=true},unfocus:function(){angular.forEach(editors[editorName].toolbarScopes,function(toolbarScope){toolbarScope.disabled=true;toolbarScope.focussed=false});editorScope.focussed=false},updateSelectedStyles:function(selectedElement){angular.forEach(editors[editorName].toolbarScopes,function(toolbarScope){angular.forEach(toolbarScope.tools,function(toolScope){if(toolScope.activeState){toolbarScope._parent=editorScope;toolScope.active=toolScope.activeState(selectedElement)}})})},sendKeyCommand:function(event){var result=false;if(event.ctrlKey||event.metaKey||event.specialKey)angular.forEach(taTools,function(tool,name){if(tool.commandKeyCode&&(tool.commandKeyCode===event.which||tool.commandKeyCode===event.specialKey)){for(var _t=0;_t0){for(var _i=0;_i");if(toolDefinition&&toolDefinition["class"])toolElement.addClass(toolDefinition["class"]);else toolElement.addClass(scope.classes.toolbarButton);toolElement.attr("name",toolScope.name);toolElement.attr("ta-button","ta-button");toolElement.attr("ng-disabled","isDisabled()");toolElement.attr("tabindex","-1");toolElement.attr("ng-click","executeAction()");toolElement.attr("ng-class","displayActiveToolClass(active)");if(toolDefinition&&toolDefinition.tooltiptext){toolElement.attr("title",toolDefinition.tooltiptext)}if(toolDefinition&&!toolDefinition.display&&!toolScope._display){toolElement[0].innerHTML="";if(toolDefinition.buttontext)toolElement[0].innerHTML=toolDefinition.buttontext;if(toolDefinition.iconclass){var icon=angular.element(""),content=toolElement[0].innerHTML;icon.addClass(toolDefinition.iconclass);toolElement[0].innerHTML="";toolElement.append(icon);if(content&&content!=="")toolElement.append(" "+content)}}toolScope._lastToolDefinition=angular.copy(toolDefinition);return $compile(toolElement)(toolScope)};scope.tools={};scope._parent={disabled:true,showHtml:false,queryFormatBlockState:function(){return false},queryCommandState:function(){return false}};var defaultChildScope={$window:$window,$editor:function(){return scope._parent},isDisabled:function(){if(this.name==="html"&&scope._parent.startAction){return false}return typeof this.$eval("disabled")!=="function"&&this.$eval("disabled")||this.$eval("disabled()")||this.name!=="html"&&this.$editor().showHtml||this.$parent.disabled||this.$editor().disabled},displayActiveToolClass:function(active){return active?scope.classes.toolbarButtonActive:""},executeAction:taToolExecuteAction};angular.forEach(scope.toolbar,function(group){var groupElement=angular.element("
    ");groupElement.addClass(scope.classes.toolbarGroup);angular.forEach(group,function(tool){scope.tools[tool]=angular.extend(scope.$new(true),taTools[tool],defaultChildScope,{name:tool});scope.tools[tool].$element=setupToolElement(taTools[tool],scope.tools[tool]);groupElement.append(scope.tools[tool].$element)});element.append(groupElement)});scope.updateToolDisplay=function(key,_newTool,forceNew){var toolInstance=scope.tools[key];if(toolInstance){if(toolInstance._lastToolDefinition&&!forceNew)_newTool=angular.extend({},toolInstance._lastToolDefinition,_newTool);if(_newTool.buttontext===null&&_newTool.iconclass===null&&_newTool.display===null)throw'textAngular Error: Tool Definition for updating "'+key+'" does not have a valid display/iconclass/buttontext value';if(_newTool.buttontext===null){delete _newTool.buttontext}if(_newTool.iconclass===null){delete _newTool.iconclass}if(_newTool.display===null){delete _newTool.display}var toolElement=setupToolElement(_newTool,toolInstance);toolInstance.$element.replaceWith(toolElement);toolInstance.$element=toolElement}};scope.addTool=function(key,_newTool,groupIndex,index){scope.tools[key]=angular.extend(scope.$new(true),taTools[key],defaultChildScope,{name:key});scope.tools[key].$element=setupToolElement(taTools[key],scope.tools[key]);var group;if(groupIndex===undefined)groupIndex=scope.toolbar.length-1;group=angular.element(element.children()[groupIndex]);if(index===undefined){group.append(scope.tools[key].$element);scope.toolbar[groupIndex][scope.toolbar[groupIndex].length-1]=key}else{group.children().eq(index).after(scope.tools[key].$element);scope.toolbar[groupIndex][index]=key}};textAngularManager.registerToolbar(scope);scope.$on("$destroy",function(){textAngularManager.unregisterToolbar(scope.name)})}}}]);textAngular.directive("textAngularVersion",["textAngularManager",function(textAngularManager){var version=textAngularManager.getVersion();return{restrict:"EA",link:function(scope,element,attrs){element.html(version)}}}]);return textAngular.name});




    © 2015 - 2025 Weber Informatics LLC | Privacy Policy