2017-08-17 09:14:58 +08:00
/*! Summernote v0.8.7 | (c) 2013- Alan Hong and other contributors | MIT license */
2017-06-11 10:08:53 +08:00
2017-08-17 09:14:58 +08:00
! function ( a ) { "function" == typeof define && define . amd ? define ( [ "jquery" ] , a ) : "object" == typeof module && module . exports ? module . exports = a ( require ( "jquery" ) ) : a ( window . jQuery ) } ( function ( $ ) { "use strict" ; var isSupportAmd = "function" == typeof define && define . amd , isFontInstalled = function ( a ) { var b = "Comic Sans MS" === a ? "Courier New" : "Comic Sans MS" , c = $ ( "<div>" ) . css ( { position : "absolute" , left : "-9999px" , top : "-9999px" , fontSize : "200px" } ) . text ( "mmmmmmmmmwwwwwww" ) . appendTo ( document . body ) , d = c . css ( "fontFamily" , b ) . width ( ) , e = c . css ( "fontFamily" , a + "," + b ) . width ( ) ; return c . remove ( ) , d !== e } , userAgent = navigator . userAgent , isMSIE = /MSIE|Trident/i . test ( userAgent ) , browserVersion ; if ( isMSIE ) { var matches = /MSIE (\d+[.]\d+)/ . exec ( userAgent ) ; matches && ( browserVersion = parseFloat ( matches [ 1 ] ) ) , matches = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/ . exec ( userAgent ) , matches && ( browserVersion = parseFloat ( matches [ 1 ] ) ) } var isEdge = /Edge\/\d+/ . test ( userAgent ) , hasCodeMirror = ! ! window . CodeMirror ; if ( ! hasCodeMirror && isSupportAmd && "undefined" != typeof require ) if ( void 0 !== require . resolve ) try { require . resolve ( "codemirror" ) , hasCodeMirror = ! 0 } catch ( a ) { } else void 0 !== eval ( "require" ) . specified && ( hasCodeMirror = eval ( "require" ) . specified ( "codemirror" ) ) ; var isSupportTouch = "ontouchstart" in window || navigator . MaxTouchPoints > 0 || navigator . msMaxTouchPoints > 0 , agent = { isMac : navigator . appVersion . indexOf ( "Mac" ) > - 1 , isMSIE : isMSIE , isEdge : isEdge , isFF : ! isEdge && /firefox/i . test ( userAgent ) , isPhantom : /PhantomJS/i . test ( userAgent ) , isWebkit : ! isEdge && /webkit/i . test ( userAgent ) , isChrome : ! isEdge && /chrome/i . test ( userAgent ) , isSafari : ! isEdge && /safari/i . test ( userAgent ) , browserVersion : browserVersion , jqueryVersion : parseFloat ( $ . fn . jquery ) , isSupportAmd : isSupportAmd , isSupportTouch : isSupportTouch , hasCodeMirror : hasCodeMirror , isFontInstalled : isFontInstalled , isW3CRangeSupport : ! ! document . createRange } , func = function ( ) { var a = function ( a ) { return function ( b ) { return a === b } } , b = function ( a , b ) { return a === b } , c = function ( a ) { return function ( b , c ) { return b [ a ] === c [ a ] } } , d = function ( ) { return ! 0 } , e = function ( ) { return ! 1 } , f = function ( a ) { return function ( ) { return ! a . apply ( a , arguments ) } } , g = function ( a , b ) { return function ( c ) { return a ( c ) && b ( c ) } } , h = 0 ; return { eq : a , eq2 : b , peq2 : c , ok : d , fail : e , self : function ( a ) { return a } , not : f , and : g , invoke : function ( a , b ) { return function ( ) { return a [ b ] . apply ( a , arguments ) } } , uniqueId : function ( a ) { var b = ++ h + "" ; return a ? a + b : b } , rect2bnd : function ( a ) { var b = $ ( document ) ; return { top : a . top + b . scrollTop ( ) , left : a . left + b . scrollLeft ( ) , width : a . right - a . left , height : a . bottom - a . top } } , invertObject : function ( a ) { var b = { } ; for ( var c in a ) a . hasOwnProperty ( c ) && ( b [ a [ c ] ] = c ) ; return b } , namespaceToCamel : function ( a , b ) { return ( b = b || "" ) + a . split ( "." ) . map ( function ( a ) { return a . substring ( 0 , 1 ) . toUpperCase ( ) + a . substring ( 1 ) } ) . join ( "" ) } , debounce : function ( a , b , c ) { var d ; return function ( ) { var e = this , f = arguments , g = function ( ) { d = null , c || a . apply ( e , f ) } , h = c && ! d ; clearTimeout ( d ) , d = setTimeout ( g , b ) , h && a . apply ( e , f ) } } } } ( ) , list = function ( ) { var a = function ( a ) { return a [ 0 ] } , b = function ( a ) { return a [ a . length - 1 ] } , c = function ( a ) { return a . slice ( 0 , a . length - 1 ) } , d = function ( a ) { return a . slice ( 1 ) } , e = function ( a , b ) { for ( var c = 0 , d = a . length ; c < d ; c ++ ) { var e = a [ c ] ; if ( b ( e ) ) return e } } , f = function ( a , b ) { for ( var c = 0 , d = a . length ; c < d ; c ++ ) if ( ! b ( a [ c ] ) ) return ! 1 ; return ! 0 } , g = function ( a , b ) { return $ . inArray ( b , a ) } , h = function ( a , b ) { return - 1 !== g ( a , b ) } , i = function ( a , b ) { return b = b || func . self , a . reduce ( function ( a , c ) { return a + b ( c ) } , 0 ) } , j = function ( a ) { for ( var b = [ ] , c = - 1 , d = a . length ; ++ c < d ; ) b [ c ] = a [ c ] ; return b } , k = function ( a ) { return ! a || ! a . length } , l = function ( c , e ) { return c . length ? d ( c ) . reduce ( function ( a , c ) { var d = b ( a ) ; return e ( b ( d ) , c ) ? d [ d . length ] = c : a [ a . length ] = [ c ] , a } , [ [ a ( c ) ] ] ) : [ ] } , m = function ( a ) { for ( var b = [ ] , c = 0 , d = a . length ; c < d ; c ++ ) a [ c ] && b . push ( a [ c ] ) ; return b } , n = function ( a ) { for ( var b = [ ] , c = 0 , d = a . length ; c < d ; c ++ ) h ( b , a [ c ] ) || b . push ( a [ c ] ) ; return b } , o = function ( a , b ) { var c = g ( a , b ) ; return - 1 === c ? null : a [ c + 1 ] } ; return { head : a , last : b , initial : c , tail : d , prev : function ( a , b ) { var c = g ( a , b ) ; return - 1 === c ? null : a [ c - 1 ] } , next : o , find : e , contains : h , all : f , sum : i , from : j , isEmpty : k , clusterBy : l , compact : m , unique : n } } ( ) , NBSP _CHAR = String . fromCharCode ( 160 ) , ZERO _WIDTH _NBSP _CHAR = "\ufeff" , dom = function ( ) { var a = function ( a ) { return a && $ ( a ) . ha
var d = dom . fromOffsetPath ( a , b . s . path ) , e = b . s . offset , f = dom . fromOffsetPath ( a , b . e . path ) , g = b . e . offset ; return new c ( d , e , f , g ) } , createFromParaBookmark : function ( a , b ) { var d = a . s . offset , e = a . e . offset , f = dom . fromOffsetPath ( list . head ( b ) , a . s . path ) , g = dom . fromOffsetPath ( list . last ( b ) , a . e . path ) ; return new c ( f , d , g , e ) } } } ( ) , async = function ( ) { return { readFileAsDataURL : function ( a ) { return $ . Deferred ( function ( b ) { $ . extend ( new FileReader , { onload : function ( a ) { var c = a . target . result ; b . resolve ( c ) } , onerror : function ( ) { b . reject ( this ) } } ) . readAsDataURL ( a ) } ) . promise ( ) } , createImage : function ( a ) { return $ . Deferred ( function ( b ) { var c = $ ( "<img>" ) ; c . one ( "load" , function ( ) { c . off ( "error abort" ) , b . resolve ( c ) } ) . one ( "error abort" , function ( ) { c . off ( "load" ) . detach ( ) , b . reject ( c ) } ) . css ( { display : "none" } ) . appendTo ( document . body ) . attr ( "src" , a ) } ) . promise ( ) } } } ( ) , History = function ( a ) { var b = [ ] , c = - 1 , d = a [ 0 ] , e = function ( ) { var b = range . create ( d ) , c = { s : { path : [ ] , offset : 0 } , e : { path : [ ] , offset : 0 } } ; return { contents : a . html ( ) , bookmark : b ? b . bookmark ( d ) : c } } , f = function ( b ) { null !== b . contents && a . html ( b . contents ) , null !== b . bookmark && range . createFromBookmark ( d , b . bookmark ) . select ( ) } ; this . rewind = function ( ) { a . html ( ) !== b [ c ] . contents && this . recordUndo ( ) , c = 0 , f ( b [ c ] ) } , this . reset = function ( ) { b = [ ] , c = - 1 , a . html ( "" ) , this . recordUndo ( ) } , this . undo = function ( ) { a . html ( ) !== b [ c ] . contents && this . recordUndo ( ) , 0 < c && ( c -- , f ( b [ c ] ) ) } , this . redo = function ( ) { b . length - 1 > c && ( c ++ , f ( b [ c ] ) ) } , this . recordUndo = function ( ) { c ++ , b . length > c && ( b = b . slice ( 0 , c ) ) , b . push ( e ( ) ) } } , Style = function ( ) { var a = function ( a , b ) { if ( agent . jqueryVersion < 1.9 ) { var c = { } ; return $ . each ( b , function ( b , d ) { c [ d ] = a . css ( d ) } ) , c } return a . css . call ( a , b ) } ; this . fromNode = function ( b ) { var c = [ "font-family" , "font-size" , "text-align" , "list-style-type" , "line-height" ] , d = a ( b , c ) || { } ; return d [ "font-size" ] = parseInt ( d [ "font-size" ] , 10 ) , d } , this . stylePara = function ( a , b ) { $ . each ( a . nodes ( dom . isPara , { includeAncestor : ! 0 } ) , function ( a , c ) { $ ( c ) . css ( b ) } ) } , this . styleNodes = function ( a , b ) { a = a . splitText ( ) ; var c = b && b . nodeName || "SPAN" , d = ! ( ! b || ! b . expandClosestSibling ) , e = ! ( ! b || ! b . onlyPartialContains ) ; if ( a . isCollapsed ( ) ) return [ a . insertNode ( dom . create ( c ) ) ] ; var f = dom . makePredByNodeName ( c ) , g = a . nodes ( dom . isText , { fullyContains : ! 0 } ) . map ( function ( a ) { return dom . singleChildAncestor ( a , f ) || dom . wrap ( a , c ) } ) ; if ( d ) { if ( e ) { var h = a . nodes ( ) ; f = func . and ( f , function ( a ) { return list . contains ( h , a ) } ) } return g . map ( function ( a ) { var b = dom . withClosestSiblings ( a , f ) , c = list . head ( b ) , d = list . tail ( b ) ; return $ . each ( d , function ( a , b ) { dom . appendChildNodes ( c , b . childNodes ) , dom . remove ( b ) } ) , list . head ( b ) } ) } return g } , this . current = function ( a ) { var b = $ ( dom . isElement ( a . sc ) ? a . sc : a . sc . parentNode ) , c = this . fromNode ( b ) ; try { c = $ . extend ( c , { "font-bold" : document . queryCommandState ( "bold" ) ? "bold" : "normal" , "font-italic" : document . queryCommandState ( "italic" ) ? "italic" : "normal" , "font-underline" : document . queryCommandState ( "underline" ) ? "underline" : "normal" , "font-subscript" : document . queryCommandState ( "subscript" ) ? "subscript" : "normal" , "font-superscript" : document . queryCommandState ( "superscript" ) ? "superscript" : "normal" , "font-strikethrough" : document . queryCommandState ( "strikethrough" ) ? "strikethrough" : "normal" , "font-family" : document . queryCommandValue ( "fontname" ) || c [ "font-family" ] } ) } catch ( a ) { } if ( a . isOnList ( ) ) { var d = [ "circle" , "disc" , "disc-leading-zero" , "square" ] , e = $ . inArray ( c [ "list-style-type" ] , d ) > - 1 ; c [ "list-style" ] = e ? "unordered" : "ordered" } else c [ "list-style" ] = "none" ; var f = dom . ancestor ( a . sc , dom . isPara ) ; if ( f && f . style [ "line-height" ] ) c [ "line-height" ] = f . style . lineHeight ; else { var g = parseInt ( c [ "line-height" ] , 10 ) / parseInt ( c [ "font-size" ] , 10 ) ; c [ "line-height" ] = g . toFixed ( 1 ) } return c . anchor = a . isOnAnchor ( ) && dom . ancestor ( a . sc , dom . isAnchor ) , c . ancestors = dom . listAncestor ( a . sc , dom . isEditable ) , c . range = a , c } } , Bullet = function ( ) { var a = this ; this . insertOrderedList = function ( a ) { this . toggleList ( "OL" , a ) } , this . insertUnorderedList = function ( a ) { this . toggleList ( "UL" , a ) } , this . indent = function ( a ) { var b = this , c = range . create ( a ) . wrapBodyInlineWithPara ( ) , d = c . nodes ( dom . isPara , { includeAncestor : ! 0 } ) , e = list . clusterBy ( d , func . peq2 ( "parentNode" ) ) ; $ . each ( e , function ( a , c ) { var d = list . head ( c ) ; dom . isLi ( d ) ? b . wrapList ( c , d . parentNode . nodeName ) : $ . each ( c , function ( a , b ) { $ ( b ) . css ( " mar
this . initialize = function ( ) { this . lastWordRange = null } , this . destroy = function ( ) { this . lastWordRange = null } , this . replace = function ( ) { if ( this . lastWordRange ) { var b = this . lastWordRange . toString ( ) , d = b . match ( c ) ; if ( d && ( d [ 1 ] || d [ 2 ] ) ) { var e = d [ 1 ] ? b : "http://" + b , f = $ ( "<a />" ) . html ( b ) . attr ( "href" , e ) [ 0 ] ; this . lastWordRange . insertNode ( f ) , this . lastWordRange = null , a . invoke ( "editor.focus" ) } } } , this . handleKeydown = function ( b ) { if ( list . contains ( [ key . code . ENTER , key . code . SPACE ] , b . keyCode ) ) { var c = a . invoke ( "editor.createRange" ) . getWordRange ( ) ; this . lastWordRange = c } } , this . handleKeyup = function ( a ) { list . contains ( [ key . code . ENTER , key . code . SPACE ] , a . keyCode ) && this . replace ( ) } } , AutoSync = function ( a ) { var b = a . layoutInfo . note ; this . events = { "summernote.change" : function ( ) { b . val ( a . invoke ( "code" ) ) } } , this . shouldInitialize = function ( ) { return dom . isTextarea ( b [ 0 ] ) } } , Placeholder = function ( a ) { var b = this , c = a . layoutInfo . editingArea , d = a . options ; this . events = { "summernote.init summernote.change" : function ( ) { b . update ( ) } , "summernote.codeview.toggled" : function ( ) { b . update ( ) } } , this . shouldInitialize = function ( ) { return ! ! d . placeholder } , this . initialize = function ( ) { this . $placeholder = $ ( '<div class="note-placeholder">' ) , this . $placeholder . on ( "click" , function ( ) { a . invoke ( "focus" ) } ) . text ( d . placeholder ) . prependTo ( c ) } , this . destroy = function ( ) { this . $placeholder . remove ( ) } , this . update = function ( ) { var b = ! a . invoke ( "codeview.isActivated" ) && a . invoke ( "editor.isEmpty" ) ; this . $placeholder . toggle ( b ) } } , Buttons = function ( a ) { var b = this , c = $ . summernote . ui , d = a . layoutInfo . toolbar , e = a . options , f = e . langInfo , g = func . invertObject ( e . keyMap [ agent . isMac ? "mac" : "pc" ] ) , h = this . representShortcut = function ( a ) { var b = g [ a ] ; return e . shortcuts && b ? ( agent . isMac && ( b = b . replace ( "CMD" , "⌘" ) . replace ( "SHIFT" , "⇧" ) ) , " (" + ( b = b . replace ( "BACKSLASH" , "\\" ) . replace ( "SLASH" , "/" ) . replace ( "LEFTBRACKET" , "[" ) . replace ( "RIGHTBRACKET" , "]" ) ) + ")" ) : "" } ; this . initialize = function ( ) { this . addToolbarButtons ( ) , this . addImagePopoverButtons ( ) , this . addLinkPopoverButtons ( ) , this . addTablePopoverButtons ( ) , this . fontInstalledMap = { } } , this . destroy = function ( ) { delete this . fontInstalledMap } , this . isFontInstalled = function ( a ) { return b . fontInstalledMap . hasOwnProperty ( a ) || ( b . fontInstalledMap [ a ] = agent . isFontInstalled ( a ) || list . contains ( e . fontNamesIgnoreCheck , a ) ) , b . fontInstalledMap [ a ] } , this . addToolbarButtons = function ( ) { a . memo ( "button.style" , function ( ) { return c . buttonGroup ( [ c . button ( { className : "dropdown-toggle" , contents : c . icon ( e . icons . magic ) + " " + c . icon ( e . icons . caret , "span" ) , tooltip : f . style . style , data : { toggle : "dropdown" } } ) , c . dropdown ( { className : "dropdown-style" , items : a . options . styleTags , template : function ( a ) { "string" == typeof a && ( a = { tag : a , title : f . style . hasOwnProperty ( a ) ? f . style [ a ] : a } ) ; var b = a . tag , c = a . title ; return "<" + b + ( a . style ? ' style="' + a . style + '" ' : "" ) + ( a . className ? ' class="' + a . className + '"' : "" ) + ">" + c + "</" + b + ">" } , click : a . createInvokeHandler ( "editor.formatBlock" ) } ) ] ) . render ( ) } ) , a . memo ( "button.bold" , function ( ) { return c . button ( { className : "note-btn-bold" , contents : c . icon ( e . icons . bold ) , tooltip : f . font . bold + h ( "bold" ) , click : a . createInvokeHandlerAndUpdateState ( "editor.bold" ) } ) . render ( ) } ) , a . memo ( "button.italic" , function ( ) { return c . button ( { className : "note-btn-italic" , contents : c . icon ( e . icons . italic ) , tooltip : f . font . italic + h ( "italic" ) , click : a . createInvokeHandlerAndUpdateState ( "editor.italic" ) } ) . render ( ) } ) , a . memo ( "button.underline" , function ( ) { return c . button ( { className : "note-btn-underline" , contents : c . icon ( e . icons . underline ) , tooltip : f . font . underline + h ( "underline" ) , click : a . createInvokeHandlerAndUpdateState ( "editor.underline" ) } ) . render ( ) } ) , a . memo ( "button.clear" , function ( ) { return c . button ( { contents : c . icon ( e . icons . eraser ) , tooltip : f . font . clear + h ( "removeFormat" ) , click : a . createInvokeHandler ( "editor.removeFormat" ) } ) . render ( ) } ) , a . memo ( "button.strikethrough" , function ( ) { return c . button ( { className : "note-btn-strikethrough" , contents : c . icon ( e . icons . strikethrough ) , tooltip : f . font . strikethrough + h ( "strikethrough" ) , click : a . createInvokeHandlerAndUpdateState ( "editor.strikethrough" ) } ) . render ( ) } ) , a . memo ( "button.superscript" , function ( ) { return c . button ( { className : "note-btn-superscript" , contents : c . icon ( e . icons . superscript ) , tooltip : f . font . superscript , cl
this . $popover = c . popover ( { className : "note-hint-popover" , hideArrow : ! 0 , direction : "" } ) . render ( ) . appendTo ( "body" ) , this . $popover . hide ( ) , this . $content = this . $popover . find ( ".popover-content" ) , this . $content . on ( "click" , ".note-hint-item" , function ( ) { b . $content . find ( ".active" ) . removeClass ( "active" ) , $ ( this ) . addClass ( "active" ) , b . replace ( ) } ) } , this . destroy = function ( ) { this . $popover . remove ( ) } , this . selectItem = function ( a ) { this . $content . find ( ".active" ) . removeClass ( "active" ) , a . addClass ( "active" ) , this . $content [ 0 ] . scrollTop = a [ 0 ] . offsetTop - this . $content . innerHeight ( ) / 2 } , this . moveDown = function ( ) { var a = this . $content . find ( ".note-hint-item.active" ) , b = a . next ( ) ; if ( b . length ) this . selectItem ( b ) ; else { var c = a . parent ( ) . next ( ) ; c . length || ( c = this . $content . find ( ".note-hint-group" ) . first ( ) ) , this . selectItem ( c . find ( ".note-hint-item" ) . first ( ) ) } } , this . moveUp = function ( ) { var a = this . $content . find ( ".note-hint-item.active" ) , b = a . prev ( ) ; if ( b . length ) this . selectItem ( b ) ; else { var c = a . parent ( ) . prev ( ) ; c . length || ( c = this . $content . find ( ".note-hint-group" ) . last ( ) ) , this . selectItem ( c . find ( ".note-hint-item" ) . last ( ) ) } } , this . replace = function ( ) { var b = this . $content . find ( ".note-hint-item.active" ) ; if ( b . length ) { var c = this . nodeFromItem ( b ) ; this . lastWordRange . insertNode ( c ) , range . createFromNode ( c ) . collapse ( ) . select ( ) , this . lastWordRange = null , this . hide ( ) , a . triggerEvent ( "change" , a . layoutInfo . editable . html ( ) , a . layoutInfo . editable ) , a . invoke ( "editor.focus" ) } } , this . nodeFromItem = function ( a ) { var b = f [ a . data ( "index" ) ] , c = a . data ( "item" ) , d = b . content ? b . content ( c ) : c ; return "string" == typeof d && ( d = dom . createText ( d ) ) , d } , this . createItemTemplates = function ( a , b ) { var c = f [ a ] ; return b . map ( function ( b , d ) { var e = $ ( '<div class="note-hint-item"/>' ) ; return e . append ( c . template ? c . template ( b ) : b + "" ) , e . data ( { index : a , item : b } ) , 0 === a && 0 === d && e . addClass ( "active" ) , e } ) } , this . handleKeydown = function ( a ) { this . $popover . is ( ":visible" ) && ( a . keyCode === key . code . ENTER ? ( a . preventDefault ( ) , this . replace ( ) ) : a . keyCode === key . code . UP ? ( a . preventDefault ( ) , this . moveUp ( ) ) : a . keyCode === key . code . DOWN && ( a . preventDefault ( ) , this . moveDown ( ) ) ) } , this . searchKeyword = function ( a , b , c ) { var d = f [ a ] ; if ( d && d . match . test ( b ) && d . search ) { var e = d . match . exec ( b ) ; d . search ( e [ 1 ] , c ) } else c ( ) } , this . createGroup = function ( a , c ) { var d = $ ( '<div class="note-hint-group note-hint-group-' + a + '"/>' ) ; return this . searchKeyword ( a , c , function ( c ) { c = c || [ ] , c . length && ( d . html ( b . createItemTemplates ( a , c ) ) , b . show ( ) ) } ) , d } , this . handleKeyup = function ( c ) { if ( list . contains ( [ key . code . ENTER , key . code . UP , key . code . DOWN ] , c . keyCode ) ) { if ( c . keyCode === key . code . ENTER && this . $popover . is ( ":visible" ) ) return } else { var d = a . invoke ( "editor.createRange" ) . getWordRange ( ) , g = d . toString ( ) ; if ( f . length && g ) { this . $content . empty ( ) ; var h = func . rect2bnd ( list . last ( d . getClientRects ( ) ) ) ; h && ( this . $popover . hide ( ) , this . lastWordRange = d , f . forEach ( function ( a , c ) { a . match . test ( g ) && b . createGroup ( c , g ) . appendTo ( b . $content ) } ) , "top" === e ? this . $popover . css ( { left : h . left , top : h . top - this . $popover . outerHeight ( ) - 5 } ) : this . $popover . css ( { left : h . left , top : h . top + h . height + 5 } ) ) } else this . hide ( ) } } , this . show = function ( ) { this . $popover . show ( ) } , this . hide = function ( ) { this . $popover . hide ( ) } } ; $ . summernote = $ . extend ( $ . summernote , { version : "0.8.7" , ui : ui , dom : dom , plugins : { } , options : { modules : { editor : Editor , clipboard : Clipboard , dropzone : Dropzone , codeview : Codeview , statusbar : Statusbar , fullscreen : Fullscreen , handle : Handle , hintPopover : HintPopover , autoLink : AutoLink , autoSync : AutoSync , placeholder : Placeholder , buttons : Buttons , toolbar : Toolbar , linkDialog : LinkDialog , linkPopover : LinkPopover , imageDialog : ImageDialog , imagePopover : ImagePopover , tablePopover : TablePopover , videoDialog : VideoDialog , helpDialog : HelpDialog , airPopover : AirPopover } , buttons : { } , lang : "en-US" , toolbar : [ [ "style" , [ "style" ] ] , [ "font" , [ "bold" , "underline" , "clear" ] ] , [ "fontname" , [ "fontname" ] ] , [ "color" , [ "color" ] ] , [ "para" , [ "ul" , "ol" , "paragraph" ] ] , [ "table" , [ "table" ] ] , [ "insert" , [ "link" , "picture" , "video" ] ] , [ "view" , [ "fullscreen" , "codeview" , "help" ] ] ] , popover : { image : [ [ "imagesize" , [ "imageSize100" , "imageSize50" , "imageSize25" ] ] , [ "float" , [ "floatLeft" , "floatRight" , "floatNone" ] ] , [ "remove" , [ "removeMedia" ] ] ] , link : [ [ "link" , [ "linkDialogShow" , "unlink" ] ] ] , table : [ [ "add" , [ "addRowDown" , " addRow