2014-05-07 13:06:24 +08:00
( function ( exports , undefined ) { "use strict" ; var modules = { } ; function require ( ids , callback ) { var module , defs = [ ] ; for ( var i = 0 ; i < ids . length ; ++ i ) { module = modules [ ids [ i ] ] || resolve ( ids [ i ] ) ; if ( ! module ) { throw "module definition dependecy not found: " + ids [ i ] } defs . push ( module ) } callback . apply ( null , defs ) } function define ( id , dependencies , definition ) { if ( typeof id !== "string" ) { throw "invalid module definition, module id must be defined and be a string" } if ( dependencies === undefined ) { throw "invalid module definition, dependencies must be specified" } if ( definition === undefined ) { throw "invalid module definition, definition function must be specified" } require ( dependencies , function ( ) { modules [ id ] = definition . apply ( null , arguments ) } ) } function defined ( id ) { return ! ! modules [ id ] } function resolve ( id ) { var target = exports ; var fragments = id . split ( /[.\/]/ ) ; for ( var fi = 0 ; fi < fragments . length ; ++ fi ) { if ( ! target [ fragments [ fi ] ] ) { return } target = target [ fragments [ fi ] ] } return target } function expose ( ids ) { for ( var i = 0 ; i < ids . length ; i ++ ) { var target = exports ; var id = ids [ i ] ; var fragments = id . split ( /[.\/]/ ) ; for ( var fi = 0 ; fi < fragments . length - 1 ; ++ fi ) { if ( target [ fragments [ fi ] ] === undefined ) { target [ fragments [ fi ] ] = { } } target = target [ fragments [ fi ] ] } target [ fragments [ fragments . length - 1 ] ] = modules [ id ] } } define ( "tinymce/dom/EventUtils" , [ ] , function ( ) { "use strict" ; var eventExpandoPrefix = "mce-data-" ; var mouseEventRe = /^(?:mouse|contextmenu)|click/ ; var deprecated = { keyLocation : 1 , layerX : 1 , layerY : 1 , returnValue : 1 } ; function addEvent ( target , name , callback , capture ) { if ( target . addEventListener ) { target . addEventListener ( name , callback , capture || false ) } else if ( target . attachEvent ) { target . attachEvent ( "on" + name , callback ) } } function removeEvent ( target , name , callback , capture ) { if ( target . removeEventListener ) { target . removeEventListener ( name , callback , capture || false ) } else if ( target . detachEvent ) { target . detachEvent ( "on" + name , callback ) } } function fix ( originalEvent , data ) { var name , event = data || { } , undef ; function returnFalse ( ) { return false } function returnTrue ( ) { return true } for ( name in originalEvent ) { if ( ! deprecated [ name ] ) { event [ name ] = originalEvent [ name ] } } if ( ! event . target ) { event . target = event . srcElement || document } if ( originalEvent && mouseEventRe . test ( originalEvent . type ) && originalEvent . pageX === undef && originalEvent . clientX !== undef ) { var eventDoc = event . target . ownerDocument || document ; var doc = eventDoc . documentElement ; var body = eventDoc . body ; event . pageX = originalEvent . clientX + ( doc && doc . scrollLeft || body && body . scrollLeft || 0 ) - ( doc && doc . clientLeft || body && body . clientLeft || 0 ) ; event . pageY = originalEvent . clientY + ( doc && doc . scrollTop || body && body . scrollTop || 0 ) - ( doc && doc . clientTop || body && body . clientTop || 0 ) } event . preventDefault = function ( ) { event . isDefaultPrevented = returnTrue ; if ( originalEvent ) { if ( originalEvent . preventDefault ) { originalEvent . preventDefault ( ) } else { originalEvent . returnValue = false } } } ; event . stopPropagation = function ( ) { event . isPropagationStopped = returnTrue ; if ( originalEvent ) { if ( originalEvent . stopPropagation ) { originalEvent . stopPropagation ( ) } else { originalEvent . cancelBubble = true } } } ; event . stopImmediatePropagation = function ( ) { event . isImmediatePropagationStopped = returnTrue ; event . stopPropagation ( ) } ; if ( ! event . isDefaultPrevented ) { event . isDefaultPrevented = returnFalse ; event . isPropagationStopped = returnFalse ; event . isImmediatePropagationStopped = returnFalse } return event } function bindOnReady ( win , callback , eventUtils ) { var doc = win . document , event = { type : "ready" } ; if ( eventUtils . domLoaded ) { callback ( event ) ; return } function readyHandler ( ) { if ( ! eventUtils . domLoaded ) { eventUtils . domLoaded = true ; callback ( event ) } } function waitForDomLoaded ( ) { if ( doc . readyState === "complete" ) { removeEvent ( doc , "readystatechange" , waitForDomLoaded ) ; readyHandler ( ) } } function tryScroll ( ) { try { doc . documentElement . doScroll ( "left" ) } catch ( ex ) { setTimeout ( tryScroll , 0 ) ; return } readyHandler ( ) } if ( doc . addEventListener ) { if ( doc . readyState === "complete" ) { readyHandler ( ) } else { addEvent ( win , "DOMContentLoaded" , readyHandler ) } } else { addEvent ( doc , "readystatechange" , waitForDomLoaded ) ; if ( doc . documentElement . doScroll && win === win . top ) { tryScroll ( ) } } addEvent ( win , "load" , readyHandler ) } function EventUtils ( ) { var self = this , events = { } , count , expando , hasFocusIn , hasMouseEnter
if ( matcher ) { matcher ( matcherIn , matcherOut , context , xml ) } if ( postFilter ) { temp = condense ( matcherOut , postMap ) ; postFilter ( temp , [ ] , context , xml ) ; i = temp . length ; while ( i -- ) { if ( elem = temp [ i ] ) { matcherOut [ postMap [ i ] ] = ! ( matcherIn [ postMap [ i ] ] = elem ) } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { temp = [ ] ; i = matcherOut . length ; while ( i -- ) { if ( elem = matcherOut [ i ] ) { temp . push ( matcherIn [ i ] = elem ) } } postFinder ( null , matcherOut = [ ] , temp , xml ) } i = matcherOut . length ; while ( i -- ) { if ( ( elem = matcherOut [ i ] ) && ( temp = postFinder ? indexOf . call ( seed , elem ) : preMap [ i ] ) > - 1 ) { seed [ temp ] = ! ( results [ temp ] = elem ) } } } } else { matcherOut = condense ( matcherOut === results ? matcherOut . splice ( preexisting , matcherOut . length ) : matcherOut ) ; if ( postFinder ) { postFinder ( null , results , matcherOut , xml ) } else { push . apply ( results , matcherOut ) } } } ) } function matcherFromTokens ( tokens ) { var checkContext , matcher , j , len = tokens . length , leadingRelative = Expr . relative [ tokens [ 0 ] . type ] , implicitRelative = leadingRelative || Expr . relative [ " " ] , i = leadingRelative ? 1 : 0 , matchContext = addCombinator ( function ( elem ) { return elem === checkContext } , implicitRelative , true ) , matchAnyContext = addCombinator ( function ( elem ) { return indexOf . call ( checkContext , elem ) > - 1 } , implicitRelative , true ) , matchers = [ function ( elem , context , xml ) { return ! leadingRelative && ( xml || context !== outermostContext ) || ( ( checkContext = context ) . nodeType ? matchContext ( elem , context , xml ) : matchAnyContext ( elem , context , xml ) ) } ] ; for ( ; i < len ; i ++ ) { if ( matcher = Expr . relative [ tokens [ i ] . type ] ) { matchers = [ addCombinator ( elementMatcher ( matchers ) , matcher ) ] } else { matcher = Expr . filter [ tokens [ i ] . type ] . apply ( null , tokens [ i ] . matches ) ; if ( matcher [ expando ] ) { j = ++ i ; for ( ; j < len ; j ++ ) { if ( Expr . relative [ tokens [ j ] . type ] ) { break } } return setMatcher ( i > 1 && elementMatcher ( matchers ) , i > 1 && toSelector ( tokens . slice ( 0 , i - 1 ) ) . replace ( rtrim , "$1" ) , matcher , i < j && matcherFromTokens ( tokens . slice ( i , j ) ) , j < len && matcherFromTokens ( tokens = tokens . slice ( j ) ) , j < len && toSelector ( tokens ) ) } matchers . push ( matcher ) } } return elementMatcher ( matchers ) } function matcherFromGroupMatchers ( elementMatchers , setMatchers ) { var matcherCachedRuns = 0 , bySet = setMatchers . length > 0 , byElement = elementMatchers . length > 0 , superMatcher = function ( seed , context , xml , results , expandContext ) { var elem , j , matcher , setMatched = [ ] , matchedCount = 0 , i = "0" , unmatched = seed && [ ] , outermost = expandContext != null , contextBackup = outermostContext , elems = seed || byElement && Expr . find [ "TAG" ] ( "*" , expandContext && context . parentNode || context ) , dirrunsUnique = dirruns += contextBackup == null ? 1 : Math . random ( ) || . 1 ; if ( outermost ) { outermostContext = context !== document && context ; cachedruns = matcherCachedRuns } for ( ; ( elem = elems [ i ] ) != null ; i ++ ) { if ( byElement && elem ) { j = 0 ; while ( matcher = elementMatchers [ j ++ ] ) { if ( matcher ( elem , context , xml ) ) { results . push ( elem ) ; break } } if ( outermost ) { dirruns = dirrunsUnique ; cachedruns = ++ matcherCachedRuns } } if ( bySet ) { if ( elem = ! matcher && elem ) { matchedCount -- } if ( seed ) { unmatched . push ( elem ) } } } matchedCount += i ; if ( bySet && i !== matchedCount ) { j = 0 ; while ( matcher = setMatchers [ j ++ ] ) { matcher ( unmatched , setMatched , context , xml ) } if ( seed ) { if ( matchedCount > 0 ) { while ( i -- ) { if ( ! ( unmatched [ i ] || setMatched [ i ] ) ) { setMatched [ i ] = pop . call ( results ) } } } setMatched = condense ( setMatched ) } push . apply ( results , setMatched ) ; if ( outermost && ! seed && setMatched . length > 0 && matchedCount + setMatchers . length > 1 ) { Sizzle . uniqueSort ( results ) } } if ( outermost ) { dirruns = dirrunsUnique ; outermostContext = contextBackup } return unmatched } ; return bySet ? markFunction ( superMatcher ) : superMatcher } compile = Sizzle . compile = function ( selector , group ) { var i , setMatchers = [ ] , elementMatchers = [ ] , cached = compilerCache [ selector + " " ] ; if ( ! cached ) { if ( ! group ) { group = tokenize ( selector ) } i = group . length ; while ( i -- ) { cached = matcherFromTokens ( group [ i ] ) ; if ( cached [ expando ] ) { setMatchers . push ( cached ) } else { elementMatchers . push ( cached ) } } cached = compilerCache ( selector , matcherFromGroupMatchers ( elementMatchers , setMatchers ) ) } return cached } ; function multipleContexts ( selector , contexts , results ) { var i = 0 , len = contexts . length ; for ( ; i < len ; i ++ ) { Sizzle ( selector , contexts [ i ] , results ) } return results } function select ( selector , context , results , seed ) { var i , tokens , token , type , find , match = tokenize ( selector ) ; if ( ! seed ) { if ( match . length === 1 ) { tokens = match [ 0 ] = match [ 0 ] . slice ( 0 ) ; if ( tokens . length > 2 && ( token
clonedGrandParent = _traverseNode ( parent , FALSE , TRUE , how ) ; if ( how != DELETE ) { clonedGrandParent . appendChild ( clonedParent ) } clonedParent = clonedGrandParent } } function _traverseNode ( n , isFullySelected , isLeft , how ) { var txtValue , newNodeValue , oldNodeValue , offset , newNode ; if ( isFullySelected ) { return _traverseFullySelected ( n , how ) } if ( n . nodeType == 3 ) { txtValue = n . nodeValue ; if ( isLeft ) { offset = t [ START _OFFSET ] ; newNodeValue = txtValue . substring ( offset ) ; oldNodeValue = txtValue . substring ( 0 , offset ) } else { offset = t [ END _OFFSET ] ; newNodeValue = txtValue . substring ( 0 , offset ) ; oldNodeValue = txtValue . substring ( offset ) } if ( how != CLONE ) { n . nodeValue = oldNodeValue } if ( how == DELETE ) { return } newNode = dom . clone ( n , FALSE ) ; newNode . nodeValue = newNodeValue ; return newNode } if ( how == DELETE ) { return } return dom . clone ( n , FALSE ) } function _traverseFullySelected ( n , how ) { if ( how != DELETE ) { return how == CLONE ? dom . clone ( n , TRUE ) : n } n . parentNode . removeChild ( n ) } function toStringIE ( ) { return dom . create ( "body" , null , cloneContents ( ) ) . outerText } extend ( t , { startContainer : doc , startOffset : 0 , endContainer : doc , endOffset : 0 , collapsed : TRUE , commonAncestorContainer : doc , START _TO _START : 0 , START _TO _END : 1 , END _TO _END : 2 , END _TO _START : 3 , setStart : setStart , setEnd : setEnd , setStartBefore : setStartBefore , setStartAfter : setStartAfter , setEndBefore : setEndBefore , setEndAfter : setEndAfter , collapse : collapse , selectNode : selectNode , selectNodeContents : selectNodeContents , compareBoundaryPoints : compareBoundaryPoints , deleteContents : deleteContents , extractContents : extractContents , cloneContents : cloneContents , insertNode : insertNode , surroundContents : surroundContents , cloneRange : cloneRange , toStringIE : toStringIE } ) ; return t } Range . prototype . toString = function ( ) { return this . toStringIE ( ) } ; return Range } ) ; define ( "tinymce/html/Entities" , [ "tinymce/util/Tools" ] , function ( Tools ) { var makeMap = Tools . makeMap ; var namedEntities , baseEntities , reverseEntities , attrsCharsRegExp = /[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g , textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g , rawCharsRegExp = /[<>&\"\']/g , entityRegExp = /&(#x|#)?([\w]+);/g , asciiMap = { 128 : "€" , 130 : "‚ " , 131 : "ƒ" , 132 : "„" , 133 : "…" , 134 : "†" , 135 : "‡" , 136 : "ˆ " , 137 : "‰" , 138 : "Š" , 139 : "‹ " , 140 : "Œ" , 142 : "Ž" , 145 : "‘ " , 146 : "’ " , 147 : "“" , 148 : "”" , 149 : "•" , 150 : "– " , 151 : "—" , 152 : "˜ " , 153 : "™" , 154 : "š" , 155 : "› " , 156 : "œ" , 158 : "ž" , 159 : "Ÿ" } ; baseEntities = { '"' : """ , "'" : "'" , "<" : "<" , ">" : ">" , "&" : "&" } ; reverseEntities = { "<" : "<" , ">" : ">" , "&" : "&" , """ : '"' , "'" : "'" } ; function nativeDecode ( text ) { var elm ; elm = document . createElement ( "div" ) ; elm . innerHTML = text ; return elm . textContent || elm . innerText || text } function buildEntitiesLookup ( items , radix ) { var i , chr , entity , lookup = { } ; if ( items ) { items = items . split ( "," ) ; radix = radix || 10 ; for ( i = 0 ; i < items . length ; i += 2 ) { chr = String . fromCharCode ( parseInt ( items [ i ] , radix ) ) ; if ( ! baseEntities [ chr ] ) { entity = "&" + items [ i + 1 ] + ";" ; lookup [ chr ] = entity ; lookup [ entity ] = chr } } return lookup } } namedEntities = buildEntitiesLookup ( "50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy," + "5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute," + "5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34," + "5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil," + "68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde," + "6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute," + "6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml," + "75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc," + "7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash," + "7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta," + "sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu," + "st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi," + " t9 , Omega , th , alpha , ti , beta , tj , gamma , tk , delta , tl , epsilon , tm , zet
this . lookup [ id ] = { instance : addOn , dependencies : dependencies } ; return addOn } , createUrl : function ( baseUrl , dep ) { if ( typeof dep === "object" ) { return dep } else { return { prefix : baseUrl . prefix , resource : dep , suffix : baseUrl . suffix } } } , addComponents : function ( pluginName , scripts ) { var pluginUrl = this . urls [ pluginName ] ; each ( scripts , function ( script ) { ScriptLoader . ScriptLoader . add ( pluginUrl + "/" + script ) } ) } , load : function ( n , u , cb , s ) { var t = this , url = u ; function loadDependencies ( ) { var dependencies = t . dependencies ( n ) ; each ( dependencies , function ( dep ) { var newUrl = t . createUrl ( u , dep ) ; t . load ( newUrl . resource , newUrl , undefined , undefined ) } ) ; if ( cb ) { if ( s ) { cb . call ( s ) } else { cb . call ( ScriptLoader ) } } } if ( t . urls [ n ] ) { return } if ( typeof u === "object" ) { url = u . prefix + u . resource + u . suffix } if ( url . indexOf ( "/" ) !== 0 && url . indexOf ( "://" ) == - 1 ) { url = AddOnManager . baseURL + "/" + url } t . urls [ n ] = url . substring ( 0 , url . lastIndexOf ( "/" ) ) ; if ( t . lookup [ n ] ) { loadDependencies ( ) } else { ScriptLoader . ScriptLoader . add ( url , loadDependencies , s ) } } } ; AddOnManager . PluginManager = new AddOnManager ; AddOnManager . ThemeManager = new AddOnManager ; return AddOnManager } ) ; define ( "tinymce/html/Node" , [ ] , function ( ) { var whiteSpaceRegExp = /^[ \t\r\n]*$/ , typeLookup = { "#text" : 3 , "#comment" : 8 , "#cdata" : 4 , "#pi" : 7 , "#doctype" : 10 , "#document-fragment" : 11 } ; function walk ( node , root _node , prev ) { var sibling , parent , startName = prev ? "lastChild" : "firstChild" , siblingName = prev ? "prev" : "next" ; if ( node [ startName ] ) { return node [ startName ] } if ( node !== root _node ) { sibling = node [ siblingName ] ; if ( sibling ) { return sibling } for ( parent = node . parent ; parent && parent !== root _node ; parent = parent . parent ) { sibling = parent [ siblingName ] ; if ( sibling ) { return sibling } } } } function Node ( name , type ) { this . name = name ; this . type = type ; if ( type === 1 ) { this . attributes = [ ] ; this . attributes . map = { } } } Node . prototype = { replace : function ( node ) { var self = this ; if ( node . parent ) { node . remove ( ) } self . insert ( node , self ) ; self . remove ( ) ; return self } , attr : function ( name , value ) { var self = this , attrs , i , undef ; if ( typeof name !== "string" ) { for ( i in name ) { self . attr ( i , name [ i ] ) } return self } if ( attrs = self . attributes ) { if ( value !== undef ) { if ( value === null ) { if ( name in attrs . map ) { delete attrs . map [ name ] ; i = attrs . length ; while ( i -- ) { if ( attrs [ i ] . name === name ) { attrs = attrs . splice ( i , 1 ) ; return self } } } return self } if ( name in attrs . map ) { i = attrs . length ; while ( i -- ) { if ( attrs [ i ] . name === name ) { attrs [ i ] . value = value ; break } } } else { attrs . push ( { name : name , value : value } ) } attrs . map [ name ] = value ; return self } else { return attrs . map [ name ] } } } , clone : function ( ) { var self = this , clone = new Node ( self . name , self . type ) , i , l , selfAttrs , selfAttr , cloneAttrs ; if ( selfAttrs = self . attributes ) { cloneAttrs = [ ] ; cloneAttrs . map = { } ; for ( i = 0 , l = selfAttrs . length ; i < l ; i ++ ) { selfAttr = selfAttrs [ i ] ; if ( selfAttr . name !== "id" ) { cloneAttrs [ cloneAttrs . length ] = { name : selfAttr . name , value : selfAttr . value } ; cloneAttrs . map [ selfAttr . name ] = selfAttr . value } } clone . attributes = cloneAttrs } clone . value = self . value ; clone . shortEnded = self . shortEnded ; return clone } , wrap : function ( wrapper ) { var self = this ; self . parent . insert ( wrapper , self ) ; wrapper . append ( self ) ; return self } , unwrap : function ( ) { var self = this , node , next ; for ( node = self . firstChild ; node ; ) { next = node . next ; self . insert ( node , self , true ) ; node = next } self . remove ( ) } , remove : function ( ) { var self = this , parent = self . parent , next = self . next , prev = self . prev ; if ( parent ) { if ( parent . firstChild === self ) { parent . firstChild = next ; if ( next ) { next . prev = null } } else { prev . next = next } if ( parent . lastChild === self ) { parent . lastChild = prev ; if ( prev ) { prev . next = null } } else { next . prev = prev } self . parent = self . next = self . prev = null } return self } , append : function ( node ) { var self = this , last ; if ( node . parent ) { node . remove ( ) } last = self . lastChild ; if ( last ) { last . next = node ; node . prev = last ; self . lastChild = node } else { self . lastChild = self . firstChild = node } node . parent = self ; return node } , insert : function ( node , ref _node , before ) { var parent ; if ( node . parent ) { node . remove ( ) } parent = ref _node . parent || this ; if ( before ) { if ( ref _node === parent . firstChild ) { parent . firstChild = node } else { ref _node . prev . next = node } node . prev = ref _node . prev ; node . next = ref _node ; ref _node . prev = node } else { if ( ref _node === parent . lastChild ) { parent . lastChild = node } else { ref _node . next . prev = node } node . next = ref _node . next ; node . prev = ref _node ; ref _node . next = node } node . parent = parent ; ret
for ( i = 0 ; i < attributeFilters . length ; i ++ ) { if ( attributeFilters [ i ] . name === name ) { attributeFilters [ i ] . callbacks . push ( callback ) ; return } } attributeFilters . push ( { name : name , callbacks : [ callback ] } ) } ) } ; self . parse = function ( html , args ) { var parser , rootNode , node , nodes , i , l , fi , fl , list , name , validate ; var blockElements , startWhiteSpaceRegExp , invalidChildren = [ ] , isInWhiteSpacePreservedElement ; var endWhiteSpaceRegExp , allWhiteSpaceRegExp , isAllWhiteSpaceRegExp , whiteSpaceElements ; var children , nonEmptyElements , rootBlockName ; args = args || { } ; matchedNodes = { } ; matchedAttributes = { } ; blockElements = extend ( makeMap ( "script,style,head,html,body,title,meta,param" ) , schema . getBlockElements ( ) ) ; nonEmptyElements = schema . getNonEmptyElements ( ) ; children = schema . children ; validate = settings . validate ; rootBlockName = "forced_root_block" in args ? args . forced _root _block : settings . forced _root _block ; whiteSpaceElements = schema . getWhiteSpaceElements ( ) ; startWhiteSpaceRegExp = /^[ \t\r\n]+/ ; endWhiteSpaceRegExp = /[ \t\r\n]+$/ ; allWhiteSpaceRegExp = /[ \t\r\n]+/g ; isAllWhiteSpaceRegExp = /^[ \t\r\n]+$/ ; function addRootBlocks ( ) { var node = rootNode . firstChild , next , rootBlockNode ; function trim ( rootBlockNode ) { if ( rootBlockNode ) { node = rootBlockNode . firstChild ; if ( node && node . type == 3 ) { node . value = node . value . replace ( startWhiteSpaceRegExp , "" ) } node = rootBlockNode . lastChild ; if ( node && node . type == 3 ) { node . value = node . value . replace ( endWhiteSpaceRegExp , "" ) } } } if ( ! schema . isValidChild ( rootNode . name , rootBlockName . toLowerCase ( ) ) ) { return } while ( node ) { next = node . next ; if ( node . type == 3 || node . type == 1 && node . name !== "p" && ! blockElements [ node . name ] && ! node . attr ( "data-mce-type" ) ) { if ( ! rootBlockNode ) { rootBlockNode = createNode ( rootBlockName , 1 ) ; rootBlockNode . attr ( settings . forced _root _block _attrs ) ; rootNode . insert ( rootBlockNode , node ) ; rootBlockNode . append ( node ) } else { rootBlockNode . append ( node ) } } else { trim ( rootBlockNode ) ; rootBlockNode = null } node = next } trim ( rootBlockNode ) } function createNode ( name , type ) { var node = new Node ( name , type ) , list ; if ( name in nodeFilters ) { list = matchedNodes [ name ] ; if ( list ) { list . push ( node ) } else { matchedNodes [ name ] = [ node ] } } return node } function removeWhitespaceBefore ( node ) { var textNode , textVal , sibling ; for ( textNode = node . prev ; textNode && textNode . type === 3 ; ) { textVal = textNode . value . replace ( endWhiteSpaceRegExp , "" ) ; if ( textVal . length > 0 ) { textNode . value = textVal ; textNode = textNode . prev } else { sibling = textNode . prev ; textNode . remove ( ) ; textNode = sibling } } } function cloneAndExcludeBlocks ( input ) { var name , output = { } ; for ( name in input ) { if ( name !== "li" && name != "p" ) { output [ name ] = input [ name ] } } return output } parser = new SaxParser ( { validate : validate , allow _script _urls : settings . allow _script _urls , allow _conditional _comments : settings . allow _conditional _comments , self _closing _elements : cloneAndExcludeBlocks ( schema . getSelfClosingElements ( ) ) , cdata : function ( text ) { node . append ( createNode ( "#cdata" , 4 ) ) . value = text } , text : function ( text , raw ) { var textNode ; if ( ! isInWhiteSpacePreservedElement ) { text = text . replace ( allWhiteSpaceRegExp , " " ) ; if ( node . lastChild && blockElements [ node . lastChild . name ] ) { text = text . replace ( startWhiteSpaceRegExp , "" ) } } if ( text . length !== 0 ) { textNode = createNode ( "#text" , 3 ) ; textNode . raw = ! ! raw ; node . append ( textNode ) . value = text } } , comment : function ( text ) { node . append ( createNode ( "#comment" , 8 ) ) . value = text } , pi : function ( name , text ) { node . append ( createNode ( name , 7 ) ) . value = text ; removeWhitespaceBefore ( node ) } , doctype : function ( text ) { var newNode ; newNode = node . append ( createNode ( "#doctype" , 10 ) ) ; newNode . value = text ; removeWhitespaceBefore ( node ) } , start : function ( name , attrs , empty ) { var newNode , attrFiltersLen , elementRule , attrName , parent ; elementRule = validate ? schema . getElementRule ( name ) : { } ; if ( elementRule ) { newNode = createNode ( elementRule . outputName || name , 1 ) ; newNode . attributes = attrs ; newNode . shortEnded = empty ; node . append ( newNode ) ; parent = children [ node . name ] ; if ( parent && children [ newNode . name ] && ! parent [ newNode . name ] ) { invalidChildren . push ( newNode ) } attrFiltersLen = attributeFilters . length ; while ( attrFiltersLen -- ) { attrName = attributeFilters [ attrFiltersLen ] . name ; if ( attrName in attrs . map ) { list = matchedAttributes [ attrName ] ; if ( list ) { list . push ( newNode ) } else { matchedAttributes [ attrName ] = [ newNode ] } } } if ( blockElements [ name ] ) { removeWhitespaceBefore ( newNode )
} catch ( ex ) { } } function controlSelect ( elm ) { var ctrlRng ; if ( ! isIE ) { return } ctrlRng = editableDoc . body . createControlRange ( ) ; try { ctrlRng . addElement ( elm ) ; ctrlRng . select ( ) ; return true } catch ( ex ) { } } editor . on ( "init" , function ( ) { if ( isIE ) { editor . on ( "ObjectResized" , function ( e ) { if ( e . target . nodeName != "TABLE" ) { hideResizeRect ( ) ; controlSelect ( e . target ) } } ) ; attachEvent ( editor . getBody ( ) , "controlselect" , nativeControlSelect ) ; editor . on ( "mousedown" , function ( e ) { lastMouseDownEvent = e } ) } else { disableGeckoResize ( ) ; if ( Env . ie >= 11 ) { editor . on ( "mouseup" , function ( e ) { var nodeName = e . target . nodeName ; if ( /^(TABLE|IMG|HR)$/ . test ( nodeName ) ) { editor . selection . select ( e . target , nodeName == "TABLE" ) ; editor . nodeChanged ( ) } } ) ; editor . dom . bind ( editor . getBody ( ) , "mscontrolselect" , function ( e ) { if ( /^(TABLE|IMG|HR)$/ . test ( e . target . nodeName ) ) { e . preventDefault ( ) } } ) } } editor . on ( "nodechange mousedown mouseup ResizeEditor" , updateResizeRect ) ; editor . on ( "keydown keyup" , function ( e ) { if ( selectedElm && selectedElm . nodeName == "TABLE" ) { updateResizeRect ( e ) } } ) } ) ; function destroy ( ) { selectedElm = selectedElmGhost = null ; if ( isIE ) { detachResizeStartListener ( ) ; detachEvent ( editor . getBody ( ) , "controlselect" , nativeControlSelect ) } } return { controlSelect : controlSelect , destroy : destroy } } } ) ; define ( "tinymce/dom/Selection" , [ "tinymce/dom/TreeWalker" , "tinymce/dom/TridentSelection" , "tinymce/dom/ControlSelection" , "tinymce/Env" , "tinymce/util/Tools" ] , function ( TreeWalker , TridentSelection , ControlSelection , Env , Tools ) { var each = Tools . each , grep = Tools . grep , trim = Tools . trim ; var isIE = Env . ie , isOpera = Env . opera ; function Selection ( dom , win , serializer , editor ) { var self = this ; self . dom = dom ; self . win = win ; self . serializer = serializer ; self . editor = editor ; self . controlSelection = new ControlSelection ( self , editor ) ; if ( ! self . win . getSelection ) { self . tridentSel = new TridentSelection ( self ) } } Selection . prototype = { setCursorLocation : function ( node , offset ) { var self = this , rng = self . dom . createRng ( ) ; rng . setStart ( node , offset ) ; rng . setEnd ( node , offset ) ; self . setRng ( rng ) ; self . collapse ( false ) } , getContent : function ( args ) { var self = this , rng = self . getRng ( ) , tmpElm = self . dom . create ( "body" ) ; var se = self . getSel ( ) , whiteSpaceBefore , whiteSpaceAfter , fragment ; args = args || { } ; whiteSpaceBefore = whiteSpaceAfter = "" ; args . get = true ; args . format = args . format || "html" ; args . selection = true ; self . editor . fire ( "BeforeGetContent" , args ) ; if ( args . format == "text" ) { return self . isCollapsed ( ) ? "" : rng . text || ( se . toString ? se . toString ( ) : "" ) } if ( rng . cloneContents ) { fragment = rng . cloneContents ( ) ; if ( fragment ) { tmpElm . appendChild ( fragment ) } } else if ( rng . item !== undefined || rng . htmlText !== undefined ) { tmpElm . innerHTML = "<br>" + ( rng . item ? rng . item ( 0 ) . outerHTML : rng . htmlText ) ; tmpElm . removeChild ( tmpElm . firstChild ) } else { tmpElm . innerHTML = rng . toString ( ) } if ( /^\s/ . test ( tmpElm . innerHTML ) ) { whiteSpaceBefore = " " } if ( /\s+$/ . test ( tmpElm . innerHTML ) ) { whiteSpaceAfter = " " } args . getInner = true ; args . content = self . isCollapsed ( ) ? "" : whiteSpaceBefore + self . serializer . serialize ( tmpElm , args ) + whiteSpaceAfter ; self . editor . fire ( "GetContent" , args ) ; return args . content } , setContent : function ( content , args ) { var self = this , rng = self . getRng ( ) , caretNode , doc = self . win . document , frag , temp ; args = args || { format : "html" } ; args . set = true ; args . selection = true ; content = args . content = content ; if ( ! args . no _events ) { self . editor . fire ( "BeforeSetContent" , args ) } content = args . content ; if ( rng . insertNode ) { content += '<span id="__caret">_</span>' ; if ( rng . startContainer == doc && rng . endContainer == doc ) { doc . body . innerHTML = content } else { rng . deleteContents ( ) ; if ( doc . body . childNodes . length === 0 ) { doc . body . innerHTML = content } else { if ( rng . createContextualFragment ) { rng . insertNode ( rng . createContextualFragment ( content ) ) } else { frag = doc . createDocumentFragment ( ) ; temp = doc . createElement ( "div" ) ; frag . appendChild ( temp ) ; temp . outerHTML = content ; rng . insertNode ( frag ) } } } caretNode = self . dom . get ( "__caret" ) ; rng = doc . createRange ( ) ; rng . setStartBefore ( caretNode ) ; rng . setEndBefore ( caretNode ) ; self . setRng ( rng ) ; self . dom . remove ( "__caret" ) ; try { self . setRng ( rng ) } catch ( ex ) { } } else { if ( rng . item ) { doc . execCommand ( "Delete" , false , null ) ; rng = self . getRng ( ) } if ( /^\s+/ . test ( content ) ) { rng . pasteHTML ( '<span id="__mce_tmp">_</span>' + content ) ; self . dom . remove ( "__mce_tmp" ) } else { rng . pasteHTML ( content ) } } if ( ! args . no
wrapElm = dom . create ( wrapName ) ; setElementFormat ( wrapElm ) ; rangeUtils . walk ( rng , function ( nodes ) { var currentWrapElm ; function process ( node ) { var nodeName , parentName , found , hasContentEditableState , lastContentEditable ; lastContentEditable = contentEditable ; nodeName = node . nodeName . toLowerCase ( ) ; parentName = node . parentNode . nodeName . toLowerCase ( ) ; if ( node . nodeType === 1 && getContentEditable ( node ) ) { lastContentEditable = contentEditable ; contentEditable = getContentEditable ( node ) === "true" ; hasContentEditableState = true } if ( isEq ( nodeName , "br" ) ) { currentWrapElm = 0 ; if ( format . block ) { dom . remove ( node ) } return } if ( format . wrapper && matchNode ( node , name , vars ) ) { currentWrapElm = 0 ; return } if ( contentEditable && ! hasContentEditableState && format . block && ! format . wrapper && isTextBlock ( nodeName ) && isValid ( parentName , wrapName ) ) { node = dom . rename ( node , wrapName ) ; setElementFormat ( node ) ; newWrappers . push ( node ) ; currentWrapElm = 0 ; return } if ( format . selector ) { each ( formatList , function ( format ) { if ( "collapsed" in format && format . collapsed !== isCollapsed ) { return } if ( dom . is ( node , format . selector ) && ! isCaretNode ( node ) ) { setElementFormat ( node , format ) ; found = true } } ) ; if ( ! format . inline || found ) { currentWrapElm = 0 ; return } } if ( contentEditable && ! hasContentEditableState && isValid ( wrapName , nodeName ) && isValid ( parentName , wrapName ) && ! ( ! node _specific && node . nodeType === 3 && node . nodeValue . length === 1 && node . nodeValue . charCodeAt ( 0 ) === 65279 ) && ! isCaretNode ( node ) && ( ! format . inline || ! isBlock ( node ) ) ) { if ( ! currentWrapElm ) { currentWrapElm = dom . clone ( wrapElm , FALSE ) ; node . parentNode . insertBefore ( currentWrapElm , node ) ; newWrappers . push ( currentWrapElm ) } currentWrapElm . appendChild ( node ) } else if ( nodeName == "li" && bookmark ) { currentWrapElm = applyStyleToList ( node , bookmark , wrapElm , newWrappers , process ) } else { currentWrapElm = 0 ; each ( grep ( node . childNodes ) , process ) ; if ( hasContentEditableState ) { contentEditable = lastContentEditable } currentWrapElm = 0 } } each ( nodes , process ) } ) ; if ( format . wrap _links === false ) { each ( newWrappers , function ( node ) { function process ( node ) { var i , currentWrapElm , children ; if ( node . nodeName === "A" ) { currentWrapElm = dom . clone ( wrapElm , FALSE ) ; newWrappers . push ( currentWrapElm ) ; children = grep ( node . childNodes ) ; for ( i = 0 ; i < children . length ; i ++ ) { currentWrapElm . appendChild ( children [ i ] ) } node . appendChild ( currentWrapElm ) } each ( grep ( node . childNodes ) , process ) } process ( node ) } ) } each ( newWrappers , function ( node ) { var childCount ; function getChildCount ( node ) { var count = 0 ; each ( node . childNodes , function ( node ) { if ( ! isWhiteSpaceNode ( node ) && ! isBookmarkNode ( node ) ) { count ++ } } ) ; return count } function mergeStyles ( node ) { var child , clone ; each ( node . childNodes , function ( node ) { if ( node . nodeType == 1 && ! isBookmarkNode ( node ) && ! isCaretNode ( node ) ) { child = node ; return FALSE } } ) ; if ( child && matchName ( child , format ) ) { clone = dom . clone ( child , FALSE ) ; setElementFormat ( clone ) ; dom . replace ( clone , node , TRUE ) ; dom . remove ( child , 1 ) } return clone || node } childCount = getChildCount ( node ) ; if ( ( newWrappers . length > 1 || ! isBlock ( node ) ) && childCount === 0 ) { dom . remove ( node , 1 ) ; return } if ( format . inline || format . wrapper ) { if ( ! format . exact && childCount === 1 ) { node = mergeStyles ( node ) } each ( formatList , function ( format ) { each ( dom . select ( format . inline , node ) , function ( child ) { var parent ; if ( format . wrap _links === false ) { parent = child . parentNode ; do { if ( parent . nodeName === "A" ) { return } } while ( parent = parent . parentNode ) } removeFormat ( format , vars , child , format . exact ? child : null ) } ) } ) ; if ( matchNode ( node . parentNode , name , vars ) ) { dom . remove ( node , 1 ) ; node = 0 ; return TRUE } if ( format . merge _with _parents ) { dom . getParent ( node . parentNode , function ( parent ) { if ( matchNode ( parent , name , vars ) ) { dom . remove ( node , 1 ) ; node = 0 ; return TRUE } } ) } if ( node && format . merge _siblings !== false ) { node = mergeSiblings ( getNonWhiteSpaceSibling ( node ) , node ) ; node = mergeSiblings ( node , getNonWhiteSpaceSibling ( node , TRUE ) ) } } } ) } if ( format ) { if ( node ) { if ( node . nodeType ) { rng = dom . createRng ( ) ; rng . setStartBefore ( node ) ; rng . setEndAfter ( node ) ; applyRngStyle ( expandRng ( rng , formatList ) , null , true ) } else { applyRngStyle ( node , null , true ) } } else { if ( ! isCollapsed || ! format . inline || dom . select ( "td.mce-item-selected,th.mce-item-selected" ) . length ) { var curSelNode = ed . selection . getNode ( ) ; if ( ! forcedRootBlock && formatList [ 0 ] . defaultBlock && ! dom . getParent ( curSelNode , dom . isBlock ) ) { apply ( formatList [ 0 ] . default
level = level || { } ; level . content = getContent ( ) ; if ( lock || editor . fire ( "BeforeAddUndo" , { level : level } ) . isDefaultPrevented ( ) ) { return null } lastLevel = data [ index ] ; if ( lastLevel && lastLevel . content == level . content ) { return null } if ( data [ index ] ) { data [ index ] . beforeBookmark = beforeBookmark } if ( settings . custom _undo _redo _levels ) { if ( data . length > settings . custom _undo _redo _levels ) { for ( i = 0 ; i < data . length - 1 ; i ++ ) { data [ i ] = data [ i + 1 ] } data . length -- ; index = data . length } } level . bookmark = editor . selection . getBookmark ( 2 , true ) ; if ( index < data . length - 1 ) { data . length = index + 1 } data . push ( level ) ; index = data . length - 1 ; var args = { level : level , lastLevel : lastLevel } ; editor . fire ( "AddUndo" , args ) ; if ( index > 0 ) { editor . fire ( "change" , args ) ; editor . isNotDirty = false } return level } , undo : function ( ) { var level ; if ( self . typing ) { self . add ( ) ; self . typing = false } if ( index > 0 ) { level = data [ -- index ] ; if ( index === 0 ) { editor . isNotDirty = true } editor . setContent ( level . content , { format : "raw" } ) ; editor . selection . moveToBookmark ( level . beforeBookmark ) ; editor . fire ( "undo" , { level : level } ) } return level } , redo : function ( ) { var level ; if ( index < data . length - 1 ) { level = data [ ++ index ] ; editor . setContent ( level . content , { format : "raw" } ) ; editor . selection . moveToBookmark ( level . bookmark ) ; editor . fire ( "redo" , { level : level } ) } return level } , clear : function ( ) { data = [ ] ; index = 0 ; self . typing = false ; editor . fire ( "ClearUndos" ) } , hasUndo : function ( ) { return index > 0 || self . typing && data [ 0 ] && getContent ( ) != data [ 0 ] . content } , hasRedo : function ( ) { return index < data . length - 1 && ! this . typing } , transact : function ( callback ) { self . beforeChange ( ) ; lock = true ; callback ( ) ; lock = false ; self . add ( ) } } ; return self } } ) ; define ( "tinymce/EnterKey" , [ "tinymce/dom/TreeWalker" , "tinymce/Env" ] , function ( TreeWalker , Env ) { var isIE = Env . ie && Env . ie < 11 ; return function ( editor ) { var dom = editor . dom , selection = editor . selection , settings = editor . settings ; var undoManager = editor . undoManager , schema = editor . schema , nonEmptyElementsMap = schema . getNonEmptyElements ( ) ; function handleEnterKey ( evt ) { var rng = selection . getRng ( true ) , tmpRng , editableRoot , container , offset , parentBlock , documentMode , shiftKey , newBlock , fragment , containerBlock , parentBlockName , containerBlockName , newBlockName , isAfterLastNodeInContainer ; function canSplitBlock ( node ) { return node && dom . isBlock ( node ) && ! /^(TD|TH|CAPTION|FORM)$/ . test ( node . nodeName ) && ! /^(fixed|absolute)/i . test ( node . style . position ) && dom . getContentEditable ( node ) !== "true" } function renderBlockOnIE ( block ) { var oldRng ; if ( dom . isBlock ( block ) ) { oldRng = selection . getRng ( ) ; block . appendChild ( dom . create ( "span" , null , " " ) ) ; selection . select ( block ) ; block . lastChild . outerHTML = "" ; selection . setRng ( oldRng ) } } function trimInlineElementsOnLeftSideOfBlock ( block ) { var node = block , firstChilds = [ ] , i ; while ( node = node . firstChild ) { if ( dom . isBlock ( node ) ) { return } if ( node . nodeType == 1 && ! nonEmptyElementsMap [ node . nodeName . toLowerCase ( ) ] ) { firstChilds . push ( node ) } } i = firstChilds . length ; while ( i -- ) { node = firstChilds [ i ] ; if ( ! node . hasChildNodes ( ) || node . firstChild == node . lastChild && node . firstChild . nodeValue === "" ) { dom . remove ( node ) } else { if ( node . nodeName == "A" && ( node . innerText || node . textContent ) === " " ) { dom . remove ( node ) } } } } function moveToCaretPosition ( root ) { var walker , node , rng , lastNode = root , tempElm ; function firstNonWhiteSpaceNodeSibling ( node ) { while ( node ) { if ( node . nodeType == 1 || node . nodeType == 3 && node . data && /[\r\n\s]/ . test ( node . data ) ) { return node } node = node . nextSibling } } if ( root . nodeName == "LI" ) { var firstChild = firstNonWhiteSpaceNodeSibling ( root . firstChild ) ; if ( firstChild && /^(UL|OL)$/ . test ( firstChild . nodeName ) ) { root . insertBefore ( dom . doc . createTextNode ( " " ) , root . firstChild ) } } rng = dom . createRng ( ) ; if ( root . hasChildNodes ( ) ) { walker = new TreeWalker ( root , root ) ; while ( node = walker . current ( ) ) { if ( node . nodeType == 3 ) { rng . setStart ( node , 0 ) ; rng . setEnd ( node , 0 ) ; break } if ( nonEmptyElementsMap [ node . nodeName . toLowerCase ( ) ] ) { rng . setStartBefore ( node ) ; rng . setEndBefore ( node ) ; break } lastNode = node ; node = walker . next ( ) } if ( ! node ) { rng . setStart ( lastNode , 0 ) ; rng . setEnd ( lastNode , 0 ) } } else { if ( root . nodeName == "BR" ) { if ( root . nextSibling && dom . isBlock ( root . nextSibling ) ) { if ( ! documentMode || documentMode < 9 ) { tempElm = dom . create ( "br" ) ; root . parentNode . insertBefore ( tempElm , root ) } rng . setStartBefore ( root ) ; rng . setEndBefore ( root ) } else { rng . setStartAfter ( ro
} for ( name in prop ) { member = prop [ name ] ; if ( typeof member == "function" && _super [ name ] ) { prototype [ name ] = createMethod ( name , member ) } else { prototype [ name ] = member } } Class . prototype = prototype ; Class . constructor = Class ; Class . extend = extendClass ; return Class } ; return Class } ) ; define ( "tinymce/ui/Selector" , [ "tinymce/util/Class" ] , function ( Class ) { "use strict" ; function unique ( array ) { var uniqueItems = [ ] , i = array . length , item ; while ( i -- ) { item = array [ i ] ; if ( ! item . _ _checked ) { uniqueItems . push ( item ) ; item . _ _checked = 1 } } i = uniqueItems . length ; while ( i -- ) { delete uniqueItems [ i ] . _ _checked } return uniqueItems } var expression = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i ; var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g , whiteSpace = /^\s*|\s*$/g , Collection ; var Selector = Class . extend ( { init : function ( selector ) { var match = this . match ; function compileNameFilter ( name ) { if ( name ) { name = name . toLowerCase ( ) ; return function ( item ) { return name === "*" || item . type === name } } } function compileIdFilter ( id ) { if ( id ) { return function ( item ) { return item . _name === id } } } function compileClassesFilter ( classes ) { if ( classes ) { classes = classes . split ( "." ) ; return function ( item ) { var i = classes . length ; while ( i -- ) { if ( ! item . hasClass ( classes [ i ] ) ) { return false } } return true } } } function compileAttrFilter ( name , cmp , check ) { if ( name ) { return function ( item ) { var value = item [ name ] ? item [ name ] ( ) : "" ; return ! cmp ? ! ! check : cmp === "=" ? value === check : cmp === "*=" ? value . indexOf ( check ) >= 0 : cmp === "~=" ? ( " " + value + " " ) . indexOf ( " " + check + " " ) >= 0 : cmp === "!=" ? value != check : cmp === "^=" ? value . indexOf ( check ) === 0 : cmp === "$=" ? value . substr ( value . length - check . length ) === check : false } } } function compilePsuedoFilter ( name ) { var notSelectors ; if ( name ) { name = /(?:not\((.+)\))|(.+)/i . exec ( name ) ; if ( ! name [ 1 ] ) { name = name [ 2 ] ; return function ( item , index , length ) { return name === "first" ? index === 0 : name === "last" ? index === length - 1 : name === "even" ? index % 2 === 0 : name === "odd" ? index % 2 === 1 : item [ name ] ? item [ name ] ( ) : false } } else { notSelectors = parseChunks ( name [ 1 ] , [ ] ) ; return function ( item ) { return ! match ( item , notSelectors ) } } } } function compile ( selector , filters , direct ) { var parts ; function add ( filter ) { if ( filter ) { filters . push ( filter ) } } parts = expression . exec ( selector . replace ( whiteSpace , "" ) ) ; add ( compileNameFilter ( parts [ 1 ] ) ) ; add ( compileIdFilter ( parts [ 2 ] ) ) ; add ( compileClassesFilter ( parts [ 3 ] ) ) ; add ( compileAttrFilter ( parts [ 4 ] , parts [ 5 ] , parts [ 6 ] ) ) ; add ( compilePsuedoFilter ( parts [ 7 ] ) ) ; filters . psuedo = ! ! parts [ 7 ] ; filters . direct = direct ; return filters } function parseChunks ( selector , selectors ) { var parts = [ ] , extra , matches , i ; do { chunker . exec ( "" ) ; matches = chunker . exec ( selector ) ; if ( matches ) { selector = matches [ 3 ] ; parts . push ( matches [ 1 ] ) ; if ( matches [ 2 ] ) { extra = matches [ 3 ] ; break } } } while ( matches ) ; if ( extra ) { parseChunks ( extra , selectors ) } selector = [ ] ; for ( i = 0 ; i < parts . length ; i ++ ) { if ( parts [ i ] != ">" ) { selector . push ( compile ( parts [ i ] , [ ] , parts [ i - 1 ] === ">" ) ) } } selectors . push ( selector ) ; return selectors } this . _selectors = parseChunks ( selector , [ ] ) } , match : function ( control , selectors ) { var i , l , si , sl , selector , fi , fl , filters , index , length , siblings , count , item ; selectors = selectors || this . _selectors ; for ( i = 0 , l = selectors . length ; i < l ; i ++ ) { selector = selectors [ i ] ; sl = selector . length ; item = control ; count = 0 ; for ( si = sl - 1 ; si >= 0 ; si -- ) { filters = selector [ si ] ; while ( item ) { if ( filters . psuedo ) { siblings = item . parent ( ) . items ( ) ; index = length = siblings . length ; while ( index -- ) { if ( siblings [ index ] === item ) { break } } } for ( fi = 0 , fl = filters . length ; fi < fl ; fi ++ ) { if ( ! filters [ fi ] ( item , index , length ) ) { fi = fl + 1 ; break } } if ( fi === fl ) { count ++ ; break } else { if ( si === sl - 1 ) { break } } item = item . parent ( ) } } if ( count === sl ) { return true } } return false } , find : function ( container ) { var matches = [ ] , i , l , selectors = this . _selectors ; function collect ( items , selector , index ) { var i , l , fi , fl , item , filters = selector [ index ] ; for ( i = 0 , l = items . length ; i < l ; i ++ ) { item = items [ i ] ; for ( fi = 0 , fl = filters . length ; fi < fl ; fi ++ ) { if ( ! filters [ fi ] ( item , i , l ) ) { fi = fl + 1 ; break } } if ( fi === fl ) { if ( index == selector . length - 1 ) { matches . push ( item ) } else { if ( item . items ) { collect ( item . items ( ) , selector , index + 1 ) } } } else if ( filters . direct ) { return } if ( item . items ) { collect ( item . items ( ) , selector
settings = settings || { } ; function getHandleElm ( ) { return doc . getElementById ( settings . handle || id ) } start = function ( e ) { var docSize = getDocumentSize ( ) , handleElm , cursor ; e . preventDefault ( ) ; downButton = e . button ; handleElm = getHandleElm ( ) ; startX = e . screenX ; startY = e . screenY ; if ( window . getComputedStyle ) { cursor = window . getComputedStyle ( handleElm , null ) . getPropertyValue ( "cursor" ) } else { cursor = handleElm . runtimeStyle . cursor } eventOverlayElm = doc . createElement ( "div" ) ; DomUtils . css ( eventOverlayElm , { position : "absolute" , top : 0 , left : 0 , width : docSize . width , height : docSize . height , zIndex : 2147483647 , opacity : 1e-4 , background : "red" , cursor : cursor } ) ; doc . body . appendChild ( eventOverlayElm ) ; DomUtils . on ( doc , "mousemove" , drag ) ; DomUtils . on ( doc , "mouseup" , stop ) ; settings . start ( e ) } ; drag = function ( e ) { if ( e . button !== downButton ) { return stop ( e ) } e . deltaX = e . screenX - startX ; e . deltaY = e . screenY - startY ; e . preventDefault ( ) ; settings . drag ( e ) } ; stop = function ( e ) { DomUtils . off ( doc , "mousemove" , drag ) ; DomUtils . off ( doc , "mouseup" , stop ) ; eventOverlayElm . parentNode . removeChild ( eventOverlayElm ) ; if ( settings . stop ) { settings . stop ( e ) } } ; this . destroy = function ( ) { DomUtils . off ( getHandleElm ( ) ) } ; DomUtils . on ( getHandleElm ( ) , "mousedown" , start ) } } ) ; define ( "tinymce/ui/Scrollable" , [ "tinymce/ui/DomUtils" , "tinymce/ui/DragHelper" ] , function ( DomUtils , DragHelper ) { "use strict" ; return { init : function ( ) { var self = this ; self . on ( "repaint" , self . renderScroll ) } , renderScroll : function ( ) { var self = this , margin = 2 ; function repaintScroll ( ) { var hasScrollH , hasScrollV , bodyElm ; function repaintAxis ( axisName , posName , sizeName , contentSizeName , hasScroll , ax ) { var containerElm , scrollBarElm , scrollThumbElm ; var containerSize , scrollSize , ratio , rect ; var posNameLower , sizeNameLower ; scrollBarElm = self . getEl ( "scroll" + axisName ) ; if ( scrollBarElm ) { posNameLower = posName . toLowerCase ( ) ; sizeNameLower = sizeName . toLowerCase ( ) ; if ( self . getEl ( "absend" ) ) { DomUtils . css ( self . getEl ( "absend" ) , posNameLower , self . layoutRect ( ) [ contentSizeName ] - 1 ) } if ( ! hasScroll ) { DomUtils . css ( scrollBarElm , "display" , "none" ) ; return } DomUtils . css ( scrollBarElm , "display" , "block" ) ; containerElm = self . getEl ( "body" ) ; scrollThumbElm = self . getEl ( "scroll" + axisName + "t" ) ; containerSize = containerElm [ "client" + sizeName ] - margin * 2 ; containerSize -= hasScrollH && hasScrollV ? scrollBarElm [ "client" + ax ] : 0 ; scrollSize = containerElm [ "scroll" + sizeName ] ; ratio = containerSize / scrollSize ; rect = { } ; rect [ posNameLower ] = containerElm [ "offset" + posName ] + margin ; rect [ sizeNameLower ] = containerSize ; DomUtils . css ( scrollBarElm , rect ) ; rect = { } ; rect [ posNameLower ] = containerElm [ "scroll" + posName ] * ratio ; rect [ sizeNameLower ] = containerSize * ratio ; DomUtils . css ( scrollThumbElm , rect ) } } bodyElm = self . getEl ( "body" ) ; hasScrollH = bodyElm . scrollWidth > bodyElm . clientWidth ; hasScrollV = bodyElm . scrollHeight > bodyElm . clientHeight ; repaintAxis ( "h" , "Left" , "Width" , "contentW" , hasScrollH , "Height" ) ; repaintAxis ( "v" , "Top" , "Height" , "contentH" , hasScrollV , "Width" ) } function addScroll ( ) { function addScrollAxis ( axisName , posName , sizeName , deltaPosName , ax ) { var scrollStart , axisId = self . _id + "-scroll" + axisName , prefix = self . classPrefix ; self . getEl ( ) . appendChild ( DomUtils . createFragment ( '<div id="' + axisId + '" class="' + prefix + "scrollbar " + prefix + "scrollbar-" + axisName + '">' + '<div id="' + axisId + 't" class="' + prefix + 'scrollbar-thumb"></div>' + "</div>" ) ) ; self . draghelper = new DragHelper ( axisId + "t" , { start : function ( ) { scrollStart = self . getEl ( "body" ) [ "scroll" + posName ] ; DomUtils . addClass ( DomUtils . get ( axisId ) , prefix + "active" ) } , drag : function ( e ) { var ratio , hasScrollH , hasScrollV , containerSize , layoutRect = self . layoutRect ( ) ; hasScrollH = layoutRect . contentW > layoutRect . innerW ; hasScrollV = layoutRect . contentH > layoutRect . innerH ; containerSize = self . getEl ( "body" ) [ "client" + sizeName ] - margin * 2 ; containerSize -= hasScrollH && hasScrollV ? self . getEl ( "scroll" + axisName ) [ "client" + ax ] : 0 ; ratio = containerSize / self . getEl ( "body" ) [ "scroll" + sizeName ] ; self . getEl ( "body" ) [ "scroll" + posName ] = scrollStart + e [ "delta" + deltaPosName ] / ratio } , stop : function ( ) { DomUtils . removeClass ( DomUtils . get ( axisId ) , prefix + "active" ) } } ) } self . addClass ( "scroll" ) ; addScrollAxis ( "v" , "Top" , "Height" , "Y" , "Width" ) ; addScrollAxis ( "h" , "Left" , "Width" , "X" , "Height" ) } if ( self . settings . autoScroll ) { if ( ! self . _hasScroll ) { self . _hasScroll = true ; addScro
2014-07-08 21:45:43 +08:00
} } } } ) } function removePreSerializedStylesWhenSelectingControls ( ) { dom . bind ( editor . getBody ( ) , "mouseup" , function ( ) { var value , node = selection . getNode ( ) ; if ( node . nodeName == "IMG" ) { if ( value = dom . getStyle ( node , "width" ) ) { dom . setAttrib ( node , "width" , value . replace ( /[^0-9%]+/g , "" ) ) ; dom . setStyle ( node , "width" , "" ) } if ( value = dom . getStyle ( node , "height" ) ) { dom . setAttrib ( node , "height" , value . replace ( /[^0-9%]+/g , "" ) ) ; dom . setStyle ( node , "height" , "" ) } } } ) } function keepInlineElementOnDeleteBackspace ( ) { editor . on ( "keydown" , function ( e ) { var isDelete , rng , container , offset , brElm , sibling , collapsed , nonEmptyElements ; isDelete = e . keyCode == DELETE ; if ( ! isDefaultPrevented ( e ) && ( isDelete || e . keyCode == BACKSPACE ) && ! VK . modifierPressed ( e ) ) { rng = selection . getRng ( ) ; container = rng . startContainer ; offset = rng . startOffset ; collapsed = rng . collapsed ; if ( container . nodeType == 3 && container . nodeValue . length > 0 && ( offset === 0 && ! collapsed || collapsed && offset === ( isDelete ? 0 : 1 ) ) ) { sibling = container . previousSibling ; if ( sibling && sibling . nodeName == "IMG" ) { return } nonEmptyElements = editor . schema . getNonEmptyElements ( ) ; e . preventDefault ( ) ; brElm = dom . create ( "br" , { id : "__tmp" } ) ; container . parentNode . insertBefore ( brElm , container ) ; editor . getDoc ( ) . execCommand ( isDelete ? "ForwardDelete" : "Delete" , false , null ) ; container = selection . getRng ( ) . startContainer ; sibling = container . previousSibling ; if ( sibling && sibling . nodeType == 1 && ! dom . isBlock ( sibling ) && dom . isEmpty ( sibling ) && ! nonEmptyElements [ sibling . nodeName . toLowerCase ( ) ] ) { dom . remove ( sibling ) } dom . remove ( "__tmp" ) } } } ) } function removeBlockQuoteOnBackSpace ( ) { editor . on ( "keydown" , function ( e ) { var rng , container , offset , root , parent ; if ( isDefaultPrevented ( e ) || e . keyCode != VK . BACKSPACE ) { return } rng = selection . getRng ( ) ; container = rng . startContainer ; offset = rng . startOffset ; root = dom . getRoot ( ) ; parent = container ; if ( ! rng . collapsed || offset !== 0 ) { return } while ( parent && parent . parentNode && parent . parentNode . firstChild == parent && parent . parentNode != root ) { parent = parent . parentNode } if ( parent . tagName === "BLOCKQUOTE" ) { editor . formatter . toggle ( "blockquote" , null , parent ) ; rng = dom . createRng ( ) ; rng . setStart ( container , 0 ) ; rng . setEnd ( container , 0 ) ; selection . setRng ( rng ) } } ) } function setGeckoEditingOptions ( ) { function setOpts ( ) { editor . _refreshContentEditable ( ) ; setEditorCommandState ( "StyleWithCSS" , false ) ; setEditorCommandState ( "enableInlineTableEditing" , false ) ; if ( ! settings . object _resizing ) { setEditorCommandState ( "enableObjectResizing" , false ) } } if ( ! settings . readonly ) { editor . on ( "BeforeExecCommand MouseDown" , setOpts ) } } function addBrAfterLastLinks ( ) { function fixLinks ( ) { each ( dom . select ( "a" ) , function ( node ) { var parentNode = node . parentNode , root = dom . getRoot ( ) ; if ( parentNode . lastChild === node ) { while ( parentNode && ! dom . isBlock ( parentNode ) ) { if ( parentNode . parentNode . lastChild !== parentNode || parentNode === root ) { return } parentNode = parentNode . parentNode } dom . add ( parentNode , "br" , { "data-mce-bogus" : 1 } ) } } ) } editor . on ( "SetContent ExecCommand" , function ( e ) { if ( e . type == "setcontent" || e . command === "mceInsertLink" ) { fixLinks ( ) } } ) } function setDefaultBlockType ( ) { if ( settings . forced _root _block ) { editor . on ( "init" , function ( ) { setEditorCommandState ( "DefaultParagraphSeparator" , settings . forced _root _block ) } ) } } function removeGhostSelection ( ) { editor . on ( "Undo Redo SetContent" , function ( e ) { if ( ! e . initial ) { editor . execCommand ( "mceRepaint" ) } } ) } function deleteControlItemOnBackSpace ( ) { editor . on ( "keydown" , function ( e ) { var rng ; if ( ! isDefaultPrevented ( e ) && e . keyCode == BACKSPACE ) { rng = editor . getDoc ( ) . selection . createRange ( ) ; if ( rng && rng . item ) { e . preventDefault ( ) ; editor . undoManager . beforeChange ( ) ; dom . remove ( rng . item ( 0 ) ) ; editor . undoManager . add ( ) } } } ) } function renderEmptyBlocksFix ( ) { var emptyBlocksCSS ; if ( getDocumentMode ( ) >= 10 ) { emptyBlocksCSS = "" ; each ( "p div h1 h2 h3 h4 h5 h6" . split ( " " ) , function ( name , i ) { emptyBlocksCSS += ( i > 0 ? "," : "" ) + name + ":empty" } ) ; editor . contentStyles . push ( emptyBlocksCSS + "{padding-right: 1px !important}" ) } } function keepNoScriptContents ( ) { if ( getDocumentMode ( ) < 9 ) { parser . addNodeFilter ( "noscript" , function ( nodes ) { var i = nodes . length , node , textNode ; while ( i -- ) { node = nodes [ i ] ; textNode = node . firstChild ; if ( textNode ) { node . attr ( "data-mce-innertext" , textNode . value ) } } } ) ; serializer . addNodeFilter ( "noscript" , function ( nodes ) { var i =
} , load : function ( args ) { var self = this , elm = self . getElement ( ) , html ; if ( elm ) { args = args || { } ; args . load = true ; html = self . setContent ( elm . value !== undefined ? elm . value : elm . innerHTML , args ) ; args . element = elm ; if ( ! args . no _events ) { self . fire ( "LoadContent" , args ) } args . element = elm = null ; return html } } , save : function ( args ) { var self = this , elm = self . getElement ( ) , html , form ; if ( ! elm || ! self . initialized ) { return } args = args || { } ; args . save = true ; args . element = elm ; html = args . content = self . getContent ( args ) ; if ( ! args . no _events ) { self . fire ( "SaveContent" , args ) } html = args . content ; if ( ! /TEXTAREA|INPUT/i . test ( elm . nodeName ) ) { elm . innerHTML = html ; if ( form = DOM . getParent ( self . id , "form" ) ) { each ( form . elements , function ( elm ) { if ( elm . name == self . id ) { elm . value = html ; return false } } ) } } else { elm . value = html } args . element = elm = null ; if ( args . set _dirty !== false ) { self . isNotDirty = true } return html } , setContent : function ( content , args ) { var self = this , body = self . getBody ( ) , forcedRootBlockName ; args = args || { } ; args . format = args . format || "html" ; args . set = true ; args . content = content ; if ( ! args . no _events ) { self . fire ( "BeforeSetContent" , args ) } content = args . content ; resizeEditor ( ) ; if ( content . length === 0 || /^\s+$/ . test ( content ) ) { forcedRootBlockName = self . settings . forced _root _block ; if ( forcedRootBlockName && self . schema . isValidChild ( body . nodeName . toLowerCase ( ) , forcedRootBlockName . toLowerCase ( ) ) ) { content = ie && ie < 11 ? "" : '<br data-mce-bogus="1">' ; content = self . dom . createHTML ( forcedRootBlockName , self . settings . forced _root _block _attrs , content ) } else if ( ! ie || ie < 11 ) { content = '<br data-mce-bogus="1">' } body . innerHTML = content ; self . fire ( "SetContent" , args ) } else { if ( args . format !== "raw" ) { content = new Serializer ( { } , self . schema ) . serialize ( self . parser . parse ( content , { isRootContent : true } ) ) } args . content = trim ( content ) ; self . dom . setHTML ( body , args . content ) ; if ( ! args . no _events ) { self . fire ( "SetContent" , args ) } } return args . content } , getContent : function ( args ) { var self = this , content , body = self . getBody ( ) ; args = args || { } ; args . format = args . format || "html" ; args . get = true ; args . getInner = true ; if ( ! args . no _events ) { self . fire ( "BeforeGetContent" , args ) } if ( args . format == "raw" ) { content = body . innerHTML } else if ( args . format == "text" ) { content = body . innerText || body . textContent } else { content = self . serializer . serialize ( body , args ) } if ( args . format != "text" ) { args . content = trim ( content ) } else { args . content = content } if ( ! args . no _events ) { self . fire ( "GetContent" , args ) } return args . content } , insertContent : function ( content ) { this . execCommand ( "mceInsertContent" , false , content ) } , insertRawContent : function ( content ) { this . execCommand ( "mceInsertRawHTML" , false , content ) } , isDirty : function ( ) { return ! this . isNotDirty } , getContainer : function ( ) { var self = this ; if ( ! self . container ) { self . container = DOM . get ( self . editorContainer || self . id + "_parent" ) } return self . container } , getContentAreaContainer : function ( ) { return this . contentAreaContainer } , getElement : function ( ) { return DOM . get ( this . settings . content _element || this . id ) } , getWin : function ( ) { var self = this , elm ; if ( ! self . contentWindow ) { elm = DOM . get ( self . id + "_ifr" ) ; if ( elm ) { self . contentWindow = elm . contentWindow } } return self . contentWindow } , getDoc : function ( ) { var self = this , win ; if ( ! self . contentDocument ) { win = self . getWin ( ) ; if ( win ) { self . contentDocument = win . document } } return self . contentDocument } , getBody : function ( ) { return this . bodyElement || this . getDoc ( ) . body } , convertURL : function ( url , name , elm ) { var self = this , settings = self . settings ; if ( settings . urlconverter _callback ) { return self . execCallback ( "urlconverter_callback" , url , elm , true , name ) } if ( ! settings . convert _urls || elm && elm . nodeName == "LINK" || url . indexOf ( "file:" ) === 0 || url . length === 0 ) { return url } if ( settings . relative _urls ) { return self . documentBaseURI . toRelative ( url ) } url = self . documentBaseURI . toAbsolute ( url , settings . remove _script _host ) ; return url } , addVisual : function ( elm ) { var self = this , settings = self . settings , dom = self . dom , cls ; elm = elm || self . getBody ( ) ; if ( self . hasVisual === undefined ) { self . hasVisual = settings . visual } each ( dom . select ( "table,a" , elm ) , function ( elm ) { var value ; switch ( elm . nodeName ) { case "TABLE" : cls = settings . visual _table _class || "mce-item-table" ; value = dom . getAttrib ( elm , "border" ) ; if ( ! value || value == "0" ) { if ( self . hasVisual ) { dom . addClass ( elm , cls ) } else { dom . removeClass ( elm , cls ) } } return ; case "A" : if ( ! dom . getAttrib
} , repaint : function ( ) { var self = this , elm = self . getEl ( ) , openElm = self . getEl ( "open" ) , rect = self . layoutRect ( ) ; var width , lineHeight ; if ( openElm ) { width = rect . w - DomUtils . getSize ( openElm ) . width - 10 } else { width = rect . w - 10 } var doc = document ; if ( doc . all && ( ! doc . documentMode || doc . documentMode <= 8 ) ) { lineHeight = self . layoutRect ( ) . h - 2 + "px" } DomUtils . css ( elm . firstChild , { width : width , lineHeight : lineHeight } ) ; self . _super ( ) ; return self } , postRender : function ( ) { var self = this ; DomUtils . on ( this . getEl ( "inp" ) , "change" , function ( ) { self . fire ( "change" ) } ) ; return self . _super ( ) } , remove : function ( ) { DomUtils . off ( this . getEl ( "inp" ) ) ; this . _super ( ) } , renderHtml : function ( ) { var self = this , id = self . _id , settings = self . settings , prefix = self . classPrefix ; var value = settings . value || settings . placeholder || "" ; var icon , text , openBtnHtml = "" ; icon = settings . icon ? prefix + "ico " + prefix + "i-" + settings . icon : "" ; text = self . _text ; if ( icon || text ) { openBtnHtml = '<div id="' + id + '-open" class="' + prefix + "btn " + prefix + 'open" tabIndex="-1">' + '<button id="' + id + '-action" type="button" hidefocus tabindex="-1">' + ( icon ? '<i class="' + icon + '"></i>' : '<i class="' + prefix + 'caret"></i>' ) + ( text ? ( icon ? " " : "" ) + text : "" ) + "</button>" + "</div>" ; self . addClass ( "has-open" ) } return '<div id="' + id + '" class="' + self . classes ( ) + '">' + '<input id="' + id + '-inp" class="' + prefix + "textbox " + prefix + 'placeholder" value="' + value + '" hidefocus="true"' + ( self . disabled ( ) ? ' disabled="disabled"' : "" ) + ">" + openBtnHtml + "</div>" } } ) } ) ; define ( "tinymce/ui/Path" , [ "tinymce/ui/Widget" , "tinymce/ui/KeyboardNavigation" ] , function ( Widget , KeyboardNavigation ) { "use strict" ; return Widget . extend ( { init : function ( settings ) { var self = this ; if ( ! settings . delimiter ) { settings . delimiter = "»" } self . _super ( settings ) ; self . addClass ( "path" ) ; self . canFocus = true ; self . on ( "click" , function ( e ) { var index , target = e . target ; if ( index = target . getAttribute ( "data-index" ) ) { self . fire ( "select" , { value : self . data ( ) [ index ] , index : index } ) } } ) } , focus : function ( ) { var self = this ; self . keyNav = new KeyboardNavigation ( { root : self , enableLeftRight : true } ) ; self . keyNav . focusFirst ( ) ; return self } , data : function ( data ) { var self = this ; if ( typeof data !== "undefined" ) { self . _data = data ; self . update ( ) ; return self } return self . _data } , update : function ( ) { this . innerHtml ( this . _getPathHtml ( ) ) } , postRender : function ( ) { var self = this ; self . _super ( ) ; self . data ( self . settings . data ) } , renderHtml : function ( ) { var self = this ; return '<div id="' + self . _id + '" class="' + self . classes ( ) + '">' + self . _getPathHtml ( ) + "</div>" } , _getPathHtml : function ( ) { var self = this , parts = self . _data || [ ] , i , l , html = "" , prefix = self . classPrefix ; for ( i = 0 , l = parts . length ; i < l ; i ++ ) { html += ( i > 0 ? '<div class="' + prefix + 'divider" aria-hidden="true"> ' + self . settings . delimiter + " </div>" : "" ) + '<div role="button" class="' + prefix + "path-item" + ( i == l - 1 ? " " + prefix + "last" : "" ) + '" data-index="' + i + '" tabindex="-1" id="' + self . _id + "-" + i + '">' + parts [ i ] . name + "</div>" } if ( ! html ) { html = '<div class="' + prefix + 'path-item"> </div>' } return html } } ) } ) ; define ( "tinymce/ui/ElementPath" , [ "tinymce/ui/Path" , "tinymce/EditorManager" ] , function ( Path , EditorManager ) { return Path . extend ( { postRender : function ( ) { var self = this , editor = EditorManager . activeEditor ; function isHidden ( elm ) { if ( elm . nodeType === 1 ) { if ( elm . nodeName == "BR" || ! ! elm . getAttribute ( "data-mce-bogus" ) ) { return true } if ( elm . getAttribute ( "data-mce-type" ) === "bookmark" ) { return true } } return false } self . on ( "select" , function ( e ) { var parents = [ ] , node , body = editor . getBody ( ) ; editor . focus ( ) ; node = editor . selection . getStart ( ) ; while ( node && node != body ) { if ( ! isHidden ( node ) ) { parents . push ( node ) } node = node . parentNode } editor . selection . select ( parents [ parents . length - 1 - e . index ] ) ; editor . nodeChanged ( ) } ) ; editor . on ( "nodeChange" , function ( e ) { var parents = [ ] , selectionParents = e . parents , i = selectionParents . length ; while ( i -- ) { if ( selectionParents [ i ] . nodeType == 1 && ! isHidden ( selectionParents [ i ] ) ) { var args = editor . fire ( "ResolveName" , { name : selectionParents [ i ] . nodeName . toLowerCase ( ) , target : selectionParents [ i ] } ) ; parents . push ( { name : args . name } ) } } self . data ( parents ) } ) ; return self . _super ( ) } } ) } ) ; define ( "tinymce/ui/FormItem" , [ "tinymce/ui/Container" ] , function ( Container ) { "use strict" ; return Container . extend ( { Defaults : { layout : "flex" , align : "center" , defaults : { flex : 1 } } , renderHtml : functi
} } ) ; self . menu . hide ( ) ; self . aria ( "expanded" , false ) } } , activeMenu : function ( state ) { this . toggleClass ( "active" , state ) } , renderHtml : function ( ) { var self = this , id = self . _id , prefix = self . classPrefix ; var icon = self . settings . icon ? prefix + "ico " + prefix + "i-" + self . settings . icon : "" ; self . aria ( "role" , self . parent ( ) instanceof MenuBar ? "menuitem" : "button" ) ; return '<div id="' + id + '" class="' + self . classes ( ) + '" tabindex="-1">' + '<button id="' + id + '-open" role="presentation" type="button" tabindex="-1">' + ( icon ? '<i class="' + icon + '"></i>' : "" ) + "<span>" + ( self . _text ? ( icon ? " " : "" ) + self . encode ( self . _text ) : "" ) + "</span>" + ' <i class="' + prefix + 'caret"></i>' + "</button>" + "</div>" } , postRender : function ( ) { var self = this ; self . on ( "click" , function ( e ) { if ( e . control === self && isChildOf ( e . target , self . getEl ( ) ) ) { self . showMenu ( ) ; if ( e . keyboard ) { self . menu . items ( ) [ 0 ] . focus ( ) } } } ) ; self . on ( "mouseenter" , function ( e ) { var overCtrl = e . control , parent = self . parent ( ) , hasVisibleSiblingMenu ; if ( overCtrl && parent && overCtrl instanceof MenuButton && overCtrl . parent ( ) == parent ) { parent . items ( ) . filter ( "MenuButton" ) . each ( function ( ctrl ) { if ( ctrl . hideMenu && ctrl != overCtrl ) { if ( ctrl . menu && ctrl . menu . visible ( ) ) { hasVisibleSiblingMenu = true } ctrl . hideMenu ( ) } } ) ; if ( hasVisibleSiblingMenu ) { overCtrl . focus ( ) ; overCtrl . showMenu ( ) } } } ) ; return self . _super ( ) } , text : function ( text ) { var self = this , i , children ; if ( self . _rendered ) { children = self . getEl ( "open" ) . getElementsByTagName ( "span" ) ; for ( i = 0 ; i < children . length ; i ++ ) { children [ i ] . innerHTML = self . encode ( text ) } } return this . _super ( text ) } , remove : function ( ) { this . _super ( ) ; if ( this . menu ) { this . menu . remove ( ) } } } ) ; return MenuButton } ) ; define ( "tinymce/ui/ListBox" , [ "tinymce/ui/MenuButton" ] , function ( MenuButton ) { "use strict" ; return MenuButton . extend ( { init : function ( settings ) { var self = this , values , i , selected , selectedText , lastItemCtrl ; self . _values = values = settings . values ; if ( values ) { for ( i = 0 ; i < values . length ; i ++ ) { selected = values [ i ] . selected || settings . value === values [ i ] . value ; if ( selected ) { selectedText = selectedText || values [ i ] . text ; self . _value = values [ i ] . value } } settings . menu = values } settings . text = settings . text || selectedText || values [ 0 ] . text ; self . _super ( settings ) ; self . addClass ( "listbox" ) ; self . on ( "select" , function ( e ) { var ctrl = e . control ; if ( lastItemCtrl ) { e . lastControl = lastItemCtrl } if ( settings . multiple ) { ctrl . active ( ! ctrl . active ( ) ) } else { self . value ( e . control . settings . value ) } lastItemCtrl = ctrl } ) } , value : function ( value ) { var self = this , active , selectedText , menu , i ; function activateByValue ( menu , value ) { menu . items ( ) . each ( function ( ctrl ) { active = ctrl . value ( ) === value ; if ( active ) { selectedText = selectedText || ctrl . text ( ) } ctrl . active ( active ) ; if ( ctrl . menu ) { activateByValue ( ctrl . menu , value ) } } ) } if ( typeof value != "undefined" ) { if ( self . menu ) { activateByValue ( self . menu , value ) } else { menu = self . settings . menu ; for ( i = 0 ; i < menu . length ; i ++ ) { active = menu [ i ] . value == value ; if ( active ) { selectedText = selectedText || menu [ i ] . text } menu [ i ] . active = active } } self . text ( selectedText || this . settings . text ) } return self . _super ( value ) } } ) } ) ; define ( "tinymce/ui/MenuItem" , [ "tinymce/ui/Widget" , "tinymce/ui/Factory" ] , function ( Widget , Factory ) { "use strict" ; return Widget . extend ( { Defaults : { border : 0 , role : "menuitem" } , init : function ( settings ) { var self = this ; self . hasPopup = true ; self . _super ( settings ) ; settings = self . settings ; self . addClass ( "menu-item" ) ; if ( settings . menu ) { self . addClass ( "menu-item-expand" ) } if ( settings . preview ) { self . addClass ( "menu-item-preview" ) } if ( self . _text === "-" || self . _text === "|" ) { self . addClass ( "menu-item-sep" ) ; self . aria ( "role" , "separator" ) ; self . canFocus = false ; self . _text = "-" } if ( settings . selectable ) { self . aria ( "role" , "menuitemcheckbox" ) ; self . aria ( "checked" , true ) ; self . addClass ( "menu-item-checkbox" ) ; settings . icon = "selected" } if ( ! settings . preview && ! settings . selectable ) { self . addClass ( "menu-item-normal" ) } self . on ( "mousedown" , function ( e ) { e . preventDefault ( ) } ) ; self . on ( "mouseenter click" , function ( e ) { if ( e . control === self ) { if ( ! settings . menu && e . type === "click" ) { self . parent ( ) . hideAll ( ) ; self . fire ( "cancel" ) ; self . fire ( "select" ) } else { self . showMenu ( ) ; if ( e . keyboard ) { setTimeout ( function ( ) { self . menu . items ( ) [ 0 ] . focus ( ) } , 0 ) } } } } ) ; if ( settings . menu ) { self . aria ( "haspopup" , true ) } } , hasMenus : function ( ) { return ! ! this . settings . menu } , showMenu : func