- asciiMap : {
- 128: '€',
- 130: '‚',
- 131: 'ƒ',
- 132: '„',
- 133: '…',
- 134: '†',
- 135: '‡',
- 136: 'ˆ',
- 137: '‰',
- 138: 'Š',
- 139: '‹',
- 140: 'Œ',
- 142: 'Ž',
- 145: '‘',
- 146: '’',
- 147: '“',
- 148: '”',
- 149: '•',
- 150: '–',
- 151: '—',
- 152: '˜',
- 153: '™',
- 154: 'š',
- 155: '›',
- 156: 'œ',
- 158: 'ž',
- 159: 'Ÿ'
- },
- // Raw entities
- baseEntities : {
- '"': '"',
- // Needs to be escaped since the YUI compressor would otherwise break the code
- '\'': ''',
- '<': '<',
- '>': '>',
- '&': '&',
- '`': '`'
- },
- // Reverse lookup table for raw entities
- reverseEntities : {
- '<': '<',
- '>': '>',
- '&': '&',
- '"': '"',
- ''': '\''
- },
-
- attrsCharsRegExp : /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
- textCharsRegExp : /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
- rawCharsRegExp : /[<>&\"\']/g,
- entityRegExp : /&#([a-z0-9]+);?|&([a-z0-9]+);/gi,
- namedEntities : false,
- namedEntitiesData : [
- '50',
- 'nbsp',
- '51',
- 'iexcl',
- '52',
- 'cent',
- '53',
- 'pound',
- '54',
- 'curren',
- '55',
- 'yen',
- '56',
- 'brvbar',
- '57',
- 'sect',
- '58',
- 'uml',
- '59',
- 'copy',
- '5a',
- 'ordf',
- '5b',
- 'laquo',
- '5c',
- 'not',
- '5d',
- 'shy',
- '5e',
- 'reg',
- '5f',
- 'macr',
- '5g',
- 'deg',
- '5h',
- 'plusmn',
- '5i',
- 'sup2',
- '5j',
- 'sup3',
- '5k',
- 'acute',
- '5l',
- 'micro',
- '5m',
- 'para',
- '5n',
- 'middot',
- '5o',
- 'cedil',
- '5p',
- 'sup1',
- '5q',
- 'ordm',
- '5r',
- 'raquo',
- '5s',
- 'frac14',
- '5t',
- 'frac12',
- '5u',
- 'frac34',
- '5v',
- 'iquest',
- '60',
- 'Agrave',
- '61',
- 'Aacute',
- '62',
- 'Acirc',
- '63',
- 'Atilde',
- '64',
- 'Auml',
- '65',
- 'Aring',
- '66',
- 'AElig',
- '67',
- 'Ccedil',
- '68',
- 'Egrave',
- '69',
- 'Eacute',
- '6a',
- 'Ecirc',
- '6b',
- 'Euml',
- '6c',
- 'Igrave',
- '6d',
- 'Iacute',
- '6e',
- 'Icirc',
- '6f',
- 'Iuml',
- '6g',
- 'ETH',
- '6h',
- 'Ntilde',
- '6i',
- 'Ograve',
- '6j',
- 'Oacute',
- '6k',
- 'Ocirc',
- '6l',
- 'Otilde',
- '6m',
- 'Ouml',
- '6n',
- 'times',
- '6o',
- 'Oslash',
- '6p',
- 'Ugrave',
- '6q',
- 'Uacute',
- '6r',
- 'Ucirc',
- '6s',
- 'Uuml',
- '6t',
- 'Yacute',
- '6u',
- 'THORN',
- '6v',
- 'szlig',
- '70',
- 'agrave',
- '71',
- 'aacute',
- '72',
- 'acirc',
- '73',
- 'atilde',
- '74',
- 'auml',
- '75',
- 'aring',
- '76',
- 'aelig',
- '77',
- 'ccedil',
- '78',
- 'egrave',
- '79',
- 'eacute',
- '7a',
- 'ecirc',
- '7b',
- 'euml',
- '7c',
- 'igrave',
- '7d',
- 'iacute',
- '7e',
- 'icirc',
- '7f',
- 'iuml',
- '7g',
- 'eth',
- '7h',
- 'ntilde',
- '7i',
- 'ograve',
- '7j',
- 'oacute',
- '7k',
- 'ocirc',
- '7l',
- 'otilde',
- '7m',
- 'ouml',
- '7n',
- 'divide',
- '7o',
- 'oslash',
- '7p',
- 'ugrave',
- '7q',
- 'uacute',
- '7r',
- 'ucirc',
- '7s',
- 'uuml',
- '7t',
- 'yacute',
- '7u',
- 'thorn',
- '7v',
- 'yuml',
- 'ci',
- 'fnof',
- 'sh',
- 'Alpha',
- 'si',
- 'Beta',
- 'sj',
- 'Gamma',
- 'sk',
- 'Delta',
- 'sl',
- 'Epsilon',
- 'sm',
- 'Zeta',
- 'sn',
- 'Eta',
- 'so',
- 'Theta',
- 'sp',
- 'Iota',
- 'sq',
- 'Kappa',
- 'sr',
- 'Lambda',
- 'ss',
- 'Mu',
- 'st',
- 'Nu',
- 'su',
- 'Xi',
- 'sv',
- 'Omicron',
- 't0',
- 'Pi',
- 't1',
- 'Rho',
- 't3',
- 'Sigma',
- 't4',
- 'Tau',
- 't5',
- 'Upsilon',
- 't6',
- 'Phi',
- 't7',
- 'Chi',
- 't8',
- 'Psi',
- 't9',
- 'Omega',
- 'th',
- 'alpha',
- 'ti',
- 'beta',
- 'tj',
- 'gamma',
- 'tk',
- 'delta',
- 'tl',
- 'epsilon',
- 'tm',
- 'zeta',
- 'tn',
- 'eta',
- 'to',
- 'theta',
- 'tp',
- 'iota',
- 'tq',
- 'kappa',
- 'tr',
- 'lambda',
- 'ts',
- 'mu',
- 'tt',
- 'nu',
- 'tu',
- 'xi',
- 'tv',
- 'omicron',
- 'u0',
- 'pi',
- 'u1',
- 'rho',
- 'u2',
- 'sigmaf',
- 'u3',
- 'sigma',
- 'u4',
- 'tau',
- 'u5',
- 'upsilon',
- 'u6',
- 'phi',
- 'u7',
- 'chi',
- 'u8',
- 'psi',
- 'u9',
- 'omega',
- 'uh',
- 'thetasym',
- 'ui',
- 'upsih',
- 'um',
- 'piv',
- '812',
- 'bull',
- '816',
- 'hellip',
- '81i',
- 'prime',
- '81j',
- 'Prime',
- '81u',
- 'oline',
- '824',
- 'frasl',
- '88o',
- 'weierp',
- '88h',
- 'image',
- '88s',
- 'real',
- '892',
- 'trade',
- '89l',
- 'alefsym',
- '8cg',
- 'larr',
- '8ch',
- 'uarr',
- '8ci',
- 'rarr',
- '8cj',
- 'darr',
- '8ck',
- 'harr',
- '8dl',
- 'crarr',
- '8eg',
- 'lArr',
- '8eh',
- 'uArr',
- '8ei',
- 'rArr',
- '8ej',
- 'dArr',
- '8ek',
- 'hArr',
- '8g0',
- 'forall',
- '8g2',
- 'part',
- '8g3',
- 'exist',
- '8g5',
- 'empty',
- '8g7',
- 'nabla',
- '8g8',
- 'isin',
- '8g9',
- 'notin',
- '8gb',
- 'ni',
- '8gf',
- 'prod',
- '8gh',
- 'sum',
- '8gi',
- 'minus',
- '8gn',
- 'lowast',
- '8gq',
- 'radic',
- '8gt',
- 'prop',
- '8gu',
- 'infin',
- '8h0',
- 'ang',
- '8h7',
- 'and',
- '8h8',
- 'or',
- '8h9',
- 'cap',
- '8ha',
- 'cup',
- '8hb',
- 'int',
- '8hk',
- 'there4',
- '8hs',
- 'sim',
- '8i5',
- 'cong',
- '8i8',
- 'asymp',
- '8j0',
- 'ne',
- '8j1',
- 'equiv',
- '8j4',
- 'le',
- '8j5',
- 'ge',
- '8k2',
- 'sub',
- '8k3',
- 'sup',
- '8k4',
- 'nsub',
- '8k6',
- 'sube',
- '8k7',
- 'supe',
- '8kl',
- 'oplus',
- '8kn',
- 'otimes',
- '8l5',
- 'perp',
- '8m5',
- 'sdot',
- '8o8',
- 'lceil',
- '8o9',
- 'rceil',
- '8oa',
- 'lfloor',
- '8ob',
- 'rfloor',
- '8p9',
- 'lang',
- '8pa',
- 'rang',
- '9ea',
- 'loz',
- '9j0',
- 'spades',
- '9j3',
- 'clubs',
- '9j5',
- 'hearts',
- '9j6',
- 'diams',
- 'ai',
- 'OElig',
- 'aj',
- 'oelig',
- 'b0',
- 'Scaron',
- 'b1',
- 'scaron',
- 'bo',
- 'Yuml',
- 'm6',
- 'circ',
- 'ms',
- 'tilde',
- '802',
- 'ensp',
- '803',
- 'emsp',
- '809',
- 'thinsp',
- '80c',
- 'zwnj',
- '80d',
- 'zwj',
- '80e',
- 'lrm',
- '80f',
- 'rlm',
- '80j',
- 'ndash',
- '80k',
- 'mdash',
- '80o',
- 'lsquo',
- '80p',
- 'rsquo',
- '80q',
- 'sbquo',
- '80s',
- 'ldquo',
- '80t',
- 'rdquo',
- '80u',
- 'bdquo',
- '810',
- 'dagger',
- '811',
- 'Dagger',
- '81g',
- 'permil',
- '81p',
- 'lsaquo',
- '81q',
- 'rsaquo',
- '85c',
- 'euro'
- ],
-
-
- /**
- * Encodes the specified string using raw entities. This means only the required XML base entities will be encoded.
- *
- * @method encodeRaw
- * @param {String} text Text to encode.
- * @param {Boolean} attr Optional flag to specify if the text is attribute contents.
- * @return {String} Entity encoded text.
- */
- encodeRaw: function(text, attr)
- {
- var t = this;
- return text.replace(attr ? this.attrsCharsRegExp : this.textCharsRegExp, function(chr) {
- return t.baseEntities[chr] || chr;
- });
- },
- /**
- * Encoded the specified text with both the attributes and text entities. This function will produce larger text contents
- * since it doesn't know if the context is within a attribute or text node. This was added for compatibility
- * and is exposed as the DOMUtils.encode function.
- *
- * @method encodeAllRaw
- * @param {String} text Text to encode.
- * @return {String} Entity encoded text.
- */
- encodeAllRaw: function(text) {
- var t = this;
- return ('' + text).replace(this.rawCharsRegExp, function(chr) {
- return t.baseEntities[chr] || chr;
- });
- },
- /**
- * Encodes the specified string using numeric entities. The core entities will be
- * encoded as named ones but all non lower ascii characters will be encoded into numeric entities.
- *
- * @method encodeNumeric
- * @param {String} text Text to encode.
- * @param {Boolean} attr Optional flag to specify if the text is attribute contents.
- * @return {String} Entity encoded text.
- */
- encodeNumeric: function(text, attr) {
- var t = this;
- return text.replace(attr ? this.attrsCharsRegExp : this.textCharsRegExp, function(chr) {
- // Multi byte sequence convert it to a single entity
- if (chr.length > 1) {
- return '&#' + (1024 * (chr.charCodeAt(0) - 55296) + (chr.charCodeAt(1) - 56320) + 65536) + ';';
- }
- return t.baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';';
- });
- },
- /**
- * Encodes the specified string using named entities. The core entities will be encoded
- * as named ones but all non lower ascii characters will be encoded into named entities.
- *
- * @method encodeNamed
- * @param {String} text Text to encode.
- * @param {Boolean} attr Optional flag to specify if the text is attribute contents.
- * @param {Object} entities Optional parameter with entities to use.
- * @return {String} Entity encoded text.
- */
- encodeNamed: function(text, attr, entities) {
- var t = this;
- entities = entities || this.namedEntities;
- return text.replace(attr ? this.attrsCharsRegExp : this.textCharsRegExp, function(chr) {
- return t.baseEntities[chr] || entities[chr] || chr;
- });
- },
- /**
- * Returns an encode function based on the name(s) and it's optional entities.
- *
- * @method getEncodeFunc
- * @param {String} name Comma separated list of encoders for example named,numeric.
- * @param {String} entities Optional parameter with entities to use instead of the built in set.
- * @return {function} Encode function to be used.
- */
- getEncodeFunc: function(name, entities) {
- entities = this.buildEntitiesLookup(entities) || this.namedEntities;
- var t = this;
- function encodeNamedAndNumeric(text, attr) {
- return text.replace(attr ? t.attrsCharsRegExp : t.textCharsRegExp, function(chr) {
- return t.baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr;
- });
- }
-
- function encodeCustomNamed(text, attr) {
- return t.encodeNamed(text, attr, entities);
- }
- // Replace + with , to be compatible with previous TinyMCE versions
- name = this.makeMap(name.replace(/\+/g, ','));
- // Named and numeric encoder
- if (name.named && name.numeric) {
- return this.encodeNamedAndNumeric;
- }
- // Named encoder
- if (name.named) {
- // Custom names
- if (entities) {
- return encodeCustomNamed;
- }
- return this.encodeNamed;
- }
- // Numeric
- if (name.numeric) {
- return this.encodeNumeric;
- }
- // Raw encoder
- return this.encodeRaw;
- },
- /**
- * Decodes the specified string, this will replace entities with raw UTF characters.
- *
- * @method decode
- * @param {String} text Text to entity decode.
- * @return {String} Entity decoded string.
- */
- decode: function(text)
- {
- var t = this;
- return text.replace(this.entityRegExp, function(all, numeric) {
- if (numeric) {
- numeric = 'x' === numeric.charAt(0).toLowerCase() ? parseInt(numeric.substr(1), 16) : parseInt(numeric, 10);
- // Support upper UTF
- if (numeric > 65535) {
- numeric -= 65536;
- return String.fromCharCode(55296 + (numeric >> 10), 56320 + (1023 & numeric));
- }
- return t.asciiMap[numeric] || String.fromCharCode(numeric);
- }
- return t.reverseEntities[all] || t.namedEntities[all] || t.nativeDecode(all);
- });
- },
- nativeDecode : function (text) {
- return text;
- },
- makeMap : function (items, delim, map) {
- var i;
- items = items || [];
- delim = delim || ',';
- if (typeof items == "string") {
- items = items.split(delim);
- }
- map = map || {};
- i = items.length;
- while (i--) {
- map[items[i]] = {};
- }
- return map;
- }
-};
-
-
-
-Roo.htmleditor.TidyEntities.init();
-/**
- * @class Roo.htmleditor.KeyEnter
- * Handle Enter press..
- * @cfg {Roo.HtmlEditorCore} core the editor.
- * @constructor
- * Create a new Filter.
- * @param {Object} config Configuration options
- */
-
-
-
-
-
-Roo.htmleditor.KeyEnter = function(cfg) {
- Roo.apply(this, cfg);
- // this does not actually call walk as it's really just a abstract class
-
- Roo.get(this.core.doc.body).on('keypress', this.keypress, this);
-}
-
-//Roo.htmleditor.KeyEnter.i = 0;
-
-
-Roo.htmleditor.KeyEnter.prototype = {
-
- core : false,
-
- keypress : function(e)
- {
- if (e.charCode != 13 && e.charCode != 10) {
- Roo.log([e.charCode,e]);
- return true;
- }
- e.preventDefault();
- // https://stackoverflow.com/questions/18552336/prevent-contenteditable-adding-div-on-enter-chrome
- var doc = this.core.doc;
- //add a new line
-
-
- var sel = this.core.getSelection();
- var range = sel.getRangeAt(0);
- var n = range.commonAncestorContainer;
- var pc = range.closest([ 'ol', 'ul']);
- var pli = range.closest('li');
- if (!pc || e.ctrlKey) {
- // on it list, or ctrl pressed.
- if (!e.ctrlKey) {
- sel.insertNode('br', 'after');
- } else {
- // only do this if we have ctrl key..
- var br = doc.createElement('br');
- br.className = 'clear';
- br.setAttribute('style', 'clear: both');
- sel.insertNode(br, 'after');
- }
-
-
- this.core.undoManager.addEvent();
- this.core.fireEditorEvent(e);
- return false;
- }
-
- // deal with <li> insetion
- if (pli.innerText.trim() == '' &&
- pli.previousSibling &&
- pli.previousSibling.nodeName == 'LI' &&
- pli.previousSibling.innerText.trim() == '') {
- pli.parentNode.removeChild(pli.previousSibling);
- sel.cursorAfter(pc);
- this.core.undoManager.addEvent();
- this.core.fireEditorEvent(e);
- return false;
- }
-
- var li = doc.createElement('LI');
- li.innerHTML = ' ';
- if (!pli || !pli.firstSibling) {
- pc.appendChild(li);
- } else {
- pli.parentNode.insertBefore(li, pli.firstSibling);
- }
- sel.cursorText (li.firstChild);
-
- this.core.undoManager.addEvent();
- this.core.fireEditorEvent(e);
-
- return false;
-
-
-
-
-
- }
-};
-
-/**
- * @class Roo.htmleditor.Block
- * Base class for html editor blocks - do not use it directly .. extend it..
- * @cfg {DomElement} node The node to apply stuff to.
- * @cfg {String} friendly_name the name that appears in the context bar about this block
- * @cfg {Object} Context menu - see Roo.form.HtmlEditor.ToolbarContext
-
- * @constructor
- * Create a new Filter.
- * @param {Object} config Configuration options
- */
-
-Roo.htmleditor.Block = function(cfg)
-{
- // do nothing .. should not be called really.
-}
-/**
- * factory method to get the block from an element (using cache if necessary)
- * @static
- * @param {HtmlElement} the dom element
- */
-Roo.htmleditor.Block.factory = function(node)
-{
- var cc = Roo.htmleditor.Block.cache;
- var id = Roo.get(node).id;
- if (typeof(cc[id]) != 'undefined' && (!cc[id].node || cc[id].node.closest('body'))) {
- Roo.htmleditor.Block.cache[id].readElement(node);
- return Roo.htmleditor.Block.cache[id];
- }
- var db = node.getAttribute('data-block');
- if (!db) {
- db = node.nodeName.toLowerCase().toUpperCaseFirst();
- }
- var cls = Roo.htmleditor['Block' + db];
- if (typeof(cls) == 'undefined') {
- //Roo.log(node.getAttribute('data-block'));
- Roo.log("OOps missing block : " + 'Block' + db);
- return false;
- }
- Roo.htmleditor.Block.cache[id] = new cls({ node: node });
- return Roo.htmleditor.Block.cache[id]; /// should trigger update element
-};
-
-/**
- * initalize all Elements from content that are 'blockable'
- * @static
- * @param the body element
- */
-Roo.htmleditor.Block.initAll = function(body, type)
-{
- if (typeof(type) == 'undefined') {
- var ia = Roo.htmleditor.Block.initAll;
- ia(body,'table');
- ia(body,'td');
- ia(body,'figure');
- return;
- }
- Roo.each(Roo.get(body).query(type), function(e) {
- Roo.htmleditor.Block.factory(e);
- },this);
-};
-// question goes here... do we need to clear out this cache sometimes?
-// or show we make it relivant to the htmleditor.
-Roo.htmleditor.Block.cache = {};
-
-Roo.htmleditor.Block.prototype = {
-
- node : false,
-
- // used by context menu
- friendly_name : 'Based Block',
-
- // text for button to delete this element
- deleteTitle : false,
-
- context : false,
- /**
- * Update a node with values from this object
- * @param {DomElement} node
- */
- updateElement : function(node)
- {
- Roo.DomHelper.update(node === undefined ? this.node : node, this.toObject());
- },
- /**
- * convert to plain HTML for calling insertAtCursor..
- */
- toHTML : function()
- {
- return Roo.DomHelper.markup(this.toObject());
- },
- /**
- * used by readEleemnt to extract data from a node
- * may need improving as it's pretty basic
-
- * @param {DomElement} node
- * @param {String} tag - tag to find, eg. IMG ?? might be better to use DomQuery ?
- * @param {String} attribute (use html - for contents, style for using next param as style, or false to return the node)
- * @param {String} style the style property - eg. text-align
- */
- getVal : function(node, tag, attr, style)
- {
- var n = node;
- if (tag !== true && n.tagName != tag.toUpperCase()) {
- // in theory we could do figure[3] << 3rd figure? or some more complex search..?
- // but kiss for now.
- n = node.getElementsByTagName(tag).item(0);
- }
- if (!n) {
- return '';
- }
- if (attr === false) {
- return n;
- }
- if (attr == 'html') {
- return n.innerHTML;
- }
- if (attr == 'style') {
- return n.style[style];
- }
-
- return n.hasAttribute(attr) ? n.getAttribute(attr) : '';
-
- },
- /**
- * create a DomHelper friendly object - for use with
- * Roo.DomHelper.markup / overwrite / etc..
- * (override this)
- */
- toObject : function()
- {
- return {};
- },
- /**
- * Read a node that has a 'data-block' property - and extract the values from it.
- * @param {DomElement} node - the node
- */
- readElement : function(node)
- {
-
- }
-
-
-};
-
-
-
-/**
- * @class Roo.htmleditor.BlockFigure
- * Block that has an image and a figcaption
- * @cfg {String} image_src the url for the image
- * @cfg {String} align (left|right) alignment for the block default left
- * @cfg {String} caption the text to appear below (and in the alt tag)
- * @cfg {String} caption_display (block|none) display or not the caption
- * @cfg {String|number} image_width the width of the image number or %?
- * @cfg {String|number} image_height the height of the image number or %?
- *
- * @constructor
- * Create a new Filter.
- * @param {Object} config Configuration options
- */
-
-Roo.htmleditor.BlockFigure = function(cfg)
-{
- if (cfg.node) {
- this.readElement(cfg.node);
- this.updateElement(cfg.node);
- }
- Roo.apply(this, cfg);
-}
-Roo.extend(Roo.htmleditor.BlockFigure, Roo.htmleditor.Block, {
-
-
- // setable values.
- image_src: '',
- align: 'center',
- caption : '',
- caption_display : 'block',
- width : '100%',
- cls : '',
- href: '',
- video_url : '',
-
- // margin: '2%', not used
-
- text_align: 'left', // (left|right) alignment for the text caption default left. - not used at present
-
-
- // used by context menu
- friendly_name : 'Image with caption',
- deleteTitle : "Delete Image and Caption",
-
- contextMenu : function(toolbar)
- {
-
- var block = function() {
- return Roo.htmleditor.Block.factory(toolbar.tb.selectedNode);
- };
-
-
- var rooui = typeof(Roo.bootstrap) == 'undefined' ? Roo : Roo.bootstrap;
-
- var syncValue = toolbar.editorcore.syncValue;
-
- var fields = {};
-
- return [
- {
- xtype : 'TextItem',
- text : "Source: ",
- xns : rooui.Toolbar //Boostrap?
- },
- {
- xtype : 'Button',
- text: 'Change Image URL',
-
- listeners : {
- click: function (btn, state)
- {
- var b = block();
-
- Roo.MessageBox.show({
- title : "Image Source URL",
- msg : "Enter the url for the image",
- buttons: Roo.MessageBox.OKCANCEL,
- fn: function(btn, val){
- if (btn != 'ok') {
- return;
- }
- b.image_src = val;
- b.updateElement();
- syncValue();
- toolbar.editorcore.onEditorEvent();
- },
- minWidth:250,
- prompt:true,
- //multiline: multiline,
- modal : true,
- value : b.image_src
- });
- }
- },
- xns : rooui.Toolbar
- },
-
- {
- xtype : 'Button',
- text: 'Change Link URL',
-
- listeners : {
- click: function (btn, state)
- {
- var b = block();
-
- Roo.MessageBox.show({
- title : "Link URL",
- msg : "Enter the url for the link - leave blank to have no link",
- buttons: Roo.MessageBox.OKCANCEL,
- fn: function(btn, val){
- if (btn != 'ok') {
- return;
- }
- b.href = val;
- b.updateElement();
- syncValue();
- toolbar.editorcore.onEditorEvent();
- },
- minWidth:250,
- prompt:true,
- //multiline: multiline,
- modal : true,
- value : b.href
- });
- }
- },
- xns : rooui.Toolbar
- },
- {
- xtype : 'Button',
- text: 'Show Video URL',
-
- listeners : {
- click: function (btn, state)
- {
- Roo.MessageBox.alert("Video URL",
- block().video_url == '' ? 'This image is not linked ot a video' :
- 'The image is linked to: <a target="_new" href="' + block().video_url + '">' + block().video_url + '</a>');
- }
- },
- xns : rooui.Toolbar
- },
-
-
- {
- xtype : 'TextItem',
- text : "Width: ",
- xns : rooui.Toolbar //Boostrap?
- },
- {
- xtype : 'ComboBox',
- allowBlank : false,
- displayField : 'val',
- editable : true,
- listWidth : 100,
- triggerAction : 'all',
- typeAhead : true,
- valueField : 'val',
- width : 70,
- name : 'width',
- listeners : {
- select : function (combo, r, index)
- {
- toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
- var b = block();
- b.width = r.get('val');
- b.updateElement();
- syncValue();
- toolbar.editorcore.onEditorEvent();
- }
- },
- xns : rooui.form,
- store : {
- xtype : 'SimpleStore',
- data : [
- ['100%'],
- ['80%'],
- ['50%'],
- ['20%'],
- ['10%']
- ],
- fields : [ 'val'],
- xns : Roo.data
- }
- },
- {
- xtype : 'TextItem',
- text : "Align: ",
- xns : rooui.Toolbar //Boostrap?
- },
- {
- xtype : 'ComboBox',
- allowBlank : false,
- displayField : 'val',
- editable : true,
- listWidth : 100,
- triggerAction : 'all',
- typeAhead : true,
- valueField : 'val',
- width : 70,
- name : 'align',
- listeners : {
- select : function (combo, r, index)
- {
- toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
- var b = block();
- b.align = r.get('val');
- b.updateElement();
- syncValue();
- toolbar.editorcore.onEditorEvent();
- }
- },
- xns : rooui.form,
- store : {
- xtype : 'SimpleStore',
- data : [
- ['left'],
- ['right'],
- ['center']
- ],
- fields : [ 'val'],
- xns : Roo.data
- }
- },
-
-
- {
- xtype : 'Button',
- text: 'Hide Caption',
- name : 'caption_display',
- pressed : false,
- enableToggle : true,
- setValue : function(v) {
- // this trigger toggle.
-
- this.setText(v ? "Hide Caption" : "Show Caption");
- this.setPressed(v != 'block');
- },
- listeners : {
- toggle: function (btn, state)
- {
- var b = block();
- b.caption_display = b.caption_display == 'block' ? 'none' : 'block';
- this.setText(b.caption_display == 'block' ? "Hide Caption" : "Show Caption");
- b.updateElement();
- syncValue();
- toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
- toolbar.editorcore.onEditorEvent();
- }
- },
- xns : rooui.Toolbar
- }
- ];
-
- },
- /**
- * create a DomHelper friendly object - for use with
- * Roo.DomHelper.markup / overwrite / etc..