2014-04-23 22:15:07 +02:00
/ *
wysihtml5 v0 . 3.0
https : //github.com/xing/wysihtml5
Author : Christopher Blum ( https : //github.com/tiff)
Copyright ( C ) 2012 XING AG
Licensed under the MIT license ( MIT )
Rangy , a cross - browser JavaScript range and selection library
http : //code.google.com/p/rangy/
Copyright 2011 , Tim Down
Licensed under the MIT license .
Version : 1.2 . 2
Build date : 13 November 2011
* /
var wysihtml5 = { version : "0.3.0" , commands : { } , dom : { } , quirks : { } , toolbar : { } , lang : { } , selection : { } , views : { } , INVISIBLE _SPACE : "\ufeff" , EMPTY _FUNCTION : function ( ) { } , ELEMENT _NODE : 1 , TEXT _NODE : 3 , BACKSPACE _KEY : 8 , ENTER _KEY : 13 , ESCAPE _KEY : 27 , SPACE _KEY : 32 , DELETE _KEY : 46 } ;
window . rangy = function ( ) { function b ( a , b ) { var c = typeof a [ b ] ; return c == k || ! ! ( c == h && a [ b ] ) || "unknown" == c } function c ( a , b ) { return ! ! ( typeof a [ b ] == h && a [ b ] ) } function a ( a , b ) { return typeof a [ b ] != j } function d ( a ) { return function ( b , c ) { for ( var d = c . length ; d -- ; ) if ( ! a ( b , c [ d ] ) ) return ! 1 ; return ! 0 } } function e ( a ) { return a && m ( a , r ) && x ( a , q ) } function f ( a ) { window . alert ( "Rangy not supported in your browser. Reason: " + a ) ; o . initialized = ! 0 ; o . supported = ! 1 } function g ( ) { if ( ! o . initialized ) { var a , d = ! 1 , h = ! 1 ; b ( document , "createRange" ) &&
( a = document . createRange ( ) , m ( a , p ) && x ( a , n ) && ( d = ! 0 ) , a . detach ( ) ) ; if ( ( a = c ( document , "body" ) ? document . body : document . getElementsByTagName ( "body" ) [ 0 ] ) && b ( a , "createTextRange" ) ) a = a . createTextRange ( ) , e ( a ) && ( h = ! 0 ) ; ! d && ! h && f ( "Neither Range nor TextRange are implemented" ) ; o . initialized = ! 0 ; o . features = { implementsDomRange : d , implementsTextRange : h } ; d = w . concat ( z ) ; h = 0 ; for ( a = d . length ; h < a ; ++ h ) try { d [ h ] ( o ) } catch ( j ) { c ( window , "console" ) && b ( window . console , "log" ) && window . console . log ( "Init listener threw an exception. Continuing." ,
j ) } } } function i ( a ) { this . name = a ; this . supported = this . initialized = ! 1 } var h = "object" , k = "function" , j = "undefined" , n = "startContainer startOffset endContainer endOffset collapsed commonAncestorContainer START_TO_START START_TO_END END_TO_START END_TO_END" . split ( " " ) , p = "setStart setStartBefore setStartAfter setEnd setEndBefore setEndAfter collapse selectNode selectNodeContents compareBoundaryPoints deleteContents extractContents cloneContents insertNode surroundContents cloneRange toString detach" . split ( " " ) ,
q = "boundingHeight boundingLeft boundingTop boundingWidth htmlText text" . split ( " " ) , r = "collapse compareEndPoints duplicate getBookmark moveToBookmark moveToElementText parentElement pasteHTML select setEndPoint getBoundingClientRect" . split ( " " ) , m = d ( b ) , s = d ( c ) , x = d ( a ) , o = { version : "1.2.2" , initialized : ! 1 , supported : ! 0 , util : { isHostMethod : b , isHostObject : c , isHostProperty : a , areHostMethods : m , areHostObjects : s , areHostProperties : x , isTextRange : e } , features : { } , modules : { } , config : { alertOnWarn : ! 1 , preferTextRange : ! 1 } } ;
o . fail = f ; o . warn = function ( a ) { a = "Rangy warning: " + a ; o . config . alertOnWarn ? window . alert ( a ) : typeof window . console != j && typeof window . console . log != j && window . console . log ( a ) } ; ( { } ) . hasOwnProperty ? o . util . extend = function ( a , b ) { for ( var c in b ) b . hasOwnProperty ( c ) && ( a [ c ] = b [ c ] ) } : f ( "hasOwnProperty not supported" ) ; var z = [ ] , w = [ ] ; o . init = g ; o . addInitListener = function ( a ) { o . initialized ? a ( o ) : z . push ( a ) } ; var y = [ ] ; o . addCreateMissingNativeApiListener = function ( a ) { y . push ( a ) } ; o . createMissingNativeApi = function ( a ) { a = a || window ; g ( ) ;
for ( var b = 0 , c = y . length ; b < c ; ++ b ) y [ b ] ( a ) } ; i . prototype . fail = function ( a ) { this . initialized = ! 0 ; this . supported = ! 1 ; throw Error ( "Module '" + this . name + "' failed to load: " + a ) ; } ; i . prototype . warn = function ( a ) { o . warn ( "Module " + this . name + ": " + a ) } ; i . prototype . createError = function ( a ) { return Error ( "Error in Rangy " + this . name + " module: " + a ) } ; o . createModule = function ( a , b ) { var c = new i ( a ) ; o . modules [ a ] = c ; w . push ( function ( a ) { b ( a , c ) ; c . initialized = ! 0 ; c . supported = ! 0 } ) } ; o . requireModules = function ( a ) { for ( var b = 0 , c = a . length , d , h ; b <
c ; ++ b ) { h = a [ b ] ; d = o . modules [ h ] ; if ( ! d || ! ( d instanceof i ) ) throw Error ( "Module '" + h + "' not found" ) ; if ( ! d . supported ) throw Error ( "Module '" + h + "' not supported" ) ; } } ; var A = ! 1 , s = function ( ) { A || ( A = ! 0 , o . initialized || g ( ) ) } ; if ( typeof window == j ) f ( "No window found" ) ; else if ( typeof document == j ) f ( "No document found" ) ; else return b ( document , "addEventListener" ) && document . addEventListener ( "DOMContentLoaded" , s , ! 1 ) , b ( window , "addEventListener" ) ? window . addEventListener ( "load" , s , ! 1 ) : b ( window , "attachEvent" ) ? window . attachEvent ( "onload" ,
s ) : f ( "Window does not have required addEventListener or attachEvent method" ) , o } ( ) ;
rangy . createModule ( "DomUtil" , function ( b , c ) { function a ( a ) { for ( var b = 0 ; a = a . previousSibling ; ) b ++ ; return b } function d ( a , b ) { var c = [ ] , d ; for ( d = a ; d ; d = d . parentNode ) c . push ( d ) ; for ( d = b ; d ; d = d . parentNode ) if ( m ( c , d ) ) return d ; return null } function e ( a , b , c ) { for ( c = c ? a : a . parentNode ; c ; ) { a = c . parentNode ; if ( a === b ) return c ; c = a } return null } function f ( a ) { a = a . nodeType ; return 3 == a || 4 == a || 8 == a } function g ( a , b ) { var c = b . nextSibling , d = b . parentNode ; c ? d . insertBefore ( a , c ) : d . appendChild ( a ) ; return a } function i ( a ) { if ( 9 == a . nodeType ) return a ;
if ( typeof a . ownerDocument != p ) return a . ownerDocument ; if ( typeof a . document != p ) return a . document ; if ( a . parentNode ) return i ( a . parentNode ) ; throw Error ( "getDocument: no document found for node" ) ; } function h ( a ) { return ! a ? "[No node]" : f ( a ) ? '"' + a . data + '"' : 1 == a . nodeType ? "<" + a . nodeName + ( a . id ? ' id="' + a . id + '"' : "" ) + ">[" + a . childNodes . length + "]" : a . nodeName } function k ( a ) { this . _next = this . root = a } function j ( a , b ) { this . node = a ; this . offset = b } function n ( a ) { this . code = this [ a ] ; this . codeName = a ; this . message = "DOMException: " + this . codeName }
var p = "undefined" , q = b . util ; q . areHostMethods ( document , [ "createDocumentFragment" , "createElement" , "createTextNode" ] ) || c . fail ( "document missing a Node creation method" ) ; q . isHostMethod ( document , "getElementsByTagName" ) || c . fail ( "document missing getElementsByTagName method" ) ; var r = document . createElement ( "div" ) ; q . areHostMethods ( r , [ "insertBefore" , "appendChild" , "cloneNode" ] ) || c . fail ( "Incomplete Element implementation" ) ; q . isHostProperty ( r , "innerHTML" ) || c . fail ( "Element is missing innerHTML property" ) ; r = document . createTextNode ( "test" ) ;
q . areHostMethods ( r , [ "splitText" , "deleteData" , "insertData" , "appendData" , "cloneNode" ] ) || c . fail ( "Incomplete Text Node implementation" ) ; var m = function ( a , b ) { for ( var c = a . length ; c -- ; ) if ( a [ c ] === b ) return ! 0 ; return ! 1 } ; k . prototype = { _current : null , hasNext : function ( ) { return ! ! this . _next } , next : function ( ) { var a = this . _current = this . _next , b ; if ( this . _current ) { b = a . firstChild ; if ( ! b ) for ( b = null ; a !== this . root && ! ( b = a . nextSibling ) ; ) a = a . parentNode ; this . _next = b } return this . _current } , detach : function ( ) { this . _current = this . _next = this . root =
null } } ; j . prototype = { equals : function ( a ) { return this . node === a . node & this . offset == a . offset } , inspect : function ( ) { return "[DomPosition(" + h ( this . node ) + ":" + this . offset + ")]" } } ; n . prototype = { INDEX _SIZE _ERR : 1 , HIERARCHY _REQUEST _ERR : 3 , WRONG _DOCUMENT _ERR : 4 , NO _MODIFICATION _ALLOWED _ERR : 7 , NOT _FOUND _ERR : 8 , NOT _SUPPORTED _ERR : 9 , INVALID _STATE _ERR : 11 } ; n . prototype . toString = function ( ) { return this . message } ; b . dom = { arrayContains : m , isHtmlNamespace : function ( a ) { var b ; return typeof a . namespaceURI == p || null === ( b = a . namespaceURI ) || "http://www.w3.org/1999/xhtml" ==
b } , parentElement : function ( a ) { a = a . parentNode ; return 1 == a . nodeType ? a : null } , getNodeIndex : a , getNodeLength : function ( a ) { var b ; return f ( a ) ? a . length : ( b = a . childNodes ) ? b . length : 0 } , getCommonAncestor : d , isAncestorOf : function ( a , b , c ) { for ( b = c ? b : b . parentNode ; b ; ) { if ( b === a ) return ! 0 ; b = b . parentNode } return ! 1 } , getClosestAncestorIn : e , isCharacterDataNode : f , insertAfter : g , splitDataNode : function ( a , b ) { var c = a . cloneNode ( ! 1 ) ; c . deleteData ( 0 , b ) ; a . deleteData ( b , a . length - b ) ; g ( c , a ) ; return c } , getDocument : i , getWindow : function ( a ) { a = i ( a ) ;
if ( typeof a . defaultView != p ) return a . defaultView ; if ( typeof a . parentWindow != p ) return a . parentWindow ; throw Error ( "Cannot get a window object for node" ) ; } , getIframeWindow : function ( a ) { if ( typeof a . contentWindow != p ) return a . contentWindow ; if ( typeof a . contentDocument != p ) return a . contentDocument . defaultView ; throw Error ( "getIframeWindow: No Window object found for iframe element" ) ; } , getIframeDocument : function ( a ) { if ( typeof a . contentDocument != p ) return a . contentDocument ; if ( typeof a . contentWindow != p ) return a . contentWindow . document ;
throw Error ( "getIframeWindow: No Document object found for iframe element" ) ; } , getBody : function ( a ) { return q . isHostObject ( a , "body" ) ? a . body : a . getElementsByTagName ( "body" ) [ 0 ] } , getRootContainer : function ( a ) { for ( var b ; b = a . parentNode ; ) a = b ; return a } , comparePoints : function ( b , c , h , j ) { var k ; if ( b == h ) return c === j ? 0 : c < j ? - 1 : 1 ; if ( k = e ( h , b , ! 0 ) ) return c <= a ( k ) ? - 1 : 1 ; if ( k = e ( b , h , ! 0 ) ) return a ( k ) < j ? - 1 : 1 ; c = d ( b , h ) ; b = b === c ? c : e ( b , c , ! 0 ) ; h = h === c ? c : e ( h , c , ! 0 ) ; if ( b === h ) throw Error ( "comparePoints got to case 4 and childA and childB are the same!" ) ;
for ( c = c . firstChild ; c ; ) { if ( c === b ) return - 1 ; if ( c === h ) return 1 ; c = c . nextSibling } throw Error ( "Should not be here!" ) ; } , inspectNode : h , fragmentFromNodeChildren : function ( a ) { for ( var b = i ( a ) . createDocumentFragment ( ) , c ; c = a . firstChild ; ) b . appendChild ( c ) ; return b } , createIterator : function ( a ) { return new k ( a ) } , DomPosition : j } ; b . DOMException = n } ) ;
rangy . createModule ( "DomRange" , function ( b ) { function c ( a , b ) { return 3 != a . nodeType && ( l . isAncestorOf ( a , b . startContainer , ! 0 ) || l . isAncestorOf ( a , b . endContainer , ! 0 ) ) } function a ( a ) { return l . getDocument ( a . startContainer ) } function d ( a , b , c ) { if ( b = a . _listeners [ b ] ) for ( var d = 0 , h = b . length ; d < h ; ++ d ) b [ d ] . call ( a , { target : a , args : c } ) } function e ( a ) { return new u ( a . parentNode , l . getNodeIndex ( a ) ) } function f ( a ) { return new u ( a . parentNode , l . getNodeIndex ( a ) + 1 ) } function g ( a , b , c ) { var d = 11 == a . nodeType ? a . firstChild : a ; l . isCharacterDataNode ( b ) ?
c == b . length ? l . insertAfter ( a , b ) : b . parentNode . insertBefore ( a , 0 == c ? b : l . splitDataNode ( b , c ) ) : c >= b . childNodes . length ? b . appendChild ( a ) : b . insertBefore ( a , b . childNodes [ c ] ) ; return d } function i ( b ) { for ( var c , d , h = a ( b . range ) . createDocumentFragment ( ) ; d = b . next ( ) ; ) { c = b . isPartiallySelectedSubtree ( ) ; d = d . cloneNode ( ! c ) ; c && ( c = b . getSubtreeIterator ( ) , d . appendChild ( i ( c ) ) , c . detach ( ! 0 ) ) ; if ( 10 == d . nodeType ) throw new B ( "HIERARCHY_REQUEST_ERR" ) ; h . appendChild ( d ) } return h } function h ( a , b , c ) { for ( var d , e , c = c || { stop : ! 1 } ; d = a . next ( ) ; ) if ( a . isPartiallySelectedSubtree ( ) ) if ( ! 1 ===
b ( d ) ) { c . stop = ! 0 ; break } else { if ( d = a . getSubtreeIterator ( ) , h ( d , b , c ) , d . detach ( ! 0 ) , c . stop ) break } else for ( d = l . createIterator ( d ) ; e = d . next ( ) ; ) if ( ! 1 === b ( e ) ) { c . stop = ! 0 ; return } } function k ( a ) { for ( var b ; a . next ( ) ; ) a . isPartiallySelectedSubtree ( ) ? ( b = a . getSubtreeIterator ( ) , k ( b ) , b . detach ( ! 0 ) ) : a . remove ( ) } function j ( b ) { for ( var c , d = a ( b . range ) . createDocumentFragment ( ) , h ; c = b . next ( ) ; ) { b . isPartiallySelectedSubtree ( ) ? ( c = c . cloneNode ( ! 1 ) , h = b . getSubtreeIterator ( ) , c . appendChild ( j ( h ) ) , h . detach ( ! 0 ) ) : b . remove ( ) ; if ( 10 == c . nodeType ) throw new B ( "HIERARCHY_REQUEST_ERR" ) ;
d . appendChild ( c ) } return d } function n ( a , b , c ) { var d = ! ( ! b || ! b . length ) , e , j = ! ! c ; d && ( e = RegExp ( "^(" + b . join ( "|" ) + ")$" ) ) ; var k = [ ] ; h ( new q ( a , ! 1 ) , function ( a ) { ( ! d || e . test ( a . nodeType ) ) && ( ! j || c ( a ) ) && k . push ( a ) } ) ; return k } function p ( a ) { return "[" + ( "undefined" == typeof a . getName ? "Range" : a . getName ( ) ) + "(" + l . inspectNode ( a . startContainer ) + ":" + a . startOffset + ", " + l . inspectNode ( a . endContainer ) + ":" + a . endOffset + ")]" } function q ( a , b ) { this . range = a ; this . clonePartiallySelectedTextNodes = b ; if ( ! a . collapsed ) { this . sc = a . startContainer ;
this . so = a . startOffset ; this . ec = a . endContainer ; this . eo = a . endOffset ; var c = a . commonAncestorContainer ; this . sc === this . ec && l . isCharacterDataNode ( this . sc ) ? ( this . isSingleCharacterDataNode = ! 0 , this . _first = this . _last = this . _next = this . sc ) : ( this . _first = this . _next = this . sc === c && ! l . isCharacterDataNode ( this . sc ) ? this . sc . childNodes [ this . so ] : l . getClosestAncestorIn ( this . sc , c , ! 0 ) , this . _last = this . ec === c && ! l . isCharacterDataNode ( this . ec ) ? this . ec . childNodes [ this . eo - 1 ] : l . getClosestAncestorIn ( this . ec , c , ! 0 ) ) } } function r ( a ) { this . code =
this [ a ] ; this . codeName = a ; this . message = "RangeException: " + this . codeName } function m ( a , b , c ) { this . nodes = n ( a , b , c ) ; this . _next = this . nodes [ 0 ] ; this . _position = 0 } function s ( a ) { return function ( b , c ) { for ( var d , h = c ? b : b . parentNode ; h ; ) { d = h . nodeType ; if ( l . arrayContains ( a , d ) ) return h ; h = h . parentNode } return null } } function x ( a , b ) { if ( $ ( a , b ) ) throw new r ( "INVALID_NODE_TYPE_ERR" ) ; } function o ( a ) { if ( ! a . startContainer ) throw new B ( "INVALID_STATE_ERR" ) ; } function z ( a , b ) { if ( ! l . arrayContains ( b , a . nodeType ) ) throw new r ( "INVALID_NODE_TYPE_ERR" ) ;
} function w ( a , b ) { if ( 0 > b || b > ( l . isCharacterDataNode ( a ) ? a . length : a . childNodes . length ) ) throw new B ( "INDEX_SIZE_ERR" ) ; } function y ( a , b ) { if ( O ( a , ! 0 ) !== O ( b , ! 0 ) ) throw new B ( "WRONG_DOCUMENT_ERR" ) ; } function A ( a ) { if ( aa ( a , ! 0 ) ) throw new B ( "NO_MODIFICATION_ALLOWED_ERR" ) ; } function t ( a , b ) { if ( ! a ) throw new B ( b ) ; } function v ( a ) { o ( a ) ; if ( ! l . arrayContains ( G , a . startContainer . nodeType ) && ! O ( a . startContainer , ! 0 ) || ! l . arrayContains ( G , a . endContainer . nodeType ) && ! O ( a . endContainer , ! 0 ) || ! ( a . startOffset <= ( l . isCharacterDataNode ( a . startContainer ) ?
a . startContainer . length : a . startContainer . childNodes . length ) ) || ! ( a . endOffset <= ( l . isCharacterDataNode ( a . endContainer ) ? a . endContainer . length : a . endContainer . childNodes . length ) ) ) throw Error ( "Range error: Range is no longer valid after DOM mutation (" + a . inspect ( ) + ")" ) ; } function D ( ) { } function K ( a ) { a . START _TO _START = Q ; a . START _TO _END = U ; a . END _TO _END = ba ; a . END _TO _START = V ; a . NODE _BEFORE = W ; a . NODE _AFTER = X ; a . NODE _BEFORE _AND _AFTER = Y ; a . NODE _INSIDE = R } function F ( a ) { K ( a ) ; K ( a . prototype ) } function E ( a , b ) { return function ( ) { v ( this ) ;
var c = this . startContainer , d = this . startOffset , e = this . commonAncestorContainer , j = new q ( this , ! 0 ) ; c !== e && ( c = l . getClosestAncestorIn ( c , e , ! 0 ) , d = f ( c ) , c = d . node , d = d . offset ) ; h ( j , A ) ; j . reset ( ) ; e = a ( j ) ; j . detach ( ) ; b ( this , c , d , c , d ) ; return e } } function I ( a , d , h ) { function g ( a , b ) { return function ( c ) { o ( this ) ; z ( c , L ) ; z ( M ( c ) , G ) ; c = ( a ? e : f ) ( c ) ; ( b ? i : n ) ( this , c . node , c . offset ) } } function i ( a , b , c ) { var h = a . endContainer , e = a . endOffset ; if ( b !== a . startContainer || c !== a . startOffset ) { if ( M ( b ) != M ( h ) || 1 == l . comparePoints ( b , c , h , e ) ) h = b , e = c ; d ( a , b , c ,
h , e ) } } function n ( a , b , c ) { var h = a . startContainer , e = a . startOffset ; if ( b !== a . endContainer || c !== a . endOffset ) { if ( M ( b ) != M ( h ) || - 1 == l . comparePoints ( b , c , h , e ) ) h = b , e = c ; d ( a , h , e , b , c ) } } a . prototype = new D ; b . util . extend ( a . prototype , { setStart : function ( a , b ) { o ( this ) ; x ( a , ! 0 ) ; w ( a , b ) ; i ( this , a , b ) } , setEnd : function ( a , b ) { o ( this ) ; x ( a , ! 0 ) ; w ( a , b ) ; n ( this , a , b ) } , setStartBefore : g ( ! 0 , ! 0 ) , setStartAfter : g ( ! 1 , ! 0 ) , setEndBefore : g ( ! 0 , ! 1 ) , setEndAfter : g ( ! 1 , ! 1 ) , collapse : function ( a ) { v ( this ) ; a ? d ( this , this . startContainer , this . startOffset , this . startContainer ,
this . startOffset ) : d ( this , this . endContainer , this . endOffset , this . endContainer , this . endOffset ) } , selectNodeContents : function ( a ) { o ( this ) ; x ( a , ! 0 ) ; d ( this , a , 0 , a , l . getNodeLength ( a ) ) } , selectNode : function ( a ) { o ( this ) ; x ( a , ! 1 ) ; z ( a , L ) ; var b = e ( a ) , a = f ( a ) ; d ( this , b . node , b . offset , a . node , a . offset ) } , extractContents : E ( j , d ) , deleteContents : E ( k , d ) , canSurroundContents : function ( ) { v ( this ) ; A ( this . startContainer ) ; A ( this . endContainer ) ; var a = new q ( this , ! 0 ) , b = a . _first && c ( a . _first , this ) || a . _last && c ( a . _last , this ) ; a . detach ( ) ; return ! b } ,
detach : function ( ) { h ( this ) } , splitBoundaries : function ( ) { v ( this ) ; var a = this . startContainer , b = this . startOffset , c = this . endContainer , h = this . endOffset , e = a === c ; l . isCharacterDataNode ( c ) && ( 0 < h && h < c . length ) && l . splitDataNode ( c , h ) ; l . isCharacterDataNode ( a ) && ( 0 < b && b < a . length ) && ( a = l . splitDataNode ( a , b ) , e ? ( h -= b , c = a ) : c == a . parentNode && h >= l . getNodeIndex ( a ) && h ++ , b = 0 ) ; d ( this , a , b , c , h ) } , normalizeBoundaries : function ( ) { v ( this ) ; var a = this . startContainer , b = this . startOffset , c = this . endContainer , h = this . endOffset , e = function ( a ) { var b =
a . nextSibling ; b && b . nodeType == a . nodeType && ( c = a , h = a . length , a . appendData ( b . data ) , b . parentNode . removeChild ( b ) ) } , j = function ( d ) { var e = d . previousSibling ; if ( e && e . nodeType == d . nodeType ) { a = d ; var j = d . length ; b = e . length ; d . insertData ( 0 , e . data ) ; e . parentNode . removeChild ( e ) ; a == c ? ( h += b , c = a ) : c == d . parentNode && ( e = l . getNodeIndex ( d ) , h == e ? ( c = d , h = j ) : h > e && h -- ) } } , k = ! 0 ; l . isCharacterDataNode ( c ) ? c . length == h && e ( c ) : ( 0 < h && ( k = c . childNodes [ h - 1 ] ) && l . isCharacterDataNode ( k ) && e ( k ) , k = ! this . collapsed ) ; k ? l . isCharacterDataNode ( a ) ? 0 == b && j ( a ) :
b < a . childNodes . length && ( e = a . childNodes [ b ] ) && l . isCharacterDataNode ( e ) && j ( e ) : ( a = c , b = h ) ; d ( this , a , b , c , h ) } , collapseToPoint : function ( a , b ) { o ( this ) ; x ( a , ! 0 ) ; w ( a , b ) ; ( a !== this . startContainer || b !== this . startOffset || a !== this . endContainer || b !== this . endOffset ) && d ( this , a , b , a , b ) } } ) ; F ( a ) } function N ( a ) { a . collapsed = a . startContainer === a . endContainer && a . startOffset === a . endOffset ; a . commonAncestorContainer = a . collapsed ? a . startContainer : l . getCommonAncestor ( a . startContainer , a . endContainer ) } function J ( a , b , c , h , e ) { var j = a . startContainer !==
b || a . startOffset !== c , k = a . endContainer !== h || a . endOffset !== e ; a . startContainer = b ; a . startOffset = c ; a . endContainer = h ; a . endOffset = e ; N ( a ) ; d ( a , "boundarychange" , { startMoved : j , endMoved : k } ) } function C ( a ) { this . startContainer = a ; this . startOffset = 0 ; this . endContainer = a ; this . endOffset = 0 ; this . _listeners = { boundarychange : [ ] , detach : [ ] } ; N ( this ) } b . requireModules ( [ "DomUtil" ] ) ; var l = b . dom , u = l . DomPosition , B = b . DOMException ; q . prototype = { _current : null , _next : null , _first : null , _last : null , isSingleCharacterDataNode : ! 1 , reset : function ( ) { this . _current =
null ; this . _next = this . _first } , hasNext : function ( ) { return ! ! this . _next } , next : function ( ) { var a = this . _current = this . _next ; a && ( this . _next = a !== this . _last ? a . nextSibling : null , l . isCharacterDataNode ( a ) && this . clonePartiallySelectedTextNodes && ( a === this . ec && ( a = a . cloneNode ( ! 0 ) ) . deleteData ( this . eo , a . length - this . eo ) , this . _current === this . sc && ( a = a . cloneNode ( ! 0 ) ) . deleteData ( 0 , this . so ) ) ) ; return a } , remove : function ( ) { var a = this . _current , b , c ; l . isCharacterDataNode ( a ) && ( a === this . sc || a === this . ec ) ? ( b = a === this . sc ? this . so : 0 , c = a ===
this . ec ? this . eo : a . length , b != c && a . deleteData ( b , c - b ) ) : a . parentNode && a . parentNode . removeChild ( a ) } , isPartiallySelectedSubtree : function ( ) { return c ( this . _current , this . range ) } , getSubtreeIterator : function ( ) { var b ; if ( this . isSingleCharacterDataNode ) b = this . range . cloneRange ( ) , b . collapse ( ) ; else { b = new C ( a ( this . range ) ) ; var c = this . _current , d = c , h = 0 , e = c , j = l . getNodeLength ( c ) ; l . isAncestorOf ( c , this . sc , ! 0 ) && ( d = this . sc , h = this . so ) ; l . isAncestorOf ( c , this . ec , ! 0 ) && ( e = this . ec , j = this . eo ) ; J ( b , d , h , e , j ) } return new q ( b , this . clonePartiallySelectedTextNodes ) } ,
detach : function ( a ) { a && this . range . detach ( ) ; this . range = this . _current = this . _next = this . _first = this . _last = this . sc = this . so = this . ec = this . eo = null } } ; r . prototype = { BAD _BOUNDARYPOINTS _ERR : 1 , INVALID _NODE _TYPE _ERR : 2 } ; r . prototype . toString = function ( ) { return this . message } ; m . prototype = { _current : null , hasNext : function ( ) { return ! ! this . _next } , next : function ( ) { this . _current = this . _next ; this . _next = this . nodes [ ++ this . _position ] ; return this . _current } , detach : function ( ) { this . _current = this . _next = this . nodes = null } } ; var L = [ 1 , 3 , 4 , 5 ,
7 , 8 , 10 ] , G = [ 2 , 9 , 11 ] , P = [ 1 , 3 , 4 , 5 , 7 , 8 , 10 , 11 ] , H = [ 1 , 3 , 4 , 5 , 7 , 8 ] , M = l . getRootContainer , O = s ( [ 9 , 11 ] ) , aa = s ( [ 5 , 6 , 10 , 12 ] ) , $ = s ( [ 6 , 10 , 12 ] ) , Z = document . createElement ( "style" ) , S = ! 1 ; try { Z . innerHTML = "<b>x</b>" , S = 3 == Z . firstChild . nodeType } catch ( ca ) { } b . features . htmlParsingConforms = S ; var T = "startContainer startOffset endContainer endOffset collapsed commonAncestorContainer" . split ( " " ) , Q = 0 , U = 1 , ba = 2 , V = 3 , W = 0 , X = 1 , Y = 2 , R = 3 ; D . prototype = { attachListener : function ( a , b ) { this . _listeners [ a ] . push ( b ) } , compareBoundaryPoints : function ( a , b ) { v ( this ) ;
y ( this . startContainer , b . startContainer ) ; var c = a == V || a == Q ? "start" : "end" , d = a == U || a == Q ? "start" : "end" ; return l . comparePoints ( this [ c + "Container" ] , this [ c + "Offset" ] , b [ d + "Container" ] , b [ d + "Offset" ] ) } , insertNode : function ( a ) { v ( this ) ; z ( a , P ) ; A ( this . startContainer ) ; if ( l . isAncestorOf ( a , this . startContainer , ! 0 ) ) throw new B ( "HIERARCHY_REQUEST_ERR" ) ; this . setStartBefore ( g ( a , this . startContainer , this . startOffset ) ) } , cloneContents : function ( ) { v ( this ) ; var b , c ; if ( this . collapsed ) return a ( this ) . createDocumentFragment ( ) ; if ( this . startContainer ===
this . endContainer && l . isCharacterDataNode ( this . startContainer ) ) return b = this . startContainer . cloneNode ( ! 0 ) , b . data = b . data . slice ( this . startOffset , this . endOffset ) , c = a ( this ) . createDocumentFragment ( ) , c . appendChild ( b ) , c ; c = new q ( this , ! 0 ) ; b = i ( c ) ; c . detach ( ) ; return b } , canSurroundContents : function ( ) { v ( this ) ; A ( this . startContainer ) ; A ( this . endContainer ) ; var a = new q ( this , ! 0 ) , b = a . _first && c ( a . _first , this ) || a . _last && c ( a . _last , this ) ; a . detach ( ) ; return ! b } , surroundContents : function ( a ) { z ( a , H ) ; if ( ! this . canSurroundContents ( ) ) throw new r ( "BAD_BOUNDARYPOINTS_ERR" ) ;
var b = this . extractContents ( ) ; if ( a . hasChildNodes ( ) ) for ( ; a . lastChild ; ) a . removeChild ( a . lastChild ) ; g ( a , this . startContainer , this . startOffset ) ; a . appendChild ( b ) ; this . selectNode ( a ) } , cloneRange : function ( ) { v ( this ) ; for ( var b = new C ( a ( this ) ) , c = T . length , d ; c -- ; ) d = T [ c ] , b [ d ] = this [ d ] ; return b } , toString : function ( ) { v ( this ) ; var a = this . startContainer ; if ( a === this . endContainer && l . isCharacterDataNode ( a ) ) return 3 == a . nodeType || 4 == a . nodeType ? a . data . slice ( this . startOffset , this . endOffset ) : "" ; var b = [ ] , a = new q ( this , ! 0 ) ; h ( a , function ( a ) { ( 3 ==
a . nodeType || 4 == a . nodeType ) && b . push ( a . data ) } ) ; a . detach ( ) ; return b . join ( "" ) } , compareNode : function ( a ) { v ( this ) ; var b = a . parentNode , c = l . getNodeIndex ( a ) ; if ( ! b ) throw new B ( "NOT_FOUND_ERR" ) ; a = this . comparePoint ( b , c ) ; b = this . comparePoint ( b , c + 1 ) ; return 0 > a ? 0 < b ? Y : W : 0 < b ? X : R } , comparePoint : function ( a , b ) { v ( this ) ; t ( a , "HIERARCHY_REQUEST_ERR" ) ; y ( a , this . startContainer ) ; return 0 > l . comparePoints ( a , b , this . startContainer , this . startOffset ) ? - 1 : 0 < l . comparePoints ( a , b , this . endContainer , this . endOffset ) ? 1 : 0 } , createContextualFragment : S ?
function ( a ) { var b = this . startContainer , c = l . getDocument ( b ) ; if ( ! b ) throw new B ( "INVALID_STATE_ERR" ) ; var d = null ; 1 == b . nodeType ? d = b : l . isCharacterDataNode ( b ) && ( d = l . parentElement ( b ) ) ; d = null === d || "HTML" == d . nodeName && l . isHtmlNamespace ( l . getDocument ( d ) . documentElement ) && l . isHtmlNamespace ( d ) ? c . createElement ( "body" ) : d . cloneNode ( ! 1 ) ; d . innerHTML = a ; return l . fragmentFromNodeChildren ( d ) } : function ( b ) { o ( this ) ; var c = a ( this ) . createElement ( "body" ) ; c . innerHTML = b ; return l . fragmentFromNodeChildren ( c ) } , toHtml : function ( ) { v ( this ) ;
var b = a ( this ) . createElement ( "div" ) ; b . appendChild ( this . cloneContents ( ) ) ; return b . innerHTML } , intersectsNode : function ( b , c ) { v ( this ) ; t ( b , "NOT_FOUND_ERR" ) ; if ( l . getDocument ( b ) !== a ( this ) ) return ! 1 ; var d = b . parentNode , h = l . getNodeIndex ( b ) ; t ( d , "NOT_FOUND_ERR" ) ; var e = l . comparePoints ( d , h , this . endContainer , this . endOffset ) , d = l . comparePoints ( d , h + 1 , this . startContainer , this . startOffset ) ; return c ? 0 >= e && 0 <= d : 0 > e && 0 < d } , isPointInRange : function ( a , b ) { v ( this ) ; t ( a , "HIERARCHY_REQUEST_ERR" ) ; y ( a , this . startContainer ) ; return 0 <=
l . comparePoints ( a , b , this . startContainer , this . startOffset ) && 0 >= l . comparePoints ( a , b , this . endContainer , this . endOffset ) } , intersectsRange : function ( b , c ) { v ( this ) ; if ( a ( b ) != a ( this ) ) throw new B ( "WRONG_DOCUMENT_ERR" ) ; var d = l . comparePoints ( this . startContainer , this . startOffset , b . endContainer , b . endOffset ) , h = l . comparePoints ( this . endContainer , this . endOffset , b . startContainer , b . startOffset ) ; return c ? 0 >= d && 0 <= h : 0 > d && 0 < h } , intersection : function ( a ) { if ( this . intersectsRange ( a ) ) { var b = l . comparePoints ( this . startContainer ,
this . startOffset , a . startContainer , a . startOffset ) , c = l . comparePoints ( this . endContainer , this . endOffset , a . endContainer , a . endOffset ) , d = this . cloneRange ( ) ; - 1 == b && d . setStart ( a . startContainer , a . startOffset ) ; 1 == c && d . setEnd ( a . endContainer , a . endOffset ) ; return d } return null } , union : function ( a ) { if ( this . intersectsRange ( a , ! 0 ) ) { var b = this . cloneRange ( ) ; - 1 == l . comparePoints ( a . startContainer , a . startOffset , this . startContainer , this . startOffset ) && b . setStart ( a . startContainer , a . startOffset ) ; 1 == l . comparePoints ( a . endContainer ,
a . endOffset , this . endContainer , this . endOffset ) && b . setEnd ( a . endContainer , a . endOffset ) ; return b } throw new r ( "Ranges do not intersect" ) ; } , containsNode : function ( a , b ) { return b ? this . intersectsNode ( a , ! 1 ) : this . compareNode ( a ) == R } , containsNodeContents : function ( a ) { return 0 <= this . comparePoint ( a , 0 ) && 0 >= this . comparePoint ( a , l . getNodeLength ( a ) ) } , containsRange : function ( a ) { return this . intersection ( a ) . equals ( a ) } , containsNodeText : function ( a ) { var b = this . cloneRange ( ) ; b . selectNode ( a ) ; var c = b . getNodes ( [ 3 ] ) ; return 0 < c . length ?
( b . setStart ( c [ 0 ] , 0 ) , a = c . pop ( ) , b . setEnd ( a , a . length ) , a = this . containsRange ( b ) , b . detach ( ) , a ) : this . containsNodeContents ( a ) } , createNodeIterator : function ( a , b ) { v ( this ) ; return new m ( this , a , b ) } , getNodes : function ( a , b ) { v ( this ) ; return n ( this , a , b ) } , getDocument : function ( ) { return a ( this ) } , collapseBefore : function ( a ) { o ( this ) ; this . setEndBefore ( a ) ; this . collapse ( ! 1 ) } , collapseAfter : function ( a ) { o ( this ) ; this . setStartAfter ( a ) ; this . collapse ( ! 0 ) } , getName : function ( ) { return "DomRange" } , equals : function ( a ) { return C . rangesEqual ( this ,
a ) } , inspect : function ( ) { return p ( this ) } } ; I ( C , J , function ( a ) { o ( a ) ; a . startContainer = a . startOffset = a . endContainer = a . endOffset = null ; a . collapsed = a . commonAncestorContainer = null ; d ( a , "detach" , null ) ; a . _listeners = null } ) ; b . rangePrototype = D . prototype ; C . rangeProperties = T ; C . RangeIterator = q ; C . copyComparisonConstants = F ; C . createPrototypeRange = I ; C . inspect = p ; C . getRangeDocument = a ; C . rangesEqual = function ( a , b ) { return a . startContainer === b . startContainer && a . startOffset === b . startOffset && a . endContainer === b . endContainer && a . endOffset ===
b . endOffset } ; b . DomRange = C ; b . RangeException = r } ) ;
rangy . createModule ( "WrappedRange" , function ( b ) { function c ( a , b , c , d ) { var g = a . duplicate ( ) ; g . collapse ( c ) ; var i = g . parentElement ( ) ; e . isAncestorOf ( b , i , ! 0 ) || ( i = b ) ; if ( ! i . canHaveHTML ) return new f ( i . parentNode , e . getNodeIndex ( i ) ) ; var b = e . getDocument ( i ) . createElement ( "span" ) , r , m = c ? "StartToStart" : "StartToEnd" ; do i . insertBefore ( b , b . previousSibling ) , g . moveToElementText ( b ) ; while ( 0 < ( r = g . compareEndPoints ( m , a ) ) && b . previousSibling ) ; m = b . nextSibling ; if ( - 1 == r && m && e . isCharacterDataNode ( m ) ) { g . setEndPoint ( c ? "EndToStart" : "EndToEnd" ,
a ) ; if ( /[\r\n]/ . test ( m . data ) ) { i = g . duplicate ( ) ; c = i . text . replace ( /\r\n/g , "\r" ) . length ; for ( c = i . moveStart ( "character" , c ) ; - 1 == i . compareEndPoints ( "StartToEnd" , i ) ; ) c ++ , i . moveStart ( "character" , 1 ) } else c = g . text . length ; i = new f ( m , c ) } else m = ( d || ! c ) && b . previousSibling , i = ( c = ( d || c ) && b . nextSibling ) && e . isCharacterDataNode ( c ) ? new f ( c , 0 ) : m && e . isCharacterDataNode ( m ) ? new f ( m , m . length ) : new f ( i , e . getNodeIndex ( b ) ) ; b . parentNode . removeChild ( b ) ; return i } function a ( a , b ) { var c , d , f = a . offset , g = e . getDocument ( a . node ) , i = g . body . createTextRange ( ) ,
m = e . isCharacterDataNode ( a . node ) ; m ? ( c = a . node , d = c . parentNode ) : ( c = a . node . childNodes , c = f < c . length ? c [ f ] : null , d = a . node ) ; g = g . createElement ( "span" ) ; g . innerHTML = "&#feff;" ; c ? d . insertBefore ( g , c ) : d . appendChild ( g ) ; i . moveToElementText ( g ) ; i . collapse ( ! b ) ; d . removeChild ( g ) ; if ( m ) i [ b ? "moveStart" : "moveEnd" ] ( "character" , f ) ; return i } b . requireModules ( [ "DomUtil" , "DomRange" ] ) ; var d , e = b . dom , f = e . DomPosition , g = b . DomRange ; if ( b . features . implementsDomRange && ( ! b . features . implementsTextRange || ! b . config . preferTextRange ) ) ( function ( ) { function a ( b ) { for ( var c =
j . length , d ; c -- ; ) d = j [ c ] , b [ d ] = b . nativeRange [ d ] } var c , j = g . rangeProperties , f ; d = function ( b ) { if ( ! b ) throw Error ( "Range must be specified" ) ; this . nativeRange = b ; a ( this ) } ; g . createPrototypeRange ( d , function ( a , b , c , d , h ) { var e = a . endContainer !== d || a . endOffset != h ; if ( a . startContainer !== b || a . startOffset != c || e ) a . setEnd ( d , h ) , a . setStart ( b , c ) } , function ( a ) { a . nativeRange . detach ( ) ; a . detached = ! 0 ; for ( var b = j . length , c ; b -- ; ) c = j [ b ] , a [ c ] = null } ) ; c = d . prototype ; c . selectNode = function ( b ) { this . nativeRange . selectNode ( b ) ; a ( this ) } ; c . deleteContents =
function ( ) { this . nativeRange . deleteContents ( ) ; a ( this ) } ; c . extractContents = function ( ) { var b = this . nativeRange . extractContents ( ) ; a ( this ) ; return b } ; c . cloneContents = function ( ) { return this . nativeRange . cloneContents ( ) } ; c . surroundContents = function ( b ) { this . nativeRange . surroundContents ( b ) ; a ( this ) } ; c . collapse = function ( b ) { this . nativeRange . collapse ( b ) ; a ( this ) } ; c . cloneRange = function ( ) { return new d ( this . nativeRange . cloneRange ( ) ) } ; c . refresh = function ( ) { a ( this ) } ; c . toString = function ( ) { return this . nativeRange . toString ( ) } ;
var i = document . createTextNode ( "test" ) ; e . getBody ( document ) . appendChild ( i ) ; var q = document . createRange ( ) ; q . setStart ( i , 0 ) ; q . setEnd ( i , 0 ) ; try { q . setStart ( i , 1 ) , c . setStart = function ( b , c ) { this . nativeRange . setStart ( b , c ) ; a ( this ) } , c . setEnd = function ( b , c ) { this . nativeRange . setEnd ( b , c ) ; a ( this ) } , f = function ( b ) { return function ( c ) { this . nativeRange [ b ] ( c ) ; a ( this ) } } } catch ( r ) { c . setStart = function ( b , c ) { try { this . nativeRange . setStart ( b , c ) } catch ( d ) { this . nativeRange . setEnd ( b , c ) , this . nativeRange . setStart ( b , c ) } a ( this ) } , c . setEnd = function ( b ,
c ) { try { this . nativeRange . setEnd ( b , c ) } catch ( d ) { this . nativeRange . setStart ( b , c ) , this . nativeRange . setEnd ( b , c ) } a ( this ) } , f = function ( b , c ) { return function ( d ) { try { this . nativeRange [ b ] ( d ) } catch ( e ) { this . nativeRange [ c ] ( d ) , this . nativeRange [ b ] ( d ) } a ( this ) } } } c . setStartBefore = f ( "setStartBefore" , "setEndBefore" ) ; c . setStartAfter = f ( "setStartAfter" , "setEndAfter" ) ; c . setEndBefore = f ( "setEndBefore" , "setStartBefore" ) ; c . setEndAfter = f ( "setEndAfter" , "setStartAfter" ) ; q . selectNodeContents ( i ) ; c . selectNodeContents = q . startContainer ==
i && q . endContainer == i && 0 == q . startOffset && q . endOffset == i . length ? function ( b ) { this . nativeRange . selectNodeContents ( b ) ; a ( this ) } : function ( a ) { this . setStart ( a , 0 ) ; this . setEnd ( a , g . getEndOffset ( a ) ) } ; q . selectNodeContents ( i ) ; q . setEnd ( i , 3 ) ; f = document . createRange ( ) ; f . selectNodeContents ( i ) ; f . setEnd ( i , 4 ) ; f . setStart ( i , 2 ) ; c . compareBoundaryPoints = - 1 == q . compareBoundaryPoints ( q . START _TO _END , f ) & 1 == q . compareBoundaryPoints ( q . END _TO _START , f ) ? function ( a , b ) { b = b . nativeRange || b ; a == b . START _TO _END ? a = b . END _TO _START : a == b . END _TO _START &&
( a = b . START _TO _END ) ; return this . nativeRange . compareBoundaryPoints ( a , b ) } : function ( a , b ) { return this . nativeRange . compareBoundaryPoints ( a , b . nativeRange || b ) } ; b . util . isHostMethod ( q , "createContextualFragment" ) && ( c . createContextualFragment = function ( a ) { return this . nativeRange . createContextualFragment ( a ) } ) ; e . getBody ( document ) . removeChild ( i ) ; q . detach ( ) ; f . detach ( ) } ) ( ) , b . createNativeRange = function ( a ) { a = a || document ; return a . createRange ( ) } ; else if ( b . features . implementsTextRange ) { d = function ( a ) { this . textRange = a ; this . refresh ( ) } ;
d . prototype = new g ( document ) ; d . prototype . refresh = function ( ) { var a , b , d = this . textRange ; a = d . parentElement ( ) ; var f = d . duplicate ( ) ; f . collapse ( ! 0 ) ; b = f . parentElement ( ) ; f = d . duplicate ( ) ; f . collapse ( ! 1 ) ; d = f . parentElement ( ) ; b = b == d ? b : e . getCommonAncestor ( b , d ) ; b = b == a ? b : e . getCommonAncestor ( a , b ) ; 0 == this . textRange . compareEndPoints ( "StartToEnd" , this . textRange ) ? b = a = c ( this . textRange , b , ! 0 , ! 0 ) : ( a = c ( this . textRange , b , ! 0 , ! 1 ) , b = c ( this . textRange , b , ! 1 , ! 1 ) ) ; this . setStart ( a . node , a . offset ) ; this . setEnd ( b . node , b . offset ) } ; g . copyComparisonConstants ( d ) ;
var i = function ( ) { return this } ( ) ; "undefined" == typeof i . Range && ( i . Range = d ) ; b . createNativeRange = function ( a ) { a = a || document ; return a . body . createTextRange ( ) } } b . features . implementsTextRange && ( d . rangeToTextRange = function ( b ) { if ( b . collapsed ) return a ( new f ( b . startContainer , b . startOffset ) , ! 0 ) ; var c = a ( new f ( b . startContainer , b . startOffset ) , ! 0 ) , d = a ( new f ( b . endContainer , b . endOffset ) , ! 1 ) , b = e . getDocument ( b . startContainer ) . body . createTextRange ( ) ; b . setEndPoint ( "StartToStart" , c ) ; b . setEndPoint ( "EndToEnd" , d ) ; return b } ) ;
d . prototype . getName = function ( ) { return "WrappedRange" } ; b . WrappedRange = d ; b . createRange = function ( a ) { a = a || document ; return new d ( b . createNativeRange ( a ) ) } ; b . createRangyRange = function ( a ) { a = a || document ; return new g ( a ) } ; b . createIframeRange = function ( a ) { return b . createRange ( e . getIframeDocument ( a ) ) } ; b . createIframeRangyRange = function ( a ) { return b . createRangyRange ( e . getIframeDocument ( a ) ) } ; b . addCreateMissingNativeApiListener ( function ( a ) { a = a . document ; if ( typeof a . createRange == "undefined" ) a . createRange = function ( ) { return b . createRange ( this ) } ;
a = a = null } ) } ) ;
rangy . createModule ( "WrappedSelection" , function ( b , c ) { function a ( a ) { return ( a || window ) . getSelection ( ) } function d ( a ) { return ( a || window ) . document . selection } function e ( a , b , c ) { var d = c ? "end" : "start" , c = c ? "start" : "end" ; a . anchorNode = b [ d + "Container" ] ; a . anchorOffset = b [ d + "Offset" ] ; a . focusNode = b [ c + "Container" ] ; a . focusOffset = b [ c + "Offset" ] } function f ( a ) { a . anchorNode = a . focusNode = null ; a . anchorOffset = a . focusOffset = 0 ; a . rangeCount = 0 ; a . isCollapsed = ! 0 ; a . _ranges . length = 0 } function g ( a ) { var c ; a instanceof x ? ( c = a . _selectionNativeRange ,
c || ( c = b . createNativeRange ( m . getDocument ( a . startContainer ) ) , c . setEnd ( a . endContainer , a . endOffset ) , c . setStart ( a . startContainer , a . startOffset ) , a . _selectionNativeRange = c , a . attachListener ( "detach" , function ( ) { this . _selectionNativeRange = null } ) ) ) : a instanceof o ? c = a . nativeRange : b . features . implementsDomRange && a instanceof m . getWindow ( a . startContainer ) . Range && ( c = a ) ; return c } function i ( a ) { var b = a . getNodes ( ) , c ; a : if ( ! b . length || 1 != b [ 0 ] . nodeType ) c = ! 1 ; else { c = 1 ; for ( var d = b . length ; c < d ; ++ c ) if ( ! m . isAncestorOf ( b [ 0 ] , b [ c ] ) ) { c =
! 1 ; break a } c = ! 0 } if ( ! c ) throw Error ( "getSingleElementFromRange: range " + a . inspect ( ) + " did not consist of a single element" ) ; return b [ 0 ] } function h ( a , b ) { var c = new o ( b ) ; a . _ranges = [ c ] ; e ( a , c , ! 1 ) ; a . rangeCount = 1 ; a . isCollapsed = c . collapsed } function k ( a ) { a . _ranges . length = 0 ; if ( "None" == a . docSelection . type ) f ( a ) ; else { var c = a . docSelection . createRange ( ) ; if ( c && "undefined" != typeof c . text ) h ( a , c ) ; else { a . rangeCount = c . length ; for ( var d , j = m . getDocument ( c . item ( 0 ) ) , k = 0 ; k < a . rangeCount ; ++ k ) d = b . createRange ( j ) , d . selectNode ( c . item ( k ) ) ,
a . _ranges . push ( d ) ; a . isCollapsed = 1 == a . rangeCount && a . _ranges [ 0 ] . collapsed ; e ( a , a . _ranges [ a . rangeCount - 1 ] , ! 1 ) } } } function j ( a , b ) { for ( var c = a . docSelection . createRange ( ) , d = i ( b ) , e = m . getDocument ( c . item ( 0 ) ) , e = m . getBody ( e ) . createControlRange ( ) , h = 0 , j = c . length ; h < j ; ++ h ) e . add ( c . item ( h ) ) ; try { e . add ( d ) } catch ( f ) { throw Error ( "addRange(): Element within the specified Range could not be added to control selection (does it have layout?)" ) ; } e . select ( ) ; k ( a ) } function n ( a , b , c ) { this . nativeSelection = a ; this . docSelection = b ; this . _ranges =
[ ] ; this . win = c ; this . refresh ( ) } function p ( a , b ) { for ( var c = m . getDocument ( b [ 0 ] . startContainer ) , c = m . getBody ( c ) . createControlRange ( ) , d = 0 , e ; d < rangeCount ; ++ d ) { e = i ( b [ d ] ) ; try { c . add ( e ) } catch ( h ) { throw Error ( "setRanges(): Element within the one of the specified Ranges could not be added to control selection (does it have layout?)" ) ; } } c . select ( ) ; k ( a ) } function q ( a , b ) { if ( a . anchorNode && m . getDocument ( a . anchorNode ) !== m . getDocument ( b ) ) throw new z ( "WRONG_DOCUMENT_ERR" ) ; } function r ( a ) { var b = [ ] , c = new w ( a . anchorNode , a . anchorOffset ) ,
d = new w ( a . focusNode , a . focusOffset ) , e = "function" == typeof a . getName ? a . getName ( ) : "Selection" ; if ( "undefined" != typeof a . rangeCount ) for ( var h = 0 , j = a . rangeCount ; h < j ; ++ h ) b [ h ] = x . inspect ( a . getRangeAt ( h ) ) ; return "[" + e + "(Ranges: " + b . join ( ", " ) + ")(anchor: " + c . inspect ( ) + ", focus: " + d . inspect ( ) + "]" } b . requireModules ( [ "DomUtil" , "DomRange" , "WrappedRange" ] ) ; b . config . checkSelectionRanges = ! 0 ; var m = b . dom , s = b . util , x = b . DomRange , o = b . WrappedRange , z = b . DOMException , w = m . DomPosition , y , A , t = b . util . isHostMethod ( window , "getSelection" ) ,
v = b . util . isHostObject ( document , "selection" ) , D = v && ( ! t || b . config . preferTextRange ) ; D ? ( y = d , b . isSelectionValid = function ( a ) { var a = ( a || window ) . document , b = a . selection ; return "None" != b . type || m . getDocument ( b . createRange ( ) . parentElement ( ) ) == a } ) : t ? ( y = a , b . isSelectionValid = function ( ) { return ! 0 } ) : c . fail ( "Neither document.selection or window.getSelection() detected." ) ; b . getNativeSelection = y ; var t = y ( ) , K = b . createNativeRange ( document ) , F = m . getBody ( document ) , E = s . areHostObjects ( t , s . areHostProperties ( t , [ "anchorOffset" , "focusOffset" ] ) ) ;
b . features . selectionHasAnchorAndFocus = E ; var I = s . isHostMethod ( t , "extend" ) ; b . features . selectionHasExtend = I ; var N = "number" == typeof t . rangeCount ; b . features . selectionHasRangeCount = N ; var J = ! 1 , C = ! 0 ; s . areHostMethods ( t , [ "addRange" , "getRangeAt" , "removeAllRanges" ] ) && ( "number" == typeof t . rangeCount && b . features . implementsDomRange ) && function ( ) { var a = document . createElement ( "iframe" ) ; F . appendChild ( a ) ; var b = m . getIframeDocument ( a ) ; b . open ( ) ; b . write ( "<html><head></head><body>12</body></html>" ) ; b . close ( ) ; var c = m . getIframeWindow ( a ) . getSelection ( ) ,
d = b . documentElement . lastChild . firstChild , b = b . createRange ( ) ; b . setStart ( d , 1 ) ; b . collapse ( true ) ; c . addRange ( b ) ; C = c . rangeCount == 1 ; c . removeAllRanges ( ) ; var e = b . cloneRange ( ) ; b . setStart ( d , 0 ) ; e . setEnd ( d , 2 ) ; c . addRange ( b ) ; c . addRange ( e ) ; J = c . rangeCount == 2 ; b . detach ( ) ; e . detach ( ) ; F . removeChild ( a ) } ( ) ; b . features . selectionSupportsMultipleRanges = J ; b . features . collapsedNonEditableSelectionsSupported = C ; var l = ! 1 , u ; F && s . isHostMethod ( F , "createControlRange" ) && ( u = F . createControlRange ( ) , s . areHostProperties ( u , [ "item" , "add" ] ) && ( l =
! 0 ) ) ; b . features . implementsControlRange = l ; A = E ? function ( a ) { return a . anchorNode === a . focusNode && a . anchorOffset === a . focusOffset } : function ( a ) { return a . rangeCount ? a . getRangeAt ( a . rangeCount - 1 ) . collapsed : false } ; var B ; s . isHostMethod ( t , "getRangeAt" ) ? B = function ( a , b ) { try { return a . getRangeAt ( b ) } catch ( c ) { return null } } : E && ( B = function ( a ) { var c = m . getDocument ( a . anchorNode ) , c = b . createRange ( c ) ; c . setStart ( a . anchorNode , a . anchorOffset ) ; c . setEnd ( a . focusNode , a . focusOffset ) ; if ( c . collapsed !== this . isCollapsed ) { c . setStart ( a . focusNode ,
a . focusOffset ) ; c . setEnd ( a . anchorNode , a . anchorOffset ) } return c } ) ; b . getSelection = function ( a ) { var a = a || window , b = a . _rangySelection , c = y ( a ) , e = v ? d ( a ) : null ; if ( b ) { b . nativeSelection = c ; b . docSelection = e ; b . refresh ( a ) } else { b = new n ( c , e , a ) ; a . _rangySelection = b } return b } ; b . getIframeSelection = function ( a ) { return b . getSelection ( m . getIframeWindow ( a ) ) } ; u = n . prototype ; if ( ! D && E && s . areHostMethods ( t , [ "removeAllRanges" , "addRange" ] ) ) { u . removeAllRanges = function ( ) { this . nativeSelection . removeAllRanges ( ) ; f ( this ) } ; var L = function ( a ,
c ) { var d = x . getRangeDocument ( c ) , d = b . createRange ( d ) ; d . collapseToPoint ( c . endContainer , c . endOffset ) ; a . nativeSelection . addRange ( g ( d ) ) ; a . nativeSelection . extend ( c . startContainer , c . startOffset ) ; a . refresh ( ) } ; u . addRange = N ? function ( a , c ) { if ( l && v && this . docSelection . type == "Control" ) j ( this , a ) ; else if ( c && I ) L ( this , a ) ; else { var d ; if ( J ) d = this . rangeCount ; else { this . removeAllRanges ( ) ; d = 0 } this . nativeSelection . addRange ( g ( a ) ) ; this . rangeCount = this . nativeSelection . rangeCount ; if ( this . rangeCount == d + 1 ) { if ( b . config . checkSelectionRanges ) ( d =
B ( this . nativeSelection , this . rangeCount - 1 ) ) && ! x . rangesEqual ( d , a ) && ( a = new o ( d ) ) ; this . _ranges [ this . rangeCount - 1 ] = a ; e ( this , a , H ( this . nativeSelection ) ) ; this . isCollapsed = A ( this ) } else this . refresh ( ) } } : function ( a , b ) { if ( b && I ) L ( this , a ) ; else { this . nativeSelection . addRange ( g ( a ) ) ; this . refresh ( ) } } ; u . setRanges = function ( a ) { if ( l && a . length > 1 ) p ( this , a ) ; else { this . removeAllRanges ( ) ; for ( var b = 0 , c = a . length ; b < c ; ++ b ) this . addRange ( a [ b ] ) } } } else if ( s . isHostMethod ( t , "empty" ) && s . isHostMethod ( K , "select" ) && l && D ) u . removeAllRanges =
function ( ) { try { this . docSelection . empty ( ) ; if ( this . docSelection . type != "None" ) { var a ; if ( this . anchorNode ) a = m . getDocument ( this . anchorNode ) ; else if ( this . docSelection . type == "Control" ) { var b = this . docSelection . createRange ( ) ; b . length && ( a = m . getDocument ( b . item ( 0 ) ) . body . createTextRange ( ) ) } if ( a ) { a . body . createTextRange ( ) . select ( ) ; this . docSelection . empty ( ) } } } catch ( c ) { } f ( this ) } , u . addRange = function ( a ) { if ( this . docSelection . type == "Control" ) j ( this , a ) ; else { o . rangeToTextRange ( a ) . select ( ) ; this . _ranges [ 0 ] = a ; this . rangeCount =
1 ; this . isCollapsed = this . _ranges [ 0 ] . collapsed ; e ( this , a , false ) } } , u . setRanges = function ( a ) { this . removeAllRanges ( ) ; var b = a . length ; b > 1 ? p ( this , a ) : b && this . addRange ( a [ 0 ] ) } ; else return c . fail ( "No means of selecting a Range or TextRange was found" ) , ! 1 ; u . getRangeAt = function ( a ) { if ( a < 0 || a >= this . rangeCount ) throw new z ( "INDEX_SIZE_ERR" ) ; return this . _ranges [ a ] } ; var G ; if ( D ) G = function ( a ) { var c ; if ( b . isSelectionValid ( a . win ) ) c = a . docSelection . createRange ( ) ; else { c = m . getBody ( a . win . document ) . createTextRange ( ) ; c . collapse ( true ) } a . docSelection . type ==
"Control" ? k ( a ) : c && typeof c . text != "undefined" ? h ( a , c ) : f ( a ) } ; else if ( s . isHostMethod ( t , "getRangeAt" ) && "number" == typeof t . rangeCount ) G = function ( a ) { if ( l && v && a . docSelection . type == "Control" ) k ( a ) ; else { a . _ranges . length = a . rangeCount = a . nativeSelection . rangeCount ; if ( a . rangeCount ) { for ( var c = 0 , d = a . rangeCount ; c < d ; ++ c ) a . _ranges [ c ] = new b . WrappedRange ( a . nativeSelection . getRangeAt ( c ) ) ; e ( a , a . _ranges [ a . rangeCount - 1 ] , H ( a . nativeSelection ) ) ; a . isCollapsed = A ( a ) } else f ( a ) } } ; else if ( E && "boolean" == typeof t . isCollapsed && "boolean" ==
typeof K . collapsed && b . features . implementsDomRange ) G = function ( a ) { var b ; b = a . nativeSelection ; if ( b . anchorNode ) { b = B ( b , 0 ) ; a . _ranges = [ b ] ; a . rangeCount = 1 ; b = a . nativeSelection ; a . anchorNode = b . anchorNode ; a . anchorOffset = b . anchorOffset ; a . focusNode = b . focusNode ; a . focusOffset = b . focusOffset ; a . isCollapsed = A ( a ) } else f ( a ) } ; else return c . fail ( "No means of obtaining a Range or TextRange from the user's selection was found" ) , ! 1 ; u . refresh = function ( a ) { var b = a ? this . _ranges . slice ( 0 ) : null ; G ( this ) ; if ( a ) { a = b . length ; if ( a != this . _ranges . length ) return false ;
for ( ; a -- ; ) if ( ! x . rangesEqual ( b [ a ] , this . _ranges [ a ] ) ) return false ; return true } } ; var P = function ( a , b ) { var c = a . getAllRanges ( ) , d = false ; a . removeAllRanges ( ) ; for ( var e = 0 , h = c . length ; e < h ; ++ e ) d || b !== c [ e ] ? a . addRange ( c [ e ] ) : d = true ; a . rangeCount || f ( a ) } ; u . removeRange = l ? function ( a ) { if ( this . docSelection . type == "Control" ) { for ( var b = this . docSelection . createRange ( ) , a = i ( a ) , c = m . getDocument ( b . item ( 0 ) ) , c = m . getBody ( c ) . createControlRange ( ) , d , e = false , h = 0 , j = b . length ; h < j ; ++ h ) { d = b . item ( h ) ; d !== a || e ? c . add ( b . item ( h ) ) : e = true } c . select ( ) ;
k ( this ) } else P ( this , a ) } : function ( a ) { P ( this , a ) } ; var H ; ! D && E && b . features . implementsDomRange ? ( H = function ( a ) { var b = false ; a . anchorNode && ( b = m . comparePoints ( a . anchorNode , a . anchorOffset , a . focusNode , a . focusOffset ) == 1 ) ; return b } , u . isBackwards = function ( ) { return H ( this ) } ) : H = u . isBackwards = function ( ) { return false } ; u . toString = function ( ) { for ( var a = [ ] , b = 0 , c = this . rangeCount ; b < c ; ++ b ) a [ b ] = "" + this . _ranges [ b ] ; return a . join ( "" ) } ; u . collapse = function ( a , c ) { q ( this , a ) ; var d = b . createRange ( m . getDocument ( a ) ) ; d . collapseToPoint ( a ,
c ) ; this . removeAllRanges ( ) ; this . addRange ( d ) ; this . isCollapsed = true } ; u . collapseToStart = function ( ) { if ( this . rangeCount ) { var a = this . _ranges [ 0 ] ; this . collapse ( a . startContainer , a . startOffset ) } else throw new z ( "INVALID_STATE_ERR" ) ; } ; u . collapseToEnd = function ( ) { if ( this . rangeCount ) { var a = this . _ranges [ this . rangeCount - 1 ] ; this . collapse ( a . endContainer , a . endOffset ) } else throw new z ( "INVALID_STATE_ERR" ) ; } ; u . selectAllChildren = function ( a ) { q ( this , a ) ; var c = b . createRange ( m . getDocument ( a ) ) ; c . selectNodeContents ( a ) ; this . removeAllRanges ( ) ;
this . addRange ( c ) } ; u . deleteFromDocument = function ( ) { if ( l && v && this . docSelection . type == "Control" ) { for ( var a = this . docSelection . createRange ( ) , b ; a . length ; ) { b = a . item ( 0 ) ; a . remove ( b ) ; b . parentNode . removeChild ( b ) } this . refresh ( ) } else if ( this . rangeCount ) { a = this . getAllRanges ( ) ; this . removeAllRanges ( ) ; b = 0 ; for ( var c = a . length ; b < c ; ++ b ) a [ b ] . deleteContents ( ) ; this . addRange ( a [ c - 1 ] ) } } ; u . getAllRanges = function ( ) { return this . _ranges . slice ( 0 ) } ; u . setSingleRange = function ( a ) { this . setRanges ( [ a ] ) } ; u . containsNode = function ( a , b ) { for ( var c =
0 , d = this . _ranges . length ; c < d ; ++ c ) if ( this . _ranges [ c ] . containsNode ( a , b ) ) return true ; return false } ; u . toHtml = function ( ) { var a = "" ; if ( this . rangeCount ) { for ( var a = x . getRangeDocument ( this . _ranges [ 0 ] ) . createElement ( "div" ) , b = 0 , c = this . _ranges . length ; b < c ; ++ b ) a . appendChild ( this . _ranges [ b ] . cloneContents ( ) ) ; a = a . innerHTML } return a } ; u . getName = function ( ) { return "WrappedSelection" } ; u . inspect = function ( ) { return r ( this ) } ; u . detach = function ( ) { this . win = this . anchorNode = this . focusNode = this . win . _rangySelection = null } ; n . inspect =
r ; b . Selection = n ; b . selectionPrototype = u ; b . addCreateMissingNativeApiListener ( function ( a ) { if ( typeof a . getSelection == "undefined" ) a . getSelection = function ( ) { return b . getSelection ( this ) } ; a = null } ) } ) ; var Base = function ( ) { } ;
Base . extend = function ( b , c ) { var a = Base . prototype . extend ; Base . _prototyping = ! 0 ; var d = new this ; a . call ( d , b ) ; d . base = function ( ) { } ; delete Base . _prototyping ; var e = d . constructor , f = d . constructor = function ( ) { if ( ! Base . _prototyping ) if ( this . _constructing || this . constructor == f ) this . _constructing = ! 0 , e . apply ( this , arguments ) , delete this . _constructing ; else if ( null != arguments [ 0 ] ) return ( arguments [ 0 ] . extend || a ) . call ( arguments [ 0 ] , d ) } ; f . ancestor = this ; f . extend = this . extend ; f . forEach = this . forEach ; f . implement = this . implement ; f . prototype =
d ; f . toString = this . toString ; f . valueOf = function ( a ) { return "object" == a ? f : e . valueOf ( ) } ; a . call ( f , c ) ; "function" == typeof f . init && f . init ( ) ; return f } ;
Base . prototype = { extend : function ( b , c ) { if ( 1 < arguments . length ) { var a = this [ b ] ; if ( a && "function" == typeof c && ( ! a . valueOf || a . valueOf ( ) != c . valueOf ( ) ) && /\bbase\b/ . test ( c ) ) { var d = c . valueOf ( ) , c = function ( ) { var b = this . base || Base . prototype . base ; this . base = a ; var c = d . apply ( this , arguments ) ; this . base = b ; return c } ; c . valueOf = function ( a ) { return "object" == a ? c : d } ; c . toString = Base . toString } this [ b ] = c } else if ( b ) { var e = Base . prototype . extend ; ! Base . _prototyping && "function" != typeof this && ( e = this . extend || e ) ; for ( var f = { toSource : null } ,
g = [ "constructor" , "toString" , "valueOf" ] , i = Base . _prototyping ? 0 : 1 ; h = g [ i ++ ] ; ) b [ h ] != f [ h ] && e . call ( this , h , b [ h ] ) ; for ( var h in b ) f [ h ] || e . call ( this , h , b [ h ] ) } return this } } ;
Base = Base . extend ( { constructor : function ( b ) { this . extend ( b ) } } , { ancestor : Object , version : "1.1" , forEach : function ( b , c , a ) { for ( var d in b ) void 0 === this . prototype [ d ] && c . call ( a , b [ d ] , d , b ) } , implement : function ( ) { for ( var b = 0 ; b < arguments . length ; b ++ ) if ( "function" == typeof arguments [ b ] ) arguments [ b ] ( this . prototype ) ; else this . prototype . extend ( arguments [ b ] ) ; return this } , toString : function ( ) { return "" + this . valueOf ( ) } } ) ;
wysihtml5 . browser = function ( ) { var b = navigator . userAgent , c = document . createElement ( "div" ) , a = - 1 !== b . indexOf ( "MSIE" ) && - 1 === b . indexOf ( "Opera" ) , d = - 1 !== b . indexOf ( "Gecko" ) && - 1 === b . indexOf ( "KHTML" ) , e = - 1 !== b . indexOf ( "AppleWebKit/" ) , f = - 1 !== b . indexOf ( "Chrome/" ) , g = - 1 !== b . indexOf ( "Opera/" ) ; return { USER _AGENT : b , supported : function ( ) { var a = this . USER _AGENT . toLowerCase ( ) , b = "contentEditable" in c , d = document . execCommand && document . queryCommandSupported && document . queryCommandState , e = document . querySelector && document . querySelectorAll ,
a = this . isIos ( ) && 5 > ( /ipad|iphone|ipod/ . test ( a ) && a . match ( / os (\d+).+? like mac os x/ ) || [ , 0 ] ) [ 1 ] || - 1 !== a . indexOf ( "opera mobi" ) || - 1 !== a . indexOf ( "hpwos/" ) ; return b && d && e && ! a } , isTouchDevice : function ( ) { return this . supportsEvent ( "touchmove" ) } , isIos : function ( ) { var a = this . USER _AGENT . toLowerCase ( ) ; return - 1 !== a . indexOf ( "webkit" ) && - 1 !== a . indexOf ( "mobile" ) } , supportsSandboxedIframes : function ( ) { return a } , throwsMixedContentWarningWhenIframeSrcIsEmpty : function ( ) { return ! ( "querySelector" in document ) } , displaysCaretInEmptyContentEditableCorrectly : function ( ) { return ! d } ,
hasCurrentStyleProperty : function ( ) { return "currentStyle" in c } , insertsLineBreaksOnReturn : function ( ) { return d } , supportsPlaceholderAttributeOn : function ( a ) { return "placeholder" in a } , supportsEvent : function ( a ) { var b ; if ( ! ( b = "on" + a in c ) ) c . setAttribute ( "on" + a , "return;" ) , b = "function" === typeof c [ "on" + a ] ; return b } , supportsEventsInIframeCorrectly : function ( ) { return ! g } , firesOnDropOnlyWhenOnDragOverIsCancelled : function ( ) { return e || d } , supportsDataTransfer : function ( ) { try { return e && ( window . Clipboard || window . DataTransfer ) . prototype . getData } catch ( a ) { return ! 1 } } ,
supportsHTML5Tags : function ( a ) { a = a . createElement ( "div" ) ; a . innerHTML = "<article>foo</article>" ; return "<article>foo</article>" === a . innerHTML . toLowerCase ( ) } , supportsCommand : function ( ) { var b = { formatBlock : a , insertUnorderedList : a || g || e , insertOrderedList : a || g || e } , c = { insertHTML : d } ; return function ( a , d ) { if ( ! b [ d ] ) { try { return a . queryCommandSupported ( d ) } catch ( e ) { } try { return a . queryCommandEnabled ( d ) } catch ( f ) { return ! ! c [ d ] } } return ! 1 } } ( ) , doesAutoLinkingInContentEditable : function ( ) { return a } , canDisableAutoLinking : function ( ) { return this . supportsCommand ( document ,
"AutoUrlDetect" ) } , clearsContentEditableCorrectly : function ( ) { return d || g || e } , supportsGetAttributeCorrectly : function ( ) { return "1" != document . createElement ( "td" ) . getAttribute ( "rowspan" ) } , canSelectImagesInContentEditable : function ( ) { return d || a || g } , clearsListsInContentEditableCorrectly : function ( ) { return d || a || e } , autoScrollsToCaret : function ( ) { return ! e } , autoClosesUnclosedTags : function ( ) { var a = c . cloneNode ( ! 1 ) , b ; a . innerHTML = "<p><div></div>" ; a = a . innerHTML . toLowerCase ( ) ; b = "<p></p><div></div>" === a || "<p><div></div></p>" ===
a ; this . autoClosesUnclosedTags = function ( ) { return b } ; return b } , supportsNativeGetElementsByClassName : function ( ) { return - 1 !== ( "" + document . getElementsByClassName ) . indexOf ( "[native code]" ) } , supportsSelectionModify : function ( ) { return "getSelection" in window && "modify" in window . getSelection ( ) } , supportsClassList : function ( ) { return "classList" in c } , needsSpaceAfterLineBreak : function ( ) { return g } , supportsSpeechApiOn : function ( a ) { return 11 <= ( b . match ( /Chrome\/(\d+)/ ) || [ , 0 ] ) [ 1 ] && ( "onwebkitspeechchange" in a || "speech" in a ) } ,
crashesWhenDefineProperty : function ( b ) { return a && ( "XMLHttpRequest" === b || "XDomainRequest" === b ) } , doesAsyncFocus : function ( ) { return a } , hasProblemsSettingCaretAfterImg : function ( ) { return a } , hasUndoInContextMenu : function ( ) { return d || f || g } } } ( ) ;
wysihtml5 . lang . array = function ( b ) { return { contains : function ( c ) { if ( b . indexOf ) return - 1 !== b . indexOf ( c ) ; for ( var a = 0 , d = b . length ; a < d ; a ++ ) if ( b [ a ] === c ) return ! 0 ; return ! 1 } , without : function ( c ) { for ( var c = wysihtml5 . lang . array ( c ) , a = [ ] , d = 0 , e = b . length ; d < e ; d ++ ) c . contains ( b [ d ] ) || a . push ( b [ d ] ) ; return a } , get : function ( ) { for ( var c = 0 , a = b . length , d = [ ] ; c < a ; c ++ ) d . push ( b [ c ] ) ; return d } } } ;
wysihtml5 . lang . Dispatcher = Base . extend ( { observe : function ( b , c ) { this . events = this . events || { } ; this . events [ b ] = this . events [ b ] || [ ] ; this . events [ b ] . push ( c ) ; return this } , on : function ( ) { return this . observe . apply ( this , wysihtml5 . lang . array ( arguments ) . get ( ) ) } , fire : function ( b , c ) { this . events = this . events || { } ; for ( var a = this . events [ b ] || [ ] , d = 0 ; d < a . length ; d ++ ) a [ d ] . call ( this , c ) ; return this } , stopObserving : function ( b , c ) { this . events = this . events || { } ; var a = 0 , d , e ; if ( b ) { d = this . events [ b ] || [ ] ; for ( e = [ ] ; a < d . length ; a ++ ) d [ a ] !== c && c &&
e . push ( d [ a ] ) ; this . events [ b ] = e } else this . events = { } ; return this } } ) ; wysihtml5 . lang . object = function ( b ) { return { merge : function ( c ) { for ( var a in c ) b [ a ] = c [ a ] ; return this } , get : function ( ) { return b } , clone : function ( ) { var c = { } , a ; for ( a in b ) c [ a ] = b [ a ] ; return c } , isArray : function ( ) { return "[object Array]" === Object . prototype . toString . call ( b ) } } } ;
( function ( ) { var b = /^\s+/ , c = /\s+$/ ; wysihtml5 . lang . string = function ( a ) { a = "" + a ; return { trim : function ( ) { return a . replace ( b , "" ) . replace ( c , "" ) } , interpolate : function ( b ) { for ( var c in b ) a = this . replace ( "#{" + c + "}" ) . by ( b [ c ] ) ; return a } , replace : function ( b ) { return { by : function ( c ) { return a . split ( b ) . join ( c ) } } } } } } ) ( ) ;
( function ( b ) { function c ( a ) { return a . replace ( e , function ( a , b ) { var c = ( b . match ( f ) || [ ] ) [ 1 ] || "" , d = i [ c ] , b = b . replace ( f , "" ) ; b . split ( d ) . length > b . split ( c ) . length && ( b += c , c = "" ) ; var e = d = b ; b . length > g && ( e = e . substr ( 0 , g ) + "..." ) ; "www." === d . substr ( 0 , 4 ) && ( d = "http://" + d ) ; return '<a href="' + d + '">' + e + "</a>" + c } ) } function a ( h ) { if ( ! d . contains ( h . nodeName ) ) if ( h . nodeType === b . TEXT _NODE && h . data . match ( e ) ) { var f = h . parentNode , j ; j = f . ownerDocument ; var g = j . _wysihtml5 _tempElement ; g || ( g = j . _wysihtml5 _tempElement = j . createElement ( "div" ) ) ; j =
g ; j . innerHTML = "<span></span>" + c ( h . data ) ; for ( j . removeChild ( j . firstChild ) ; j . firstChild ; ) f . insertBefore ( j . firstChild , h ) ; f . removeChild ( h ) } else { f = b . lang . array ( h . childNodes ) . get ( ) ; j = f . length ; for ( g = 0 ; g < j ; g ++ ) a ( f [ g ] ) ; return h } } var d = b . lang . array ( "CODE PRE A SCRIPT HEAD TITLE STYLE" . split ( " " ) ) , e = /((https?:\/\/|www\.)[^\s<]{3,})/gi , f = /([^\w\/\-](,?))$/i , g = 100 , i = { ")" : "(" , "]" : "[" , "}" : "{" } ; b . dom . autoLink = function ( b ) { var c ; a : { c = b ; for ( var e ; c . parentNode ; ) { c = c . parentNode ; e = c . nodeName ; if ( d . contains ( e ) ) { c = ! 0 ; break a } if ( "body" ===
e ) break } c = ! 1 } if ( c ) return b ; b === b . ownerDocument . documentElement && ( b = b . ownerDocument . body ) ; return a ( b ) } ; b . dom . autoLink . URL _REG _EXP = e } ) ( wysihtml5 ) ;
( function ( b ) { var c = b . browser . supportsClassList ( ) , a = b . dom ; a . addClass = function ( b , e ) { if ( c ) return b . classList . add ( e ) ; a . hasClass ( b , e ) || ( b . className += " " + e ) } ; a . removeClass = function ( a , b ) { if ( c ) return a . classList . remove ( b ) ; a . className = a . className . replace ( RegExp ( "(^|\\s+)" + b + "(\\s+|$)" ) , " " ) } ; a . hasClass = function ( a , b ) { if ( c ) return a . classList . contains ( b ) ; var f = a . className ; return 0 < f . length && ( f == b || RegExp ( "(^|\\s)" + b + "(\\s|$)" ) . test ( f ) ) } } ) ( wysihtml5 ) ;
wysihtml5 . dom . contains = function ( ) { var b = document . documentElement ; if ( b . contains ) return function ( b , a ) { a . nodeType !== wysihtml5 . ELEMENT _NODE && ( a = a . parentNode ) ; return b !== a && b . contains ( a ) } ; if ( b . compareDocumentPosition ) return function ( b , a ) { return ! ! ( b . compareDocumentPosition ( a ) & 16 ) } } ( ) ;
wysihtml5 . dom . convertToList = function ( ) { function b ( b , a ) { var d = b . createElement ( "li" ) ; a . appendChild ( d ) ; return d } return function ( c , a ) { if ( "UL" === c . nodeName || "OL" === c . nodeName || "MENU" === c . nodeName ) return c ; var d = c . ownerDocument , e = d . createElement ( a ) , f = c . querySelectorAll ( "br" ) , g = f . length , i , h , k , j , n ; for ( n = 0 ; n < g ; n ++ ) for ( i = f [ n ] ; ( h = i . parentNode ) && h !== c && h . lastChild === i ; ) { if ( "block" === wysihtml5 . dom . getStyle ( "display" ) . from ( h ) ) { h . removeChild ( i ) ; break } wysihtml5 . dom . insert ( i ) . after ( i . parentNode ) } f = wysihtml5 . lang . array ( c . childNodes ) . get ( ) ;
g = f . length ; for ( n = 0 ; n < g ; n ++ ) j = j || b ( d , e ) , i = f [ n ] , h = "block" === wysihtml5 . dom . getStyle ( "display" ) . from ( i ) , k = "BR" === i . nodeName , h ? ( j = j . firstChild ? b ( d , e ) : j , j . appendChild ( i ) , j = null ) : k ? j = j . firstChild ? null : j : j . appendChild ( i ) ; c . parentNode . replaceChild ( e , c ) ; return e } } ( ) ; wysihtml5 . dom . copyAttributes = function ( b ) { return { from : function ( c ) { return { to : function ( a ) { for ( var d , e = 0 , f = b . length ; e < f ; e ++ ) d = b [ e ] , "undefined" !== typeof c [ d ] && "" !== c [ d ] && ( a [ d ] = c [ d ] ) ; return { andTo : arguments . callee } } } } } } ;
( function ( b ) { var c = [ "-webkit-box-sizing" , "-moz-box-sizing" , "-ms-box-sizing" , "box-sizing" ] , a = function ( a ) { var e ; a : for ( var f = 0 , g = c . length ; f < g ; f ++ ) if ( "border-box" === b . getStyle ( c [ f ] ) . from ( a ) ) { e = c [ f ] ; break a } return e ? parseInt ( b . getStyle ( "width" ) . from ( a ) , 10 ) < a . offsetWidth : ! 1 } ; b . copyStyles = function ( d ) { return { from : function ( e ) { a ( e ) && ( d = wysihtml5 . lang . array ( d ) . without ( c ) ) ; for ( var f = "" , g = d . length , i = 0 , h ; i < g ; i ++ ) h = d [ i ] , f += h + ":" + b . getStyle ( h ) . from ( e ) + ";" ; return { to : function ( a ) { b . setStyles ( f ) . on ( a ) ; return { andTo : arguments . callee } } } } } } } ) ( wysihtml5 . dom ) ;
( function ( b ) { b . dom . delegate = function ( c , a , d , e ) { return b . dom . observe ( c , d , function ( d ) { for ( var g = d . target , i = b . lang . array ( c . querySelectorAll ( a ) ) ; g && g !== c ; ) { if ( i . contains ( g ) ) { e . call ( g , d ) ; break } g = g . parentNode } } ) } } ) ( wysihtml5 ) ;
wysihtml5 . dom . getAsDom = function ( ) { var b = "abbr article aside audio bdi canvas command datalist details figcaption figure footer header hgroup keygen mark meter nav output progress rp rt ruby svg section source summary time track video wbr" . split ( " " ) ; return function ( c , a ) { var a = a || document , d ; if ( "object" === typeof c && c . nodeType ) d = a . createElement ( "div" ) , d . appendChild ( c ) ; else if ( wysihtml5 . browser . supportsHTML5Tags ( a ) ) d = a . createElement ( "div" ) , d . innerHTML = c ; else { d = a ; if ( ! d . _wysihtml5 _supportsHTML5Tags ) { for ( var e =
0 , f = b . length ; e < f ; e ++ ) d . createElement ( b [ e ] ) ; d . _wysihtml5 _supportsHTML5Tags = ! 0 } d = a ; e = d . createElement ( "div" ) ; e . style . display = "none" ; d . body . appendChild ( e ) ; try { e . innerHTML = c } catch ( g ) { } d . body . removeChild ( e ) ; d = e } return d } } ( ) ;
wysihtml5 . dom . getParentElement = function ( ) { function b ( b , a ) { return ! a || ! a . length ? ! 0 : "string" === typeof a ? b === a : wysihtml5 . lang . array ( a ) . contains ( b ) } return function ( c , a , d ) { d = d || 50 ; if ( a . className || a . classRegExp ) { a : { for ( var e = a . nodeName , f = a . className , a = a . classRegExp ; d -- && c && "BODY" !== c . nodeName ; ) { var g ; if ( g = c . nodeType === wysihtml5 . ELEMENT _NODE ) if ( g = b ( c . nodeName , e ) ) { g = f ; var i = ( c . className || "" ) . match ( a ) || [ ] ; g = ! g ? ! ! i . length : i [ i . length - 1 ] === g } if ( g ) break a ; c = c . parentNode } c = null } return c } a : { e = a . nodeName ; for ( f = d ; f -- &&
c && "BODY" !== c . nodeName ; ) { if ( b ( c . nodeName , e ) ) break a ; c = c . parentNode } c = null } return c } } ( ) ;
wysihtml5 . dom . getStyle = function ( ) { function b ( b ) { return b . replace ( a , function ( a ) { return a . charAt ( 1 ) . toUpperCase ( ) } ) } var c = { "float" : "styleFloat" in document . createElement ( "div" ) . style ? "styleFloat" : "cssFloat" } , a = /\-[a-z]/g ; return function ( a ) { return { from : function ( e ) { if ( e . nodeType === wysihtml5 . ELEMENT _NODE ) { var f = e . ownerDocument , g = c [ a ] || b ( a ) , i = e . style , h = e . currentStyle , k = i [ g ] ; if ( k ) return k ; if ( h ) try { return h [ g ] } catch ( j ) { } var g = f . defaultView || f . parentWindow , f = ( "height" === a || "width" === a ) && "TEXTAREA" === e . nodeName ,
n ; if ( g . getComputedStyle ) return f && ( n = i . overflow , i . overflow = "hidden" ) , e = g . getComputedStyle ( e , null ) . getPropertyValue ( a ) , f && ( i . overflow = n || "" ) , e } } } } } ( ) ; wysihtml5 . dom . hasElementWithTagName = function ( ) { var b = { } , c = 1 ; return function ( a , d ) { var e = ( a . _wysihtml5 _identifier || ( a . _wysihtml5 _identifier = c ++ ) ) + ":" + d , f = b [ e ] ; f || ( f = b [ e ] = a . getElementsByTagName ( d ) ) ; return 0 < f . length } } ( ) ;
( function ( b ) { var c = { } , a = 1 ; b . dom . hasElementWithClassName = function ( d , e ) { if ( ! b . browser . supportsNativeGetElementsByClassName ( ) ) return ! ! d . querySelector ( "." + e ) ; var f = ( d . _wysihtml5 _identifier || ( d . _wysihtml5 _identifier = a ++ ) ) + ":" + e , g = c [ f ] ; g || ( g = c [ f ] = d . getElementsByClassName ( e ) ) ; return 0 < g . length } } ) ( wysihtml5 ) ; wysihtml5 . dom . insert = function ( b ) { return { after : function ( c ) { c . parentNode . insertBefore ( b , c . nextSibling ) } , before : function ( c ) { c . parentNode . insertBefore ( b , c ) } , into : function ( c ) { c . appendChild ( b ) } } } ;
wysihtml5 . dom . insertCSS = function ( b ) { b = b . join ( "\n" ) ; return { into : function ( c ) { var a = c . head || c . getElementsByTagName ( "head" ) [ 0 ] , d = c . createElement ( "style" ) ; d . type = "text/css" ; d . styleSheet ? d . styleSheet . cssText = b : d . appendChild ( c . createTextNode ( b ) ) ; a && a . appendChild ( d ) } } } ;
wysihtml5 . dom . observe = function ( b , c , a ) { for ( var c = "string" === typeof c ? [ c ] : c , d , e , f = 0 , g = c . length ; f < g ; f ++ ) e = c [ f ] , b . addEventListener ? b . addEventListener ( e , a , ! 1 ) : ( d = function ( c ) { "target" in c || ( c . target = c . srcElement ) ; c . preventDefault = c . preventDefault || function ( ) { this . returnValue = false } ; c . stopPropagation = c . stopPropagation || function ( ) { this . cancelBubble = true } ; a . call ( b , c ) } , b . attachEvent ( "on" + e , d ) ) ; return { stop : function ( ) { for ( var e , h = 0 , f = c . length ; h < f ; h ++ ) e = c [ h ] , b . removeEventListener ? b . removeEventListener ( e , a , ! 1 ) :
b . detachEvent ( "on" + e , d ) } } } ;
wysihtml5 . dom . parse = function ( ) { function b ( c , e ) { var h = c . childNodes , f = h . length , g ; g = a [ c . nodeType ] ; var k = 0 ; g = g && g ( c ) ; if ( ! g ) return null ; for ( k = 0 ; k < f ; k ++ ) ( newChild = b ( h [ k ] , e ) ) && g . appendChild ( newChild ) ; return e && 1 >= g . childNodes . length && g . nodeName . toLowerCase ( ) === d && ! g . attributes . length ? g . firstChild : g } function c ( a , b ) { var b = b . toLowerCase ( ) , c ; if ( c = "IMG" == a . nodeName ) if ( c = "src" == b ) { var d ; try { d = a . complete && ! a . mozMatchesSelector ( ":-moz-broken" ) } catch ( e ) { a . complete && "complete" === a . readyState && ( d = ! 0 ) } c = ! 0 === d } return c ?
a . src : i && "outerHTML" in a ? - 1 != a . outerHTML . toLowerCase ( ) . indexOf ( " " + b + "=" ) ? a . getAttribute ( b ) : null : a . getAttribute ( b ) } var a = { 1 : function ( a ) { var b , f , i = g . tags ; f = a . nodeName . toLowerCase ( ) ; b = a . scopeName ; if ( a . _wysihtml5 ) return null ; a . _wysihtml5 = 1 ; if ( "wysihtml5-temp" === a . className ) return null ; b && "HTML" != b && ( f = b + ":" + f ) ; "outerHTML" in a && ! wysihtml5 . browser . autoClosesUnclosedTags ( ) && ( "P" === a . nodeName && "</p>" !== a . outerHTML . slice ( - 4 ) . toLowerCase ( ) ) && ( f = "div" ) ; if ( f in i ) { b = i [ f ] ; if ( ! b || b . remove ) return null ; b = "string" ===
typeof b ? { rename _tag : b } : b } else if ( a . firstChild ) b = { rename _tag : d } ; else return null ; f = a . ownerDocument . createElement ( b . rename _tag || f ) ; var i = { } , r = b . set _class , m = b . add _class , s = b . set _attributes , x = b . check _attributes , o = g . classes , z = 0 , w = [ ] ; b = [ ] ; var y = [ ] , A = [ ] , t ; s && ( i = wysihtml5 . lang . object ( s ) . clone ( ) ) ; if ( x ) for ( t in x ) if ( s = h [ x [ t ] ] ) s = s ( c ( a , t ) ) , "string" === typeof s && ( i [ t ] = s ) ; r && w . push ( r ) ; if ( m ) for ( t in m ) if ( s = k [ m [ t ] ] ) r = s ( c ( a , t ) ) , "string" === typeof r && w . push ( r ) ; o [ "_wysihtml5-temp-placeholder" ] = 1 ; ( A = a . getAttribute ( "class" ) ) &&
( w = w . concat ( A . split ( e ) ) ) ; for ( m = w . length ; z < m ; z ++ ) a = w [ z ] , o [ a ] && b . push ( a ) ; for ( o = b . length ; o -- ; ) a = b [ o ] , wysihtml5 . lang . array ( y ) . contains ( a ) || y . unshift ( a ) ; y . length && ( i [ "class" ] = y . join ( " " ) ) ; for ( t in i ) try { f . setAttribute ( t , i [ t ] ) } catch ( v ) { } i . src && ( "undefined" !== typeof i . width && f . setAttribute ( "width" , i . width ) , "undefined" !== typeof i . height && f . setAttribute ( "height" , i . height ) ) ; return f } , 3 : function ( a ) { return a . ownerDocument . createTextNode ( a . data ) } } , d = "span" , e = /\s+/ , f = { tags : { } , classes : { } } , g = { } , i = ! wysihtml5 . browser . supportsGetAttributeCorrectly ( ) ,
h = { url : function ( ) { var a = /^https?:\/\//i ; return function ( b ) { return ! b || ! b . match ( a ) ? null : b . replace ( a , function ( a ) { return a . toLowerCase ( ) } ) } } ( ) , alt : function ( ) { var a = /[^ a-z0-9_\-]/gi ; return function ( b ) { return ! b ? "" : b . replace ( a , "" ) } } ( ) , numbers : function ( ) { var a = /\D/g ; return function ( b ) { return ( b = ( b || "" ) . replace ( a , "" ) ) || null } } ( ) } , k = { align _img : function ( ) { var a = { left : "wysiwyg-float-left" , right : "wysiwyg-float-right" } ; return function ( b ) { return a [ ( "" + b ) . toLowerCase ( ) ] } } ( ) , align _text : function ( ) { var a = { left : "wysiwyg-text-align-left" ,
right : "wysiwyg-text-align-right" , center : "wysiwyg-text-align-center" , justify : "wysiwyg-text-align-justify" } ; return function ( b ) { return a [ ( "" + b ) . toLowerCase ( ) ] } } ( ) , clear _br : function ( ) { var a = { left : "wysiwyg-clear-left" , right : "wysiwyg-clear-right" , both : "wysiwyg-clear-both" , all : "wysiwyg-clear-both" } ; return function ( b ) { return a [ ( "" + b ) . toLowerCase ( ) ] } } ( ) , size _font : function ( ) { var a = { 1 : "wysiwyg-font-size-xx-small" , 2 : "wysiwyg-font-size-small" , 3 : "wysiwyg-font-size-medium" , 4 : "wysiwyg-font-size-large" , 5 : "wysiwyg-font-size-x-large" ,
6 : "wysiwyg-font-size-xx-large" , 7 : "wysiwyg-font-size-xx-large" , "-" : "wysiwyg-font-size-smaller" , "+" : "wysiwyg-font-size-larger" } ; return function ( b ) { return a [ ( "" + b ) . charAt ( 0 ) ] } } ( ) } ; return function ( a , c , d , e ) { wysihtml5 . lang . object ( g ) . merge ( f ) . merge ( c ) . get ( ) ; for ( var d = d || a . ownerDocument || document , c = d . createDocumentFragment ( ) , h = "string" === typeof a , a = h ? wysihtml5 . dom . getAsDom ( a , d ) : a ; a . firstChild ; ) d = a . firstChild , a . removeChild ( d ) , ( d = b ( d , e ) ) && c . appendChild ( d ) ; a . innerHTML = "" ; a . appendChild ( c ) ; return h ? wysihtml5 . quirks . getCorrectInnerHTML ( a ) :
a } } ( ) ; wysihtml5 . dom . removeEmptyTextNodes = function ( b ) { for ( var c = wysihtml5 . lang . array ( b . childNodes ) . get ( ) , a = c . length , d = 0 ; d < a ; d ++ ) b = c [ d ] , b . nodeType === wysihtml5 . TEXT _NODE && "" === b . data && b . parentNode . removeChild ( b ) } ; wysihtml5 . dom . renameElement = function ( b , c ) { for ( var a = b . ownerDocument . createElement ( c ) , d ; d = b . firstChild ; ) a . appendChild ( d ) ; wysihtml5 . dom . copyAttributes ( [ "align" , "className" ] ) . from ( b ) . to ( a ) ; b . parentNode . replaceChild ( a , b ) ; return a } ;
wysihtml5 . dom . replaceWithChildNodes = function ( b ) { if ( b . parentNode ) if ( b . firstChild ) { for ( var c = b . ownerDocument . createDocumentFragment ( ) ; b . firstChild ; ) c . appendChild ( b . firstChild ) ; b . parentNode . replaceChild ( c , b ) } else b . parentNode . removeChild ( b ) } ;
( function ( b ) { function c ( a ) { var b = a . ownerDocument . createElement ( "br" ) ; a . appendChild ( b ) } b . resolveList = function ( a ) { if ( ! ( "MENU" !== a . nodeName && "UL" !== a . nodeName && "OL" !== a . nodeName ) ) { var d = a . ownerDocument . createDocumentFragment ( ) , e = a . previousElementSibling || a . previousSibling , f , g , i ; for ( e && "block" !== b . getStyle ( "display" ) . from ( e ) && c ( d ) ; i = a . firstChild ; ) { for ( f = i . lastChild ; e = i . firstChild ; ) g = ( g = e === f ) && "block" !== b . getStyle ( "display" ) . from ( e ) && "BR" !== e . nodeName , d . appendChild ( e ) , g && c ( d ) ; i . parentNode . removeChild ( i ) } a . parentNode . replaceChild ( d ,
a ) } } } ) ( wysihtml5 . dom ) ;
( function ( b ) { var c = document , a = "parent top opener frameElement frames localStorage globalStorage sessionStorage indexedDB" . split ( " " ) , d = "open close openDialog showModalDialog alert confirm prompt openDatabase postMessage XMLHttpRequest XDomainRequest" . split ( " " ) , e = [ "referrer" , "write" , "open" , "close" ] ; b . dom . Sandbox = Base . extend ( { constructor : function ( a , c ) { this . callback = a || b . EMPTY _FUNCTION ; this . config = b . lang . object ( { } ) . merge ( c ) . get ( ) ; this . iframe = this . _createIframe ( ) } , insertInto : function ( a ) { "string" === typeof a &&
( a = c . getElementById ( a ) ) ; a . appendChild ( this . iframe ) } , getIframe : function ( ) { return this . iframe } , getWindow : function ( ) { this . _readyError ( ) } , getDocument : function ( ) { this . _readyError ( ) } , destroy : function ( ) { var a = this . getIframe ( ) ; a . parentNode . removeChild ( a ) } , _readyError : function ( ) { throw Error ( "wysihtml5.Sandbox: Sandbox iframe isn't loaded yet" ) ; } , _createIframe : function ( ) { var a = this , d = c . createElement ( "iframe" ) ; d . className = "wysihtml5-sandbox" ; b . dom . setAttributes ( { security : "restricted" , allowtransparency : "true" ,
frameborder : 0 , width : 0 , height : 0 , marginwidth : 0 , marginheight : 0 } ) . on ( d ) ; b . browser . throwsMixedContentWarningWhenIframeSrcIsEmpty ( ) && ( d . src = "javascript:'<html></html>'" ) ; d . onload = function ( ) { d . onreadystatechange = d . onload = null ; a . _onLoadIframe ( d ) } ; d . onreadystatechange = function ( ) { if ( /loaded|complete/ . test ( d . readyState ) ) { d . onreadystatechange = d . onload = null ; a . _onLoadIframe ( d ) } } ; return d } , _onLoadIframe : function ( f ) { if ( b . dom . contains ( c . documentElement , f ) ) { var g = this , i = f . contentWindow , h = f . contentWindow . document , k =
this . _getHtml ( { charset : c . characterSet || c . charset || "utf-8" , stylesheets : this . config . stylesheets } ) ; h . open ( "text/html" , "replace" ) ; h . write ( k ) ; h . close ( ) ; this . getWindow = function ( ) { return f . contentWindow } ; this . getDocument = function ( ) { return f . contentWindow . document } ; i . onerror = function ( a , b , c ) { throw Error ( "wysihtml5.Sandbox: " + a , b , c ) ; } ; if ( ! b . browser . supportsSandboxedIframes ( ) ) { var j , k = 0 ; for ( j = a . length ; k < j ; k ++ ) this . _unset ( i , a [ k ] ) ; k = 0 ; for ( j = d . length ; k < j ; k ++ ) this . _unset ( i , d [ k ] , b . EMPTY _FUNCTION ) ; k = 0 ; for ( j = e . length ; k <
j ; k ++ ) this . _unset ( h , e [ k ] ) ; this . _unset ( h , "cookie" , "" , ! 0 ) } this . loaded = ! 0 ; setTimeout ( function ( ) { g . callback ( g ) } , 0 ) } } , _getHtml : function ( a ) { var c = a . stylesheets , d = "" , e = 0 , k ; if ( c = "string" === typeof c ? [ c ] : c ) for ( k = c . length ; e < k ; e ++ ) d += '<link rel="stylesheet" href="' + c [ e ] + '">' ; a . stylesheets = d ; return b . lang . string ( '<!DOCTYPE html><html><head><meta charset="#{charset}">#{stylesheets}</head><body></body></html>' ) . interpolate ( a ) } , _unset : function ( a , c , d , e ) { try { a [ c ] = d } catch ( k ) { } try { a . _ _defineGetter _ _ ( c , function ( ) { return d } ) } catch ( j ) { } if ( e ) try { a . _ _defineSetter _ _ ( c ,
function ( ) { } ) } catch ( n ) { } if ( ! b . browser . crashesWhenDefineProperty ( c ) ) try { var p = { get : function ( ) { return d } } ; e && ( p . set = function ( ) { } ) ; Object . defineProperty ( a , c , p ) } catch ( q ) { } } } ) } ) ( wysihtml5 ) ; ( function ( ) { var b = { className : "class" } ; wysihtml5 . dom . setAttributes = function ( c ) { return { on : function ( a ) { for ( var d in c ) a . setAttribute ( b [ d ] || d , c [ d ] ) } } } } ) ( ) ;
wysihtml5 . dom . setStyles = function ( b ) { return { on : function ( c ) { c = c . style ; if ( "string" === typeof b ) c . cssText += ";" + b ; else for ( var a in b ) "float" === a ? ( c . cssFloat = b [ a ] , c . styleFloat = b [ a ] ) : c [ a ] = b [ a ] } } } ;
( function ( b ) { b . simulatePlaceholder = function ( c , a , d ) { var e = function ( ) { a . hasPlaceholderSet ( ) && a . clear ( ) ; b . removeClass ( a . element , "placeholder" ) } , f = function ( ) { a . isEmpty ( ) && ( a . setValue ( d ) , b . addClass ( a . element , "placeholder" ) ) } ; c . observe ( "set_placeholder" , f ) . observe ( "unset_placeholder" , e ) . observe ( "focus:composer" , e ) . observe ( "paste:composer" , e ) . observe ( "blur:composer" , f ) ; f ( ) } } ) ( wysihtml5 . dom ) ;
( function ( b ) { var c = document . documentElement ; "textContent" in c ? ( b . setTextContent = function ( a , b ) { a . textContent = b } , b . getTextContent = function ( a ) { return a . textContent } ) : "innerText" in c ? ( b . setTextContent = function ( a , b ) { a . innerText = b } , b . getTextContent = function ( a ) { return a . innerText } ) : ( b . setTextContent = function ( a , b ) { a . nodeValue = b } , b . getTextContent = function ( a ) { return a . nodeValue } ) } ) ( wysihtml5 . dom ) ;
wysihtml5 . quirks . cleanPastedHTML = function ( ) { var b = { "a u" : wysihtml5 . dom . replaceWithChildNodes } ; return function ( c , a , d ) { var a = a || b , d = d || c . ownerDocument || document , e = "string" === typeof c , f , g , i , h = 0 , c = e ? wysihtml5 . dom . getAsDom ( c , d ) : c ; for ( i in a ) { f = c . querySelectorAll ( i ) ; d = a [ i ] ; for ( g = f . length ; h < g ; h ++ ) d ( f [ h ] ) } return e ? c . innerHTML : c } } ( ) ;
( function ( b ) { var c = b . dom ; b . quirks . ensureProperClearing = function ( ) { var a = function ( ) { var a = this ; setTimeout ( function ( ) { var b = a . innerHTML . toLowerCase ( ) ; if ( "<p> </p>" == b || "<p> </p><p> </p>" == b ) a . innerHTML = "" } , 0 ) } ; return function ( b ) { c . observe ( b . element , [ "cut" , "keydown" ] , a ) } } ( ) ; b . quirks . ensureProperClearingOfLists = function ( ) { var a = [ "OL" , "UL" , "MENU" ] ; return function ( d ) { c . observe ( d . element , "keydown" , function ( e ) { if ( e . keyCode === b . BACKSPACE _KEY ) { var f = d . selection . getSelectedNode ( ) , e = d . element ;
e . firstChild && b . lang . array ( a ) . contains ( e . firstChild . nodeName ) && ( f = c . getParentElement ( f , { nodeName : a } ) ) && f == e . firstChild && 1 >= f . childNodes . length && ( f . firstChild ? "" === f . firstChild . innerHTML : 1 ) && f . parentNode . removeChild ( f ) } } ) } } ( ) } ) ( wysihtml5 ) ;
( function ( b ) { b . quirks . getCorrectInnerHTML = function ( c ) { var a = c . innerHTML ; if ( - 1 === a . indexOf ( "%7E" ) ) return a ; var c = c . querySelectorAll ( "[href*='~'], [src*='~']" ) , d , e , f , g ; g = 0 ; for ( f = c . length ; g < f ; g ++ ) d = c [ g ] . href || c [ g ] . src , e = b . lang . string ( d ) . replace ( "~" ) . by ( "%7E" ) , a = b . lang . string ( a ) . replace ( e ) . by ( d ) ; return a } } ) ( wysihtml5 ) ;
( function ( b ) { var c = b . dom , a = "LI P H1 H2 H3 H4 H5 H6" . split ( " " ) , d = [ "UL" , "OL" , "MENU" ] ; b . quirks . insertLineBreakOnReturn = function ( e ) { function f ( a ) { if ( a = c . getParentElement ( a , { nodeName : [ "P" , "DIV" ] } , 2 ) ) { var d = document . createTextNode ( b . INVISIBLE _SPACE ) ; c . insert ( d ) . before ( a ) ; c . replaceWithChildNodes ( a ) ; e . selection . selectNode ( d ) } } c . observe ( e . element . ownerDocument , "keydown" , function ( g ) { var i = g . keyCode ; if ( ! ( g . shiftKey || i !== b . ENTER _KEY && i !== b . BACKSPACE _KEY ) ) { var h = e . selection . getSelectedNode ( ) ; ( h = c . getParentElement ( h ,
{ nodeName : a } , 4 ) ) ? "LI" === h . nodeName && ( i === b . ENTER _KEY || i === b . BACKSPACE _KEY ) ? setTimeout ( function ( ) { var a = e . selection . getSelectedNode ( ) , b ; a && ( ( b = c . getParentElement ( a , { nodeName : d } , 2 ) ) || f ( a ) ) } , 0 ) : h . nodeName . match ( /H[1-6]/ ) && i === b . ENTER _KEY && setTimeout ( function ( ) { f ( e . selection . getSelectedNode ( ) ) } , 0 ) : i === b . ENTER _KEY && ! b . browser . insertsLineBreaksOnReturn ( ) && ( e . commands . exec ( "insertLineBreak" ) , g . preventDefault ( ) ) } } ) } } ) ( wysihtml5 ) ;
( function ( b ) { b . quirks . redraw = function ( c ) { b . dom . addClass ( c , "wysihtml5-quirks-redraw" ) ; b . dom . removeClass ( c , "wysihtml5-quirks-redraw" ) ; try { var a = c . ownerDocument ; a . execCommand ( "italic" , ! 1 , null ) ; a . execCommand ( "italic" , ! 1 , null ) } catch ( d ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = b . dom ; b . Selection = Base . extend ( { constructor : function ( a ) { window . rangy . init ( ) ; this . editor = a ; this . composer = a . composer ; this . doc = this . composer . doc } , getBookmark : function ( ) { var a = this . getRange ( ) ; return a && a . cloneRange ( ) } , setBookmark : function ( a ) { a && this . setSelection ( a ) } , setBefore : function ( a ) { var b = rangy . createRange ( this . doc ) ; b . setStartBefore ( a ) ; b . setEndBefore ( a ) ; return this . setSelection ( b ) } , setAfter : function ( a ) { var b = rangy . createRange ( this . doc ) ; b . setStartAfter ( a ) ; b . setEndAfter ( a ) ; return this . setSelection ( b ) } ,
selectNode : function ( a ) { var d = rangy . createRange ( this . doc ) , e = a . nodeType === b . ELEMENT _NODE , f = "canHaveHTML" in a ? a . canHaveHTML : "IMG" !== a . nodeName , g = e ? a . innerHTML : a . data , g = "" === g || g === b . INVISIBLE _SPACE , i = c . getStyle ( "display" ) . from ( a ) , i = "block" === i || "list-item" === i ; if ( g && e && f ) try { a . innerHTML = b . INVISIBLE _SPACE } catch ( h ) { } f ? d . selectNodeContents ( a ) : d . selectNode ( a ) ; f && g && e ? d . collapse ( i ) : f && g && ( d . setStartAfter ( a ) , d . setEndAfter ( a ) ) ; this . setSelection ( d ) } , getSelectedNode : function ( a ) { if ( a && this . doc . selection && "Control" ===
this . doc . selection . type && ( a = this . doc . selection . createRange ( ) ) && a . length ) return a . item ( 0 ) ; a = this . getSelection ( this . doc ) ; return a . focusNode === a . anchorNode ? a . focusNode : ( a = this . getRange ( this . doc ) ) ? a . commonAncestorContainer : this . doc . body } , executeAndRestore : function ( a , c ) { var e = this . doc . body , f = c && e . scrollTop , g = c && e . scrollLeft , i = '<span class="_wysihtml5-temp-placeholder">' + b . INVISIBLE _SPACE + "</span>" , h = this . getRange ( this . doc ) ; if ( h ) { i = h . createContextualFragment ( i ) ; h . insertNode ( i ) ; try { a ( h . startContainer , h . endContainer ) } catch ( k ) { setTimeout ( function ( ) { throw k ;
} , 0 ) } ( caretPlaceholder = this . doc . querySelector ( "._wysihtml5-temp-placeholder" ) ) ? ( h = rangy . createRange ( this . doc ) , h . selectNode ( caretPlaceholder ) , h . deleteContents ( ) , this . setSelection ( h ) ) : e . focus ( ) ; c && ( e . scrollTop = f , e . scrollLeft = g ) ; try { caretPlaceholder . parentNode . removeChild ( caretPlaceholder ) } catch ( j ) { } } else a ( e , e ) } , executeAndRestoreSimple : function ( a ) { var b , c , f = this . getRange ( ) , g = this . doc . body , i ; if ( f ) { b = f . getNodes ( [ 3 ] ) ; g = b [ 0 ] || f . startContainer ; i = b [ b . length - 1 ] || f . endContainer ; b = g === f . startContainer ? f . startOffset :
0 ; c = i === f . endContainer ? f . endOffset : i . length ; try { a ( f . startContainer , f . endContainer ) } catch ( h ) { setTimeout ( function ( ) { throw h ; } , 0 ) } a = rangy . createRange ( this . doc ) ; try { a . setStart ( g , b ) } catch ( k ) { } try { a . setEnd ( i , c ) } catch ( j ) { } try { this . setSelection ( a ) } catch ( n ) { } } else a ( g , g ) } , insertHTML : function ( a ) { var a = rangy . createRange ( this . doc ) . createContextualFragment ( a ) , b = a . lastChild ; this . insertNode ( a ) ; b && this . setAfter ( b ) } , insertNode : function ( a ) { var b = this . getRange ( ) ; b && b . insertNode ( a ) } , surround : function ( a ) { var b = this . getRange ( ) ;
if ( b ) try { b . surroundContents ( a ) , this . selectNode ( a ) } catch ( c ) { a . appendChild ( b . extractContents ( ) ) , b . insertNode ( a ) } } , scrollIntoView : function ( ) { var a = this . doc , c = a . documentElement . scrollHeight > a . documentElement . offsetHeight , e ; if ( ! ( e = a . _wysihtml5ScrollIntoViewElement ) ) e = a . createElement ( "span" ) , e . innerHTML = b . INVISIBLE _SPACE ; e = a . _wysihtml5ScrollIntoViewElement = e ; if ( c ) { this . insertNode ( e ) ; var c = e , f = 0 ; if ( c . parentNode ) { do f += c . offsetTop || 0 , c = c . offsetParent ; while ( c ) } c = f ; e . parentNode . removeChild ( e ) ; c > a . body . scrollTop &&
( a . body . scrollTop = c ) } } , selectLine : function ( ) { b . browser . supportsSelectionModify ( ) ? this . _selectLine _W3C ( ) : this . doc . selection && this . _selectLine _MSIE ( ) } , _selectLine _W3C : function ( ) { var a = this . doc . defaultView . getSelection ( ) ; a . modify ( "extend" , "left" , "lineboundary" ) ; a . modify ( "extend" , "right" , "lineboundary" ) } , _selectLine _MSIE : function ( ) { var a = this . doc . selection . createRange ( ) , b = a . boundingTop , c = this . doc . body . scrollWidth , f ; if ( a . moveToPoint ) { 0 === b && ( f = this . doc . createElement ( "span" ) , this . insertNode ( f ) , b = f . offsetTop ,
f . parentNode . removeChild ( f ) ) ; b += 1 ; for ( f = - 10 ; f < c ; f += 2 ) try { a . moveToPoint ( f , b ) ; break } catch ( g ) { } for ( f = this . doc . selection . createRange ( ) ; 0 <= c ; c -- ) try { f . moveToPoint ( c , b ) ; break } catch ( i ) { } a . setEndPoint ( "EndToEnd" , f ) ; a . select ( ) } } , getText : function ( ) { var a = this . getSelection ( ) ; return a ? a . toString ( ) : "" } , getNodes : function ( a , b ) { var c = this . getRange ( ) ; return c ? c . getNodes ( [ a ] , b ) : [ ] } , getRange : function ( ) { var a = this . getSelection ( ) ; return a && a . rangeCount && a . getRangeAt ( 0 ) } , getSelection : function ( ) { return rangy . getSelection ( this . doc . defaultView ||
this . doc . parentWindow ) } , setSelection : function ( a ) { return rangy . getSelection ( this . doc . defaultView || this . doc . parentWindow ) . setSingleRange ( a ) } } ) } ) ( wysihtml5 ) ;
( function ( b , c ) { function a ( a , b ) { return c . dom . isCharacterDataNode ( a ) ? 0 == b ? ! ! a . previousSibling : b == a . length ? ! ! a . nextSibling : ! 0 : 0 < b && b < a . childNodes . length } function d ( a , b , e ) { var f ; c . dom . isCharacterDataNode ( b ) && ( 0 == e ? ( e = c . dom . getNodeIndex ( b ) , b = b . parentNode ) : e == b . length ? ( e = c . dom . getNodeIndex ( b ) + 1 , b = b . parentNode ) : f = c . dom . splitDataNode ( b , e ) ) ; if ( ! f ) { f = b . cloneNode ( ! 1 ) ; f . id && f . removeAttribute ( "id" ) ; for ( var g ; g = b . childNodes [ e ] ; ) f . appendChild ( g ) ; c . dom . insertAfter ( f , b ) } return b == a ? f : d ( a , f . parentNode , c . dom . getNodeIndex ( f ) ) }
function e ( a ) { this . firstTextNode = ( this . isElementMerge = a . nodeType == b . ELEMENT _NODE ) ? a . lastChild : a ; this . textNodes = [ this . firstTextNode ] } function f ( a , b , c , d ) { this . tagNames = a || [ g ] ; this . cssClass = b || "" ; this . similarClassRegExp = c ; this . normalize = d ; this . applyToAnyTagName = ! 1 } var g = "span" , i = /\s+/g ; e . prototype = { doMerge : function ( ) { for ( var a = [ ] , b , c , d = 0 , e = this . textNodes . length ; d < e ; ++ d ) b = this . textNodes [ d ] , c = b . parentNode , a [ d ] = b . data , d && ( c . removeChild ( b ) , c . hasChildNodes ( ) || c . parentNode . removeChild ( c ) ) ; return this . firstTextNode . data =
a = a . join ( "" ) } , getLength : function ( ) { for ( var a = this . textNodes . length , b = 0 ; a -- ; ) b += this . textNodes [ a ] . length ; return b } , toString : function ( ) { for ( var a = [ ] , b = 0 , c = this . textNodes . length ; b < c ; ++ b ) a [ b ] = "'" + this . textNodes [ b ] . data + "'" ; return "[Merge(" + a . join ( "," ) + ")]" } } ; f . prototype = { getAncestorWithClass : function ( a ) { for ( var d ; a ; ) { if ( this . cssClass ) if ( d = this . cssClass , a . className ) { var e = a . className . match ( this . similarClassRegExp ) || [ ] ; d = e [ e . length - 1 ] === d } else d = ! 1 ; else d = ! 0 ; if ( a . nodeType == b . ELEMENT _NODE && c . dom . arrayContains ( this . tagNames ,
a . tagName . toLowerCase ( ) ) && d ) return a ; a = a . parentNode } return ! 1 } , postApply : function ( a , b ) { for ( var c = a [ 0 ] , d = a [ a . length - 1 ] , f = [ ] , g , i = c , m = d , s = 0 , x = d . length , o , z , w = 0 , y = a . length ; w < y ; ++ w ) if ( o = a [ w ] , z = this . getAdjacentMergeableTextNode ( o . parentNode , ! 1 ) ) { if ( g || ( g = new e ( z ) , f . push ( g ) ) , g . textNodes . push ( o ) , o === c && ( i = g . firstTextNode , s = i . length ) , o === d ) m = g . firstTextNode , x = g . getLength ( ) } else g = null ; if ( c = this . getAdjacentMergeableTextNode ( d . parentNode , ! 0 ) ) g || ( g = new e ( d ) , f . push ( g ) ) , g . textNodes . push ( c ) ; if ( f . length ) { w = 0 ; for ( y =
f . length ; w < y ; ++ w ) f [ w ] . doMerge ( ) ; b . setStart ( i , s ) ; b . setEnd ( m , x ) } } , getAdjacentMergeableTextNode : function ( a , c ) { var d = a . nodeType == b . TEXT _NODE , e = d ? a . parentNode : a , f = c ? "nextSibling" : "previousSibling" ; if ( d ) { if ( ( d = a [ f ] ) && d . nodeType == b . TEXT _NODE ) return d } else if ( ( d = e [ f ] ) && this . areElementsMergeable ( a , d ) ) return d [ c ? "firstChild" : "lastChild" ] ; return null } , areElementsMergeable : function ( a , b ) { var d ; if ( d = c . dom . arrayContains ( this . tagNames , ( a . tagName || "" ) . toLowerCase ( ) ) ) if ( d = c . dom . arrayContains ( this . tagNames , ( b . tagName ||
"" ) . toLowerCase ( ) ) ) if ( d = a . className . replace ( i , " " ) == b . className . replace ( i , " " ) ) a : if ( a . attributes . length != b . attributes . length ) d = ! 1 ; else { d = 0 ; for ( var e = a . attributes . length , f , g ; d < e ; ++ d ) if ( f = a . attributes [ d ] , g = f . name , "class" != g && ( g = b . attributes . getNamedItem ( g ) , f . specified != g . specified || f . specified && f . nodeValue !== g . nodeValue ) ) { d = ! 1 ; break a } d = ! 0 } return d } , createContainer : function ( a ) { a = a . createElement ( this . tagNames [ 0 ] ) ; this . cssClass && ( a . className = this . cssClass ) ; return a } , applyToTextNode : function ( a ) { var b =
a . parentNode ; 1 == b . childNodes . length && c . dom . arrayContains ( this . tagNames , b . tagName . toLowerCase ( ) ) ? this . cssClass && ( a = this . cssClass , b . className ? ( b . className && ( b . className = b . className . replace ( this . similarClassRegExp , "" ) ) , b . className += " " + a ) : b . className = a ) : ( b = this . createContainer ( c . dom . getDocument ( a ) ) , a . parentNode . insertBefore ( b , a ) , b . appendChild ( a ) ) } , isRemovable : function ( a ) { return c . dom . arrayContains ( this . tagNames , a . tagName . toLowerCase ( ) ) && b . lang . string ( a . className ) . trim ( ) == this . cssClass } , undoToTextNode : function ( b ,
c , e ) { c . containsNode ( e ) || ( b = c . cloneRange ( ) , b . selectNode ( e ) , b . isPointInRange ( c . endContainer , c . endOffset ) && a ( c . endContainer , c . endOffset ) && ( d ( e , c . endContainer , c . endOffset ) , c . setEndAfter ( e ) ) , b . isPointInRange ( c . startContainer , c . startOffset ) && a ( c . startContainer , c . startOffset ) && ( e = d ( e , c . startContainer , c . startOffset ) ) ) ; this . similarClassRegExp && e . className && ( e . className = e . className . replace ( this . similarClassRegExp , "" ) ) ; if ( this . isRemovable ( e ) ) { c = e ; for ( e = c . parentNode ; c . firstChild ; ) e . insertBefore ( c . firstChild ,
c ) ; e . removeChild ( c ) } } , applyToRange : function ( a ) { var c = a . getNodes ( [ b . TEXT _NODE ] ) ; if ( ! c . length ) try { var d = this . createContainer ( a . endContainer . ownerDocument ) ; a . surroundContents ( d ) ; this . selectNode ( a , d ) ; return } catch ( e ) { } a . splitBoundaries ( ) ; c = a . getNodes ( [ b . TEXT _NODE ] ) ; if ( c . length ) { for ( var f = 0 , g = c . length ; f < g ; ++ f ) d = c [ f ] , this . getAncestorWithClass ( d ) || this . applyToTextNode ( d ) ; a . setStart ( c [ 0 ] , 0 ) ; d = c [ c . length - 1 ] ; a . setEnd ( d , d . length ) ; this . normalize && this . postApply ( c , a ) } } , undoToRange : function ( a ) { var c = a . getNodes ( [ b . TEXT _NODE ] ) ,
d , e ; c . length ? ( a . splitBoundaries ( ) , c = a . getNodes ( [ b . TEXT _NODE ] ) ) : ( c = a . endContainer . ownerDocument . createTextNode ( b . INVISIBLE _SPACE ) , a . insertNode ( c ) , a . selectNode ( c ) , c = [ c ] ) ; for ( var f = 0 , g = c . length ; f < g ; ++ f ) d = c [ f ] , ( e = this . getAncestorWithClass ( d ) ) && this . undoToTextNode ( d , a , e ) ; 1 == g ? this . selectNode ( a , c [ 0 ] ) : ( a . setStart ( c [ 0 ] , 0 ) , d = c [ c . length - 1 ] , a . setEnd ( d , d . length ) , this . normalize && this . postApply ( c , a ) ) } , selectNode : function ( a , c ) { var d = c . nodeType === b . ELEMENT _NODE , e = "canHaveHTML" in c ? c . canHaveHTML : ! 0 , f = d ? c . innerHTML :
c . data ; if ( ( f = "" === f || f === b . INVISIBLE _SPACE ) && d && e ) try { c . innerHTML = b . INVISIBLE _SPACE } catch ( g ) { } a . selectNodeContents ( c ) ; f && d ? a . collapse ( ! 1 ) : f && ( a . setStartAfter ( c ) , a . setEndAfter ( c ) ) } , getTextSelectedByRange : function ( a , b ) { var c = b . cloneRange ( ) ; c . selectNodeContents ( a ) ; var d = c . intersection ( b ) , d = d ? d . toString ( ) : "" ; c . detach ( ) ; return d } , isAppliedToRange : function ( a ) { var c = [ ] , d , e = a . getNodes ( [ b . TEXT _NODE ] ) ; if ( ! e . length ) return ( d = this . getAncestorWithClass ( a . startContainer ) ) ? [ d ] : ! 1 ; for ( var f = 0 , g = e . length , i ; f < g ; ++ f ) { i =
this . getTextSelectedByRange ( e [ f ] , a ) ; d = this . getAncestorWithClass ( e [ f ] ) ; if ( "" != i && ! d ) return ! 1 ; c . push ( d ) } return c } , toggleRange : function ( a ) { this . isAppliedToRange ( a ) ? this . undoToRange ( a ) : this . applyToRange ( a ) } } ; b . selection . HTMLApplier = f } ) ( wysihtml5 , rangy ) ;
wysihtml5 . Commands = Base . extend ( { constructor : function ( b ) { this . editor = b ; this . composer = b . composer ; this . doc = this . composer . doc } , support : function ( b ) { return wysihtml5 . browser . supportsCommand ( this . doc , b ) } , exec : function ( b , c ) { var a = wysihtml5 . commands [ b ] , d = wysihtml5 . lang . array ( arguments ) . get ( ) , e = a && a . exec , f = null ; this . editor . fire ( "beforecommand:composer" ) ; if ( e ) d . unshift ( this . composer ) , f = e . apply ( a , d ) ; else try { f = this . doc . execCommand ( b , ! 1 , c ) } catch ( g ) { } this . editor . fire ( "aftercommand:composer" ) ; return f } , state : function ( b ,
c ) { var a = wysihtml5 . commands [ b ] , d = wysihtml5 . lang . array ( arguments ) . get ( ) , e = a && a . state ; if ( e ) return d . unshift ( this . composer ) , e . apply ( a , d ) ; try { return this . doc . queryCommandState ( b ) } catch ( f ) { return ! 1 } } , value : function ( b ) { var c = wysihtml5 . commands [ b ] , a = c && c . value ; if ( a ) return a . call ( c , this . composer , b ) ; try { return this . doc . queryCommandValue ( b ) } catch ( d ) { return null } } } ) ;
( function ( b ) { b . commands . bold = { exec : function ( c , a ) { return b . commands . formatInline . exec ( c , a , "b" ) } , state : function ( c , a ) { return b . commands . formatInline . state ( c , a , "b" ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { function c ( c , g ) { var i = c . doc , h = "_wysihtml5-temp-" + + new Date , k = 0 , j , n , p ; b . commands . formatInline . exec ( c , a , d , h , /non-matching-class/g ) ; j = i . querySelectorAll ( d + "." + h ) ; for ( h = j . length ; k < h ; k ++ ) for ( p in n = j [ k ] , n . removeAttribute ( "class" ) , g ) n . setAttribute ( p , g [ p ] ) ; k = n ; 1 === h && ( p = e . getTextContent ( n ) , h = ! ! n . querySelector ( "*" ) , p = "" === p || p === b . INVISIBLE _SPACE , ! h && p && ( e . setTextContent ( n , g . text || n . href ) , i = i . createTextNode ( " " ) , c . selection . setAfter ( n ) , c . selection . insertNode ( i ) , k = i ) ) ; c . selection . setAfter ( k ) }
var a , d = "A" , e = b . dom ; b . commands . createLink = { exec : function ( a , b , d ) { var h = this . state ( a , b ) ; h ? a . selection . executeAndRestore ( function ( ) { for ( var a = h . length , b = 0 , c , d , f ; b < a ; b ++ ) c = h [ b ] , d = e . getParentElement ( c , { nodeName : "code" } ) , f = e . getTextContent ( c ) , f . match ( e . autoLink . URL _REG _EXP ) && ! d ? e . renameElement ( c , "code" ) : e . replaceWithChildNodes ( c ) } ) : ( d = "object" === typeof d ? d : { href : d } , c ( a , d ) ) } , state : function ( a , c ) { return b . commands . formatInline . state ( a , c , "A" ) } , value : function ( ) { return a } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = /wysiwyg-font-size-[a-z\-]+/g ; b . commands . fontSize = { exec : function ( a , d , e ) { return b . commands . formatInline . exec ( a , d , "span" , "wysiwyg-font-size-" + e , c ) } , state : function ( a , d , e ) { return b . commands . formatInline . state ( a , d , "span" , "wysiwyg-font-size-" + e , c ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = /wysiwyg-color-[a-z]+/g ; b . commands . foreColor = { exec : function ( a , d , e ) { return b . commands . formatInline . exec ( a , d , "span" , "wysiwyg-color-" + e , c ) } , state : function ( a , d , e ) { return b . commands . formatInline . state ( a , d , "span" , "wysiwyg-color-" + e , c ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { function c ( a ) { for ( a = a . previousSibling ; a && a . nodeType === b . TEXT _NODE && ! b . lang . string ( a . data ) . trim ( ) ; ) a = a . previousSibling ; return a } function a ( a ) { for ( a = a . nextSibling ; a && a . nodeType === b . TEXT _NODE && ! b . lang . string ( a . data ) . trim ( ) ; ) a = a . nextSibling ; return a } function d ( a ) { return "BR" === a . nodeName || "block" === g . getStyle ( "display" ) . from ( a ) ? ! 0 : ! 1 } function e ( a , c , d , e ) { if ( e ) var f = g . observe ( a , "DOMNodeInserted" , function ( a ) { var a = a . target , c ; a . nodeType === b . ELEMENT _NODE && ( c = g . getStyle ( "display" ) . from ( a ) , "inline" !==
c . substr ( 0 , 6 ) && ( a . className += " " + e ) ) } ) ; a . execCommand ( c , ! 1 , d ) ; f && f . stop ( ) } function f ( b , d ) { b . selection . selectLine ( ) ; b . selection . surround ( d ) ; var e = a ( d ) , f = c ( d ) ; e && "BR" === e . nodeName && e . parentNode . removeChild ( e ) ; f && "BR" === f . nodeName && f . parentNode . removeChild ( f ) ; ( e = d . lastChild ) && "BR" === e . nodeName && e . parentNode . removeChild ( e ) ; b . selection . selectNode ( d ) } var g = b . dom , i = "H1 H2 H3 H4 H5 H6 P BLOCKQUOTE DIV" . split ( " " ) ; b . commands . formatBlock = { exec : function ( h , k , j , n , p ) { var q = h . doc , r = this . state ( h , k , j , n , p ) , m , j = "string" ===
typeof j ? j . toUpperCase ( ) : j ; if ( r ) h . selection . executeAndRestoreSimple ( function ( ) { p && ( r . className = r . className . replace ( p , "" ) ) ; var e = ! ! b . lang . string ( r . className ) . trim ( ) ; if ( ! e && r . nodeName === ( j || "DIV" ) ) { var e = r , f = e . ownerDocument , h = a ( e ) , i = c ( e ) ; h && ! d ( h ) && e . parentNode . insertBefore ( f . createElement ( "br" ) , h ) ; i && ! d ( i ) && e . parentNode . insertBefore ( f . createElement ( "br" ) , e ) ; g . replaceWithChildNodes ( r ) } else e && g . renameElement ( r , "DIV" ) } ) ; else { if ( null === j || b . lang . array ( i ) . contains ( j ) ) if ( m = h . selection . getSelectedNode ( ) ,
r = g . getParentElement ( m , { nodeName : i } ) ) { h . selection . executeAndRestoreSimple ( function ( ) { j && ( r = g . renameElement ( r , j ) ) ; if ( n ) { var a = r ; a . className ? ( a . className = a . className . replace ( p , "" ) , a . className += " " + n ) : a . className = n } } ) ; return } h . commands . support ( k ) ? e ( q , k , j || "DIV" , n ) : ( r = q . createElement ( j || "DIV" ) , n && ( r . className = n ) , f ( h , r ) ) } } , state : function ( a , b , c , d , e ) { c = "string" === typeof c ? c . toUpperCase ( ) : c ; a = a . selection . getSelectedNode ( ) ; return g . getParentElement ( a , { nodeName : c , className : d , classRegExp : e } ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { function c ( c , f , g ) { var i = c + ":" + f ; if ( ! d [ i ] ) { var h = d , k = b . selection . HTMLApplier , j = a [ c ] , c = j ? [ c . toLowerCase ( ) , j . toLowerCase ( ) ] : [ c . toLowerCase ( ) ] ; h [ i ] = new k ( c , f , g , ! 0 ) } return d [ i ] } var a = { strong : "b" , em : "i" , b : "strong" , i : "em" } , d = { } ; b . commands . formatInline = { exec : function ( a , b , d , i , h ) { b = a . selection . getRange ( ) ; if ( ! b ) return ! 1 ; c ( d , i , h ) . toggleRange ( b ) ; a . selection . setSelection ( b ) } , state : function ( d , f , g , i , h ) { var f = d . doc , k = a [ g ] || g ; if ( ! b . dom . hasElementWithTagName ( f , g ) && ! b . dom . hasElementWithTagName ( f , k ) || i &&
! b . dom . hasElementWithClassName ( f , i ) ) return ! 1 ; d = d . selection . getRange ( ) ; return ! d ? ! 1 : c ( g , i , h ) . isAppliedToRange ( d ) } , value : function ( ) { } } } ) ( wysihtml5 ) ; ( function ( b ) { b . commands . insertHTML = { exec : function ( b , a , d ) { b . commands . support ( a ) ? b . doc . execCommand ( a , ! 1 , d ) : b . selection . insertHTML ( d ) } , state : function ( ) { return ! 1 } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { b . commands . insertImage = { exec : function ( c , a , d ) { var d = "object" === typeof d ? d : { src : d } , e = c . doc , a = this . state ( c ) , f ; if ( a ) c . selection . setBefore ( a ) , d = a . parentNode , d . removeChild ( a ) , b . dom . removeEmptyTextNodes ( d ) , "A" === d . nodeName && ! d . firstChild && ( c . selection . setAfter ( d ) , d . parentNode . removeChild ( d ) ) , b . quirks . redraw ( c . element ) ; else { a = e . createElement ( "IMG" ) ; for ( f in d ) a [ f ] = d [ f ] ; c . selection . insertNode ( a ) ; b . browser . hasProblemsSettingCaretAfterImg ( ) ? ( d = e . createTextNode ( b . INVISIBLE _SPACE ) , c . selection . insertNode ( d ) ,
c . selection . setAfter ( d ) ) : c . selection . setAfter ( a ) } } , state : function ( c ) { var a ; if ( ! b . dom . hasElementWithTagName ( c . doc , "IMG" ) ) return ! 1 ; a = c . selection . getSelectedNode ( ) ; if ( ! a ) return ! 1 ; if ( "IMG" === a . nodeName ) return a ; if ( a . nodeType !== b . ELEMENT _NODE ) return ! 1 ; a = c . selection . getText ( ) ; if ( a = b . lang . string ( a ) . trim ( ) ) return ! 1 ; c = c . selection . getNodes ( b . ELEMENT _NODE , function ( a ) { return "IMG" === a . nodeName } ) ; return 1 !== c . length ? ! 1 : c [ 0 ] } , value : function ( b ) { return ( b = this . state ( b ) ) && b . src } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = "<br>" + ( b . browser . needsSpaceAfterLineBreak ( ) ? " " : "" ) ; b . commands . insertLineBreak = { exec : function ( a , d ) { a . commands . support ( d ) ? ( a . doc . execCommand ( d , ! 1 , null ) , b . browser . autoScrollsToCaret ( ) || a . selection . scrollIntoView ( ) ) : a . commands . exec ( "insertHTML" , c ) } , state : function ( ) { return ! 1 } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { b . commands . insertOrderedList = { exec : function ( c , a ) { var d = c . doc , e = c . selection . getSelectedNode ( ) , f = b . dom . getParentElement ( e , { nodeName : "OL" } ) , g = b . dom . getParentElement ( e , { nodeName : "UL" } ) , e = "_wysihtml5-temp-" + ( new Date ) . getTime ( ) , i ; c . commands . support ( a ) ? d . execCommand ( a , ! 1 , null ) : f ? c . selection . executeAndRestoreSimple ( function ( ) { b . dom . resolveList ( f ) } ) : g ? c . selection . executeAndRestoreSimple ( function ( ) { b . dom . renameElement ( g , "ol" ) } ) : ( c . commands . exec ( "formatBlock" , "div" , e ) , i = d . querySelector ( "." + e ) ,
d = "" === i . innerHTML || i . innerHTML === b . INVISIBLE _SPACE , c . selection . executeAndRestoreSimple ( function ( ) { f = b . dom . convertToList ( i , "ol" ) } ) , d && c . selection . selectNode ( f . querySelector ( "li" ) ) ) } , state : function ( c ) { c = c . selection . getSelectedNode ( ) ; return b . dom . getParentElement ( c , { nodeName : "OL" } ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { b . commands . insertUnorderedList = { exec : function ( c , a ) { var d = c . doc , e = c . selection . getSelectedNode ( ) , f = b . dom . getParentElement ( e , { nodeName : "UL" } ) , g = b . dom . getParentElement ( e , { nodeName : "OL" } ) , e = "_wysihtml5-temp-" + ( new Date ) . getTime ( ) , i ; c . commands . support ( a ) ? d . execCommand ( a , ! 1 , null ) : f ? c . selection . executeAndRestoreSimple ( function ( ) { b . dom . resolveList ( f ) } ) : g ? c . selection . executeAndRestoreSimple ( function ( ) { b . dom . renameElement ( g , "ul" ) } ) : ( c . commands . exec ( "formatBlock" , "div" , e ) , i = d . querySelector ( "." + e ) ,
d = "" === i . innerHTML || i . innerHTML === b . INVISIBLE _SPACE , c . selection . executeAndRestoreSimple ( function ( ) { f = b . dom . convertToList ( i , "ul" ) } ) , d && c . selection . selectNode ( f . querySelector ( "li" ) ) ) } , state : function ( c ) { c = c . selection . getSelectedNode ( ) ; return b . dom . getParentElement ( c , { nodeName : "UL" } ) } , value : function ( ) { } } } ) ( wysihtml5 ) ; ( function ( b ) { b . commands . italic = { exec : function ( c , a ) { return b . commands . formatInline . exec ( c , a , "i" ) } , state : function ( c , a ) { return b . commands . formatInline . state ( c , a , "i" ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = /wysiwyg-text-align-[a-z]+/g ; b . commands . justifyCenter = { exec : function ( a ) { return b . commands . formatBlock . exec ( a , "formatBlock" , null , "wysiwyg-text-align-center" , c ) } , state : function ( a ) { return b . commands . formatBlock . state ( a , "formatBlock" , null , "wysiwyg-text-align-center" , c ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = /wysiwyg-text-align-[a-z]+/g ; b . commands . justifyLeft = { exec : function ( a ) { return b . commands . formatBlock . exec ( a , "formatBlock" , null , "wysiwyg-text-align-left" , c ) } , state : function ( a ) { return b . commands . formatBlock . state ( a , "formatBlock" , null , "wysiwyg-text-align-left" , c ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = /wysiwyg-text-align-[a-z]+/g ; b . commands . justifyRight = { exec : function ( a ) { return b . commands . formatBlock . exec ( a , "formatBlock" , null , "wysiwyg-text-align-right" , c ) } , state : function ( a ) { return b . commands . formatBlock . state ( a , "formatBlock" , null , "wysiwyg-text-align-right" , c ) } , value : function ( ) { } } } ) ( wysihtml5 ) ; ( function ( b ) { b . commands . underline = { exec : function ( c , a ) { return b . commands . formatInline . exec ( c , a , "u" ) } , state : function ( c , a ) { return b . commands . formatInline . state ( c , a , "u" ) } , value : function ( ) { } } } ) ( wysihtml5 ) ;
( function ( b ) { var c = '<span id="_wysihtml5-undo" class="_wysihtml5-temp">' + b . INVISIBLE _SPACE + "</span>" , a = '<span id="_wysihtml5-redo" class="_wysihtml5-temp">' + b . INVISIBLE _SPACE + "</span>" , d = b . dom ; b . UndoManager = b . lang . Dispatcher . extend ( { constructor : function ( a ) { this . editor = a ; this . composer = a . composer ; this . element = this . composer . element ; this . history = [ this . composer . getValue ( ) ] ; this . position = 1 ; this . composer . commands . support ( "insertHTML" ) && this . _observe ( ) } , _observe : function ( ) { var e = this , f = this . composer . sandbox . getDocument ( ) ,
g ; d . observe ( this . element , "keydown" , function ( a ) { if ( ! ( a . altKey || ! a . ctrlKey && ! a . metaKey ) ) { var b = a . keyCode , c = 90 === b && a . shiftKey || 89 === b ; 90 === b && ! a . shiftKey ? ( e . undo ( ) , a . preventDefault ( ) ) : c && ( e . redo ( ) , a . preventDefault ( ) ) } } ) ; d . observe ( this . element , "keydown" , function ( a ) { a = a . keyCode ; a !== g && ( g = a , ( 8 === a || 46 === a ) && e . transact ( ) ) } ) ; if ( b . browser . hasUndoInContextMenu ( ) ) { var i , h , k = function ( ) { for ( var a ; a = f . querySelector ( "._wysihtml5-temp" ) ; ) a . parentNode . removeChild ( a ) ; clearInterval ( i ) } ; d . observe ( this . element , "contextmenu" ,
function ( ) { k ( ) ; e . composer . selection . executeAndRestoreSimple ( function ( ) { e . element . lastChild && e . composer . selection . setAfter ( e . element . lastChild ) ; f . execCommand ( "insertHTML" , ! 1 , c ) ; f . execCommand ( "insertHTML" , ! 1 , a ) ; f . execCommand ( "undo" , ! 1 , null ) } ) ; i = setInterval ( function ( ) { f . getElementById ( "_wysihtml5-redo" ) ? ( k ( ) , e . redo ( ) ) : f . getElementById ( "_wysihtml5-undo" ) || ( k ( ) , e . undo ( ) ) } , 400 ) ; h || ( h = ! 0 , d . observe ( document , "mousedown" , k ) , d . observe ( f , [ "mousedown" , "paste" , "cut" , "copy" ] , k ) ) } ) } this . editor . observe ( "newword:composer" ,
function ( ) { e . transact ( ) } ) . observe ( "beforecommand:composer" , function ( ) { e . transact ( ) } ) } , transact : function ( ) { var a = this . history [ this . position - 1 ] , b = this . composer . getValue ( ) ; if ( b != a ) { if ( 40 < ( this . history . length = this . position ) ) this . history . shift ( ) , this . position -- ; this . position ++ ; this . history . push ( b ) } } , undo : function ( ) { this . transact ( ) ; 1 >= this . position || ( this . set ( this . history [ -- this . position - 1 ] ) , this . editor . fire ( "undo:composer" ) ) } , redo : function ( ) { this . position >= this . history . length || ( this . set ( this . history [ ++ this . position -
1 ] ) , this . editor . fire ( "redo:composer" ) ) } , set : function ( a ) { this . composer . setValue ( a ) ; this . editor . focus ( ! 0 ) } } ) } ) ( wysihtml5 ) ;
wysihtml5 . views . View = Base . extend ( { constructor : function ( b , c , a ) { this . parent = b ; this . element = c ; this . config = a ; this . _observeViewChange ( ) } , _observeViewChange : function ( ) { var b = this ; this . parent . observe ( "beforeload" , function ( ) { b . parent . observe ( "change_view" , function ( c ) { c === b . name ? ( b . parent . currentView = b , b . show ( ) , setTimeout ( function ( ) { b . focus ( ) } , 0 ) ) : b . hide ( ) } ) } ) } , focus : function ( ) { if ( this . element . ownerDocument . querySelector ( ":focus" ) !== this . element ) try { this . element . focus ( ) } catch ( b ) { } } , hide : function ( ) { this . element . style . display =
"none" } , show : function ( ) { this . element . style . display = "" } , disable : function ( ) { this . element . setAttribute ( "disabled" , "disabled" ) } , enable : function ( ) { this . element . removeAttribute ( "disabled" ) } } ) ;
( function ( b ) { var c = b . dom , a = b . browser ; b . views . Composer = b . views . View . extend ( { name : "composer" , CARET _HACK : "<br>" , constructor : function ( a , b , c ) { this . base ( a , b , c ) ; this . textarea = this . parent . textarea ; this . _initSandbox ( ) } , clear : function ( ) { this . element . innerHTML = a . displaysCaretInEmptyContentEditableCorrectly ( ) ? "" : this . CARET _HACK } , getValue : function ( a ) { var c = this . isEmpty ( ) ? "" : b . quirks . getCorrectInnerHTML ( this . element ) ; a && ( c = this . parent . parse ( c ) ) ; return c = b . lang . string ( c ) . replace ( b . INVISIBLE _SPACE ) . by ( "" ) } , setValue : function ( a ,
b ) { b && ( a = this . parent . parse ( a ) ) ; this . element . innerHTML = a } , show : function ( ) { this . iframe . style . display = this . _displayStyle || "" ; this . disable ( ) ; this . enable ( ) } , hide : function ( ) { this . _displayStyle = c . getStyle ( "display" ) . from ( this . iframe ) ; "none" === this . _displayStyle && ( this . _displayStyle = null ) ; this . iframe . style . display = "none" } , disable : function ( ) { this . element . removeAttribute ( "contentEditable" ) ; this . base ( ) } , enable : function ( ) { this . element . setAttribute ( "contentEditable" , "true" ) ; this . base ( ) } , focus : function ( a ) { b . browser . doesAsyncFocus ( ) &&
this . hasPlaceholderSet ( ) && this . clear ( ) ; this . base ( ) ; var c = this . element . lastChild ; a && c && ( "BR" === c . nodeName ? this . selection . setBefore ( this . element . lastChild ) : this . selection . setAfter ( this . element . lastChild ) ) } , getTextContent : function ( ) { return c . getTextContent ( this . element ) } , hasPlaceholderSet : function ( ) { return this . getTextContent ( ) == this . textarea . element . getAttribute ( "placeholder" ) } , isEmpty : function ( ) { var a = this . element . innerHTML ; return "" === a || a === this . CARET _HACK || this . hasPlaceholderSet ( ) || "" === this . getTextContent ( ) &&
! this . element . querySelector ( "blockquote, ul, ol, img, embed, object, table, iframe, svg, video, audio, button, input, select, textarea" ) } , _initSandbox : function ( ) { var a = this ; this . sandbox = new c . Sandbox ( function ( ) { a . _create ( ) } , { stylesheets : this . config . stylesheets } ) ; this . iframe = this . sandbox . getIframe ( ) ; var b = document . createElement ( "input" ) ; b . type = "hidden" ; b . name = "_wysihtml5_mode" ; b . value = 1 ; var f = this . textarea . element ; c . insert ( this . iframe ) . after ( f ) ; c . insert ( b ) . after ( f ) } , _create : function ( ) { var d = this ; this . doc =
this . sandbox . getDocument ( ) ; this . element = this . doc . body ; this . textarea = this . parent . textarea ; this . element . innerHTML = this . textarea . getValue ( ! 0 ) ; this . enable ( ) ; this . selection = new b . Selection ( this . parent ) ; this . commands = new b . Commands ( this . parent ) ; c . copyAttributes ( "className spellcheck title lang dir accessKey" . split ( " " ) ) . from ( this . textarea . element ) . to ( this . element ) ; c . addClass ( this . element , this . config . composerClassName ) ; this . config . style && this . style ( ) ; this . observe ( ) ; var e = this . config . name ; e && ( c . addClass ( this . element ,
e ) , c . addClass ( this . iframe , e ) ) ; ( e = "string" === typeof this . config . placeholder ? this . config . placeholder : this . textarea . element . getAttribute ( "placeholder" ) ) && c . simulatePlaceholder ( this . parent , this , e ) ; this . commands . exec ( "styleWithCSS" , ! 1 ) ; this . _initAutoLinking ( ) ; this . _initObjectResizing ( ) ; this . _initUndoManager ( ) ; ( this . textarea . element . hasAttribute ( "autofocus" ) || document . querySelector ( ":focus" ) == this . textarea . element ) && setTimeout ( function ( ) { d . focus ( ) } , 100 ) ; b . quirks . insertLineBreakOnReturn ( this ) ; a . clearsContentEditableCorrectly ( ) ||
b . quirks . ensureProperClearing ( this ) ; a . clearsListsInContentEditableCorrectly ( ) || b . quirks . ensureProperClearingOfLists ( this ) ; this . initSync && this . config . sync && this . initSync ( ) ; this . textarea . hide ( ) ; this . parent . fire ( "beforeload" ) . fire ( "load" ) } , _initAutoLinking : function ( ) { var d = this , e = a . canDisableAutoLinking ( ) , f = a . doesAutoLinkingInContentEditable ( ) ; e && this . commands . exec ( "autoUrlDetect" , ! 1 ) ; if ( this . config . autoLink ) { ( ! f || f && e ) && this . parent . observe ( "newword:composer" , function ( ) { d . selection . executeAndRestore ( function ( a ,
b ) { c . autoLink ( b . parentNode ) } ) } ) ; var g = this . sandbox . getDocument ( ) . getElementsByTagName ( "a" ) , i = c . autoLink . URL _REG _EXP , h = function ( a ) { a = b . lang . string ( c . getTextContent ( a ) ) . trim ( ) ; "www." === a . substr ( 0 , 4 ) && ( a = "http://" + a ) ; return a } ; c . observe ( this . element , "keydown" , function ( a ) { if ( g . length ) { var a = d . selection . getSelectedNode ( a . target . ownerDocument ) , b = c . getParentElement ( a , { nodeName : "A" } , 4 ) , e ; b && ( e = h ( b ) , setTimeout ( function ( ) { var a = h ( b ) ; a !== e && a . match ( i ) && b . setAttribute ( "href" , a ) } , 0 ) ) } } ) } } , _initObjectResizing : function ( ) { var d =
[ "width" , "height" ] , e = d . length , f = this . element ; this . commands . exec ( "enableObjectResizing" , this . config . allowObjectResizing ) ; this . config . allowObjectResizing ? a . supportsEvent ( "resizeend" ) && c . observe ( f , "resizeend" , function ( a ) { for ( var a = a . target || a . srcElement , c = a . style , h = 0 , k ; h < e ; h ++ ) k = d [ h ] , c [ k ] && ( a . setAttribute ( k , parseInt ( c [ k ] , 10 ) ) , c [ k ] = "" ) ; b . quirks . redraw ( f ) } ) : a . supportsEvent ( "resizestart" ) && c . observe ( f , "resizestart" , function ( a ) { a . preventDefault ( ) } ) } , _initUndoManager : function ( ) { new b . UndoManager ( this . parent ) } } ) } ) ( wysihtml5 ) ;
2014-05-06 16:44:34 +02:00
( function ( b ) { var c = b . dom , a = document , d = window , e = a . createElement ( "div" ) , f = "background-color color cursor font-family font-size font-style font-variant font-weight letter-spacing text-align text-decoration text-indent text-rendering word-break word-wrap word-spacing" . split ( " " ) , g = "background-color border-collapse border-bottom-color border-bottom-style border-bottom-width border-left-color border-left-style border-left-width border-right-color border-right-style border-right-width border-top-color border-top-style border-top-width clear display float margin-bottom margin-left margin-right margin-top outline-color outline-offset outline-width outline-style padding-left padding-right padding-top padding-bottom position top left right bottom z-index vertical-align text-align -webkit-box-sizing -moz-box-sizing -ms-box-sizing box-sizing -webkit-box-shadow -moz-box-shadow -ms-box-shadow box-shadow -webkit-border-top-right-radius -moz-border-radius-topright border-top-right-radius -webkit-border-bottom-right-radius -moz-border-radius-bottomright border-bottom-right-radius -webkit-border-bottom-left-radius -moz-border-radius-bottomleft border-bottom-left-radius -webkit-border-top-left-radius -moz-border-radius-topleft border-top-left-radius width height" . split ( " " ) ,
2014-04-23 22:15:07 +02:00
i = "width height top left right bottom" . split ( " " ) , h = [ "html { height: 100%; }" , "body { min-height: 100%; padding: 0; margin: 0; margin-top: -1px; padding-top: 1px; }" , "._wysihtml5-temp { display: none; }" , b . browser . isGecko ? "body.placeholder { color: graytext !important; }" : "body.placeholder { color: #a9a9a9 !important; }" , "body[disabled] { background-color: #eee !important; color: #999 !important; cursor: default !important; }" , "img:-moz-broken { -moz-force-broken-image-icon: 1; height: 24px; width: 24px; }" ] ,
k = function ( b ) { if ( b . setActive ) try { b . setActive ( ) } catch ( e ) { } else { var f = b . style , h = a . documentElement . scrollTop || a . body . scrollTop , g = a . documentElement . scrollLeft || a . body . scrollLeft , f = { position : f . position , top : f . top , left : f . left , WebkitUserSelect : f . WebkitUserSelect } ; c . setStyles ( { position : "absolute" , top : "-99999px" , left : "-99999px" , WebkitUserSelect : "none" } ) . on ( b ) ; b . focus ( ) ; c . setStyles ( f ) . on ( b ) ; d . scrollTo && d . scrollTo ( g , h ) } } ; b . views . Composer . prototype . style = function ( ) { var j = this , n = a . querySelector ( ":focus" ) , p = this . textarea . element ,
q = p . hasAttribute ( "placeholder" ) , r = q && p . getAttribute ( "placeholder" ) ; this . focusStylesHost = this . focusStylesHost || e . cloneNode ( ! 1 ) ; this . blurStylesHost = this . blurStylesHost || e . cloneNode ( ! 1 ) ; q && p . removeAttribute ( "placeholder" ) ; p === n && p . blur ( ) ; c . copyStyles ( g ) . from ( p ) . to ( this . iframe ) . andTo ( this . blurStylesHost ) ; c . copyStyles ( f ) . from ( p ) . to ( this . element ) . andTo ( this . blurStylesHost ) ; c . insertCSS ( h ) . into ( this . element . ownerDocument ) ; k ( p ) ; c . copyStyles ( g ) . from ( p ) . to ( this . focusStylesHost ) ; c . copyStyles ( f ) . from ( p ) . to ( this . focusStylesHost ) ;
var m = b . lang . array ( g ) . without ( [ "display" ] ) ; n ? n . focus ( ) : p . blur ( ) ; q && p . setAttribute ( "placeholder" , r ) ; if ( ! b . browser . hasCurrentStyleProperty ( ) ) var s = c . observe ( d , "resize" , function ( ) { if ( c . contains ( document . documentElement , j . iframe ) ) { var a = c . getStyle ( "display" ) . from ( p ) , b = c . getStyle ( "display" ) . from ( j . iframe ) ; p . style . display = "" ; j . iframe . style . display = "none" ; c . copyStyles ( i ) . from ( p ) . to ( j . iframe ) . andTo ( j . focusStylesHost ) . andTo ( j . blurStylesHost ) ; j . iframe . style . display = b ; p . style . display = a } else s . stop ( ) } ) ; this . parent . observe ( "focus:composer" ,
function ( ) { c . copyStyles ( m ) . from ( j . focusStylesHost ) . to ( j . iframe ) ; c . copyStyles ( f ) . from ( j . focusStylesHost ) . to ( j . element ) } ) ; this . parent . observe ( "blur:composer" , function ( ) { c . copyStyles ( m ) . from ( j . blurStylesHost ) . to ( j . iframe ) ; c . copyStyles ( f ) . from ( j . blurStylesHost ) . to ( j . element ) } ) ; return this } } ) ( wysihtml5 ) ;
( function ( b ) { var c = b . dom , a = b . browser , d = { 66 : "bold" , 73 : "italic" , 85 : "underline" } ; b . views . Composer . prototype . observe = function ( ) { var e = this , f = this . getValue ( ) , g = this . sandbox . getIframe ( ) , i = this . element , h = a . supportsEventsInIframeCorrectly ( ) ? i : this . sandbox . getWindow ( ) , k = a . supportsEvent ( "drop" ) ? [ "drop" , "paste" ] : [ "dragdrop" , "paste" ] ; c . observe ( g , "DOMNodeRemoved" , function ( ) { clearInterval ( j ) ; e . parent . fire ( "destroy:composer" ) } ) ; var j = setInterval ( function ( ) { c . contains ( document . documentElement , g ) || ( clearInterval ( j ) ,
e . parent . fire ( "destroy:composer" ) ) } , 250 ) ; c . observe ( h , "focus" , function ( ) { e . parent . fire ( "focus" ) . fire ( "focus:composer" ) ; setTimeout ( function ( ) { f = e . getValue ( ) } , 0 ) } ) ; c . observe ( h , "blur" , function ( ) { f !== e . getValue ( ) && e . parent . fire ( "change" ) . fire ( "change:composer" ) ; e . parent . fire ( "blur" ) . fire ( "blur:composer" ) } ) ; b . browser . isIos ( ) && c . observe ( i , "blur" , function ( ) { var a = i . ownerDocument . createElement ( "input" ) , b = document . documentElement . scrollTop || document . body . scrollTop , c = document . documentElement . scrollLeft || document . body . scrollLeft ;
try { e . selection . insertNode ( a ) } catch ( d ) { i . appendChild ( a ) } a . focus ( ) ; a . parentNode . removeChild ( a ) ; window . scrollTo ( c , b ) } ) ; c . observe ( i , "dragenter" , function ( ) { e . parent . fire ( "unset_placeholder" ) } ) ; a . firesOnDropOnlyWhenOnDragOverIsCancelled ( ) && c . observe ( i , [ "dragover" , "dragenter" ] , function ( a ) { a . preventDefault ( ) } ) ; c . observe ( i , k , function ( b ) { var c = b . dataTransfer , d ; c && a . supportsDataTransfer ( ) && ( d = c . getData ( "text/html" ) || c . getData ( "text/plain" ) ) ; d ? ( i . focus ( ) , e . commands . exec ( "insertHTML" , d ) , e . parent . fire ( "paste" ) . fire ( "paste:composer" ) ,
b . stopPropagation ( ) , b . preventDefault ( ) ) : setTimeout ( function ( ) { e . parent . fire ( "paste" ) . fire ( "paste:composer" ) } , 0 ) } ) ; c . observe ( i , "keyup" , function ( a ) { a = a . keyCode ; ( a === b . SPACE _KEY || a === b . ENTER _KEY ) && e . parent . fire ( "newword:composer" ) } ) ; this . parent . observe ( "paste:composer" , function ( ) { setTimeout ( function ( ) { e . parent . fire ( "newword:composer" ) } , 0 ) } ) ; a . canSelectImagesInContentEditable ( ) || c . observe ( i , "mousedown" , function ( a ) { var b = a . target ; "IMG" === b . nodeName && ( e . selection . selectNode ( b ) , a . preventDefault ( ) ) } ) ; c . observe ( i ,
"keydown" , function ( a ) { var b = d [ a . keyCode ] ; if ( ( a . ctrlKey || a . metaKey ) && ! a . altKey && b ) e . commands . exec ( b ) , a . preventDefault ( ) } ) ; c . observe ( i , "keydown" , function ( a ) { var c = e . selection . getSelectedNode ( ! 0 ) , d = a . keyCode ; if ( c && "IMG" === c . nodeName && ( d === b . BACKSPACE _KEY || d === b . DELETE _KEY ) ) d = c . parentNode , d . removeChild ( c ) , "A" === d . nodeName && ! d . firstChild && d . parentNode . removeChild ( d ) , setTimeout ( function ( ) { b . quirks . redraw ( i ) } , 0 ) , a . preventDefault ( ) } ) ; var n = { IMG : "Image: " , A : "Link: " } ; c . observe ( i , "mouseover" , function ( a ) { var a =
a . target , b = a . nodeName ; ! ( "A" !== b && "IMG" !== b ) && ! a . hasAttribute ( "title" ) && ( b = n [ b ] + ( a . getAttribute ( "href" ) || a . getAttribute ( "src" ) ) , a . setAttribute ( "title" , b ) ) } ) } } ) ( wysihtml5 ) ;
( function ( b ) { b . views . Synchronizer = Base . extend ( { constructor : function ( b , a , d ) { this . editor = b ; this . textarea = a ; this . composer = d ; this . _observe ( ) } , fromComposerToTextarea : function ( c ) { this . textarea . setValue ( b . lang . string ( this . composer . getValue ( ) ) . trim ( ) , c ) } , fromTextareaToComposer : function ( b ) { var a = this . textarea . getValue ( ) ; a ? this . composer . setValue ( a , b ) : ( this . composer . clear ( ) , this . editor . fire ( "set_placeholder" ) ) } , sync : function ( b ) { "textarea" === this . editor . currentView . name ? this . fromTextareaToComposer ( b ) : this . fromComposerToTextarea ( b ) } ,
_observe : function ( ) { var c , a = this , d = this . textarea . element . form , e = function ( ) { c = setInterval ( function ( ) { a . fromComposerToTextarea ( ) } , 400 ) } , f = function ( ) { clearInterval ( c ) ; c = null } ; e ( ) ; d && ( b . dom . observe ( d , "submit" , function ( ) { a . sync ( ! 0 ) } ) , b . dom . observe ( d , "reset" , function ( ) { setTimeout ( function ( ) { a . fromTextareaToComposer ( ) } , 0 ) } ) ) ; this . editor . observe ( "change_view" , function ( b ) { if ( b === "composer" && ! c ) { a . fromTextareaToComposer ( true ) ; e ( ) } else if ( b === "textarea" ) { a . fromComposerToTextarea ( true ) ; f ( ) } } ) ; this . editor . observe ( "destroy:composer" ,
f ) } } ) } ) ( wysihtml5 ) ;
wysihtml5 . views . Textarea = wysihtml5 . views . View . extend ( { name : "textarea" , constructor : function ( b , c , a ) { this . base ( b , c , a ) ; this . _observe ( ) } , clear : function ( ) { this . element . value = "" } , getValue : function ( b ) { var c = this . isEmpty ( ) ? "" : this . element . value ; b && ( c = this . parent . parse ( c ) ) ; return c } , setValue : function ( b , c ) { c && ( b = this . parent . parse ( b ) ) ; this . element . value = b } , hasPlaceholderSet : function ( ) { var b = wysihtml5 . browser . supportsPlaceholderAttributeOn ( this . element ) , c = this . element . getAttribute ( "placeholder" ) || null , a = this . element . value ;
return b && ! a || a === c } , isEmpty : function ( ) { return ! wysihtml5 . lang . string ( this . element . value ) . trim ( ) || this . hasPlaceholderSet ( ) } , _observe : function ( ) { var b = this . element , c = this . parent , a = { focusin : "focus" , focusout : "blur" } , d = wysihtml5 . browser . supportsEvent ( "focusin" ) ? [ "focusin" , "focusout" , "change" ] : [ "focus" , "blur" , "change" ] ; c . observe ( "beforeload" , function ( ) { wysihtml5 . dom . observe ( b , d , function ( b ) { b = a [ b . type ] || b . type ; c . fire ( b ) . fire ( b + ":textarea" ) } ) ; wysihtml5 . dom . observe ( b , [ "paste" , "drop" ] , function ( ) { setTimeout ( function ( ) { c . fire ( "paste" ) . fire ( "paste:textarea" ) } ,
0 ) } ) } ) } } ) ;
( function ( b ) { var c = b . dom ; b . toolbar . Dialog = b . lang . Dispatcher . extend ( { constructor : function ( a , b ) { this . link = a ; this . container = b } , _observe : function ( ) { if ( ! this . _observed ) { var a = this , d = function ( b ) { var c = a . _serialize ( ) ; c == a . elementToChange ? a . fire ( "edit" , c ) : a . fire ( "save" , c ) ; a . hide ( ) ; b . preventDefault ( ) ; b . stopPropagation ( ) } ; c . observe ( a . link , "click" , function ( ) { c . hasClass ( a . link , "wysihtml5-command-dialog-opened" ) && setTimeout ( function ( ) { a . hide ( ) } , 0 ) } ) ; c . observe ( this . container , "keydown" , function ( c ) { var e = c . keyCode ;
e === b . ENTER _KEY && d ( c ) ; e === b . ESCAPE _KEY && a . hide ( ) } ) ; c . delegate ( this . container , "[data-wysihtml5-dialog-action=save]" , "click" , d ) ; c . delegate ( this . container , "[data-wysihtml5-dialog-action=cancel]" , "click" , function ( b ) { a . fire ( "cancel" ) ; a . hide ( ) ; b . preventDefault ( ) ; b . stopPropagation ( ) } ) ; for ( var e = this . container . querySelectorAll ( "input, select, textarea" ) , f = 0 , g = e . length , i = function ( ) { clearInterval ( a . interval ) } ; f < g ; f ++ ) c . observe ( e [ f ] , "change" , i ) ; this . _observed = ! 0 } } , _serialize : function ( ) { for ( var a = this . elementToChange ||
{ } , b = this . container . querySelectorAll ( "[data-wysihtml5-dialog-field]" ) , c = b . length , f = 0 ; f < c ; f ++ ) a [ b [ f ] . getAttribute ( "data-wysihtml5-dialog-field" ) ] = b [ f ] . value ; return a } , _interpolate : function ( a ) { for ( var b , c , f = document . querySelector ( ":focus" ) , g = this . container . querySelectorAll ( "[data-wysihtml5-dialog-field]" ) , i = g . length , h = 0 ; h < i ; h ++ ) b = g [ h ] , b !== f && ! ( a && "hidden" === b . type ) && ( c = b . getAttribute ( "data-wysihtml5-dialog-field" ) , c = this . elementToChange ? this . elementToChange [ c ] || "" : b . defaultValue , b . value = c ) } , show : function ( a ) { var b =
this , e = this . container . querySelector ( "input, select, textarea" ) ; this . elementToChange = a ; this . _observe ( ) ; this . _interpolate ( ) ; a && ( this . interval = setInterval ( function ( ) { b . _interpolate ( ! 0 ) } , 500 ) ) ; c . addClass ( this . link , "wysihtml5-command-dialog-opened" ) ; this . container . style . display = "" ; this . fire ( "show" ) ; if ( e && ! a ) try { e . focus ( ) } catch ( f ) { } } , hide : function ( ) { clearInterval ( this . interval ) ; this . elementToChange = null ; c . removeClass ( this . link , "wysihtml5-command-dialog-opened" ) ; this . container . style . display = "none" ; this . fire ( "hide" ) } } ) } ) ( wysihtml5 ) ;
( function ( b ) { var c = b . dom , a = { position : "relative" } , d = { left : 0 , margin : 0 , opacity : 0 , overflow : "hidden" , padding : 0 , position : "absolute" , top : 0 , zIndex : 1 } , e = { cursor : "inherit" , fontSize : "50px" , height : "50px" , marginTop : "-25px" , outline : 0 , padding : 0 , position : "absolute" , right : "-4px" , top : "50%" } , f = { "x-webkit-speech" : "" , speech : "" } ; b . toolbar . Speech = function ( g , i ) { var h = document . createElement ( "input" ) ; if ( b . browser . supportsSpeechApiOn ( h ) ) { var k = document . createElement ( "div" ) ; b . lang . object ( d ) . merge ( { width : i . offsetWidth + "px" , height : i . offsetHeight +
"px" } ) ; c . insert ( h ) . into ( k ) ; c . insert ( k ) . into ( i ) ; c . setStyles ( e ) . on ( h ) ; c . setAttributes ( f ) . on ( h ) ; c . setStyles ( d ) . on ( k ) ; c . setStyles ( a ) . on ( i ) ; c . observe ( h , "onwebkitspeechchange" in h ? "webkitspeechchange" : "speechchange" , function ( ) { g . execCommand ( "insertText" , h . value ) ; h . value = "" } ) ; c . observe ( h , "click" , function ( a ) { c . hasClass ( i , "wysihtml5-command-disabled" ) && a . preventDefault ( ) ; a . stopPropagation ( ) } ) } else i . style . display = "none" } } ) ( wysihtml5 ) ;
( function ( b ) { var c = b . dom ; b . toolbar . Toolbar = Base . extend ( { constructor : function ( a , c ) { this . editor = a ; this . container = "string" === typeof c ? document . getElementById ( c ) : c ; this . composer = a . composer ; this . _getLinks ( "command" ) ; this . _getLinks ( "action" ) ; this . _observe ( ) ; this . show ( ) ; for ( var e = this . container . querySelectorAll ( "[data-wysihtml5-command=insertSpeech]" ) , f = e . length , g = 0 ; g < f ; g ++ ) new b . toolbar . Speech ( this , e [ g ] ) } , _getLinks : function ( a ) { for ( var c = this [ a + "Links" ] = b . lang . array ( this . container . querySelectorAll ( "[data-wysihtml5-" +
a + "]" ) ) . get ( ) , e = c . length , f = 0 , g = this [ a + "Mapping" ] = { } , i , h , k , j , n ; f < e ; f ++ ) i = c [ f ] , k = i . getAttribute ( "data-wysihtml5-" + a ) , j = i . getAttribute ( "data-wysihtml5-" + a + "-value" ) , h = this . container . querySelector ( "[data-wysihtml5-" + a + "-group='" + k + "']" ) , n = this . _getDialog ( i , k ) , g [ k + ":" + j ] = { link : i , group : h , name : k , value : j , dialog : n , state : ! 1 } } , _getDialog : function ( a , c ) { var e = this , f = this . container . querySelector ( "[data-wysihtml5-dialog='" + c + "']" ) , g , i ; f && ( g = new b . toolbar . Dialog ( a , f ) , g . observe ( "show" , function ( ) { i = e . composer . selection . getBookmark ( ) ;
e . editor . fire ( "show:dialog" , { command : c , dialogContainer : f , commandLink : a } ) } ) , g . observe ( "save" , function ( b ) { i && e . composer . selection . setBookmark ( i ) ; e . _execCommand ( c , b ) ; e . editor . fire ( "save:dialog" , { command : c , dialogContainer : f , commandLink : a } ) } ) , g . observe ( "cancel" , function ( ) { e . editor . focus ( ! 1 ) ; e . editor . fire ( "cancel:dialog" , { command : c , dialogContainer : f , commandLink : a } ) } ) ) ; return g } , execCommand : function ( a , b ) { if ( ! this . commandsDisabled ) { var c = this . commandMapping [ a + ":" + b ] ; c && c . dialog && ! c . state ? c . dialog . show ( ) :
this . _execCommand ( a , b ) } } , _execCommand : function ( a , b ) { this . editor . focus ( ! 1 ) ; this . composer . commands . exec ( a , b ) ; this . _updateLinkStates ( ) } , execAction : function ( a ) { var b = this . editor ; switch ( a ) { case "change_view" : b . currentView === b . textarea ? b . fire ( "change_view" , "composer" ) : b . fire ( "change_view" , "textarea" ) } } , _observe : function ( ) { for ( var a = this , b = this . editor , e = this . container , f = this . commandLinks . concat ( this . actionLinks ) , g = f . length , i = 0 ; i < g ; i ++ ) c . setAttributes ( { href : "javascript:;" , unselectable : "on" } ) . on ( f [ i ] ) ; c . delegate ( e ,
"[data-wysihtml5-command]" , "mousedown" , function ( a ) { a . preventDefault ( ) } ) ; c . delegate ( e , "[data-wysihtml5-command]" , "click" , function ( b ) { var c = this . getAttribute ( "data-wysihtml5-command" ) , d = this . getAttribute ( "data-wysihtml5-command-value" ) ; a . execCommand ( c , d ) ; b . preventDefault ( ) } ) ; c . delegate ( e , "[data-wysihtml5-action]" , "click" , function ( b ) { var c = this . getAttribute ( "data-wysihtml5-action" ) ; a . execAction ( c ) ; b . preventDefault ( ) } ) ; b . observe ( "focus:composer" , function ( ) { a . bookmark = null ; clearInterval ( a . interval ) ; a . interval =
setInterval ( function ( ) { a . _updateLinkStates ( ) } , 500 ) } ) ; b . observe ( "blur:composer" , function ( ) { clearInterval ( a . interval ) } ) ; b . observe ( "destroy:composer" , function ( ) { clearInterval ( a . interval ) } ) ; b . observe ( "change_view" , function ( b ) { setTimeout ( function ( ) { a . commandsDisabled = "composer" !== b ; a . _updateLinkStates ( ) ; a . commandsDisabled ? c . addClass ( e , "wysihtml5-commands-disabled" ) : c . removeClass ( e , "wysihtml5-commands-disabled" ) } , 0 ) } ) } , _updateLinkStates : function ( ) { var a = this . commandMapping , d = this . actionMapping , e , f , g ; for ( e in a ) if ( g =
a [ e ] , this . commandsDisabled ? ( f = ! 1 , c . removeClass ( g . link , "wysihtml5-command-active" ) , g . group && c . removeClass ( g . group , "wysihtml5-command-active" ) , g . dialog && g . dialog . hide ( ) ) : ( f = this . composer . commands . state ( g . name , g . value ) , b . lang . object ( f ) . isArray ( ) && ( f = 1 === f . length ? f [ 0 ] : ! 0 ) , c . removeClass ( g . link , "wysihtml5-command-disabled" ) , g . group && c . removeClass ( g . group , "wysihtml5-command-disabled" ) ) , g . state !== f ) ( g . state = f ) ? ( c . addClass ( g . link , "wysihtml5-command-active" ) , g . group && c . addClass ( g . group , "wysihtml5-command-active" ) ,
g . dialog && ( "object" === typeof f ? g . dialog . show ( f ) : g . dialog . hide ( ) ) ) : ( c . removeClass ( g . link , "wysihtml5-command-active" ) , g . group && c . removeClass ( g . group , "wysihtml5-command-active" ) , g . dialog && g . dialog . hide ( ) ) ; for ( e in d ) a = d [ e ] , "change_view" === a . name && ( a . state = this . editor . currentView === this . editor . textarea , a . state ? c . addClass ( a . link , "wysihtml5-action-active" ) : c . removeClass ( a . link , "wysihtml5-action-active" ) ) } , show : function ( ) { this . container . style . display = "" } , hide : function ( ) { this . container . style . display = "none" } } ) } ) ( wysihtml5 ) ;
( function ( b ) { var c = { name : void 0 , style : ! 0 , toolbar : void 0 , autoLink : ! 0 , parserRules : { tags : { br : { } , span : { } , div : { } , p : { } } , classes : { } } , parser : b . dom . parse , composerClassName : "wysihtml5-editor" , bodyClassName : "wysihtml5-supported" , stylesheets : [ ] , placeholderText : void 0 , allowObjectResizing : ! 0 , supportTouchDevices : ! 0 } ; b . Editor = b . lang . Dispatcher . extend ( { constructor : function ( a , d ) { this . textareaElement = "string" === typeof a ? document . getElementById ( a ) : a ; this . config = b . lang . object ( { } ) . merge ( c ) . merge ( d ) . get ( ) ; this . currentView =
this . textarea = new b . views . Textarea ( this , this . textareaElement , this . config ) ; this . _isCompatible = b . browser . supported ( ) ; if ( ! this . _isCompatible || ! this . config . supportTouchDevices && b . browser . isTouchDevice ( ) ) { var e = this ; setTimeout ( function ( ) { e . fire ( "beforeload" ) . fire ( "load" ) } , 0 ) } else { b . dom . addClass ( document . body , this . config . bodyClassName ) ; this . currentView = this . composer = new b . views . Composer ( this , this . textareaElement , this . config ) ; "function" === typeof this . config . parser && this . _initParser ( ) ; this . observe ( "beforeload" ,
function ( ) { this . synchronizer = new b . views . Synchronizer ( this , this . textarea , this . composer ) ; this . config . toolbar && ( this . toolbar = new b . toolbar . Toolbar ( this , this . config . toolbar ) ) } ) ; try { console . log ( "Heya! This page is using wysihtml5 for rich text editing. Check out https://github.com/xing/wysihtml5" ) } catch ( f ) { } } } , isCompatible : function ( ) { return this . _isCompatible } , clear : function ( ) { this . currentView . clear ( ) ; return this } , getValue : function ( a ) { return this . currentView . getValue ( a ) } , setValue : function ( a , b ) { if ( ! a ) return this . clear ( ) ;
this . currentView . setValue ( a , b ) ; return this } , focus : function ( a ) { this . currentView . focus ( a ) ; return this } , disable : function ( ) { this . currentView . disable ( ) ; return this } , enable : function ( ) { this . currentView . enable ( ) ; return this } , isEmpty : function ( ) { return this . currentView . isEmpty ( ) } , hasPlaceholderSet : function ( ) { return this . currentView . hasPlaceholderSet ( ) } , parse : function ( a ) { var c = this . config . parser ( a , this . config . parserRules , this . composer . sandbox . getDocument ( ) , ! 0 ) ; "object" === typeof a && b . quirks . redraw ( a ) ; return c } ,
_initParser : function ( ) { this . observe ( "paste:composer" , function ( ) { var a = this ; a . composer . selection . executeAndRestore ( function ( ) { b . quirks . cleanPastedHTML ( a . composer . element ) ; a . parse ( a . composer . element ) } , ! 0 ) } ) ; this . observe ( "paste:textarea" , function ( ) { this . textarea . setValue ( this . parse ( this . textarea . getValue ( ) ) ) } ) } } ) } ) ( wysihtml5 ) ;
! function ( $ , wysi ) {
"use strict" ;
var tpl = {
"font-styles" : function ( locale , options ) {
var size = ( options && options . size ) ? ' btn-' + options . size : '' ;
return "<li class='dropdown'>" +
"<a class='btn btn-default dropdown-toggle" + size + "' data-toggle='dropdown' href='#'>" +
"<i class='icon-font'></i> <span class='current-font'>" + locale . font _styles . normal + "</span> <b class='caret'></b>" +
"</a>" +
"<ul class='dropdown-menu'>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='div' tabindex='-1'>" + locale . font _styles . normal + "</a></li>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h1' tabindex='-1'>" + locale . font _styles . h1 + "</a></li>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h2' tabindex='-1'>" + locale . font _styles . h2 + "</a></li>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h3' tabindex='-1'>" + locale . font _styles . h3 + "</a></li>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h4'>" + locale . font _styles . h4 + "</a></li>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h5'>" + locale . font _styles . h5 + "</a></li>" +
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h6'>" + locale . font _styles . h6 + "</a></li>" +
"</ul>" +
"</li>" ;
} ,
"emphasis" : function ( locale , options ) {
var size = ( options && options . size ) ? ' btn-' + options . size : '' ;
return "<li>" +
"<div class='btn-group'>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='bold' title='CTRL+B' tabindex='-1'>B</a>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='italic' title='CTRL+I' tabindex='-1'>I</a>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='underline' title='CTRL+U' tabindex='-1'>U</a>" +
"</div>" +
"</li>" ;
} ,
"lists" : function ( locale , options ) {
var size = ( options && options . size ) ? ' btn-' + options . size : '' ;
return "<li>" +
"<div class='btn-group'>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='insertUnorderedList' title='" + locale . lists . unordered + "' tabindex='-1'><span class='glyphicon glyphicon-list'></span> </a>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='insertOrderedList' title='" + locale . lists . ordered + "' tabindex='-1'><span class='glyphicon glyphicon-th-list'></span> </a>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='Outdent' title='" + locale . lists . outdent + "' tabindex='-1'><span class='glyphicon glyphicon-indent-left'></span> </a>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='Indent' title='" + locale . lists . indent + "' tabindex='-1'><span class='glyphicon glyphicon-indent-right'></span> </a>" +
"</div>" +
"</li>" ;
} ,
"link" : function ( locale , options ) {
var size = ( options && options . size ) ? ' btn-' + options . size : '' ;
return "<li>" +
"<div class='bootstrap-wysihtml5-insert-link-modal modal hide fade'>" +
"<div class='modal-dialog'><div class='modal-content'>" +
"<div class='modal-header'>" +
"<a class='close' data-dismiss='modal'>×</a>" +
"<h3>" + locale . link . insert + "</h3>" +
"</div>" +
"<div class='modal-body'>" +
"<input value='http://' class='bootstrap-wysihtml5-insert-link-url input-xlarge'>" +
"</div>" +
"<div class='modal-footer'>" +
"<a href='#' class='btn' data-dismiss='modal'>" + locale . link . cancel + "</a>" +
"<a href='#' class='btn btn-primary' data-dismiss='modal'>" + locale . link . insert + "</a>" +
"</div>" +
"</div></div>" +
"</div>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='createLink' title='" + locale . link . insert + "' tabindex='-1'><span class='glyphicon glyphicon-share'></span> </a>" +
"</li>" ;
} ,
"image" : function ( locale , options ) {
var size = ( options && options . size ) ? ' btn-' + options . size : '' ;
return "<li>" +
"<div class='bootstrap-wysihtml5-insert-image-modal modal hide fade'>" +
"<div class='modal-dialog'><div class='modal-content'>" +
"<div class='modal-header'>" +
"<a class='close' data-dismiss='modal'>×</a>" +
"<h3>" + locale . image . insert + "</h3>" +
"</div>" +
"<div class='modal-body'>" +
"<input value='http://' class='bootstrap-wysihtml5-insert-image-url input-xlarge'>" +
"</div>" +
"<div class='modal-footer'>" +
"<a href='#' class='btn' data-dismiss='modal'>" + locale . image . cancel + "</a>" +
"<a href='#' class='btn btn-primary' data-dismiss='modal'>" + locale . image . insert + "</a>" +
"</div>" +
"</div></div>" +
"</div>" +
"<a class='btn btn-default" + size + "' data-wysihtml5-command='insertImage' title='" + locale . image . insert + "' tabindex='-1'><span class='glyphicon glyphicon-picture'></span> </a>" +
"</li>" ;
} ,
"color" : function ( locale , options ) {
var size = ( options && options . size ) ? ' btn-' + options . size : '' ;
return "<li class='dropdown'>" +
"<a class='btn btn-default dropdown-toggle" + size + "' data-toggle='dropdown' href='#' tabindex='-1'>" +
"<span class='current-color'>" + locale . colours . black + "</span> <b class='caret'></b>" +
"</a>" +
"<ul class='dropdown-menu'>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='black'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='black'>" + locale . colours . black + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='silver'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='silver'>" + locale . colours . silver + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='gray'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='gray'>" + locale . colours . gray + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='maroon'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='maroon'>" + locale . colours . maroon + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='red'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='red'>" + locale . colours . red + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='purple'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='purple'>" + locale . colours . purple + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='green'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='green'>" + locale . colours . green + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='olive'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='olive'>" + locale . colours . olive + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='navy'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='navy'>" + locale . colours . navy + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='blue'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='blue'>" + locale . colours . blue + "</a></li>" +
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='orange'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='orange'>" + locale . colours . orange + "</a></li>" +
"</ul>" +
"</li>" ;
}
} ;
var templates = function ( key , locale , options ) {
return tpl [ key ] ( locale , options ) ;
} ;
var Wysihtml5 = function ( el , options ) {
this . el = el ;
var toolbarOpts = options || defaultOptions ;
for ( var t in toolbarOpts . customTemplates ) {
tpl [ t ] = toolbarOpts . customTemplates [ t ] ;
}
this . toolbar = this . createToolbar ( el , toolbarOpts ) ;
this . editor = this . createEditor ( options ) ;
window . editor = this . editor ;
$ ( 'iframe.wysihtml5-sandbox' ) . each ( function ( i , el ) {
$ ( el . contentWindow ) . off ( 'focus.wysihtml5' ) . on ( {
'focus.wysihtml5' : function ( ) {
$ ( 'li.dropdown' ) . removeClass ( 'open' ) ;
}
} ) ;
} ) ;
} ;
Wysihtml5 . prototype = {
constructor : Wysihtml5 ,
createEditor : function ( options ) {
options = options || { } ;
// Add the toolbar to a clone of the options object so multiple instances
// of the WYISYWG don't break because "toolbar" is already defined
options = $ . extend ( true , { } , options ) ;
options . toolbar = this . toolbar [ 0 ] ;
var editor = new wysi . Editor ( this . el [ 0 ] , options ) ;
if ( options && options . events ) {
for ( var eventName in options . events ) {
editor . on ( eventName , options . events [ eventName ] ) ;
}
}
return editor ;
} ,
createToolbar : function ( el , options ) {
var self = this ;
var toolbar = $ ( "<ul/>" , {
'class' : "wysihtml5-toolbar" ,
'style' : "display:none"
} ) ;
var culture = options . locale || defaultOptions . locale || "en" ;
for ( var key in defaultOptions ) {
var value = false ;
if ( options [ key ] !== undefined ) {
if ( options [ key ] === true ) {
value = true ;
}
} else {
value = defaultOptions [ key ] ;
}
if ( value === true ) {
toolbar . append ( templates ( key , locale [ culture ] , options ) ) ;
if ( key === "link" ) {
this . initInsertLink ( toolbar ) ;
}
if ( key === "image" ) {
this . initInsertImage ( toolbar ) ;
}
}
}
if ( options . toolbar ) {
for ( key in options . toolbar ) {
toolbar . append ( options . toolbar [ key ] ) ;
}
}
toolbar . find ( "a[data-wysihtml5-command='formatBlock']" ) . click ( function ( e ) {
var target = e . target || e . srcElement ;
var el = $ ( target ) ;
self . toolbar . find ( '.current-font' ) . text ( el . html ( ) ) ;
} ) ;
toolbar . find ( "a[data-wysihtml5-command='foreColor']" ) . click ( function ( e ) {
var target = e . target || e . srcElement ;
var el = $ ( target ) ;
self . toolbar . find ( '.current-color' ) . text ( el . html ( ) ) ;
} ) ;
this . el . before ( toolbar ) ;
return toolbar ;
} ,
initHtml : function ( toolbar ) {
var changeViewSelector = "a[data-wysihtml5-action='change_view']" ;
toolbar . find ( changeViewSelector ) . click ( function ( e ) {
toolbar . find ( 'a.btn' ) . not ( changeViewSelector ) . toggleClass ( 'disabled' ) ;
} ) ;
} ,
initInsertImage : function ( toolbar ) {
var self = this ;
var insertImageModal = toolbar . find ( '.bootstrap-wysihtml5-insert-image-modal' ) ;
var urlInput = insertImageModal . find ( '.bootstrap-wysihtml5-insert-image-url' ) ;
var insertButton = insertImageModal . find ( 'a.btn-primary' ) ;
var initialValue = urlInput . val ( ) ;
var caretBookmark ;
var insertImage = function ( ) {
var url = urlInput . val ( ) ;
urlInput . val ( initialValue ) ;
self . editor . currentView . element . focus ( ) ;
if ( caretBookmark ) {
self . editor . composer . selection . setBookmark ( caretBookmark ) ;
caretBookmark = null ;
}
self . editor . composer . commands . exec ( "insertImage" , url ) ;
} ;
urlInput . keypress ( function ( e ) {
if ( e . which == 13 ) {
insertImage ( ) ;
insertImageModal . modal ( 'hide' ) ;
}
} ) ;
insertButton . click ( insertImage ) ;
insertImageModal . on ( 'shown' , function ( ) {
urlInput . focus ( ) ;
} ) ;
insertImageModal . on ( 'hide' , function ( ) {
self . editor . currentView . element . focus ( ) ;
} ) ;
toolbar . find ( 'a[data-wysihtml5-command=insertImage]' ) . click ( function ( ) {
var activeButton = $ ( this ) . hasClass ( "wysihtml5-command-active" ) ;
if ( ! activeButton ) {
self . editor . currentView . element . focus ( false ) ;
caretBookmark = self . editor . composer . selection . getBookmark ( ) ;
insertImageModal . appendTo ( 'body' ) . modal ( 'show' ) . removeClass ( 'hide' ) ;
insertImageModal . on ( 'click.dismiss.modal' , '[data-dismiss="modal"]' , function ( e ) {
e . stopPropagation ( ) ;
} ) ;
return false ;
}
else {
return true ;
}
} ) ;
} ,
initInsertLink : function ( toolbar ) {
var self = this ;
var insertLinkModal = toolbar . find ( '.bootstrap-wysihtml5-insert-link-modal' ) ;
var urlInput = insertLinkModal . find ( '.bootstrap-wysihtml5-insert-link-url' ) ;
var targetInput = insertLinkModal . find ( '.bootstrap-wysihtml5-insert-link-target' ) ;
var insertButton = insertLinkModal . find ( 'a.btn-primary' ) ;
var initialValue = urlInput . val ( ) ;
var caretBookmark ;
var insertLink = function ( ) {
var url = urlInput . val ( ) ;
urlInput . val ( initialValue ) ;
self . editor . currentView . element . focus ( ) ;
if ( caretBookmark ) {
self . editor . composer . selection . setBookmark ( caretBookmark ) ;
caretBookmark = null ;
}
var newWindow = targetInput . prop ( "checked" ) ;
self . editor . composer . commands . exec ( "createLink" , {
'href' : url ,
2015-02-11 19:02:08 +01:00
'rel' : 'external' ,
2014-04-23 22:15:07 +02:00
'target' : '_blank'
} ) ;
} ;
var pressedEnter = false ;
urlInput . keypress ( function ( e ) {
if ( e . which == 13 ) {
insertLink ( ) ;
insertLinkModal . modal ( 'hide' ) ;
}
} ) ;
insertButton . click ( insertLink ) ;
insertLinkModal . on ( 'shown' , function ( ) {
urlInput . focus ( ) ;
} ) ;
insertLinkModal . on ( 'hide' , function ( ) {
self . editor . currentView . element . focus ( ) ;
} ) ;
toolbar . find ( 'a[data-wysihtml5-command=createLink]' ) . click ( function ( ) {
var activeButton = $ ( this ) . hasClass ( "wysihtml5-command-active" ) ;
if ( ! activeButton ) {
self . editor . currentView . element . focus ( false ) ;
caretBookmark = self . editor . composer . selection . getBookmark ( ) ;
insertLinkModal . appendTo ( 'body' ) . modal ( 'show' ) . removeClass ( 'hide' ) ;
insertLinkModal . on ( 'click.dismiss.modal' , '[data-dismiss="modal"]' , function ( e ) {
e . stopPropagation ( ) ;
} ) ;
return false ;
}
else {
return true ;
}
} ) ;
}
} ;
// these define our public api
var methods = {
resetDefaults : function ( ) {
$ . fn . wysihtml5 . defaultOptions = $ . extend ( true , { } , $ . fn . wysihtml5 . defaultOptionsCache ) ;
} ,
bypassDefaults : function ( options ) {
return this . each ( function ( ) {
var $this = $ ( this ) ;
$this . data ( 'wysihtml5' , new Wysihtml5 ( $this , options ) ) ;
} ) ;
} ,
shallowExtend : function ( options ) {
var settings = $ . extend ( { } , $ . fn . wysihtml5 . defaultOptions , options || { } , $ ( this ) . data ( ) ) ;
var that = this ;
return methods . bypassDefaults . apply ( that , [ settings ] ) ;
} ,
deepExtend : function ( options ) {
var settings = $ . extend ( true , { } , $ . fn . wysihtml5 . defaultOptions , options || { } ) ;
var that = this ;
return methods . bypassDefaults . apply ( that , [ settings ] ) ;
} ,
init : function ( options ) {
var that = this ;
return methods . shallowExtend . apply ( that , [ options ] ) ;
}
} ;
$ . fn . wysihtml5 = function ( method ) {
if ( methods [ method ] ) {
return methods [ method ] . apply ( this , Array . prototype . slice . call ( arguments , 1 ) ) ;
} else if ( typeof method === 'object' || ! method ) {
return methods . init . apply ( this , arguments ) ;
} else {
$ . error ( 'Method ' + method + ' does not exist on jQuery.wysihtml5' ) ;
}
} ;
$ . fn . wysihtml5 . Constructor = Wysihtml5 ;
var defaultOptions = $ . fn . wysihtml5 . defaultOptions = {
"font-styles" : true ,
"color" : true ,
"emphasis" : true ,
"lists" : true ,
"link" : true ,
"image" : true ,
"size" : 'sm' ,
events : { } ,
parserRules : {
classes : {
// (path_to_project/lib/css/wysiwyg-color.css)
"wysiwyg-color-silver" : 1 ,
"wysiwyg-color-gray" : 1 ,
"wysiwyg-color-white" : 1 ,
"wysiwyg-color-maroon" : 1 ,
"wysiwyg-color-red" : 1 ,
"wysiwyg-color-purple" : 1 ,
"wysiwyg-color-fuchsia" : 1 ,
"wysiwyg-color-green" : 1 ,
"wysiwyg-color-lime" : 1 ,
"wysiwyg-color-olive" : 1 ,
"wysiwyg-color-yellow" : 1 ,
"wysiwyg-color-navy" : 1 ,
"wysiwyg-color-blue" : 1 ,
"wysiwyg-color-teal" : 1 ,
"wysiwyg-color-aqua" : 1 ,
"wysiwyg-color-orange" : 1
} ,
tags : {
"b" : { } ,
"i" : { } ,
"br" : { } ,
"ol" : { } ,
"ul" : { } ,
"li" : { } ,
"h1" : { } ,
"h2" : { } ,
"h3" : { } ,
"h4" : { } ,
"h5" : { } ,
"h6" : { } ,
"blockquote" : { } ,
"u" : 1 ,
"img" : {
"check_attributes" : {
"width" : "numbers" ,
"alt" : "alt" ,
"src" : "url" ,
"height" : "numbers"
}
} ,
"a" : {
check _attributes : {
'href' : "url" , // important to avoid XSS
'target' : 'alt' ,
'rel' : 'alt'
}
} ,
"span" : 1 ,
"div" : 1 ,
// to allow save and edit files with code tag hacks
"code" : 1 ,
"pre" : 1
}
} ,
2014-05-06 16:44:34 +02:00
stylesheets : [ "./css/wysiwyg-color.css" ] , // (path_to_project/lib/css/wysiwyg-color.css)
2014-04-23 22:15:07 +02:00
locale : "en"
} ;
if ( typeof $ . fn . wysihtml5 . defaultOptionsCache === 'undefined' ) {
$ . fn . wysihtml5 . defaultOptionsCache = $ . extend ( true , { } , $ . fn . wysihtml5 . defaultOptions ) ;
}
var locale = $ . fn . wysihtml5 . locale = {
en : {
font _styles : {
normal : "Normal text" ,
h1 : "Heading 1" ,
h2 : "Heading 2" ,
h3 : "Heading 3" ,
h4 : "Heading 4" ,
h5 : "Heading 5" ,
h6 : "Heading 6"
} ,
emphasis : {
bold : "Bold" ,
italic : "Italic" ,
underline : "Underline"
} ,
lists : {
unordered : "Unordered list" ,
ordered : "Ordered list" ,
outdent : "Outdent" ,
indent : "Indent"
} ,
link : {
insert : "Insert link" ,
cancel : "Cancel" ,
target : "Open link in new window"
} ,
image : {
insert : "Insert image" ,
cancel : "Cancel"
} ,
html : {
edit : "Edit HTML"
} ,
colours : {
black : "Black" ,
silver : "Silver" ,
gray : "Grey" ,
maroon : "Maroon" ,
red : "Red" ,
purple : "Purple" ,
green : "Green" ,
olive : "Olive" ,
navy : "Navy" ,
blue : "Blue" ,
orange : "Orange"
}
}
} ;
} ( window . jQuery , window . wysihtml5 ) ;