more styling
authorAlan <alan@roojs.com>
Tue, 22 Feb 2022 09:34:22 +0000 (17:34 +0800)
committerAlan <alan@roojs.com>
Tue, 22 Feb 2022 09:34:22 +0000 (17:34 +0800)
107 files changed:
Roo/GridPanel.js [new file with mode: 0644]
Roo/NestedLayoutPanel.js [new file with mode: 0644]
Roo/ScrollPanel.js [new file with mode: 0644]
Roo/TreePanel.js [new file with mode: 0644]
Roo/UndoManager.js [new file with mode: 0644]
Roo/bootstrap/dash/namespace.js [new file with mode: 0644]
Roo/bootstrap/namespace.js [new file with mode: 0644]
Roo/form/HtmlEditor/Td.js [new file with mode: 0644]
Roo/htmleditor/Block.js [new file with mode: 0644]
Roo/htmleditor/BlockFigure.js [new file with mode: 0644]
Roo/htmleditor/BlockTable.js [new file with mode: 0644]
Roo/htmleditor/BlockTd.js [new file with mode: 0644]
Roo/htmleditor/Filter.js [new file with mode: 0644]
Roo/htmleditor/FilterAttributes.js [new file with mode: 0644]
Roo/htmleditor/FilterBlack.js [new file with mode: 0644]
Roo/htmleditor/FilterBlock.js [new file with mode: 0644]
Roo/htmleditor/FilterComment.js [new file with mode: 0644]
Roo/htmleditor/FilterEmpty.js [new file with mode: 0644]
Roo/htmleditor/FilterKeepChildren.js [new file with mode: 0644]
Roo/htmleditor/FilterLongBr.js [new file with mode: 0644]
Roo/htmleditor/FilterParagraph.js [new file with mode: 0644]
Roo/htmleditor/FilterSpan.js [new file with mode: 0644]
Roo/htmleditor/FilterStyleToTag.js [new file with mode: 0644]
Roo/htmleditor/FilterTableWidth.js [new file with mode: 0644]
Roo/htmleditor/FilterWord.js [new file with mode: 0644]
Roo/htmleditor/KeyEnter.js [new file with mode: 0644]
Roo/htmleditor/TidyEntities.js [new file with mode: 0644]
Roo/htmleditor/TidySerializer.js [new file with mode: 0644]
Roo/htmleditor/TidyWriter.js [new file with mode: 0644]
Roo/htmleditor/namespace.js [new file with mode: 0644]
Roo/lib/Range.js [new file with mode: 0644]
Roo/lib/Selection.js [new file with mode: 0644]
Roo/lib/UndoManager.js [new file with mode: 0644]
Roo/rtf/Ctrl.js [new file with mode: 0644]
Roo/rtf/Document.js [new file with mode: 0644]
Roo/rtf/Group.js [new file with mode: 0644]
Roo/rtf/Hex.js [new file with mode: 0644]
Roo/rtf/Paragraph.js [new file with mode: 0644]
Roo/rtf/Parser.js [new file with mode: 0644]
Roo/rtf/Span.js [new file with mode: 0644]
Roo/rtf/namespace.js [new file with mode: 0644]
docs/src/Roo_GridPanel.js.html [new file with mode: 0644]
docs/src/Roo_NestedLayoutPanel.js.html [new file with mode: 0644]
docs/src/Roo_ScrollPanel.js.html [new file with mode: 0644]
docs/src/Roo_TreePanel.js.html [new file with mode: 0644]
docs/src/Roo_bootstrap_dash_namespace.js.html [new file with mode: 0644]
docs/src/Roo_bootstrap_namespace.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_Block.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_BlockFigure.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_BlockTable.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_BlockTd.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_Filter.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterAttributes.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterBlack.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterBlock.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterComment.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterKeepChildren.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterLongBr.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterParagraph.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterSpan.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterStyleToTag.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterTableWidth.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_FilterWord.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_KeyEnter.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_Tidy.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_TidyEntities.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_TidySerializer.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_TidyWriter.js.html [new file with mode: 0644]
docs/src/Roo_htmleditor_namespace.js.html [new file with mode: 0644]
docs/src/Roo_lib_Range.js.html [new file with mode: 0644]
docs/src/Roo_lib_Selection.js.html [new file with mode: 0644]
docs/src/Roo_lib_UndoManager.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Ctrl.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Document.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Group.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Hex.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Paragraph.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Parser.js.html [new file with mode: 0644]
docs/src/Roo_rtf_Span.js.html [new file with mode: 0644]
docs/src/Roo_rtf_namespace.js.html [new file with mode: 0644]
docs/symbols/Roo.MessageBox.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.Block.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.BlockFigure.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.BlockTable.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.BlockTd.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.Filter.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterAttributes.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterBlack.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterBlock.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterComment.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterKeepChildren.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterLongBr.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterParagraph.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterSpan.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterStyleToTag.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterTableWidth.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.FilterWord.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.KeyEnter.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.Tidy.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.TidyEntities.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.TidySerializer.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.TidyWriter.json [new file with mode: 0644]
docs/symbols/Roo.htmleditor.json [new file with mode: 0644]
docs/symbols/Roo.lib.Range.json [new file with mode: 0644]
docs/symbols/Roo.lib.Selection.json [new file with mode: 0644]
docs/symbols/Roo.lib.UndoManager.json [new file with mode: 0644]
docs/symbols/Roo.rtf.json [new file with mode: 0644]

diff --git a/Roo/GridPanel.js b/Roo/GridPanel.js
new file mode 100644 (file)
index 0000000..3bd51cd
--- /dev/null
@@ -0,0 +1,78 @@
+
+/**
+ * @class Roo.GridPanel
+ * @extends Roo.ContentPanel
+ * @parent Roo.BorderLayout Roo.LayoutDialog builder
+ * @constructor
+ * Create a new GridPanel.
+ * @cfg {Roo.grid.Grid} grid The grid for this panel
+ */
+Roo.GridPanel = function(grid, config){
+    
+    // universal ctor...
+    if (typeof(grid.grid) != 'undefined') {
+        config = grid;
+        grid = config.grid;
+    }
+    this.wrapper = Roo.DomHelper.append(document.body, // wrapper for IE7 strict & safari scroll issue
+        {tag: "div", cls: "x-layout-grid-wrapper x-layout-inactive-content"}, true);
+        
+    this.wrapper.dom.appendChild(grid.getGridEl().dom);
+    
+    Roo.GridPanel.superclass.constructor.call(this, this.wrapper, config);
+    
+    if(this.toolbar){
+        this.toolbar.el.insertBefore(this.wrapper.dom.firstChild);
+    }
+    // xtype created footer. - not sure if will work as we normally have to render first..
+    if (this.footer && !this.footer.el && this.footer.xtype) {
+        
+        this.footer.container = this.grid.getView().getFooterPanel(true);
+        this.footer.dataSource = this.grid.dataSource;
+        this.footer = Roo.factory(this.footer, Roo);
+        
+    }
+    
+    grid.monitorWindowResize = false; // turn off autosizing
+    grid.autoHeight = false;
+    grid.autoWidth = false;
+    this.grid = grid;
+    this.grid.getGridEl().replaceClass("x-layout-inactive-content", "x-layout-component-panel");
+};
+
+Roo.extend(Roo.GridPanel, Roo.ContentPanel, {
+    getId : function(){
+        return this.grid.id;
+    },
+    
+    /**
+     * Returns the grid for this panel
+     * @return {Roo.grid.Grid} 
+     */
+    getGrid : function(){
+        return this.grid;    
+    },
+    
+    setSize : function(width, height){
+        if(!this.ignoreResize(width, height)){
+            var grid = this.grid;
+            var size = this.adjustForComponents(width, height);
+            grid.getGridEl().setSize(size.width, size.height);
+            grid.autoSize();
+        }
+    },
+    
+    beforeSlide : function(){
+        this.grid.getView().scroller.clip();
+    },
+    
+    afterSlide : function(){
+        this.grid.getView().scroller.unclip();
+    },
+    
+    destroy : function(){
+        this.grid.destroy();
+        delete this.grid;
+        Roo.GridPanel.superclass.destroy.call(this); 
+    }
+});
diff --git a/Roo/NestedLayoutPanel.js b/Roo/NestedLayoutPanel.js
new file mode 100644 (file)
index 0000000..acb5b3c
--- /dev/null
@@ -0,0 +1,132 @@
+
+
+/**
+ * @class Roo.NestedLayoutPanel
+ * @extends Roo.ContentPanel
+ * @parent Roo.BorderLayout Roo.LayoutDialog builder
+ * @cfg {Roo.BorderLayout} layout   [required] The layout for this panel
+ *
+ * 
+ * @constructor
+ * Create a new NestedLayoutPanel.
+ * 
+ * 
+ * @param {Roo.BorderLayout} layout [required] The layout for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ */
+Roo.NestedLayoutPanel = function(layout, config)
+{
+    // construct with only one argument..
+    /* FIXME - implement nicer consturctors
+    if (layout.layout) {
+        config = layout;
+        layout = config.layout;
+        delete config.layout;
+    }
+    if (layout.xtype && !layout.getEl) {
+        // then layout needs constructing..
+        layout = Roo.factory(layout, Roo);
+    }
+    */
+    
+    
+    Roo.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config);
+    
+    layout.monitorWindowResize = false; // turn off autosizing
+    this.layout = layout;
+    this.layout.getEl().addClass("x-layout-nested-layout");
+    
+    
+    
+    
+};
+
+Roo.extend(Roo.NestedLayoutPanel, Roo.ContentPanel, {
+
+    layout : false,
+
+    setSize : function(width, height){
+        if(!this.ignoreResize(width, height)){
+            var size = this.adjustForComponents(width, height);
+            var el = this.layout.getEl();
+            el.setSize(size.width, size.height);
+            var touch = el.dom.offsetWidth;
+            this.layout.layout();
+            // ie requires a double layout on the first pass
+            if(Roo.isIE && !this.initialized){
+                this.initialized = true;
+                this.layout.layout();
+            }
+        }
+    },
+    
+    // activate all subpanels if not currently active..
+    
+    setActiveState : function(active){
+        this.active = active;
+        if(!active){
+            this.fireEvent("deactivate", this);
+            return;
+        }
+        
+        this.fireEvent("activate", this);
+        // not sure if this should happen before or after..
+        if (!this.layout) {
+            return; // should not happen..
+        }
+        var reg = false;
+        for (var r in this.layout.regions) {
+            reg = this.layout.getRegion(r);
+            if (reg.getActivePanel()) {
+                //reg.showPanel(reg.getActivePanel()); // force it to activate.. 
+                reg.setActivePanel(reg.getActivePanel());
+                continue;
+            }
+            if (!reg.panels.length) {
+                continue;
+            }
+            reg.showPanel(reg.getPanel(0));
+        }
+        
+        
+        
+        
+    },
+    
+    /**
+     * Returns the nested BorderLayout for this panel
+     * @return {Roo.BorderLayout}
+     */
+    getLayout : function(){
+        return this.layout;
+    },
+    
+     /**
+     * Adds a xtype elements to the layout of the nested panel
+     * <pre><code>
+
+panel.addxtype({
+       xtype : 'ContentPanel',
+       region: 'west',
+       items: [ .... ]
+   }
+);
+
+panel.addxtype({
+        xtype : 'NestedLayoutPanel',
+        region: 'west',
+        layout: {
+           center: { },
+           west: { }   
+        },
+        items : [ ... list of content panels or nested layout panels.. ]
+   }
+);
+</code></pre>
+     * @param {Object} cfg Xtype definition of item to add.
+     */
+    addxtype : function(cfg) {
+        return this.layout.addxtype(cfg);
+    
+    }
+});
diff --git a/Roo/ScrollPanel.js b/Roo/ScrollPanel.js
new file mode 100644 (file)
index 0000000..179048f
--- /dev/null
@@ -0,0 +1,61 @@
+
+Roo.ScrollPanel = function(el, config, content){
+    config = config || {};
+    config.fitToFrame = true;
+    Roo.ScrollPanel.superclass.constructor.call(this, el, config, content);
+    
+    this.el.dom.style.overflow = "hidden";
+    var wrap = this.el.wrap({cls: "x-scroller x-layout-inactive-content"});
+    this.el.removeClass("x-layout-inactive-content");
+    this.el.on("mousewheel", this.onWheel, this);
+
+    var up = wrap.createChild({cls: "x-scroller-up", html: "&#160;"}, this.el.dom);
+    var down = wrap.createChild({cls: "x-scroller-down", html: "&#160;"});
+    up.unselectable(); down.unselectable();
+    up.on("click", this.scrollUp, this);
+    down.on("click", this.scrollDown, this);
+    up.addClassOnOver("x-scroller-btn-over");
+    down.addClassOnOver("x-scroller-btn-over");
+    up.addClassOnClick("x-scroller-btn-click");
+    down.addClassOnClick("x-scroller-btn-click");
+    this.adjustments = [0, -(up.getHeight() + down.getHeight())];
+
+    this.resizeEl = this.el;
+    this.el = wrap; this.up = up; this.down = down;
+};
+
+Roo.extend(Roo.ScrollPanel, Roo.ContentPanel, {
+    increment : 100,
+    wheelIncrement : 5,
+    scrollUp : function(){
+        this.resizeEl.scroll("up", this.increment, {callback: this.afterScroll, scope: this});
+    },
+
+    scrollDown : function(){
+        this.resizeEl.scroll("down", this.increment, {callback: this.afterScroll, scope: this});
+    },
+
+    afterScroll : function(){
+        var el = this.resizeEl;
+        var t = el.dom.scrollTop, h = el.dom.scrollHeight, ch = el.dom.clientHeight;
+        this.up[t == 0 ? "addClass" : "removeClass"]("x-scroller-btn-disabled");
+        this.down[h - t <= ch ? "addClass" : "removeClass"]("x-scroller-btn-disabled");
+    },
+
+    setSize : function(){
+        Roo.ScrollPanel.superclass.setSize.apply(this, arguments);
+        this.afterScroll();
+    },
+
+    onWheel : function(e){
+        var d = e.getWheelDelta();
+        this.resizeEl.dom.scrollTop -= (d*this.wheelIncrement);
+        this.afterScroll();
+        e.stopEvent();
+    },
+
+    setContent : function(content, loadScripts){
+        this.resizeEl.update(content, loadScripts);
+    }
+
+});
diff --git a/Roo/TreePanel.js b/Roo/TreePanel.js
new file mode 100644 (file)
index 0000000..7f31154
--- /dev/null
@@ -0,0 +1,61 @@
+
+
+
+/**
+ * @class Roo.TreePanel
+ * @extends Roo.ContentPanel
+ * @parent Roo.BorderLayout Roo.LayoutDialog builder
+ * Treepanel component
+ * 
+ * @constructor
+ * Create a new TreePanel. - defaults to fit/scoll contents.
+ * @param {String/Object} config A string to set only the panel's title, or a config object
+ */
+Roo.TreePanel = function(config){
+    var el = config.el;
+    var tree = config.tree;
+    delete config.tree; 
+    delete config.el; // hopefull!
+    
+    // wrapper for IE7 strict & safari scroll issue
+    
+    var treeEl = el.createChild();
+    config.resizeEl = treeEl;
+    
+    
+    
+    Roo.TreePanel.superclass.constructor.call(this, el, config);
+    this.tree = new Roo.tree.TreePanel(treeEl , tree);
+    //console.log(tree);
+    this.on('activate', function()
+    {
+        if (this.tree.rendered) {
+            return;
+        }
+        //console.log('render tree');
+        this.tree.render();
+    });
+    // this should not be needed.. - it's actually the 'el' that resizes?
+    // actuall it breaks the containerScroll - dragging nodes auto scroll at top
+    
+    //this.on('resize',  function (cp, w, h) {
+    //        this.tree.innerCt.setWidth(w);
+    //        this.tree.innerCt.setHeight(h);
+    //        //this.tree.innerCt.setStyle('overflow-y', 'auto');
+    //});
+
+        
+    
+};
+
+Roo.extend(Roo.TreePanel, Roo.ContentPanel, {   
+    fitToFrame : true,
+    autoScroll : true,
+    /*
+     * @cfg {Roo.tree.TreePanel} tree [required] The tree TreePanel, with config etc.
+     */
+    tree : false
+
+});
diff --git a/Roo/UndoManager.js b/Roo/UndoManager.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Roo/bootstrap/dash/namespace.js b/Roo/bootstrap/dash/namespace.js
new file mode 100644 (file)
index 0000000..ac99127
--- /dev/null
@@ -0,0 +1 @@
+Roo.bootstrap.dash = {};
\ No newline at end of file
diff --git a/Roo/bootstrap/namespace.js b/Roo/bootstrap/namespace.js
new file mode 100644 (file)
index 0000000..d6204e4
--- /dev/null
@@ -0,0 +1 @@
+Roo.bootstrap = {};
\ No newline at end of file
diff --git a/Roo/form/HtmlEditor/Td.js b/Roo/form/HtmlEditor/Td.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Roo/htmleditor/Block.js b/Roo/htmleditor/Block.js
new file mode 100644 (file)
index 0000000..7e3c164
--- /dev/null
@@ -0,0 +1,143 @@
+/**
+ * @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, or style for using next param as style)
+     * @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 == '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)
+    {
+        
+    } 
+    
+    
+};
+
diff --git a/Roo/htmleditor/BlockFigure.js b/Roo/htmleditor/BlockFigure.js
new file mode 100644 (file)
index 0000000..0cc0e7a
--- /dev/null
@@ -0,0 +1,394 @@
+
+/**
+ * @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 : [
+                        ['auto'],
+                        ['50%'],
+                        ['100%']
+                    ],
+                    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.toggle(v == 'block' ? false : true);
+                },
+                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..
+     */
+    toObject : function()
+    {
+        var d = document.createElement('div');
+        d.innerHTML = this.caption;
+        
+        var m = this.width == '50%' && this.align == 'center' ? '0 auto' : 0; 
+        
+        var img =   {
+            tag : 'img',
+            contenteditable : 'false',
+            src : this.image_src,
+            alt : d.innerText.replace(/\n/g, " ").replace(/\s+/g, ' ').trim(), // removeHTML and reduce spaces..
+            style: {
+                width : 'auto',
+                'max-width': '100%',
+                margin : '0px' 
+                
+                
+            }
+        };
+        /*
+        '<div class="{0}" width="420" height="315" src="{1}" frameborder="0" allowfullscreen>' +
+                    '<a href="{2}">' + 
+                        '<img class="{0}-thumbnail" src="{3}/Images/{4}/{5}#image-{4}" />' + 
+                    '</a>' + 
+                '</div>',
+        */
+                
+        if (this.href.length > 0) {
+            img = {
+                tag : 'a',
+                href: this.href,
+                contenteditable : 'true',
+                cn : [
+                    img
+                ]
+            };
+        }
+        
+        
+        if (this.video_url.length > 0) {
+            img = {
+                tag : 'div',
+                cls : this.cls,
+                frameborder : 0,
+                allowfullscreen : true,
+                width : 420,  // these are for video tricks - that we replace the outer
+                height : 315,
+                src : this.video_url,
+                cn : [
+                    img
+                ]
+            };
+        }
+        
+        var captionhtml = this.caption_display == 'hidden' ? this.caption : (this.caption.length ? this.caption : "Caption");
+        
+        return  {
+            tag: 'figure',
+            'data-block' : 'Figure',
+            contenteditable : 'false',
+            style : {
+                display: 'block',
+                float :  this.align ,
+                'max-width':  this.width,
+                width : 'auto',
+                margin:  m,
+                padding: '10px'
+                
+            },
+           
+            
+            align : this.align,
+            cn : [
+                img,
+              
+                {
+                    tag: 'figcaption',
+                    
+                    style : {
+                        'text-align': 'left',
+                        'margin-top' : '16px',
+                        'font-size' : '16px',
+                        'line-height' : '24px',
+                         display : this.caption_display
+                    },
+                    cls : this.cls.length > 0 ? (this.cls  + '-thumbnail' ) : '',
+                    cn : [
+                        {
+                            // we can not rely on yahoo syndication to use CSS elements - so have to use  '<i>' to encase stuff.
+                            tag : 'i',
+                            contenteditable : true,
+                            html : captionhtml
+                        }
+                    ]
+                    
+                }
+            ]
+        };
+         
+    },
+    
+    readElement : function(node)
+    {
+        // this should not really come from the link...
+        this.video_url = this.getVal(node, 'div', 'src');
+        this.cls = this.getVal(node, 'div', 'class');
+        this.href = this.getVal(node, 'a', 'href');
+        
+        this.image_src = this.getVal(node, 'img', 'src');
+         
+        this.align = this.getVal(node, 'figure', 'align');
+        this.caption = this.getVal(node, 'figcaption', 'html');
+        // remove '<i>
+        if (this.caption.trim().match(/^<i[^>]*>/i)) {
+            this.caption = this.caption.trim().replace(/^<i[^>]*>/i, '').replace(/^<\/i>$/i, '');
+        }
+        //this.text_align = this.getVal(node, 'figcaption', 'style','text-align');
+        this.width = this.getVal(node, 'figure', 'style', 'max-width');
+        //this.margin = this.getVal(node, 'figure', 'style', 'margin');
+        
+    },
+    removeNode : function()
+    {
+        return this.node;
+    }
+    
+  
+   
+     
+    
+    
+    
+    
+})
+
diff --git a/Roo/htmleditor/BlockTable.js b/Roo/htmleditor/BlockTable.js
new file mode 100644 (file)
index 0000000..fe76729
--- /dev/null
@@ -0,0 +1,489 @@
+
+/**
+ * @class Roo.htmleditor.BlockTable
+ * Block that manages a table
+ * 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.BlockTable = function(cfg)
+{
+    if (cfg.node) {
+        this.readElement(cfg.node);
+        this.updateElement(cfg.node);
+    }
+    Roo.apply(this, cfg);
+    if (!cfg.node) {
+        this.rows = [];
+        for(var r = 0; r < this.no_row; r++) {
+            this.rows[r] = [];
+            for(var c = 0; c < this.no_col; c++) {
+                this.rows[r][c] = this.emptyCell();
+            }
+        }
+    }
+    
+    
+}
+Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
+    rows : false,
+    no_col : 1,
+    no_row : 1,
+    
+    
+    width: '100%',
+    
+    // used by context menu
+    friendly_name : 'Table',
+    deleteTitle : 'Delete Table',
+    // context menu is drawn once..
+    
+    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 : "Width: ",
+                xns : rooui.Toolbar  //Boostrap?
+            },
+            {
+                xtype : 'ComboBox',
+                allowBlank : false,
+                displayField : 'val',
+                editable : true,
+                listWidth : 100,
+                triggerAction : 'all',
+                typeAhead : true,
+                valueField : 'val',
+                width : 100,
+                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%'],
+                        ['auto']
+                    ],
+                    fields : [ 'val'],
+                    xns : Roo.data
+                }
+            },
+            // -------- Cols
+            
+            {
+                xtype : 'TextItem',
+                text : "Columns: ",
+                xns : rooui.Toolbar  //Boostrap?
+            },
+         
+            {
+                xtype : 'Button',
+                text: '-',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        block().removeColumn();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            {
+                xtype : 'Button',
+                text: '+',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        block().addColumn();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            // -------- ROWS
+            {
+                xtype : 'TextItem',
+                text : "Rows: ",
+                xns : rooui.Toolbar  //Boostrap?
+            },
+         
+            {
+                xtype : 'Button',
+                text: '-',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        block().removeRow();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            {
+                xtype : 'Button',
+                text: '+',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        block().addRow();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            // -------- ROWS
+            {
+                xtype : 'Button',
+                text: 'Reset Column Widths',
+                listeners : {
+                    
+                    click : function (_self, e)
+                    {
+                        block().resetWidths();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            } 
+            
+            
+            
+        ];
+        
+    },
+    
+    
+  /**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     * ?? should it be called with option to hide all editing features?
+     */
+    toObject : function()
+    {
+        
+        var ret = {
+            tag : 'table',
+            contenteditable : 'false', // this stops cell selection from picking the table.
+            'data-block' : 'Table',
+            style : {
+                width:  this.width,
+                border : 'solid 1px #000', // ??? hard coded?
+                'border-collapse' : 'collapse' 
+            },
+            cn : [
+                { tag : 'tbody' , cn : [] }
+            ]
+        };
+        
+        // do we have a head = not really 
+        var ncols = 0;
+        Roo.each(this.rows, function( row ) {
+            var tr = {
+                tag: 'tr',
+                style : {
+                    margin: '6px',
+                    border : 'solid 1px #000',
+                    textAlign : 'left' 
+                },
+                cn : [ ]
+            };
+            
+            ret.cn[0].cn.push(tr);
+            // does the row have any properties? ?? height?
+            var nc = 0;
+            Roo.each(row, function( cell ) {
+                
+                var td = {
+                    tag : 'td',
+                    contenteditable :  'true',
+                    'data-block' : 'Td',
+                    html : cell.html,
+                    style : cell.style
+                };
+                if (cell.colspan > 1) {
+                    td.colspan = cell.colspan ;
+                    nc += cell.colspan;
+                } else {
+                    nc++;
+                }
+                if (cell.rowspan > 1) {
+                    td.rowspan = cell.rowspan ;
+                }
+                
+                
+                // widths ?
+                tr.cn.push(td);
+                    
+                
+            }, this);
+            ncols = Math.max(nc, ncols);
+            
+            
+        }, this);
+        // add the header row..
+        
+        ncols++;
+         
+        
+        return ret;
+         
+    },
+    
+    readElement : function(node)
+    {
+        node  = node ? node : this.node ;
+        this.width = this.getVal(node, true, 'style', 'width') || '100%';
+        
+        this.rows = [];
+        this.no_row = 0;
+        var trs = Array.from(node.rows);
+        trs.forEach(function(tr) {
+            var row =  [];
+            this.rows.push(row);
+            
+            this.no_row++;
+            var no_column = 0;
+            Array.from(tr.cells).forEach(function(td) {
+                
+                var add = {
+                    colspan : td.hasAttribute('colspan') ? td.getAttribute('colspan')*1 : 1,
+                    rowspan : td.hasAttribute('rowspan') ? td.getAttribute('rowspan')*1 : 1,
+                    style : td.hasAttribute('style') ? td.getAttribute('style') : '',
+                    html : td.innerHTML
+                };
+                no_column += add.colspan;
+                     
+                
+                row.push(add);
+                
+                
+            },this);
+            this.no_col = Math.max(this.no_col, no_column);
+            
+            
+        },this);
+        
+        
+    },
+    normalizeRows: function()
+    {
+        var ret= [];
+        var rid = -1;
+        this.rows.forEach(function(row) {
+            rid++;
+            ret[rid] = [];
+            row = this.normalizeRow(row);
+            var cid = 0;
+            row.forEach(function(c) {
+                while (typeof(ret[rid][cid]) != 'undefined') {
+                    cid++;
+                }
+                if (typeof(ret[rid]) == 'undefined') {
+                    ret[rid] = [];
+                }
+                ret[rid][cid] = c;
+                c.row = rid;
+                c.col = cid;
+                if (c.rowspan < 2) {
+                    return;
+                }
+                
+                for(var i = 1 ;i < c.rowspan; i++) {
+                    if (typeof(ret[rid+i]) == 'undefined') {
+                        ret[rid+i] = [];
+                    }
+                    ret[rid+i][cid] = c;
+                }
+            });
+        }, this);
+        return ret;
+    
+    },
+    
+    normalizeRow: function(row)
+    {
+        var ret= [];
+        row.forEach(function(c) {
+            if (c.colspan < 2) {
+                ret.push(c);
+                return;
+            }
+            for(var i =0 ;i < c.colspan; i++) {
+                ret.push(c);
+            }
+        });
+        return ret;
+    
+    },
+    
+    deleteColumn : function(sel)
+    {
+        if (!sel || sel.type != 'col') {
+            return;
+        }
+        if (this.no_col < 2) {
+            return;
+        }
+        
+        this.rows.forEach(function(row) {
+            var cols = this.normalizeRow(row);
+            var col = cols[sel.col];
+            if (col.colspan > 1) {
+                col.colspan --;
+            } else {
+                row.remove(col);
+            }
+            
+        }, this);
+        this.no_col--;
+        
+    },
+    removeColumn : function()
+    {
+        this.deleteColumn({
+            type: 'col',
+            col : this.no_col-1
+        });
+        this.updateElement();
+    },
+    
+     
+    addColumn : function()
+    {
+        
+        this.rows.forEach(function(row) {
+            row.push(this.emptyCell());
+           
+        }, this);
+        this.updateElement();
+    },
+    
+    deleteRow : function(sel)
+    {
+        if (!sel || sel.type != 'row') {
+            return;
+        }
+        
+        if (this.no_row < 2) {
+            return;
+        }
+        
+        var rows = this.normalizeRows();
+        
+        
+        rows[sel.row].forEach(function(col) {
+            if (col.rowspan > 1) {
+                col.rowspan--;
+            } else {
+                col.remove = 1; // flage it as removed.
+            }
+            
+        }, this);
+        var newrows = [];
+        this.rows.forEach(function(row) {
+            newrow = [];
+            row.forEach(function(c) {
+                if (typeof(c.remove) == 'undefined') {
+                    newrow.push(c);
+                }
+                
+            });
+            if (newrow.length > 0) {
+                newrows.push(row);
+            }
+        });
+        this.rows =  newrows;
+        
+        
+        
+        this.no_row--;
+        this.updateElement();
+        
+    },
+    removeRow : function()
+    {
+        this.deleteRow({
+            type: 'row',
+            row : this.no_row-1
+        });
+        
+    },
+    
+     
+    addRow : function()
+    {
+        
+        var row = [];
+        for (var i = 0; i < this.no_col; i++ ) {
+            
+            row.push(this.emptyCell());
+           
+        }
+        this.rows.push(row);
+        this.updateElement();
+        
+    },
+     
+    // the default cell object... at present...
+    emptyCell : function() {
+        return (new Roo.htmleditor.BlockTd({})).toObject();
+        
+     
+    },
+    
+    removeNode : function()
+    {
+        return this.node;
+    },
+    
+    
+    
+    resetWidths : function()
+    {
+        Array.from(this.node.getElementsByTagName('td')).forEach(function(n) {
+            var nn = Roo.htmleditor.Block.factory(n);
+            nn.width = '';
+            nn.updateElement(n);
+        });
+    }
+    
+    
+    
+    
+})
+
diff --git a/Roo/htmleditor/BlockTd.js b/Roo/htmleditor/BlockTd.js
new file mode 100644 (file)
index 0000000..b6022ca
--- /dev/null
@@ -0,0 +1,749 @@
+/**
+ *
+ * editing a TD?
+ *
+ * since selections really work on the table cell, then editing really should work from there
+ *
+ * The original plan was to support merging etc... - but that may not be needed yet..
+ *
+ * So this simple version will support:
+ *   add/remove cols
+ *   adjust the width +/-
+ *   reset the width...
+ *   
+ *
+ */
+
+
+
+/**
+ * @class Roo.htmleditor.BlockTable
+ * Block that manages a table
+ * 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.BlockTd = function(cfg)
+{
+    if (cfg.node) {
+        this.readElement(cfg.node);
+        this.updateElement(cfg.node);
+    }
+    Roo.apply(this, cfg);
+     
+    
+    
+}
+Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
+    node : false,
+    
+    width: '',
+    textAlign : 'left',
+    valign : 'top',
+    
+    colspan : 1,
+    rowspan : 1,
+    
+    
+    // used by context menu
+    friendly_name : 'Table Cell',
+    deleteTitle : false, // use our customer delete
+    
+    // context menu is drawn once..
+    
+    contextMenu : function(toolbar)
+    {
+        
+        var cell = function() {
+            return Roo.htmleditor.Block.factory(toolbar.tb.selectedNode);
+        };
+        
+        var table = function() {
+            return Roo.htmleditor.Block.factory(toolbar.tb.selectedNode.closest('table'));
+        };
+        
+        var lr = false;
+        var saveSel = function()
+        {
+            lr = toolbar.editorcore.getSelection().getRangeAt(0);
+        }
+        var restoreSel = function()
+        {
+            if (lr) {
+                (function() {
+                    toolbar.editorcore.focus();
+                    var cr = toolbar.editorcore.getSelection();
+                    cr.removeAllRanges();
+                    cr.addRange(lr);
+                    toolbar.editorcore.onEditorEvent();
+                }).defer(10, this);
+                
+                
+            }
+        }
+        
+        var rooui =  typeof(Roo.bootstrap) == 'undefined' ? Roo : Roo.bootstrap;
+        
+        var syncValue = toolbar.editorcore.syncValue;
+        
+        var fields = {};
+        
+        return [
+            {
+                xtype : 'Button',
+                text : 'Edit Table',
+                listeners : {
+                    click : function() {
+                        var t = toolbar.tb.selectedNode.closest('table');
+                        toolbar.editorcore.selectNode(t);
+                        toolbar.editorcore.onEditorEvent();                        
+                    }
+                }
+                
+            },
+              
+           
+             
+            {
+                xtype : 'TextItem',
+                text : "Column Width: ",
+                 xns : rooui.Toolbar 
+               
+            },
+            {
+                xtype : 'Button',
+                text: '-',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        cell().shrinkColumn();
+                        syncValue();
+                         toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            {
+                xtype : 'Button',
+                text: '+',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        cell().growColumn();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            
+            {
+                xtype : 'TextItem',
+                text : "Vertical Align: ",
+                xns : rooui.Toolbar  //Boostrap?
+            },
+            {
+                xtype : 'ComboBox',
+                allowBlank : false,
+                displayField : 'val',
+                editable : true,
+                listWidth : 100,
+                triggerAction : 'all',
+                typeAhead : true,
+                valueField : 'val',
+                width : 100,
+                name : 'valign',
+                listeners : {
+                    select : function (combo, r, index)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        var b = cell();
+                        b.valign = r.get('val');
+                        b.updateElement();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.form,
+                store : {
+                    xtype : 'SimpleStore',
+                    data : [
+                        ['top'],
+                        ['middle'],
+                        ['bottom'] // there are afew more... 
+                    ],
+                    fields : [ 'val'],
+                    xns : Roo.data
+                }
+            },
+            
+            {
+                xtype : 'TextItem',
+                text : "Merge Cells: ",
+                 xns : rooui.Toolbar 
+               
+            },
+            
+            
+            {
+                xtype : 'Button',
+                text: 'Right',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        cell().mergeRight();
+                        //block().growColumn();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+             
+            {
+                xtype : 'Button',
+                text: 'Below',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        cell().mergeBelow();
+                        //block().growColumn();
+                        syncValue();
+                        toolbar.editorcore.onEditorEvent();
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            {
+                xtype : 'TextItem',
+                text : "| ",
+                 xns : rooui.Toolbar 
+               
+            },
+            
+            {
+                xtype : 'Button',
+                text: 'Split',
+                listeners : {
+                    click : function (_self, e)
+                    {
+                        //toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        cell().split();
+                        syncValue();
+                        toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        toolbar.editorcore.onEditorEvent();
+                                             
+                    }
+                },
+                xns : rooui.Toolbar
+            },
+            {
+                xtype : 'Fill',
+                xns : rooui.Toolbar 
+               
+            },
+        
+          
+            {
+                xtype : 'Button',
+                text: 'Delete',
+                 
+                xns : rooui.Toolbar,
+                menu : {
+                    xtype : 'Menu',
+                    xns : rooui.menu,
+                    items : [
+                        {
+                            xtype : 'Item',
+                            html: 'Column',
+                            listeners : {
+                                click : function (_self, e)
+                                {
+                                    var t = table();
+                                    
+                                    cell().deleteColumn();
+                                    syncValue();
+                                    toolbar.editorcore.selectNode(t.node);
+                                    toolbar.editorcore.onEditorEvent();   
+                                }
+                            },
+                            xns : rooui.menu
+                        },
+                        {
+                            xtype : 'Item',
+                            html: 'Row',
+                            listeners : {
+                                click : function (_self, e)
+                                {
+                                    var t = table();
+                                    cell().deleteRow();
+                                    syncValue();
+                                    
+                                    toolbar.editorcore.selectNode(t.node);
+                                    toolbar.editorcore.onEditorEvent();   
+                                                         
+                                }
+                            },
+                            xns : rooui.menu
+                        },
+                       {
+                            xtype : 'Separator',
+                            xns : rooui.menu
+                        },
+                        {
+                            xtype : 'Item',
+                            html: 'Table',
+                            listeners : {
+                                click : function (_self, e)
+                                {
+                                    var t = table();
+                                    var nn = t.node.nextSibling || t.node.previousSibling;
+                                    t.node.parentNode.removeChild(t.node);
+                                    if (nn) { 
+                                        toolbar.editorcore.selectNode(nn, true);
+                                    }
+                                    toolbar.editorcore.onEditorEvent();   
+                                                         
+                                }
+                            },
+                            xns : rooui.menu
+                        }
+                    ]
+                }
+            }
+            
+            // align... << fixme
+            
+        ];
+        
+    },
+    
+    
+  /**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     * ?? should it be called with option to hide all editing features?
+     */
+ /**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     * ?? should it be called with option to hide all editing features?
+     */
+    toObject : function()
+    {
+        
+        var ret = {
+            tag : 'td',
+            contenteditable : 'true', // this stops cell selection from picking the table.
+            'data-block' : 'Td',
+            valign : this.valign,
+            style : {  
+                'text-align' :  this.textAlign,
+                border : 'solid 1px rgb(0, 0, 0)', // ??? hard coded?
+                'border-collapse' : 'collapse',
+                padding : '6px', // 8 for desktop / 4 for mobile
+                'vertical-align': this.valign
+            },
+            html : this.html
+        };
+        if (this.width != '') {
+            ret.width = this.width;
+            ret.style.width = this.width;
+        }
+        
+        
+        if (this.colspan > 1) {
+            ret.colspan = this.colspan ;
+        } 
+        if (this.rowspan > 1) {
+            ret.rowspan = this.rowspan ;
+        }
+        
+           
+        
+        return ret;
+         
+    },
+    
+    readElement : function(node)
+    {
+        node  = node ? node : this.node ;
+        this.width = node.style.width;
+        this.colspan = Math.max(1,1*node.getAttribute('colspan'));
+        this.rowspan = Math.max(1,1*node.getAttribute('rowspan'));
+        this.html = node.innerHTML;
+        
+        
+    },
+     
+    // the default cell object... at present...
+    emptyCell : function() {
+        return {
+            colspan :  1,
+            rowspan :  1,
+            textAlign : 'left',
+            html : "&nbsp;" // is this going to be editable now?
+        };
+     
+    },
+    
+    removeNode : function()
+    {
+        return this.node.closest('table');
+         
+    },
+    
+    cellData : false,
+    
+    colWidths : false,
+    
+    toTableArray  : function()
+    {
+        var ret = [];
+        var tab = this.node.closest('tr').closest('table');
+        Array.from(tab.rows).forEach(function(r, ri){
+            ret[ri] = [];
+        });
+        var rn = 0;
+        this.colWidths = [];
+        var all_auto = true;
+        Array.from(tab.rows).forEach(function(r, ri){
+            
+            var cn = 0;
+            Array.from(r.cells).forEach(function(ce, ci){
+                var c =  {
+                    cell : ce,
+                    row : rn,
+                    col: cn,
+                    colspan : ce.colSpan,
+                    rowspan : ce.rowSpan
+                };
+                if (ce.isEqualNode(this.node)) {
+                    this.cellData = c;
+                }
+                // if we have been filled up by a row?
+                if (typeof(ret[rn][cn]) != 'undefined') {
+                    while(typeof(ret[rn][cn]) != 'undefined') {
+                        cn++;
+                    }
+                    c.col = cn;
+                }
+                
+                if (typeof(this.colWidths[cn]) == 'undefined') {
+                    this.colWidths[cn] =   ce.style.width;
+                    if (this.colWidths[cn] != '') {
+                        all_auto = false;
+                    }
+                }
+                
+                
+                if (c.colspan < 2 && c.rowspan < 2 ) {
+                    ret[rn][cn] = c;
+                    cn++;
+                    return;
+                }
+                for(var j = 0; j < c.rowspan; j++) {
+                    if (typeof(ret[rn+j]) == 'undefined') {
+                        continue; // we have a problem..
+                    }
+                    ret[rn+j][cn] = c;
+                    for(var i = 0; i < c.colspan; i++) {
+                        ret[rn+j][cn+i] = c;
+                    }
+                }
+                
+                cn += c.colspan;
+            }, this);
+            rn++;
+        }, this);
+        
+        // initalize widths.?
+        // either all widths or no widths..
+        if (all_auto) {
+            this.colWidths[0] = false; // no widths flag.
+        }
+        
+        
+        return ret;
+        
+    },
+    
+    
+    
+    
+    mergeRight: function()
+    {
+         
+        // get the contents of the next cell along..
+        var tr = this.node.closest('tr');
+        var i = Array.prototype.indexOf.call(tr.childNodes, this.node);
+        if (i >= tr.childNodes.length - 1) {
+            return; // no cells on right to merge with.
+        }
+        var table = this.toTableArray();
+        
+        if (typeof(table[this.cellData.row][this.cellData.col+this.cellData.colspan]) == 'undefined') {
+            return; // nothing right?
+        }
+        var rc = table[this.cellData.row][this.cellData.col+this.cellData.colspan];
+        // right cell - must be same rowspan and on the same row.
+        if (rc.rowspan != this.cellData.rowspan || rc.row != this.cellData.row) {
+            return; // right hand side is not same rowspan.
+        }
+        
+        
+        
+        this.node.innerHTML += ' ' + rc.cell.innerHTML;
+        tr.removeChild(rc.cell);
+        this.colspan += rc.colspan;
+        this.node.setAttribute('colspan', this.colspan);
+
+    },
+    
+    
+    mergeBelow : function()
+    {
+        var table = this.toTableArray();
+        if (typeof(table[this.cellData.row+this.cellData.rowspan]) == 'undefined') {
+            return; // no row below
+        }
+        if (typeof(table[this.cellData.row+this.cellData.rowspan][this.cellData.col]) == 'undefined') {
+            return; // nothing right?
+        }
+        var rc = table[this.cellData.row+this.cellData.rowspan][this.cellData.col];
+        
+        if (rc.colspan != this.cellData.colspan || rc.col != this.cellData.col) {
+            return; // right hand side is not same rowspan.
+        }
+        this.node.innerHTML =  this.node.innerHTML + rc.cell.innerHTML ;
+        rc.cell.parentNode.removeChild(rc.cell);
+        this.rowspan += rc.rowspan;
+        this.node.setAttribute('rowspan', this.rowspan);
+    },
+    
+    split: function()
+    {
+        if (this.node.rowSpan < 2 && this.node.colSpan < 2) {
+            return;
+        }
+        var table = this.toTableArray();
+        var cd = this.cellData;
+        this.rowspan = 1;
+        this.colspan = 1;
+        
+        for(var r = cd.row; r < cd.row + cd.rowspan; r++) {
+            
+            
+            
+            for(var c = cd.col; c < cd.col + cd.colspan; c++) {
+                if (r == cd.row && c == cd.col) {
+                    this.node.removeAttribute('rowspan');
+                    this.node.removeAttribute('colspan');
+                    continue;
+                }
+                 
+                var ntd = this.node.cloneNode(); // which col/row should be 0..
+                ntd.removeAttribute('id'); //
+                //ntd.style.width  = '';
+                ntd.innerHTML = '';
+                table[r][c] = { cell : ntd, col : c, row: r , colspan : 1 , rowspan : 1   };
+            }
+            
+        }
+        this.redrawAllCells(table);
+        
+         
+        
+    },
+    
+    
+    
+    redrawAllCells: function(table)
+    {
+        
+         
+        var tab = this.node.closest('tr').closest('table');
+        var ctr = tab.rows[0].parentNode;
+        Array.from(tab.rows).forEach(function(r, ri){
+            
+            Array.from(r.cells).forEach(function(ce, ci){
+                ce.parentNode.removeChild(ce);
+            });
+            r.parentNode.removeChild(r);
+        });
+        for(var r = 0 ; r < table.length; r++) {
+            var re = tab.rows[r];
+            
+            var re = tab.ownerDocument.createElement('tr');
+            ctr.appendChild(re);
+            for(var c = 0 ; c < table[r].length; c++) {
+                if (table[r][c].cell === false) {
+                    continue;
+                }
+                
+                re.appendChild(table[r][c].cell);
+                 
+                table[r][c].cell = false;
+            }
+        }
+        
+    },
+    updateWidths : function(table)
+    {
+        for(var r = 0 ; r < table.length; r++) {
+           
+            for(var c = 0 ; c < table[r].length; c++) {
+                if (table[r][c].cell === false) {
+                    continue;
+                }
+                
+                if (this.colWidths[0] != false && table[r][c].colspan < 2) {
+                    var el = Roo.htmleditor.Block.factory(table[r][c].cell);
+                    el.width = Math.floor(this.colWidths[c])  +'%';
+                    el.updateElement(el.node);
+                }
+                table[r][c].cell = false; // done
+            }
+        }
+    },
+    normalizeWidths : function(table)
+    {
+    
+        if (this.colWidths[0] === false) {
+            var nw = 100.0 / this.colWidths.length;
+            this.colWidths.forEach(function(w,i) {
+                this.colWidths[i] = nw;
+            },this);
+            return;
+        }
+    
+        var t = 0, missing = [];
+        
+        this.colWidths.forEach(function(w,i) {
+            //if you mix % and
+            this.colWidths[i] = this.colWidths[i] == '' ? 0 : (this.colWidths[i]+'').replace(/[^0-9]+/g,'')*1;
+            var add =  this.colWidths[i];
+            if (add > 0) {
+                t+=add;
+                return;
+            }
+            missing.push(i);
+            
+            
+        },this);
+        var nc = this.colWidths.length;
+        if (missing.length) {
+            var mult = (nc - missing.length) / (1.0 * nc);
+            var t = mult * t;
+            var ew = (100 -t) / (1.0 * missing.length);
+            this.colWidths.forEach(function(w,i) {
+                if (w > 0) {
+                    this.colWidths[i] = w * mult;
+                    return;
+                }
+                
+                this.colWidths[i] = ew;
+            }, this);
+            // have to make up numbers..
+             
+        }
+        // now we should have all the widths..
+        
+    
+    },
+    
+    shrinkColumn : function()
+    {
+        var table = this.toTableArray();
+        this.normalizeWidths(table);
+        var col = this.cellData.col;
+        var nw = this.colWidths[col] * 0.8;
+        if (nw < 5) {
+            return;
+        }
+        var otherAdd = (this.colWidths[col]  * 0.2) / (this.colWidths.length -1);
+        this.colWidths.forEach(function(w,i) {
+            if (i == col) {
+                 this.colWidths[i] = nw;
+                return;
+            }
+            this.colWidths[i] += otherAdd
+        }, this);
+        this.updateWidths(table);
+         
+    },
+    growColumn : function()
+    {
+        var table = this.toTableArray();
+        this.normalizeWidths(table);
+        var col = this.cellData.col;
+        var nw = this.colWidths[col] * 1.2;
+        if (nw > 90) {
+            return;
+        }
+        var otherSub = (this.colWidths[col]  * 0.2) / (this.colWidths.length -1);
+        this.colWidths.forEach(function(w,i) {
+            if (i == col) {
+                this.colWidths[i] = nw;
+                return;
+            }
+            this.colWidths[i] -= otherSub
+        }, this);
+        this.updateWidths(table);
+         
+    },
+    deleteRow : function()
+    {
+        // delete this rows 'tr'
+        // if any of the cells in this row have a rowspan > 1 && row!= this row..
+        // then reduce the rowspan.
+        var table = this.toTableArray();
+        // this.cellData.row;
+        for (var i =0;i< table[this.cellData.row].length ; i++) {
+            var c = table[this.cellData.row][i];
+            if (c.row != this.cellData.row) {
+                
+                c.rowspan--;
+                c.cell.setAttribute('rowspan', c.rowspan);
+                continue;
+            }
+            if (c.rowspan > 1) {
+                c.rowspan--;
+                c.cell.setAttribute('rowspan', c.rowspan);
+            }
+        }
+        table.splice(this.cellData.row,1);
+        this.redrawAllCells(table);
+        
+    },
+    deleteColumn : function()
+    {
+        var table = this.toTableArray();
+        
+        for (var i =0;i< table.length ; i++) {
+            var c = table[i][this.cellData.col];
+            if (c.col != this.cellData.col) {
+                table[i][this.cellData.col].colspan--;
+            } else if (c.colspan > 1) {
+                c.colspan--;
+                c.cell.setAttribute('colspan', c.colspan);
+            }
+            table[i].splice(this.cellData.col,1);
+        }
+        
+        this.redrawAllCells(table);
+    }
+    
+    
+    
+    
+})
+
diff --git a/Roo/htmleditor/Filter.js b/Roo/htmleditor/Filter.js
new file mode 100644 (file)
index 0000000..2e270bd
--- /dev/null
@@ -0,0 +1,64 @@
+/**
+ * @class Roo.htmleditor.Filter
+ * Base Class for filtering htmleditor stuff. - do not use this directly - extend it.
+ * @cfg {DomElement} node The node to iterate and filter
+ * @cfg {boolean|String|Array} tag Tags to replace 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+
+
+Roo.htmleditor.Filter = function(cfg) {
+    Roo.apply(this.cfg);
+    // this does not actually call walk as it's really just a abstract class
+}
+
+
+Roo.htmleditor.Filter.prototype = {
+    
+    node: false,
+    
+    tag: false,
+
+    // overrride to do replace comments.
+    replaceComment : false,
+    
+    // overrride to do replace or do stuff with tags..
+    replaceTag : false,
+    
+    walk : function(dom)
+    {
+        Roo.each( Array.from(dom.childNodes), function( e ) {
+            switch(true) {
+                
+                case e.nodeType == 8 &&  this.replaceComment  !== false: // comment
+                    this.replaceComment(e);
+                    return;
+                
+                case e.nodeType != 1: //not a node.
+                    return;
+                
+                case this.tag === true: // everything
+                case typeof(this.tag) == 'object' && this.tag.indexOf(e.tagName) > -1: // array and it matches.
+                case typeof(this.tag) == 'string' && this.tag == e.tagName: // array and it matches.
+                    if (this.replaceTag && false === this.replaceTag(e)) {
+                        return;
+                    }
+                    if (e.hasChildNodes()) {
+                        this.walk(e);
+                    }
+                    return;
+                
+                default:    // tags .. that do not match.
+                    if (e.hasChildNodes()) {
+                        this.walk(e);
+                    }
+            }
+            
+        }, this);
+        
+    }
+};
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterAttributes.js b/Roo/htmleditor/FilterAttributes.js
new file mode 100644 (file)
index 0000000..6ef231a
--- /dev/null
@@ -0,0 +1,156 @@
+
+/**
+ * @class Roo.htmleditor.FilterAttributes
+ * clean attributes and  styles including http:// etc.. in attribute
+ * @constructor
+* Run a new Attribute Filter
+* @param {Object} config Configuration options
+ */
+Roo.htmleditor.FilterAttributes = function(cfg)
+{
+    Roo.apply(this, cfg);
+    this.attrib_black = this.attrib_black || [];
+    this.attrib_white = this.attrib_white || [];
+
+    this.attrib_clean = this.attrib_clean || [];
+    this.style_white = this.style_white || [];
+    this.style_black = this.style_black || [];
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterAttributes, Roo.htmleditor.Filter,
+{
+    tag: true, // all tags
+    
+    attrib_black : false, // array
+    attrib_clean : false,
+    attrib_white : false,
+
+    style_white : false,
+    style_black : false,
+     
+     
+    replaceTag : function(node)
+    {
+        if (!node.attributes || !node.attributes.length) {
+            return true;
+        }
+        
+        for (var i = node.attributes.length-1; i > -1 ; i--) {
+            var a = node.attributes[i];
+            //console.log(a);
+            if (this.attrib_white.length && this.attrib_white.indexOf(a.name.toLowerCase()) < 0) {
+                node.removeAttribute(a.name);
+                continue;
+            }
+            
+            
+            
+            if (a.name.toLowerCase().substr(0,2)=='on')  {
+                node.removeAttribute(a.name);
+                continue;
+            }
+            
+            
+            if (this.attrib_black.indexOf(a.name.toLowerCase()) > -1) {
+                node.removeAttribute(a.name);
+                continue;
+            }
+            if (this.attrib_clean.indexOf(a.name.toLowerCase()) > -1) {
+                this.cleanAttr(node,a.name,a.value); // fixme..
+                continue;
+            }
+            if (a.name == 'style') {
+                this.cleanStyle(node,a.name,a.value);
+                continue;
+            }
+            /// clean up MS crap..
+            // tecnically this should be a list of valid class'es..
+            
+            
+            if (a.name == 'class') {
+                if (a.value.match(/^Mso/)) {
+                    node.removeAttribute('class');
+                }
+                
+                if (a.value.match(/^body$/)) {
+                    node.removeAttribute('class');
+                }
+                continue;
+            }
+            
+            
+            // style cleanup!?
+            // class cleanup?
+            
+        }
+        return true; // clean children
+    },
+        
+    cleanAttr: function(node, n,v)
+    {
+        
+        if (v.match(/^\./) || v.match(/^\//)) {
+            return;
+        }
+        if (v.match(/^(http|https):\/\//)
+            || v.match(/^mailto:/) 
+            || v.match(/^ftp:/)
+            || v.match(/^data:/)
+            ) {
+            return;
+        }
+        if (v.match(/^#/)) {
+            return;
+        }
+        if (v.match(/^\{/)) { // allow template editing.
+            return;
+        }
+//            Roo.log("(REMOVE TAG)"+ node.tagName +'.' + n + '=' + v);
+        node.removeAttribute(n);
+        
+    },
+    cleanStyle : function(node,  n,v)
+    {
+        if (v.match(/expression/)) { //XSS?? should we even bother..
+            node.removeAttribute(n);
+            return;
+        }
+        
+        var parts = v.split(/;/);
+        var clean = [];
+        
+        Roo.each(parts, function(p) {
+            p = p.replace(/^\s+/g,'').replace(/\s+$/g,'');
+            if (!p.length) {
+                return true;
+            }
+            var l = p.split(':').shift().replace(/\s+/g,'');
+            l = l.replace(/^\s+/g,'').replace(/\s+$/g,'');
+            
+            if ( this.style_black.length && (this.style_black.indexOf(l) > -1 || this.style_black.indexOf(l.toLowerCase()) > -1)) {
+                return true;
+            }
+            //Roo.log()
+            // only allow 'c whitelisted system attributes'
+            if ( this.style_white.length &&  style_white.indexOf(l) < 0 && style_white.indexOf(l.toLowerCase()) < 0 ) {
+                return true;
+            }
+            
+            
+            clean.push(p);
+            return true;
+        },this);
+        if (clean.length) { 
+            node.setAttribute(n, clean.join(';'));
+        } else {
+            node.removeAttribute(n);
+        }
+        
+    }
+        
+        
+        
+    
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterBlack.js b/Roo/htmleditor/FilterBlack.js
new file mode 100644 (file)
index 0000000..76189ac
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ * @class Roo.htmleditor.FilterBlack
+ * remove blacklisted elements.
+ * @constructor
+ * Run a new Blacklisted Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterBlack = function(cfg)
+{
+    Roo.apply(this, cfg);
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterBlack, Roo.htmleditor.Filter,
+{
+    tag : true, // all elements.
+   
+    replaceTag : function(n)
+    {
+        n.parentNode.removeChild(n);
+    }
+});
diff --git a/Roo/htmleditor/FilterBlock.js b/Roo/htmleditor/FilterBlock.js
new file mode 100644 (file)
index 0000000..62592a4
--- /dev/null
@@ -0,0 +1,37 @@
+
+/**
+ * @class Roo.htmleditor.FilterBlock
+ * removes id / data-block and contenteditable that are associated with blocks
+ * usage should be done on a cloned copy of the dom
+ * @constructor
+* Run a new Attribute Filter { node : xxxx }}
+* @param {Object} config Configuration options
+ */
+Roo.htmleditor.FilterBlock = function(cfg)
+{
+    Roo.apply(this, cfg);
+    var qa = cfg.node.querySelectorAll;
+    this.removeAttributes('data-block');
+    this.removeAttributes('contenteditable');
+    this.removeAttributes('id');
+    
+}
+
+Roo.apply(Roo.htmleditor.FilterBlock.prototype,
+{
+    node: true, // all tags
+     
+     
+    removeAttributes : function(attr)
+    {
+        var ar = this.node.querySelectorAll('*[' + attr + ']');
+        for (var i =0;i<ar.length;i++) {
+            ar[i].removeAttribute(attr);
+        }
+    }
+        
+        
+        
+    
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterComment.js b/Roo/htmleditor/FilterComment.js
new file mode 100644 (file)
index 0000000..02e28cf
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * @class Roo.htmleditor.FilterComment
+ * remove comments.
+ * @constructor
+* Run a new Comments Filter
+* @param {Object} config Configuration options
+ */
+Roo.htmleditor.FilterComment = function(cfg)
+{
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterComment, Roo.htmleditor.Filter,
+{
+  
+    replaceComment : function(n)
+    {
+        n.parentNode.removeChild(n);
+    }
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterEmpty.js b/Roo/htmleditor/FilterEmpty.js
new file mode 100644 (file)
index 0000000..642f992
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * @class Roo.htmleditor.FilterEmpty
+ * filter empty elements (normally <B> on paste)
+ * @constructor
+ * Run a new Empty Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterEmpty = function(cfg)
+{
+    // no need to apply config.
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterSpan, Roo.htmleditor.FilterBlack,
+{
+     
+    tag : 'B',
+     
+    replaceTag : function(node)
+    {
+        if (node.innerHTML.trim() != '') {
+            return true;
+        }
+        if (node.attributes && node.attributes.length > 0) {
+            return true; // walk if there are any.
+        }
+        Roo.htmleditor.FilterBlack.prototype.replaceTag.call(this, node);
+        return false;
+     
+    }
+    
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterKeepChildren.js b/Roo/htmleditor/FilterKeepChildren.js
new file mode 100644 (file)
index 0000000..de74237
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * @class Roo.htmleditor.FilterKeepChildren
+ * remove tags but keep children
+ * @constructor
+ * Run a new Keep Children Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterKeepChildren = function(cfg)
+{
+    Roo.apply(this, cfg);
+    if (this.tag === false) {
+        return; // dont walk.. (you can use this to use this just to do a child removal on a single tag )
+    }
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterKeepChildren, Roo.htmleditor.FilterBlack,
+{
+    
+  
+    replaceTag : function(node)
+    {
+        // walk children...
+        //Roo.log(node);
+        var ar = Array.from(node.childNodes);
+        //remove first..
+        for (var i = 0; i < ar.length; i++) {
+            if (ar[i].nodeType == 1) {
+                if (
+                    (typeof(this.tag) == 'object' && this.tag.indexOf(ar[i].tagName) > -1)
+                    || // array and it matches
+                    (typeof(this.tag) == 'string' && this.tag == ar[i].tagName)
+                ) {
+                    this.replaceTag(ar[i]); // child is blacklisted as well...
+                    continue;
+                }
+            }
+        }  
+        ar = Array.from(node.childNodes);
+        for (var i = 0; i < ar.length; i++) {
+         
+            node.removeChild(ar[i]);
+            // what if we need to walk these???
+            node.parentNode.insertBefore(ar[i], node);
+            if (this.tag !== false) {
+                this.walk(ar[i]);
+                
+            }
+        }
+        node.parentNode.removeChild(node);
+        return false; // don't walk children
+        
+        
+    }
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterLongBr.js b/Roo/htmleditor/FilterLongBr.js
new file mode 100644 (file)
index 0000000..39f464b
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * @class Roo.htmleditor.FilterLongBr
+ * BR/BR/BR - keep a maximum of 2...
+ * @constructor
+ * Run a new Long BR Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterLongBr = function(cfg)
+{
+    // no need to apply config.
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterLongBr, Roo.htmleditor.Filter,
+{
+    
+     
+    tag : 'BR',
+    
+     
+    replaceTag : function(node)
+    {
+        
+        var ps = node.nextSibling;
+        while (ps && ps.nodeType == 3 && ps.nodeValue.trim().length < 1) {
+            ps = ps.nextSibling;
+        }
+        
+        if (!ps &&  [ 'TD', 'TH', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ].indexOf(node.parentNode.tagName) > -1) { 
+            node.parentNode.removeChild(node); // remove last BR inside one fo these tags
+            return false;
+        }
+        
+        if (!ps || ps.nodeType != 1) {
+            return false;
+        }
+        
+        if (!ps || ps.tagName != 'BR') {
+           
+            return false;
+        }
+        
+        
+        
+        
+        
+        if (!node.previousSibling) {
+            return false;
+        }
+        var ps = node.previousSibling;
+        
+        while (ps && ps.nodeType == 3 && ps.nodeValue.trim().length < 1) {
+            ps = ps.previousSibling;
+        }
+        if (!ps || ps.nodeType != 1) {
+            return false;
+        }
+        // if header or BR before.. then it's a candidate for removal.. - as we only want '2' of these..
+        if (!ps || [ 'BR', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ].indexOf(ps.tagName) < 0) {
+            return false;
+        }
+        
+        node.parentNode.removeChild(node); // remove me...
+        
+        return false; // no need to do children
+
+    }
+    
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterParagraph.js b/Roo/htmleditor/FilterParagraph.js
new file mode 100644 (file)
index 0000000..5c5f227
--- /dev/null
@@ -0,0 +1,52 @@
+/**
+ * @class Roo.htmleditor.FilterParagraph
+ * paragraphs cause a nightmare for shared content - this filter is designed to be called ? at various points when editing
+ * like on 'push' to remove the <p> tags and replace them with line breaks.
+ * @constructor
+ * Run a new Paragraph Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterParagraph = function(cfg)
+{
+    // no need to apply config.
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterParagraph, Roo.htmleditor.Filter,
+{
+    
+     
+    tag : 'P',
+    
+     
+    replaceTag : function(node)
+    {
+        
+        if (node.childNodes.length == 1 &&
+            node.childNodes[0].nodeType == 3 &&
+            node.childNodes[0].textContent.trim().length < 1
+            ) {
+            // remove and replace with '<BR>';
+            node.parentNode.replaceChild(node.ownerDocument.createElement('BR'),node);
+            return false; // no need to walk..
+        }
+        var ar = Array.from(node.childNodes);
+        for (var i = 0; i < ar.length; i++) {
+            node.removeChild(ar[i]);
+            // what if we need to walk these???
+            node.parentNode.insertBefore(ar[i], node);
+        }
+        // now what about this?
+        // <p> &nbsp; </p>
+        
+        // double BR.
+        node.parentNode.insertBefore(node.ownerDocument.createElement('BR'), node);
+        node.parentNode.insertBefore(node.ownerDocument.createElement('BR'), node);
+        node.parentNode.removeChild(node);
+        
+        return false;
+
+    }
+    
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterSpan.js b/Roo/htmleditor/FilterSpan.js
new file mode 100644 (file)
index 0000000..7d16d7d
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * @class Roo.htmleditor.FilterSpan
+ * filter span's with no attributes out..
+ * @constructor
+ * Run a new Span Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterSpan = function(cfg)
+{
+    // no need to apply config.
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterSpan, Roo.htmleditor.FilterKeepChildren,
+{
+     
+    tag : 'SPAN',
+     
+    replaceTag : function(node)
+    {
+        if (node.attributes && node.attributes.length > 0) {
+            return true; // walk if there are any.
+        }
+        Roo.htmleditor.FilterKeepChildren.prototype.replaceTag.call(this, node);
+        return false;
+     
+    }
+    
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterStyleToTag.js b/Roo/htmleditor/FilterStyleToTag.js
new file mode 100644 (file)
index 0000000..db7128b
--- /dev/null
@@ -0,0 +1,75 @@
+
+/**
+ * @class Roo.htmleditor.FilterStyleToTag
+ * part of the word stuff... - certain 'styles' should be converted to tags.
+ * eg.
+ *   font-weight: bold -> bold
+ *   ?? super / subscrit etc..
+ * 
+ * @constructor
+* Run a new style to tag filter.
+* @param {Object} config Configuration options
+ */
+Roo.htmleditor.FilterStyleToTag = function(cfg)
+{
+    
+    this.tags = {
+        B  : [ 'fontWeight' , 'bold'],
+        I :  [ 'fontStyle' , 'italic'],
+        //pre :  [ 'font-style' , 'italic'],
+        // h1.. h6 ?? font-size?
+        SUP : [ 'verticalAlign' , 'super' ],
+        SUB : [ 'verticalAlign' , 'sub' ]
+        
+        
+    };
+    
+    Roo.apply(this, cfg);
+     
+    
+    this.walk(cfg.node);
+    
+    
+    
+}
+
+
+Roo.extend(Roo.htmleditor.FilterStyleToTag, Roo.htmleditor.Filter,
+{
+    tag: true, // all tags
+    
+    tags : false,
+    
+    
+    replaceTag : function(node)
+    {
+        
+        
+        if (node.getAttribute("style") === null) {
+            return true;
+        }
+        var inject = [];
+        for (var k in this.tags) {
+            if (node.style[this.tags[k][0]] == this.tags[k][1]) {
+                inject.push(k);
+                node.style.removeProperty(this.tags[k][0]);
+            }
+        }
+        if (!inject.length) {
+            return true; 
+        }
+        var cn = Array.from(node.childNodes);
+        var nn = node;
+        Roo.each(inject, function(t) {
+            var nc = node.ownerDocument.createElement(t);
+            nn.appendChild(nc);
+            nn = nc;
+        });
+        for(var i = 0;i < cn.length;cn++) {
+            node.removeChild(cn[i]);
+            nn.appendChild(cn[i]);
+        }
+        return true /// iterate thru
+    }
+    
+})
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterTableWidth.js b/Roo/htmleditor/FilterTableWidth.js
new file mode 100644 (file)
index 0000000..1c81e8d
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * @class Roo.htmleditor.FilterTableWidth
+  try and remove table width data - as that frequently messes up other stuff.
+ * 
+ *      was cleanTableWidths.
+ *
+ * Quite often pasting from word etc.. results in tables with column and widths.
+ * This does not work well on fluid HTML layouts - like emails. - so this code should hunt an destroy them..
+ *
+ * @constructor
+ * Run a new Table Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterTableWidth = function(cfg)
+{
+    // no need to apply config.
+    this.tag = ['TABLE', 'TD', 'TR', 'TH', 'THEAD', 'TBODY' ];
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterTableWidth, Roo.htmleditor.Filter,
+{
+     
+     
+    
+    replaceTag: function(node) {
+        
+        
+      
+        if (node.hasAttribute('width')) {
+            node.removeAttribute('width');
+        }
+        
+         
+        if (node.hasAttribute("style")) {
+            // pretty basic...
+            
+            var styles = node.getAttribute("style").split(";");
+            var nstyle = [];
+            Roo.each(styles, function(s) {
+                if (!s.match(/:/)) {
+                    return;
+                }
+                var kv = s.split(":");
+                if (kv[0].match(/^\s*(width|min-width)\s*$/)) {
+                    return;
+                }
+                // what ever is left... we allow.
+                nstyle.push(s);
+            });
+            node.setAttribute("style", nstyle.length ? nstyle.join(';') : '');
+            if (!nstyle.length) {
+                node.removeAttribute('style');
+            }
+        }
+        
+        return true; // continue doing children..
+    }
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/FilterWord.js b/Roo/htmleditor/FilterWord.js
new file mode 100644 (file)
index 0000000..3af0cd3
--- /dev/null
@@ -0,0 +1,118 @@
+/**
+ * @class Roo.htmleditor.FilterWord
+ * try and clean up all the mess that Word generates.
+ * 
+ * This is the 'nice version' - see 'Heavy' that white lists a very short list of elements, and multi-filters 
+ * @constructor
+ * Run a new Span Filter
+ * @param {Object} config Configuration options
+ */
+
+Roo.htmleditor.FilterWord = function(cfg)
+{
+    // no need to apply config.
+    this.walk(cfg.node);
+}
+
+Roo.extend(Roo.htmleditor.FilterWord, Roo.htmleditor.Filter,
+{
+    tag: true,
+     
+    
+    /**
+     * Clean up MS wordisms...
+     */
+    replaceTag : function(node)
+    {
+         
+        // no idea what this does - span with text, replaceds with just text.
+        if(
+                node.nodeName == 'SPAN' &&
+                !node.hasAttributes() &&
+                node.childNodes.length == 1 &&
+                node.firstChild.nodeName == "#text"  
+        ) {
+            var textNode = node.firstChild;
+            node.removeChild(textNode);
+            if (node.getAttribute('lang') != 'zh-CN') {   // do not space pad on chinese characters..
+                node.parentNode.insertBefore(node.ownerDocument.createTextNode(" "), node);
+            }
+            node.parentNode.insertBefore(textNode, node);
+            if (node.getAttribute('lang') != 'zh-CN') {   // do not space pad on chinese characters..
+                node.parentNode.insertBefore(node.ownerDocument.createTextNode(" ") , node);
+            }
+            
+            node.parentNode.removeChild(node);
+            return false; // dont do chidren - we have remove our node - so no need to do chdhilren?
+        }
+        
+   
+        
+        if (node.tagName.toLowerCase().match(/^(style|script|applet|embed|noframes|noscript)$/)) {
+            node.parentNode.removeChild(node);
+            return false; // dont do chidlren
+        }
+        //Roo.log(node.tagName);
+        // remove - but keep children..
+        if (node.tagName.toLowerCase().match(/^(meta|link|\\?xml:|st1:|o:|v:|font)/)) {
+            //Roo.log('-- removed');
+            while (node.childNodes.length) {
+                var cn = node.childNodes[0];
+                node.removeChild(cn);
+                node.parentNode.insertBefore(cn, node);
+                // move node to parent - and clean it..
+                this.replaceTag(cn);
+            }
+            node.parentNode.removeChild(node);
+            /// no need to iterate chidlren = it's got none..
+            //this.iterateChildren(node, this.cleanWord);
+            return false; // no need to iterate children.
+        }
+        // clean styles
+        if (node.className.length) {
+            
+            var cn = node.className.split(/\W+/);
+            var cna = [];
+            Roo.each(cn, function(cls) {
+                if (cls.match(/Mso[a-zA-Z]+/)) {
+                    return;
+                }
+                cna.push(cls);
+            });
+            node.className = cna.length ? cna.join(' ') : '';
+            if (!cna.length) {
+                node.removeAttribute("class");
+            }
+        }
+        
+        if (node.hasAttribute("lang")) {
+            node.removeAttribute("lang");
+        }
+        
+        if (node.hasAttribute("style")) {
+            
+            var styles = node.getAttribute("style").split(";");
+            var nstyle = [];
+            Roo.each(styles, function(s) {
+                if (!s.match(/:/)) {
+                    return;
+                }
+                var kv = s.split(":");
+                if (kv[0].match(/^(mso-|line|font|background|margin|padding|color)/)) {
+                    return;
+                }
+                // what ever is left... we allow.
+                nstyle.push(s);
+            });
+            node.setAttribute("style", nstyle.length ? nstyle.join(';') : '');
+            if (!nstyle.length) {
+                node.removeAttribute('style');
+            }
+        }
+        return true; // do children
+        
+        
+        
+    }
+});
\ No newline at end of file
diff --git a/Roo/htmleditor/KeyEnter.js b/Roo/htmleditor/KeyEnter.js
new file mode 100644 (file)
index 0000000..c0355ed
--- /dev/null
@@ -0,0 +1,86 @@
+
+/**
+ * @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) {
+            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 = '&nbsp;';
+        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;
+        
+    
+        
+        
+         
+    }
+};
+    
\ No newline at end of file
diff --git a/Roo/htmleditor/TidyEntities.js b/Roo/htmleditor/TidyEntities.js
new file mode 100644 (file)
index 0000000..fef4683
--- /dev/null
@@ -0,0 +1,747 @@
+/***
+ * This is based loosely on tinymce 
+ * @class Roo.htmleditor.TidyEntities
+ * @static
+ * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
+ *
+ * Not 100% sure this is actually used or needed.
+ */
+
+Roo.htmleditor.TidyEntities = {
+    
+    /**
+     * initialize data..
+     */
+    init : function (){
+     
+        this.namedEntities = this.buildEntitiesLookup(this.namedEntitiesData, 32);
+       
+    },
+
+
+    buildEntitiesLookup: function(items, radix) {
+        var i, chr, entity, lookup = {};
+        if (!items) {
+            return {};
+        }
+        items = typeof(items) == 'string' ? items.split(',') : items;
+        radix = radix || 10;
+        // Build entities lookup table
+        for (i = 0; i < items.length; i += 2) {
+            chr = String.fromCharCode(parseInt(items[i], radix));
+            // Only add non base entities
+            if (!this.baseEntities[chr]) {
+                entity = '&' + items[i + 1] + ';';
+                lookup[chr] = entity;
+                lookup[entity] = chr;
+            }
+        }
+        return lookup;
+        
+    },
+    
+    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 : {
+        '"': '&quot;',
+        // Needs to be escaped since the YUI compressor would otherwise break the code
+        '\'': '&#39;',
+        '<': '&lt;',
+        '>': '&gt;',
+        '&': '&amp;',
+        '`': '&#96;'
+    },
+    // Reverse lookup table for raw entities
+    reverseEntities : {
+        '&lt;': '<',
+        '&gt;': '>',
+        '&amp;': '&',
+        '&quot;': '"',
+        '&apos;': '\''
+    },
+    
+    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();
\ No newline at end of file
diff --git a/Roo/htmleditor/TidySerializer.js b/Roo/htmleditor/TidySerializer.js
new file mode 100644 (file)
index 0000000..f1fc44d
--- /dev/null
@@ -0,0 +1,120 @@
+
+/***
+ * This is based loosely on tinymce 
+ * @class Roo.htmleditor.TidySerializer
+ * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
+ * @constructor
+ * @method Serializer
+ * @param {Object} settings Name/value settings object.
+ */
+
+
+Roo.htmleditor.TidySerializer = function(settings)
+{
+    Roo.apply(this, settings);
+    
+    this.writer = new Roo.htmleditor.TidyWriter(settings);
+    
+    
+
+};
+Roo.htmleditor.TidySerializer.prototype = {
+    
+    /**
+     * @param {boolean} inner do the inner of the node.
+     */
+    inner : false,
+    
+    writer : false,
+    
+    /**
+    * Serializes the specified node into a string.
+    *
+    * @example
+    * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('<p>text</p>'));
+    * @method serialize
+    * @param {DomElement} node Node instance to serialize.
+    * @return {String} String with HTML based on DOM tree.
+    */
+    serialize : function(node) {
+        
+        // = settings.validate;
+        var writer = this.writer;
+        var self  = this;
+        this.handlers = {
+            // #text
+            3: function(node) {
+                
+                writer.text(node.nodeValue, node);
+            },
+            // #comment
+            8: function(node) {
+                writer.comment(node.nodeValue);
+            },
+            // Processing instruction
+            7: function(node) {
+                writer.pi(node.name, node.nodeValue);
+            },
+            // Doctype
+            10: function(node) {
+                writer.doctype(node.nodeValue);
+            },
+            // CDATA
+            4: function(node) {
+                writer.cdata(node.nodeValue);
+            },
+            // Document fragment
+            11: function(node) {
+                node = node.firstChild;
+                if (!node) {
+                    return;
+                }
+                while(node) {
+                    self.walk(node);
+                    node = node.nextSibling
+                }
+            }
+        };
+        writer.reset();
+        1 != node.nodeType || this.inner ? this.handlers[11](node) : this.walk(node);
+        return writer.getContent();
+    },
+
+    walk: function(node)
+    {
+        var attrName, attrValue, sortedAttrs, i, l, elementRule,
+            handler = this.handlers[node.nodeType];
+            
+        if (handler) {
+            handler(node);
+            return;
+        }
+    
+        var name = node.nodeName;
+        var isEmpty = node.childNodes.length < 1;
+      
+        var writer = this.writer;
+        var attrs = node.attributes;
+        // Sort attributes
+        
+        writer.start(node.nodeName, attrs, isEmpty, node);
+        if (isEmpty) {
+            return;
+        }
+        node = node.firstChild;
+        if (!node) {
+            writer.end(name);
+            return;
+        }
+        while (node) {
+            this.walk(node);
+            node = node.nextSibling;
+        }
+        writer.end(name);
+        
+    
+    }
+    // Serialize element and treat all non elements as fragments
+   
+}; 
+
diff --git a/Roo/htmleditor/TidyWriter.js b/Roo/htmleditor/TidyWriter.js
new file mode 100644 (file)
index 0000000..9db08ab
--- /dev/null
@@ -0,0 +1,400 @@
+/***
+ * This is based loosely on tinymce 
+ * @class Roo.htmleditor.TidyWriter
+ * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
+ *
+ * Known issues?
+ * - not tested much with 'PRE' formated elements.
+ * 
+ *
+ *
+ */
+
+Roo.htmleditor.TidyWriter = function(settings)
+{
+    
+    // indent, indentBefore, indentAfter, encode, htmlOutput, html = [];
+    Roo.apply(this, settings);
+    this.html = [];
+    this.state = [];
+     
+    this.encode = Roo.htmleditor.TidyEntities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);
+  
+}
+Roo.htmleditor.TidyWriter.prototype = {
+
+    state : false,
+    
+    indent :  '  ',
+    
+    // part of state...
+    indentstr : '',
+    in_pre: false,
+    in_inline : false,
+    last_inline : false,
+    encode : false,
+     
+    
+            /**
+    * Writes the a start element such as <p id="a">.
+    *
+    * @method start
+    * @param {String} name Name of the element.
+    * @param {Array} attrs Optional attribute array or undefined if it hasn't any.
+    * @param {Boolean} empty Optional empty state if the tag should end like <br />.
+    */
+    start: function(name, attrs, empty, node)
+    {
+        var i, l, attr, value;
+        
+        // there are some situations where adding line break && indentation will not work. will not work.
+        // <span / b / i ... formating?
+        
+        var in_inline = this.in_inline || Roo.htmleditor.TidyWriter.inline_elements.indexOf(name) > -1;
+        var in_pre    = this.in_pre    || Roo.htmleditor.TidyWriter.whitespace_elements.indexOf(name) > -1;
+        
+        var is_short   = empty ? Roo.htmleditor.TidyWriter.shortend_elements.indexOf(name) > -1 : false;
+        
+        var add_lb = name == 'BR' ? false : in_inline;
+        
+        if (!add_lb && !this.in_pre && this.lastElementEndsWS()) {
+            i_inline = false;
+        }
+
+        var indentstr =  this.indentstr;
+        
+        // e_inline = elements that can be inline, but still allow \n before and after?
+        // only 'BR' ??? any others?
+        
+        // ADD LINE BEFORE tage
+        if (!this.in_pre) {
+            if (in_inline) {
+                //code
+                if (name == 'BR') {
+                    this.addLine();
+                } else if (this.lastElementEndsWS()) {
+                    this.addLine();
+                } else{
+                    // otherwise - no new line. (and dont indent.)
+                    indentstr = '';
+                }
+                
+            } else {
+                this.addLine();
+            }
+        } else {
+            indentstr = '';
+        }
+        
+        this.html.push(indentstr + '<', name.toLowerCase());
+        
+        if (attrs) {
+            for (i = 0, l = attrs.length; i < l; i++) {
+                attr = attrs[i];
+                this.html.push(' ', attr.name, '="', this.encode(attr.value, true), '"');
+            }
+        }
+     
+        if (empty) {
+            if (is_short) {
+                this.html[this.html.length] = '/>';
+            } else {
+                this.html[this.html.length] = '></' + name.toLowerCase() + '>';
+            }
+            var e_inline = name == 'BR' ? false : this.in_inline;
+            
+            if (!e_inline && !this.in_pre) {
+                this.addLine();
+            }
+            return;
+        
+        }
+        // not empty..
+        this.html[this.html.length] = '>';
+        
+        // there is a special situation, where we need to turn on in_inline - if any of the imediate chidlren are one of these.
+        /*
+        if (!in_inline && !in_pre) {
+            var cn = node.firstChild;
+            while(cn) {
+                if (Roo.htmleditor.TidyWriter.inline_elements.indexOf(cn.nodeName) > -1) {
+                    in_inline = true
+                    break;
+                }
+                cn = cn.nextSibling;
+            }
+             
+        }
+        */
+        
+        
+        this.pushState({
+            indentstr : in_pre   ? '' : (this.indentstr + this.indent),
+            in_pre : in_pre,
+            in_inline :  in_inline
+        });
+        // add a line after if we are not in a
+        
+        if (!in_inline && !in_pre) {
+            this.addLine();
+        }
+        
+            
+         
+        
+    },
+    
+    lastElementEndsWS : function()
+    {
+        var value = this.html.length > 0 ? this.html[this.html.length-1] : false;
+        if (value === false) {
+            return true;
+        }
+        return value.match(/\s+$/);
+        
+    },
+    
+    /**
+     * Writes the a end element such as </p>.
+     *
+     * @method end
+     * @param {String} name Name of the element.
+     */
+    end: function(name) {
+        var value;
+        this.popState();
+        var indentstr = '';
+        var in_inline = this.in_inline || Roo.htmleditor.TidyWriter.inline_elements.indexOf(name) > -1;
+        
+        if (!this.in_pre && !in_inline) {
+            this.addLine();
+            indentstr  = this.indentstr;
+        }
+        this.html.push(indentstr + '</', name.toLowerCase(), '>');
+        this.last_inline = in_inline;
+        
+        // pop the indent state..
+    },
+    /**
+     * Writes a text node.
+     *
+     * In pre - we should not mess with the contents.
+     * 
+     *
+     * @method text
+     * @param {String} text String to write out.
+     * @param {Boolean} raw Optional raw state if true the contents wont get encoded.
+     */
+    text: function(text, node)
+    {
+        // if not in whitespace critical
+        if (text.length < 1) {
+            return;
+        }
+        if (this.in_pre) {
+            this.html[this.html.length] =  text;
+            return;   
+        }
+        
+        if (this.in_inline) {
+            text = text.replace(/\s+/g,' '); // all white space inc line breaks to a slingle' '
+            if (text != ' ') {
+                text = text.replace(/\s+/,' ');  // all white space to single white space
+                
+                    
+                // if next tag is '<BR>', then we can trim right..
+                if (node.nextSibling &&
+                    node.nextSibling.nodeType == 1 &&
+                    node.nextSibling.nodeName == 'BR' )
+                {
+                    text = text.replace(/\s+$/g,'');
+                }
+                // if previous tag was a BR, we can also trim..
+                if (node.previousSibling &&
+                    node.previousSibling.nodeType == 1 &&
+                    node.previousSibling.nodeName == 'BR' )
+                {
+                    text = this.indentstr +  text.replace(/^\s+/g,'');
+                }
+                if (text.match(/\n/)) {
+                    text = text.replace(
+                        /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, '$1\n' + this.indentstr
+                    );
+                    // remoeve the last whitespace / line break.
+                    text = text.replace(/\n\s+$/,'');
+                }
+                // repace long lines
+                
+            }
+             
+            this.html[this.html.length] =  text;
+            return;   
+        }
+        // see if previous element was a inline element.
+        var indentstr = this.indentstr;
+   
+        text = text.replace(/\s+/g," "); // all whitespace into single white space.
+        
+        // should trim left?
+        if (node.previousSibling &&
+            node.previousSibling.nodeType == 1 &&
+            Roo.htmleditor.TidyWriter.inline_elements.indexOf(node.previousSibling.nodeName) > -1)
+        {
+            indentstr = '';
+            
+        } else {
+            this.addLine();
+            text = text.replace(/^\s+/,''); // trim left
+          
+        }
+        // should trim right?
+        if (node.nextSibling &&
+            node.nextSibling.nodeType == 1 &&
+            Roo.htmleditor.TidyWriter.inline_elements.indexOf(node.nextSibling.nodeName) > -1)
+        {
+          // noop
+            
+        }  else {
+            text = text.replace(/\s+$/,''); // trim right
+        }
+         
+              
+        
+        
+        
+        if (text.length < 1) {
+            return;
+        }
+        if (!text.match(/\n/)) {
+            this.html.push(indentstr + text);
+            return;
+        }
+        
+        text = this.indentstr + text.replace(
+            /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, '$1\n' + this.indentstr
+        );
+        // remoeve the last whitespace / line break.
+        text = text.replace(/\s+$/,''); 
+        
+        this.html.push(text);
+        
+        // split and indent..
+        
+        
+    },
+    /**
+     * Writes a cdata node such as <![CDATA[data]]>.
+     *
+     * @method cdata
+     * @param {String} text String to write out inside the cdata.
+     */
+    cdata: function(text) {
+        this.html.push('<![CDATA[', text, ']]>');
+    },
+    /**
+    * Writes a comment node such as <!-- Comment -->.
+    *
+    * @method cdata
+    * @param {String} text String to write out inside the comment.
+    */
+   comment: function(text) {
+       this.html.push('<!--', text, '-->');
+   },
+    /**
+     * Writes a PI node such as <?xml attr="value" ?>.
+     *
+     * @method pi
+     * @param {String} name Name of the pi.
+     * @param {String} text String to write out inside the pi.
+     */
+    pi: function(name, text) {
+        text ? this.html.push('<?', name, ' ', this.encode(text), '?>') : this.html.push('<?', name, '?>');
+        this.indent != '' && this.html.push('\n');
+    },
+    /**
+     * Writes a doctype node such as <!DOCTYPE data>.
+     *
+     * @method doctype
+     * @param {String} text String to write out inside the doctype.
+     */
+    doctype: function(text) {
+        this.html.push('<!DOCTYPE', text, '>', this.indent != '' ? '\n' : '');
+    },
+    /**
+     * Resets the internal buffer if one wants to reuse the writer.
+     *
+     * @method reset
+     */
+    reset: function() {
+        this.html.length = 0;
+        this.state = [];
+        this.pushState({
+            indentstr : '',
+            in_pre : false, 
+            in_inline : false
+        })
+    },
+    /**
+     * Returns the contents that got serialized.
+     *
+     * @method getContent
+     * @return {String} HTML contents that got written down.
+     */
+    getContent: function() {
+        return this.html.join('').replace(/\n$/, '');
+    },
+    
+    pushState : function(cfg)
+    {
+        this.state.push(cfg);
+        Roo.apply(this, cfg);
+    },
+    
+    popState : function()
+    {
+        if (this.state.length < 1) {
+            return; // nothing to push
+        }
+        var cfg = {
+            in_pre: false,
+            indentstr : ''
+        };
+        this.state.pop();
+        if (this.state.length > 0) {
+            cfg = this.state[this.state.length-1]; 
+        }
+        Roo.apply(this, cfg);
+    },
+    
+    addLine: function()
+    {
+        if (this.html.length < 1) {
+            return;
+        }
+        
+        
+        var value = this.html[this.html.length - 1];
+        if (value.length > 0 && '\n' !== value) {
+            this.html.push('\n');
+        }
+    }
+    
+    
+//'pre script noscript style textarea video audio iframe object code'
+// shortended... 'area base basefont br col frame hr img input isindex link  meta param embed source wbr track');
+// inline 
+};
+
+Roo.htmleditor.TidyWriter.inline_elements = [
+        'SPAN','STRONG','B','EM','I','FONT','STRIKE','U','VAR',
+        'CITE','DFN','CODE','MARK','Q','SUP','SUB','SAMP', 'A'
+];
+Roo.htmleditor.TidyWriter.shortend_elements = [
+    'AREA','BASE','BASEFONT','BR','COL','FRAME','HR','IMG','INPUT',
+    'ISINDEX','LINK','','META','PARAM','EMBED','SOURCE','WBR','TRACK'
+];
+
+Roo.htmleditor.TidyWriter.whitespace_elements = [
+    'PRE','SCRIPT','NOSCRIPT','STYLE','TEXTAREA','VIDEO','AUDIO','IFRAME','OBJECT','CODE'
+];
\ No newline at end of file
diff --git a/Roo/htmleditor/namespace.js b/Roo/htmleditor/namespace.js
new file mode 100644 (file)
index 0000000..775c795
--- /dev/null
@@ -0,0 +1,2 @@
+
+Roo.htmleditor = {};
diff --git a/Roo/lib/Range.js b/Roo/lib/Range.js
new file mode 100644 (file)
index 0000000..513f9fc
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * @class Roo.lib.Range
+ * @constructor
+ * This is a toolkit, normally used to copy features into a Dom Range element
+ * Roo.lib.Range.wrap(x);
+ *
+ *
+ *
+ */
+Roo.lib.Range = function() { };
+
+/**
+ * Wrap a Dom Range object, to give it new features...
+ * @static
+ * @param {Range} the range to wrap
+ */
+Roo.lib.Range.wrap = function(r) {
+    return Roo.apply(r, Roo.lib.Range.prototype);
+};
+/**
+ * find a parent node eg. LI / OL
+ * @param {string|Array} node name or array of nodenames
+ * @return {DomElement|false}
+ */
+Roo.apply(Roo.lib.Range.prototype,
+{
+    
+    closest : function(str)
+    {
+        if (typeof(str) != 'string') {
+            // assume it's a array.
+            for(var i = 0;i < str.length;i++) {
+                var r = this.closest(str[i]);
+                if (r !== false) {
+                    return r;
+                }
+                
+            }
+            return false;
+        }
+        str = str.toLowerCase();
+        var n = this.commonAncestorContainer; // might not be a node
+        while (n.nodeType != 1) {
+            n = n.parentNode;
+        }
+        
+        if (n.nodeName.toLowerCase() == str ) {
+            return n;
+        }
+        if (n.nodeName.toLowerCase() == 'body') {
+            return false;
+        }
+            
+        return n.closest(str) || false;
+        
+    },
+    cloneRange : function()
+    {
+        return Roo.lib.Range.wrap(Range.prototype.cloneRange.call(this));
+    }
+});
\ No newline at end of file
diff --git a/Roo/lib/Selection.js b/Roo/lib/Selection.js
new file mode 100644 (file)
index 0000000..a4f2951
--- /dev/null
@@ -0,0 +1,101 @@
+/**
+ * @class Roo.lib.Selection
+ * @constructor
+ * This is a toolkit, normally used to copy features into a Dom Selection element
+ * Roo.lib.Selection.wrap(x);
+ *
+ *
+ *
+ */
+Roo.lib.Selection = function() { };
+
+/**
+ * Wrap a Dom Range object, to give it new features...
+ * @static
+ * @param {Range} the range to wrap
+ */
+Roo.lib.Selection.wrap = function(r, doc) {
+    Roo.apply(r, Roo.lib.Selection.prototype);
+    r.ownerDocument = doc; // usefull so we dont have to keep referening to it.
+    return r;
+};
+/**
+ * find a parent node eg. LI / OL
+ * @param {string|Array} node name or array of nodenames
+ * @return {DomElement|false}
+ */
+Roo.apply(Roo.lib.Selection.prototype,
+{
+    /**
+     * the owner document
+     */
+    ownerDocument : false,
+    
+    getRangeAt : function(n)
+    {
+        return Roo.lib.Range.wrap(Selection.prototype.getRangeAt.call(this,n));
+    },
+    
+    /**
+     * insert node at selection 
+     * @param {DomElement|string} node
+     * @param {string} cursor (after|in|none) where to place the cursor after inserting.
+     */
+    insertNode: function(node, cursor)
+    {
+        if (typeof(node) == 'string') {
+            node = this.ownerDocument.createElement(node);
+            if (cursor == 'in') {
+                node.innerHTML = '&nbsp;';
+            }
+        }
+        
+        var range = this.getRangeAt(0);
+        
+        if (this.type != 'Caret') {
+            range.deleteContents();
+        }
+        var sn = node.childNodes[0]; // select the contents.
+
+        
+        
+        range.insertNode(node);
+        if (cursor == 'after') {
+            node.insertAdjacentHTML('afterend', '&nbsp;');
+            sn = node.nextSibling;
+        }
+        
+        if (cursor == 'none') {
+            return;
+        }
+        
+        this.cursorText(sn);
+    },
+    
+    cursorText : function(n)
+    {
+       
+        //var range = this.getRangeAt(0);
+        range = Roo.lib.Range.wrap(new Range());
+        //range.selectNode(n);
+        
+        var ix = Array.from(n.parentNode.childNodes).indexOf(n);
+        range.setStart(n.parentNode,ix);
+        range.setEnd(n.parentNode,ix+1);
+        //range.collapse(false);
+         
+        this.removeAllRanges();
+        this.addRange(range);
+        
+        Roo.log([n, range, this,this.baseOffset,this.extentOffset, this.type]);
+    },
+    cursorAfter : function(n)
+    {
+        if (!n.nextSibling || n.nextSibling.nodeValue != '&nbsp;') {
+            n.insertAdjacentHTML('afterend', '&nbsp;');
+        }
+        this.cursorText (n.nextSibling);
+    }
+        
+    
+});
\ No newline at end of file
diff --git a/Roo/lib/UndoManager.js b/Roo/lib/UndoManager.js
new file mode 100644 (file)
index 0000000..03e091e
--- /dev/null
@@ -0,0 +1,301 @@
+/**
+ * Originally based of this code... - refactored for Roo...
+ * https://github.com/aaalsaleh/undo-manager
+ * undo-manager.js
+ * @author  Abdulrahman Alsaleh 
+ * @copyright 2015 Abdulrahman Alsaleh 
+ * @license  MIT License (c) 
+ *
+ * Hackily modifyed by alan@roojs.com
+ *
+ *
+ *  
+ *
+ *  TOTALLY UNTESTED...
+ *
+ *  Documentation to be done....
+ */
+
+/**
+* @class Roo.lib.UndoManager
+* An undo manager implementation in JavaScript. It follows the W3C UndoManager and DOM Transaction
+* Draft and the undocumented and disabled Mozilla Firefox's UndoManager implementation.
+
+ * Usage:
+ * <pre><code>
+
+
+editor.undoManager = new Roo.lib.UndoManager(1000, editor);
+</code></pre>
+
+* For more information see this blog post with examples:
+*  <a href="http://www.cnitblog.com/seeyeah/archive/2011/12/30/38728.html/">DomHelper
+     - Create Elements using DOM, HTML fragments and Templates</a>. 
+* @constructor
+* @param {Number} limit how far back to go ... use 1000?
+* @param {Object} scope usually use document..
+*/
+
+Roo.lib.UndoManager = function (limit, undoScopeHost)
+{
+    this.stack = [];
+    this.limit = limit;
+    this.scope = undoScopeHost;
+    this.fireEvent = typeof CustomEvent != 'undefined' && undoScopeHost && undoScopeHost.dispatchEvent;
+    if (this.fireEvent) {
+        this.bindEvents();
+    }
+    this.reset();
+    
+};
+        
+Roo.lib.UndoManager.prototype = {
+    
+    limit : false,
+    stack : false,
+    scope :  false,
+    fireEvent : false,
+    position : 0,
+    length : 0,
+    
+    
+     /**
+     * To push and execute a transaction, the method undoManager.transact
+     * must be called by passing a transaction object as the first argument, and a merge
+     * flag as the second argument. A transaction object has the following properties:
+     *
+     * Usage:
+<pre><code>
+undoManager.transact({
+    label: 'Typing',
+    execute: function() { ... },
+    undo: function() { ... },
+    // redo same as execute
+    redo: function() { this.execute(); }
+}, false);
+
+// merge transaction
+undoManager.transact({
+    label: 'Typing',
+    execute: function() { ... },  // this will be run...
+    undo: function() { ... }, // what to do when undo is run.
+    // redo same as execute
+    redo: function() { this.execute(); }
+}, true); 
+</code></pre> 
+     *
+     * 
+     * @param {Object} transaction The transaction to add to the stack.
+     * @return {String} The HTML fragment
+     */
+    
+    
+    transact : function (transaction, merge)
+    {
+        if (arguments.length < 2) {
+            throw new TypeError('Not enough arguments to UndoManager.transact.');
+        }
+
+        transaction.execute();
+
+        this.stack.splice(0, this.position);
+        if (merge && this.length) {
+            this.stack[0].push(transaction);
+        } else {
+            this.stack.unshift([transaction]);
+        }
+    
+        this.position = 0;
+
+        if (this.limit && this.stack.length > this.limit) {
+            this.length = this.stack.length = this.limit;
+        } else {
+            this.length = this.stack.length;
+        }
+
+        if (this.fireEvent) {
+            this.scope.dispatchEvent(
+                new CustomEvent('DOMTransaction', {
+                    detail: {
+                        transactions: this.stack[0].slice()
+                    },
+                    bubbles: true,
+                    cancelable: false
+                })
+            );
+        }
+        
+        //Roo.log("transaction: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
+      
+        
+    },
+
+    undo : function ()
+    {
+        //Roo.log("undo: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
+        
+        if (this.position < this.length) {
+            for (var i = this.stack[this.position].length - 1; i >= 0; i--) {
+                this.stack[this.position][i].undo();
+            }
+            this.position++;
+
+            if (this.fireEvent) {
+                this.scope.dispatchEvent(
+                    new CustomEvent('undo', {
+                        detail: {
+                            transactions: this.stack[this.position - 1].slice()
+                        },
+                        bubbles: true,
+                        cancelable: false
+                    })
+                );
+            }
+        }
+    },
+
+    redo : function ()
+    {
+        if (this.position > 0) {
+            for (var i = 0, n = this.stack[this.position - 1].length; i < n; i++) {
+                this.stack[this.position - 1][i].redo();
+            }
+            this.position--;
+
+            if (this.fireEvent) {
+                this.scope.dispatchEvent(
+                    new CustomEvent('redo', {
+                        detail: {
+                            transactions: this.stack[this.position].slice()
+                        },
+                        bubbles: true,
+                        cancelable: false
+                    })
+                );
+            }
+        }
+    },
+
+    item : function (index)
+    {
+        if (index >= 0 && index < this.length) {
+            return this.stack[index].slice();
+        }
+        return null;
+    },
+
+    clearUndo : function () {
+        this.stack.length = this.length = this.position;
+    },
+
+    clearRedo : function () {
+        this.stack.splice(0, this.position);
+        this.position = 0;
+        this.length = this.stack.length;
+    },
+    /**
+     * Reset the undo - probaly done on load to clear all history.
+     */
+    reset : function()
+    {
+        this.stack = [];
+        this.position = 0;
+        this.length = 0;
+        this.current_html = this.scope.innerHTML;
+        if (this.timer !== false) {
+            clearTimeout(this.timer);
+        }
+        this.timer = false;
+        this.merge = false;
+        this.addEvent();
+        
+    },
+    current_html : '',
+    timer : false,
+    merge : false,
+    
+    
+    // this will handle the undo/redo on the element.?
+    bindEvents : function()
+    {
+        var el  = this.scope;
+        el.undoManager = this;
+        
+        
+        this.scope.addEventListener('keydown', function(e) {
+            if ((e.ctrlKey || e.metaKey) && e.keyCode === 90) {
+                if (e.shiftKey) {
+                    el.undoManager.redo(); // Ctrl/Command + Shift + Z
+                } else {
+                    el.undoManager.undo(); // Ctrl/Command + Z
+                }
+        
+                e.preventDefault();
+            }
+        });
+        /// ignore keyup..
+        this.scope.addEventListener('keyup', function(e) {
+            if ((e.ctrlKey || e.metaKey) && e.keyCode === 90) {
+                e.preventDefault();
+            }
+        });
+        
+        
+        
+        var t = this;
+        
+        el.addEventListener('input', function(e) {
+            if(el.innerHTML == t.current_html) {
+                return;
+            }
+            // only record events every second.
+            if (t.timer !== false) {
+               clearTimeout(t.timer);
+               t.timer = false;
+            }
+            t.timer = setTimeout(function() { t.merge = false; }, 1000);
+            
+            t.addEvent(t.merge);
+            t.merge = true; // ignore changes happening every second..
+        });
+       },
+    /**
+     * Manually add an event.
+     * Normall called without arguements - and it will just get added to the stack.
+     * 
+     */
+    
+    addEvent : function(merge)
+    {
+        //Roo.log("undomanager +" + (merge ? 'Y':'n'));
+        // not sure if this should clear the timer 
+        merge = typeof(merge) == 'undefined' ? false : merge; 
+        
+        this.scope.undoManager.transact({
+            scope : this.scope,
+            oldHTML: this.current_html,
+            newHTML: this.scope.innerHTML,
+            // nothing to execute (content already changed when input is fired)
+            execute: function() { },
+            undo: function() {
+                this.scope.innerHTML = this.current_html = this.oldHTML;
+            },
+            redo: function() {
+                this.scope.innerHTML = this.current_html = this.newHTML;
+            }
+        }, false); //merge);
+        
+        this.merge = merge;
+        
+        this.current_html = this.scope.innerHTML;
+    }
+    
+    
+     
+    
+    
+    
+};
diff --git a/Roo/rtf/Ctrl.js b/Roo/rtf/Ctrl.js
new file mode 100644 (file)
index 0000000..7a0d40f
--- /dev/null
@@ -0,0 +1,6 @@
+Roo.rtf.Ctrl = function(opts)
+{
+    this.value = opts.value;
+    this.param = opts.param;
+};
diff --git a/Roo/rtf/Document.js b/Roo/rtf/Document.js
new file mode 100644 (file)
index 0000000..ee130df
--- /dev/null
@@ -0,0 +1,46 @@
+
+// this looks like it's normally the {rtf{ .... }}
+Roo.rtf.Document = function()
+{
+    // we dont want to acutally store parent - it will make debug a nightmare..
+    this.rtlch  = [];
+    this.content = [];
+    this.cn = [];
+    
+};
+Roo.extend(Roo.rtf.Document, Roo.rtf.Group, { 
+    addChild : function(cn)
+    {
+        this.cn.push(cn);
+        switch(cn.type) {
+            case 'rtlch': // most content seems to be inside this??
+            case 'listtext':
+            case 'shpinst':
+                this.rtlch.push(cn);
+                return;
+            default:
+                this[cn.type] = cn;
+        }
+        
+    },
+    
+    getElementsByType : function(type)
+    {
+        var ret =  [];
+        this._getElementsByType(type, ret, this.cn, 'rtf');
+        return ret;
+    },
+    _getElementsByType : function (type, ret, search_array, path)
+    {
+        search_array.forEach(function(n,i) {
+            if (n.type == type) {
+                n.path = path + '/' + n.type + ':' + i;
+                ret.push(n);
+            }
+            if (n.cn.length > 0) {
+                this._getElementsByType(type, ret, n.cn, path + '/' + n.type+':'+i);
+            }
+        },this);
+    }
+    
+});
diff --git a/Roo/rtf/Group.js b/Roo/rtf/Group.js
new file mode 100644 (file)
index 0000000..1adfef5
--- /dev/null
@@ -0,0 +1,47 @@
+
+Roo.rtf.Group = function(parent)
+{
+    // we dont want to acutally store parent - it will make debug a nightmare..
+    this.content = [];
+    this.cn  = [];
+     
+       
+    
+};
+
+Roo.rtf.Group.prototype = {
+    ignorable : false,
+    content: false,
+    cn: false,
+    addContent : function(node) {
+        // could set styles...
+        this.content.push(node);
+    },
+    addChild : function(cn)
+    {
+        this.cn.push(cn);
+    },
+    // only for images really...
+    toDataURL : function()
+    {
+        var mimetype = false;
+        switch(true) {
+            case this.content.filter(function(a) { return a.value == 'pngblip' } ).length > 0: 
+                mimetype = "image/png";
+                break;
+             case this.content.filter(function(a) { return a.value == 'jpegblip' } ).length > 0:
+                mimetype = "image/jpeg";
+                break;
+            default :
+                return 'about:blank'; // ?? error?
+        }
+        
+        
+        var hexstring = this.content[this.content.length-1].value;
+        
+        return 'data:' + mimetype + ';base64,' + btoa(hexstring.match(/\w{2}/g).map(function(a) {
+            return String.fromCharCode(parseInt(a, 16));
+        }).join(""));
+    }
+    
+};
\ No newline at end of file
diff --git a/Roo/rtf/Hex.js b/Roo/rtf/Hex.js
new file mode 100644 (file)
index 0000000..06bb69e
--- /dev/null
@@ -0,0 +1,4 @@
+Roo.rtf.Hex = function(hex)
+{
+    this.hexstr = hex;
+};
diff --git a/Roo/rtf/Paragraph.js b/Roo/rtf/Paragraph.js
new file mode 100644 (file)
index 0000000..511c60c
--- /dev/null
@@ -0,0 +1,4 @@
+Roo.rtf.Paragraph = function(opts)
+{
+    this.content = []; ///??? is that used?
+};
\ No newline at end of file
diff --git a/Roo/rtf/Parser.js b/Roo/rtf/Parser.js
new file mode 100644 (file)
index 0000000..6a3d708
--- /dev/null
@@ -0,0 +1,384 @@
+/**
+ *
+ *
+ * based on this https://github.com/iarna/rtf-parser
+ * it's really only designed to extract pict from pasted RTF 
+ *
+ * usage:
+ *
+ *  var images = new Roo.rtf.Parser().parse(a_string).filter(function(g) { return g.type == 'pict'; });
+ *  
+ *
+ */
+
+
+
+
+Roo.rtf.Parser = function(text) {
+    //super({objectMode: true})
+    this.text = '';
+    this.parserState = this.parseText;
+    
+    // these are for interpeter...
+    this.doc = {};
+    ///this.parserState = this.parseTop
+    this.groupStack = [];
+    this.hexStore = [];
+    this.doc = false;
+    
+    this.groups = []; // where we put the return.
+    
+    for (var ii = 0; ii < text.length; ++ii) {
+        ++this.cpos;
+        
+        if (text[ii] === '\n') {
+            ++this.row;
+            this.col = 1;
+        } else {
+            ++this.col;
+        }
+        this.parserState(text[ii]);
+    }
+    
+    
+    
+};
+Roo.rtf.Parser.prototype = {
+    text : '', // string being parsed..
+    controlWord : '',
+    controlWordParam :  '',
+    hexChar : '',
+    doc : false,
+    group: false,
+    groupStack : false,
+    hexStore : false,
+    
+    
+    cpos : 0, 
+    row : 1, // reportin?
+    col : 1, //
+
+     
+    push : function (el)
+    {
+        var m = 'cmd'+ el.type;
+        if (typeof(this[m]) == 'undefined') {
+            Roo.log('invalid cmd:' + el.type);
+            return;
+        }
+        this[m](el);
+        //Roo.log(el);
+    },
+    flushHexStore : function()
+    {
+        if (this.hexStore.length < 1) {
+            return;
+        }
+        var hexstr = this.hexStore.map(
+            function(cmd) {
+                return cmd.value;
+        }).join('');
+        
+        this.group.addContent( new Roo.rtf.Hex( hexstr ));
+              
+            
+        this.hexStore.splice(0)
+        
+    },
+    
+    cmdgroupstart : function()
+    {
+        this.flushHexStore();
+        if (this.group) {
+            this.groupStack.push(this.group);
+        }
+         // parent..
+        if (this.doc === false) {
+            this.group = this.doc = new Roo.rtf.Document();
+            return;
+            
+        }
+        this.group = new Roo.rtf.Group(this.group);
+    },
+    cmdignorable : function()
+    {
+        this.flushHexStore();
+        this.group.ignorable = true;
+    },
+    cmdendparagraph : function()
+    {
+        this.flushHexStore();
+        this.group.addContent(new Roo.rtf.Paragraph());
+    },
+    cmdgroupend : function ()
+    {
+        this.flushHexStore();
+        var endingGroup = this.group;
+        
+        
+        this.group = this.groupStack.pop();
+        if (this.group) {
+            this.group.addChild(endingGroup);
+        }
+        
+        
+        
+        var doc = this.group || this.doc;
+        //if (endingGroup instanceof FontTable) {
+        //  doc.fonts = endingGroup.table
+        //} else if (endingGroup instanceof ColorTable) {
+        //  doc.colors = endingGroup.table
+        //} else if (endingGroup !== this.doc && !endingGroup.get('ignorable')) {
+        if (endingGroup.ignorable === false) {
+            //code
+            this.groups.push(endingGroup);
+           // Roo.log( endingGroup );
+        }
+            //Roo.each(endingGroup.content, function(item)) {
+            //    doc.addContent(item);
+            //}
+            //process.emit('debug', 'GROUP END', endingGroup.type, endingGroup.get('ignorable'))
+        //}
+    },
+    cmdtext : function (cmd)
+    {
+        this.flushHexStore();
+        if (!this.group) { // an RTF fragment, missing the {\rtf1 header
+            //this.group = this.doc
+            return;  // we really don't care about stray text...
+        }
+        this.group.addContent(new Roo.rtf.Span(cmd));
+    },
+    cmdcontrolword : function (cmd)
+    {
+        this.flushHexStore();
+        if (!this.group.type) {
+            this.group.type = cmd.value;
+            return;
+        }
+        this.group.addContent(new Roo.rtf.Ctrl(cmd));
+        // we actually don't care about ctrl words...
+        return ;
+        /*
+        var method = 'ctrl$' + cmd.value.replace(/-(.)/g, (_, char) => char.toUpperCase())
+        if (this[method]) {
+            this[method](cmd.param)
+        } else {
+            if (!this.group.get('ignorable')) process.emit('debug', method, cmd.param)
+        }
+        */
+    },
+    cmdhexchar : function(cmd) {
+        this.hexStore.push(cmd);
+    },
+    cmderror : function(cmd) {
+        throw new Exception (cmd.value);
+    },
+    
+    /*
+      _flush (done) {
+        if (this.text !== '\u0000') this.emitText()
+        done()
+      }
+      */
+      
+      
+    parseText : function(c)
+    {
+        if (c === '\\') {
+            this.parserState = this.parseEscapes;
+        } else if (c === '{') {
+            this.emitStartGroup();
+        } else if (c === '}') {
+            this.emitEndGroup();
+        } else if (c === '\x0A' || c === '\x0D') {
+            // cr/lf are noise chars
+        } else {
+            this.text += c;
+        }
+    },
+    
+    parseEscapes: function (c)
+    {
+        if (c === '\\' || c === '{' || c === '}') {
+            this.text += c;
+            this.parserState = this.parseText;
+        } else {
+            this.parserState = this.parseControlSymbol;
+            this.parseControlSymbol(c);
+        }
+    },
+    parseControlSymbol: function(c)
+    {
+        if (c === '~') {
+            this.text += '\u00a0'; // nbsp
+            this.parserState = this.parseText
+        } else if (c === '-') {
+             this.text += '\u00ad'; // soft hyphen
+        } else if (c === '_') {
+            this.text += '\u2011'; // non-breaking hyphen
+        } else if (c === '*') {
+            this.emitIgnorable();
+            this.parserState = this.parseText;
+        } else if (c === "'") {
+            this.parserState = this.parseHexChar;
+        } else if (c === '|') { // formula cacter
+            this.emitFormula();
+            this.parserState = this.parseText;
+        } else if (c === ':') { // subentry in an index entry
+            this.emitIndexSubEntry();
+            this.parserState = this.parseText;
+        } else if (c === '\x0a') {
+            this.emitEndParagraph();
+            this.parserState = this.parseText;
+        } else if (c === '\x0d') {
+            this.emitEndParagraph();
+            this.parserState = this.parseText;
+        } else {
+            this.parserState = this.parseControlWord;
+            this.parseControlWord(c);
+        }
+    },
+    parseHexChar: function (c)
+    {
+        if (/^[A-Fa-f0-9]$/.test(c)) {
+            this.hexChar += c;
+            if (this.hexChar.length >= 2) {
+              this.emitHexChar();
+              this.parserState = this.parseText;
+            }
+            return;
+        }
+        this.emitError("Invalid character \"" + c + "\" in hex literal.");
+        this.parserState = this.parseText;
+        
+    },
+    parseControlWord : function(c)
+    {
+        if (c === ' ') {
+            this.emitControlWord();
+            this.parserState = this.parseText;
+        } else if (/^[-\d]$/.test(c)) {
+            this.parserState = this.parseControlWordParam;
+            this.controlWordParam += c;
+        } else if (/^[A-Za-z]$/.test(c)) {
+          this.controlWord += c;
+        } else {
+          this.emitControlWord();
+          this.parserState = this.parseText;
+          this.parseText(c);
+        }
+    },
+    parseControlWordParam : function (c) {
+        if (/^\d$/.test(c)) {
+          this.controlWordParam += c;
+        } else if (c === ' ') {
+          this.emitControlWord();
+          this.parserState = this.parseText;
+        } else {
+          this.emitControlWord();
+          this.parserState = this.parseText;
+          this.parseText(c);
+        }
+    },
+    
+    
+    
+    
+    emitText : function () {
+        if (this.text === '') {
+            return;
+        }
+        this.push({
+            type: 'text',
+            value: this.text,
+            pos: this.cpos,
+            row: this.row,
+            col: this.col
+        });
+        this.text = ''
+    },
+    emitControlWord : function ()
+    {
+        this.emitText();
+        if (this.controlWord === '') {
+            this.emitError('empty control word');
+        } else {
+            this.push({
+                  type: 'controlword',
+                  value: this.controlWord,
+                  param: this.controlWordParam !== '' && Number(this.controlWordParam),
+                  pos: this.cpos,
+                  row: this.row,
+                  col: this.col
+            });
+        }
+        this.controlWord = '';
+        this.controlWordParam = '';
+    },
+    emitStartGroup : function ()
+    {
+        this.emitText();
+        this.push({
+            type: 'groupstart',
+            pos: this.cpos,
+            row: this.row,
+            col: this.col
+        });
+    },
+    emitEndGroup : function ()
+    {
+        this.emitText();
+        this.push({
+            type: 'groupend',
+            pos: this.cpos,
+            row: this.row,
+            col: this.col
+        });
+    },
+    emitIgnorable : function ()
+    {
+        this.emitText();
+        this.push({
+            type: 'ignorable',
+            pos: this.cpos,
+            row: this.row,
+            col: this.col
+        });
+    },
+    emitHexChar : function ()
+    {
+        this.emitText();
+        this.push({
+            type: 'hexchar',
+            value: this.hexChar,
+            pos: this.cpos,
+            row: this.row,
+            col: this.col
+        });
+        this.hexChar = ''
+    },
+    emitError : function (message)
+    {
+      this.emitText();
+      this.push({
+            type: 'error',
+            value: message,
+            row: this.row,
+            col: this.col,
+            char: this.cpos //,
+            //stack: new Error().stack
+        });
+    },
+    emitEndParagraph : function () {
+        this.emitText();
+        this.push({
+            type: 'endparagraph',
+            pos: this.cpos,
+            row: this.row,
+            col: this.col
+        });
+    }
+     
+} ;
\ No newline at end of file
diff --git a/Roo/rtf/Span.js b/Roo/rtf/Span.js
new file mode 100644 (file)
index 0000000..35592dc
--- /dev/null
@@ -0,0 +1,4 @@
+Roo.rtf.Span = function(opts)
+{
+    this.value = opts.value;
+};
diff --git a/Roo/rtf/namespace.js b/Roo/rtf/namespace.js
new file mode 100644 (file)
index 0000000..a09497d
--- /dev/null
@@ -0,0 +1 @@
+Roo.rtf = {}; // namespace
diff --git a/docs/src/Roo_GridPanel.js.html b/docs/src/Roo_GridPanel.js.html
new file mode 100644 (file)
index 0000000..4955084
--- /dev/null
@@ -0,0 +1,79 @@
+<html><head><title>Roo/GridPanel.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/**
+ * @class Roo.GridPanel
+ * @extends Roo.ContentPanel
+ * @parent Roo.BorderLayout Roo.LayoutDialog builder
+ * @constructor
+ * Create a new GridPanel.
+ * @cfg {Roo.grid.Grid} grid The grid for this panel
+ */
+</span><span class="jsdoc-var">Roo.GridPanel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">grid</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">){
+
+    </span><span class="jsdoc-comment">// universal ctor...
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">grid.grid</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">config </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">grid</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">grid </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">config.grid</span><span class="jsdoc-syntax">;
+    }
+    </span><span class="jsdoc-var">this.wrapper </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.DomHelper.append</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">document.body</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// wrapper for IE7 strict &amp; safari scroll issue
+        </span><span class="jsdoc-syntax">{</span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;div&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;x-layout-grid-wrapper x-layout-inactive-content&quot;</span><span class="jsdoc-syntax">}, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-var">this.wrapper.dom.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">grid.getGridEl</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.dom</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-var">Roo.GridPanel.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.wrapper</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.toolbar</span><span class="jsdoc-syntax">){
+        </span><span class="jsdoc-var">this.toolbar.el.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.wrapper.dom.firstChild</span><span class="jsdoc-syntax">);
+    }
+    </span><span class="jsdoc-comment">// xtype created footer. - not sure if will work as we normally have to render first..
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.footer </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.footer.el </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.footer.xtype</span><span class="jsdoc-syntax">) {
+
+        </span><span class="jsdoc-var">this.footer.container </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.grid.getView</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.getFooterPanel</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.footer.dataSource </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.grid.dataSource</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.footer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.footer</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo</span><span class="jsdoc-syntax">);
+
+    }
+
+    </span><span class="jsdoc-var">grid.monitorWindowResize </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// turn off autosizing
+    </span><span class="jsdoc-var">grid.autoHeight </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">grid.autoWidth </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.grid </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">grid</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.grid.getGridEl</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.replaceClass</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-layout-inactive-content&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">&quot;x-layout-component-panel&quot;</span><span class="jsdoc-syntax">);
+};
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.GridPanel</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.ContentPanel</span><span class="jsdoc-syntax">, {
+    </span><span class="jsdoc-var">getId </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.grid.id</span><span class="jsdoc-syntax">;
+    },
+
+    </span><span class="jsdoc-comment">/**
+     * Returns the grid for this panel
+     * @return {Roo.grid.Grid} 
+     */
+    </span><span class="jsdoc-var">getGrid </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.grid</span><span class="jsdoc-syntax">;
+    },
+
+    </span><span class="jsdoc-var">setSize </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">height</span><span class="jsdoc-syntax">){
+        </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.ignoreResize</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">height</span><span class="jsdoc-syntax">)){
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">grid </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.grid</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">size </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.adjustForComponents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">height</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">grid.getGridEl</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.setSize</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">size.width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">size.height</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">grid.autoSize</span><span class="jsdoc-syntax">();
+        }
+    },
+
+    </span><span class="jsdoc-var">beforeSlide </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-var">this.grid.getView</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.scroller.clip</span><span class="jsdoc-syntax">();
+    },
+
+    </span><span class="jsdoc-var">afterSlide </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-var">this.grid.getView</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.scroller.unclip</span><span class="jsdoc-syntax">();
+    },
+
+    </span><span class="jsdoc-var">destroy </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-var">this.grid.destroy</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">this.grid</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">Roo.GridPanel.superclass.destroy.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+    }
+});
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_NestedLayoutPanel.js.html b/docs/src/Roo_NestedLayoutPanel.js.html
new file mode 100644 (file)
index 0000000..6062e8a
--- /dev/null
@@ -0,0 +1,133 @@
+<html><head><title>Roo/NestedLayoutPanel.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+
+<span class="jsdoc-comment">/**
+ * @class Roo.NestedLayoutPanel
+ * @extends Roo.ContentPanel
+ * @parent Roo.BorderLayout Roo.LayoutDialog builder
+ * @cfg {Roo.BorderLayout} layout   [required] The layout for this panel
+ *
+ * 
+ * @constructor
+ * Create a new NestedLayoutPanel.
+ * 
+ * 
+ * @param {Roo.BorderLayout} layout [required] The layout for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ */
+</span><span class="jsdoc-var">Roo.NestedLayoutPanel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">layout</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// construct with only one argument..
+    /* FIXME - implement nicer consturctors
+    if (layout.layout) {
+        config = layout;
+        layout = config.layout;
+        delete config.layout;
+    }
+    if (layout.xtype &amp;&amp; !layout.getEl) {
+        // then layout needs constructing..
+        layout = Roo.factory(layout, Roo);
+    }
+    */
+
+
+    </span><span class="jsdoc-var">Roo.NestedLayoutPanel.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">layout.getEl</span><span class="jsdoc-syntax">(), </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-var">layout.monitorWindowResize </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// turn off autosizing
+    </span><span class="jsdoc-var">this.layout </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">layout</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.layout.getEl</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.addClass</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-layout-nested-layout&quot;</span><span class="jsdoc-syntax">);
+
+
+
+
+};
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.NestedLayoutPanel</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.ContentPanel</span><span class="jsdoc-syntax">, {
+
+    </span><span class="jsdoc-var">layout </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">setSize </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">height</span><span class="jsdoc-syntax">){
+        </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.ignoreResize</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">height</span><span class="jsdoc-syntax">)){
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">size </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.adjustForComponents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">height</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.layout.getEl</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">el.setSize</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">size.width</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">size.height</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">touch </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">el.dom.offsetWidth</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.layout.layout</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-comment">// ie requires a double layout on the first pass
+            </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.isIE </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.initialized</span><span class="jsdoc-syntax">){
+                </span><span class="jsdoc-var">this.initialized </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">this.layout.layout</span><span class="jsdoc-syntax">();
+            }
+        }
+    },
+
+    </span><span class="jsdoc-comment">// activate all subpanels if not currently active..
+
+    </span><span class="jsdoc-var">setActiveState </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">active</span><span class="jsdoc-syntax">){
+        </span><span class="jsdoc-var">this.active </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">active</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">active</span><span class="jsdoc-syntax">){
+            </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;deactivate&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;activate&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">// not sure if this should happen before or after..
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.layout</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// should not happen..
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">reg </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-keyword">in </span><span class="jsdoc-var">this.layout.regions</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">reg </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.layout.getRegion</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">reg.getActivePanel</span><span class="jsdoc-syntax">()) {
+                </span><span class="jsdoc-comment">//reg.showPanel(reg.getActivePanel()); // force it to activate.. 
+                </span><span class="jsdoc-var">reg.setActivePanel</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">reg.getActivePanel</span><span class="jsdoc-syntax">());
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">reg.panels.length</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-var">reg.showPanel</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">reg.getPanel</span><span class="jsdoc-syntax">(0));
+        }
+
+
+
+
+    },
+
+    </span><span class="jsdoc-comment">/**
+     * Returns the nested BorderLayout for this panel
+     * @return {Roo.BorderLayout}
+     */
+    </span><span class="jsdoc-var">getLayout </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.layout</span><span class="jsdoc-syntax">;
+    },
+
+     </span><span class="jsdoc-comment">/**
+     * Adds a xtype elements to the layout of the nested panel
+     * &lt;pre&gt;&lt;code&gt;
+
+panel.addxtype({
+       xtype : 'ContentPanel',
+       region: 'west',
+       items: [ .... ]
+   }
+);
+
+panel.addxtype({
+        xtype : 'NestedLayoutPanel',
+        region: 'west',
+        layout: {
+           center: { },
+           west: { }   
+        },
+        items : [ ... list of content panels or nested layout panels.. ]
+   }
+);
+&lt;/code&gt;&lt;/pre&gt;
+     * @param {Object} cfg Xtype definition of item to add.
+     */
+    </span><span class="jsdoc-var">addxtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.layout.addxtype</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+
+    }
+});
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_ScrollPanel.js.html b/docs/src/Roo_ScrollPanel.js.html
new file mode 100644 (file)
index 0000000..427dc2c
--- /dev/null
@@ -0,0 +1,62 @@
+<html><head><title>Roo/ScrollPanel.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-var">Roo.ScrollPanel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">content</span><span class="jsdoc-syntax">){
+    </span><span class="jsdoc-var">config </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">config </span><span class="jsdoc-syntax">|| {};
+    </span><span class="jsdoc-var">config.fitToFrame </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">Roo.ScrollPanel.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">content</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-var">this.el.dom.style.overflow </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">&quot;hidden&quot;</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">wrap </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.el.wrap</span><span class="jsdoc-syntax">({</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;x-scroller x-layout-inactive-content&quot;</span><span class="jsdoc-syntax">});
+    </span><span class="jsdoc-var">this.el.removeClass</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-layout-inactive-content&quot;</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.el.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;mousewheel&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.onWheel</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">up </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">wrap.createChild</span><span class="jsdoc-syntax">({</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;x-scroller-up&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">html</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;&amp;#160;&quot;</span><span class="jsdoc-syntax">}, </span><span class="jsdoc-var">this.el.dom</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">down </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">wrap.createChild</span><span class="jsdoc-syntax">({</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;x-scroller-down&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">html</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;&amp;#160;&quot;</span><span class="jsdoc-syntax">});
+    </span><span class="jsdoc-var">up.unselectable</span><span class="jsdoc-syntax">(); </span><span class="jsdoc-var">down.unselectable</span><span class="jsdoc-syntax">();
+    </span><span class="jsdoc-var">up.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;click&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.scrollUp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">down.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;click&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.scrollDown</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">up.addClassOnOver</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-scroller-btn-over&quot;</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">down.addClassOnOver</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-scroller-btn-over&quot;</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">up.addClassOnClick</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-scroller-btn-click&quot;</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">down.addClassOnClick</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;x-scroller-btn-click&quot;</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.adjustments </span><span class="jsdoc-syntax">= [0, -(</span><span class="jsdoc-var">up.getHeight</span><span class="jsdoc-syntax">() + </span><span class="jsdoc-var">down.getHeight</span><span class="jsdoc-syntax">())];
+
+    </span><span class="jsdoc-var">this.resizeEl </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.el</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">wrap</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">this.up </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">up</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">this.down </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">down</span><span class="jsdoc-syntax">;
+};
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.ScrollPanel</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.ContentPanel</span><span class="jsdoc-syntax">, {
+    </span><span class="jsdoc-var">increment </span><span class="jsdoc-syntax">: 100,
+    </span><span class="jsdoc-var">wheelIncrement </span><span class="jsdoc-syntax">: 5,
+    </span><span class="jsdoc-var">scrollUp </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-var">this.resizeEl.scroll</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;up&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.increment</span><span class="jsdoc-syntax">, {</span><span class="jsdoc-var">callback</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.afterScroll</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">});
+    },
+
+    </span><span class="jsdoc-var">scrollDown </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-var">this.resizeEl.scroll</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;down&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.increment</span><span class="jsdoc-syntax">, {</span><span class="jsdoc-var">callback</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.afterScroll</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">});
+    },
+
+    </span><span class="jsdoc-var">afterScroll </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.resizeEl</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">el.dom.scrollTop</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">h </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">el.dom.scrollHeight</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ch </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">el.dom.clientHeight</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.up</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">== 0 ? </span><span class="jsdoc-string">&quot;addClass&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;removeClass&quot;</span><span class="jsdoc-syntax">](</span><span class="jsdoc-string">&quot;x-scroller-btn-disabled&quot;</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.down</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">h </span><span class="jsdoc-syntax">- </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">&lt;= </span><span class="jsdoc-var">ch </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">&quot;addClass&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;removeClass&quot;</span><span class="jsdoc-syntax">](</span><span class="jsdoc-string">&quot;x-scroller-btn-disabled&quot;</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-var">setSize </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
+        </span><span class="jsdoc-var">Roo.ScrollPanel.superclass.setSize.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.afterScroll</span><span class="jsdoc-syntax">();
+    },
+
+    </span><span class="jsdoc-var">onWheel </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">){
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">d </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">e.getWheelDelta</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.resizeEl.dom.scrollTop </span><span class="jsdoc-syntax">-= (</span><span class="jsdoc-var">d</span><span class="jsdoc-syntax">*</span><span class="jsdoc-var">this.wheelIncrement</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.afterScroll</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">e.stopEvent</span><span class="jsdoc-syntax">();
+    },
+
+    </span><span class="jsdoc-var">setContent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">content</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">loadScripts</span><span class="jsdoc-syntax">){
+        </span><span class="jsdoc-var">this.resizeEl.update</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">content</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">loadScripts</span><span class="jsdoc-syntax">);
+    }
+
+});
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_TreePanel.js.html b/docs/src/Roo_TreePanel.js.html
new file mode 100644 (file)
index 0000000..87e4d1e
--- /dev/null
@@ -0,0 +1,62 @@
+<html><head><title>Roo/TreePanel.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+
+
+<span class="jsdoc-comment">/**
+ * @class Roo.TreePanel
+ * @extends Roo.ContentPanel
+ * @parent Roo.BorderLayout Roo.LayoutDialog builder
+ * Treepanel component
+ * 
+ * @constructor
+ * Create a new TreePanel. - defaults to fit/scoll contents.
+ * @param {String/Object} config A string to set only the panel's title, or a config object
+ */
+</span><span class="jsdoc-var">Roo.TreePanel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">){
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">config.el</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">config.tree</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">config.tree</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">config.el</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// hopefull!
+
+    // wrapper for IE7 strict &amp; safari scroll issue
+
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">treeEl </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">el.createChild</span><span class="jsdoc-syntax">();
+    </span><span class="jsdoc-var">config.resizeEl </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">treeEl</span><span class="jsdoc-syntax">;
+
+
+
+    </span><span class="jsdoc-var">Roo.TreePanel.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">);
+
+
+    </span><span class="jsdoc-var">this.tree </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.tree.TreePanel</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">treeEl </span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">tree</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-comment">//console.log(tree);
+    </span><span class="jsdoc-var">this.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'activate'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tree.rendered</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-comment">//console.log('render tree');
+        </span><span class="jsdoc-var">this.tree.render</span><span class="jsdoc-syntax">();
+    });
+    </span><span class="jsdoc-comment">// this should not be needed.. - it's actually the 'el' that resizes?
+    // actuall it breaks the containerScroll - dragging nodes auto scroll at top
+
+    //this.on('resize',  function (cp, w, h) {
+    //        this.tree.innerCt.setWidth(w);
+    //        this.tree.innerCt.setHeight(h);
+    //        //this.tree.innerCt.setStyle('overflow-y', 'auto');
+    //});
+
+
+
+</span><span class="jsdoc-syntax">};
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.TreePanel</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.ContentPanel</span><span class="jsdoc-syntax">, {
+    </span><span class="jsdoc-var">fitToFrame </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">autoScroll </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-comment">/*
+     * @cfg {Roo.tree.TreePanel} tree [required] The tree TreePanel, with config etc.
+     */
+    </span><span class="jsdoc-var">tree </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false
+
+</span><span class="jsdoc-syntax">});
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_bootstrap_dash_namespace.js.html b/docs/src/Roo_bootstrap_dash_namespace.js.html
new file mode 100644 (file)
index 0000000..979d271
--- /dev/null
@@ -0,0 +1 @@
+<html><head><title>Roo/bootstrap/dash/namespace.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-var">Roo.bootstrap.dash </span><span class="jsdoc-syntax">= {};</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_bootstrap_namespace.js.html b/docs/src/Roo_bootstrap_namespace.js.html
new file mode 100644 (file)
index 0000000..6fdd7cd
--- /dev/null
@@ -0,0 +1 @@
+<html><head><title>Roo/bootstrap/namespace.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-var">Roo.bootstrap </span><span class="jsdoc-syntax">= {};</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_Block.js.html b/docs/src/Roo_htmleditor_Block.js.html
new file mode 100644 (file)
index 0000000..0a202ec
--- /dev/null
@@ -0,0 +1,144 @@
+<html><head><title>Roo/htmleditor/Block.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/**
+ * @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
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.Block  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// do nothing .. should not be called really.
+</span><span class="jsdoc-syntax">}
+</span><span class="jsdoc-comment">/**
+ * factory method to get the block from an element (using cache if necessary)
+ * @static
+ * @param {HtmlElement} the dom element
+ */
+</span><span class="jsdoc-var">Roo.htmleditor.Block.factory </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">id </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.id</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cc</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">]) != </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">&amp;&amp; (!</span><span class="jsdoc-var">cc</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.node </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">cc</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.node.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'body'</span><span class="jsdoc-syntax">))) {
+        </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.readElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">];
+    }
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">db  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">db</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">db </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nodeName.toLowerCase</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.toUpperCaseFirst</span><span class="jsdoc-syntax">();
+    }
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cls </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'Block' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">db</span><span class="jsdoc-syntax">];
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-comment">//Roo.log(node.getAttribute('data-block'));
+        </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;OOps missing block : &quot; </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'Block' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">db</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+    }
+    </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">({ </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">});
+    </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">];  </span><span class="jsdoc-comment">/// should trigger update element
+</span><span class="jsdoc-syntax">};
+
+</span><span class="jsdoc-comment">/**
+ * initalize all Elements from content that are 'blockable'
+ * @static
+ * @param the body element
+ */
+</span><span class="jsdoc-var">Roo.htmleditor.Block.initAll </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">body</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ia </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.initAll</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">ia</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">body</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">ia</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">body</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'td'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">ia</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">body</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'figure'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+    }
+    </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">body</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.query</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">), </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+    },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+};
+</span><span class="jsdoc-comment">// question goes here... do we need to clear out this cache sometimes?
+// or show we make it relivant to the htmleditor.
+</span><span class="jsdoc-var">Roo.htmleditor.Block.cache </span><span class="jsdoc-syntax">= {};
+
+</span><span class="jsdoc-var">Roo.htmleditor.Block.prototype </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+     </span><span class="jsdoc-comment">// used by context menu
+    </span><span class="jsdoc-var">friendly_name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Based Block'</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">// text for button to delete this element
+    </span><span class="jsdoc-var">deleteTitle </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">context </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-comment">/**
+     * Update a node with values from this object
+     * @param {DomElement} node
+     */
+    </span><span class="jsdoc-var">updateElement </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">Roo.DomHelper.update</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-var">undefined </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.node </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.toObject</span><span class="jsdoc-syntax">());
+    },
+     </span><span class="jsdoc-comment">/**
+     * convert to plain HTML for calling insertAtCursor..
+     */
+    </span><span class="jsdoc-var">toHTML </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.DomHelper.markup</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.toObject</span><span class="jsdoc-syntax">());
+    },
+    </span><span class="jsdoc-comment">/**
+     * 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, or style for using next param as style)
+     * @param {String} style the style property - eg. text-align
+     */
+    </span><span class="jsdoc-var">getVal </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">style</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">n.tagName </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">tag.toUpperCase</span><span class="jsdoc-syntax">()) {
+            </span><span class="jsdoc-comment">// in theory we could do figure[3] &lt;&lt; 3rd figure? or some more complex search..?
+            // but kiss for now.
+            </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.getElementsByTagName</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.item</span><span class="jsdoc-syntax">(0);
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'html'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n.innerHTML</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n.style</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">style</span><span class="jsdoc-syntax">];
+        }
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) ? </span><span class="jsdoc-var">n.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+
+    },
+    </span><span class="jsdoc-comment">/**
+     * create a DomHelper friendly object - for use with 
+     * Roo.DomHelper.markup / overwrite / etc..
+     * (override this)
+     */
+    </span><span class="jsdoc-var">toObject </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">{};
+    },
+      </span><span class="jsdoc-comment">/**
+     * Read a node that has a 'data-block' property - and extract the values from it.
+     * @param {DomElement} node - the node
+     */
+    </span><span class="jsdoc-var">readElement </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+
+    }
+
+
+};
+
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_BlockFigure.js.html b/docs/src/Roo_htmleditor_BlockFigure.js.html
new file mode 100644 (file)
index 0000000..cccd3dd
--- /dev/null
@@ -0,0 +1,395 @@
+<html><head><title>Roo/htmleditor/BlockFigure.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+
+<span class="jsdoc-comment">/**
+ * @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
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.BlockFigure </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.readElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+    }
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+}
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.BlockFigure</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Block</span><span class="jsdoc-syntax">, {
+
+
+    </span><span class="jsdoc-comment">// setable values.
+    </span><span class="jsdoc-var">image_src</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">align</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'center'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">caption </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">caption_display </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'block'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'100%'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">cls </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">href</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">video_url </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">// margin: '2%', not used
+
+    </span><span class="jsdoc-var">text_align</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">//   (left|right) alignment for the text caption default left. - not used at present
+
+
+    // used by context menu
+    </span><span class="jsdoc-var">friendly_name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Image with caption'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">deleteTitle </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Delete Image and Caption&quot;</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">contextMenu </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">block </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+        };
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rooui </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.bootstrap</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">Roo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.bootstrap</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">syncValue </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">toolbar.editorcore.syncValue</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">= {};
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">[
+             {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Source: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Change Image URL'</span><span class="jsdoc-syntax">,
+
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">state</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">();
+
+                        </span><span class="jsdoc-var">Roo.MessageBox.show</span><span class="jsdoc-syntax">({
+                            </span><span class="jsdoc-var">title </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Image Source URL&quot;</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">msg </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Enter the url for the image&quot;</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">buttons</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.MessageBox.OKCANCEL</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">){
+                                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'ok'</span><span class="jsdoc-syntax">) {
+                                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                                }
+                                </span><span class="jsdoc-var">b.image_src </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">;
+                                </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                                </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                                </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                            },
+                            </span><span class="jsdoc-var">minWidth</span><span class="jsdoc-syntax">:250,
+                            </span><span class="jsdoc-var">prompt</span><span class="jsdoc-syntax">:</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-comment">//multiline: multiline,
+                            </span><span class="jsdoc-var">modal </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">b.image_src
+                        </span><span class="jsdoc-syntax">});
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Change Link URL'</span><span class="jsdoc-syntax">,
+
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">state</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">();
+
+                        </span><span class="jsdoc-var">Roo.MessageBox.show</span><span class="jsdoc-syntax">({
+                            </span><span class="jsdoc-var">title </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Link URL&quot;</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">msg </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Enter the url for the link - leave blank to have no link&quot;</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">buttons</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.MessageBox.OKCANCEL</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">){
+                                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'ok'</span><span class="jsdoc-syntax">) {
+                                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                                }
+                                </span><span class="jsdoc-var">b.href </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">;
+                                </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                                </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                                </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                            },
+                            </span><span class="jsdoc-var">minWidth</span><span class="jsdoc-syntax">:250,
+                            </span><span class="jsdoc-var">prompt</span><span class="jsdoc-syntax">:</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-comment">//multiline: multiline,
+                            </span><span class="jsdoc-var">modal </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">b.href
+                        </span><span class="jsdoc-syntax">});
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Show Video URL'</span><span class="jsdoc-syntax">,
+
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">state</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">Roo.MessageBox.alert</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;Video URL&quot;</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.video_url </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'This image is not linked ot a video' </span><span class="jsdoc-syntax">:
+                                </span><span class="jsdoc-string">'The image is linked to: &lt;a target=&quot;_new&quot; href=&quot;' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.video_url </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'&quot;&gt;' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.video_url </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'&lt;/a&gt;'</span><span class="jsdoc-syntax">);
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Width: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'ComboBox'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">allowBlank </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">displayField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">editable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listWidth </span><span class="jsdoc-syntax">: 100,
+                </span><span class="jsdoc-var">triggerAction </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'all'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">typeAhead </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">valueField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: 70,
+                </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'width'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">select </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">combo</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">b.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">r.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.form</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">store </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'SimpleStore'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">data </span><span class="jsdoc-syntax">: [
+                        [</span><span class="jsdoc-string">'auto'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'50%'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'100%'</span><span class="jsdoc-syntax">]
+                    ],
+                    </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">],
+                    </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.data
+                </span><span class="jsdoc-syntax">}
+            },
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Align: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'ComboBox'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">allowBlank </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">displayField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">editable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listWidth </span><span class="jsdoc-syntax">: 100,
+                </span><span class="jsdoc-var">triggerAction </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'all'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">typeAhead </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">valueField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: 70,
+                </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'align'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">select </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">combo</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">b.align </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">r.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.form</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">store </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'SimpleStore'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">data </span><span class="jsdoc-syntax">: [
+                        [</span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'right'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'center'</span><span class="jsdoc-syntax">]
+                    ],
+                    </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">],
+                    </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.data
+                </span><span class="jsdoc-syntax">}
+            },
+
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Hide Caption'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'caption_display'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">pressed </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">enableToggle </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">setValue </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">this.toggle</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'block' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
+                },
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">toggle</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">btn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">state</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">b.caption_display </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">b.caption_display </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'block' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'none' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'block'</span><span class="jsdoc-syntax">;
+                        </span><span class="jsdoc-var">this.setText</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">b.caption_display </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'block' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">&quot;Hide Caption&quot; </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Show Caption&quot;</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">}
+        ];
+
+    },
+    </span><span class="jsdoc-comment">/**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     */
+    </span><span class="jsdoc-var">toObject </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">d </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">document.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'div'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">d.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.caption</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">m </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.width </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'50%' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.align </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'center' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'0 auto' </span><span class="jsdoc-syntax">: 0;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">img </span><span class="jsdoc-syntax">=   {
+            </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'img'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'false'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">src </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.image_src</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">alt </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">d.innerText.replace</span><span class="jsdoc-syntax">(/\n/g, </span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/\s+/g, </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.trim</span><span class="jsdoc-syntax">(), </span><span class="jsdoc-comment">// removeHTML and reduce spaces..
+            </span><span class="jsdoc-var">style</span><span class="jsdoc-syntax">: {
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'auto'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-string">'max-width'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'100%'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">margin </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'0px'
+
+
+            </span><span class="jsdoc-syntax">}
+        };
+        </span><span class="jsdoc-comment">/*
+        '&lt;div class=&quot;{0}&quot; width=&quot;420&quot; height=&quot;315&quot; src=&quot;{1}&quot; frameborder=&quot;0&quot; allowfullscreen&gt;' +
+                    '&lt;a href=&quot;{2}&quot;&gt;' + 
+                        '&lt;img class=&quot;{0}-thumbnail&quot; src=&quot;{3}/Images/{4}/{5}#image-{4}&quot; /&gt;' + 
+                    '&lt;/a&gt;' + 
+                '&lt;/div&gt;',
+        */
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.href.length </span><span class="jsdoc-syntax">&gt; 0) {
+            </span><span class="jsdoc-var">img </span><span class="jsdoc-syntax">= {
+                </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'a'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">href</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.href</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'true'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [
+                    </span><span class="jsdoc-var">img
+                </span><span class="jsdoc-syntax">]
+            };
+        }
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.video_url.length </span><span class="jsdoc-syntax">&gt; 0) {
+            </span><span class="jsdoc-var">img </span><span class="jsdoc-syntax">= {
+                </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'div'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">cls </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cls</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">frameborder </span><span class="jsdoc-syntax">: 0,
+                </span><span class="jsdoc-var">allowfullscreen </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: 420,  </span><span class="jsdoc-comment">// these are for video tricks - that we replace the outer
+                </span><span class="jsdoc-var">height </span><span class="jsdoc-syntax">: 315,
+                </span><span class="jsdoc-var">src </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.video_url</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [
+                    </span><span class="jsdoc-var">img
+                </span><span class="jsdoc-syntax">]
+            };
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">captionhtml </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.caption_display </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'hidden' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.caption </span><span class="jsdoc-syntax">: (</span><span class="jsdoc-var">this.caption.length </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.caption </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Caption&quot;</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-keyword">return  </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'figure'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-string">'data-block' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Figure'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'false'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: {
+                </span><span class="jsdoc-var">display</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'block'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">float </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">this.align </span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-string">'max-width'</span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">this.width</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'auto'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">margin</span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">m</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">padding</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'10px'
+
+            </span><span class="jsdoc-syntax">},
+
+
+            </span><span class="jsdoc-var">align </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.align</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [
+                </span><span class="jsdoc-var">img</span><span class="jsdoc-syntax">,
+
+                {
+                    </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'figcaption'</span><span class="jsdoc-syntax">,
+
+                    </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: {
+                        </span><span class="jsdoc-string">'text-align'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">,
+                        </span><span class="jsdoc-string">'margin-top' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'16px'</span><span class="jsdoc-syntax">,
+                        </span><span class="jsdoc-string">'font-size' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'16px'</span><span class="jsdoc-syntax">,
+                        </span><span class="jsdoc-string">'line-height' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'24px'</span><span class="jsdoc-syntax">,
+                         </span><span class="jsdoc-var">display </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.caption_display
+                    </span><span class="jsdoc-syntax">},
+                    </span><span class="jsdoc-var">cls </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cls.length </span><span class="jsdoc-syntax">&gt; 0 ? (</span><span class="jsdoc-var">this.cls  </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'-thumbnail' </span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [
+                        {
+                            </span><span class="jsdoc-comment">// we can not rely on yahoo syndication to use CSS elements - so have to use  '&lt;i&gt;' to encase stuff.
+                            </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'i'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">html </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">captionhtml
+                        </span><span class="jsdoc-syntax">}
+                    ]
+
+                }
+            ]
+        };
+
+    },
+
+    </span><span class="jsdoc-var">readElement </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-comment">// this should not really come from the link...
+        </span><span class="jsdoc-var">this.video_url </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'div'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'src'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.cls </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'div'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'class'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.href </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'a'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'href'</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-var">this.image_src </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'img'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'src'</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-var">this.align </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'figure'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'align'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.caption </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'figcaption'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'html'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">// remove '&lt;i&gt;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.caption.trim</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.match</span><span class="jsdoc-syntax">(/^&lt;i[^&gt;]*&gt;/i)) {
+            </span><span class="jsdoc-var">this.caption </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.caption.trim</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/^&lt;i[^&gt;]*&gt;/i, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/^&lt;\/i&gt;$/i, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-comment">//this.text_align = this.getVal(node, 'figcaption', 'style','text-align');
+        </span><span class="jsdoc-var">this.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'figure'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'max-width'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">//this.margin = this.getVal(node, 'figure', 'style', 'margin');
+
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-var">removeNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.node</span><span class="jsdoc-syntax">;
+    }
+
+
+
+
+
+
+
+
+})
+
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_BlockTable.js.html b/docs/src/Roo_htmleditor_BlockTable.js.html
new file mode 100644 (file)
index 0000000..f147705
--- /dev/null
@@ -0,0 +1,490 @@
+<html><head><title>Roo/htmleditor/BlockTable.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.BlockTable
+ * Block that manages a table
+ * 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.BlockTable </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.readElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+    }
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.rows </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">this.no_row</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-var">this.rows</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">] = [];
+            </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">this.no_col</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-var">this.rows</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">this.emptyCell</span><span class="jsdoc-syntax">();
+            }
+        }
+    }
+
+
+}
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.BlockTable</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Block</span><span class="jsdoc-syntax">, {
+
+    </span><span class="jsdoc-var">rows </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">no_col </span><span class="jsdoc-syntax">: 1,
+    </span><span class="jsdoc-var">no_row </span><span class="jsdoc-syntax">: 1,
+
+
+    </span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'100%'</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">// used by context menu
+    </span><span class="jsdoc-var">friendly_name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Table'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">deleteTitle </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Delete Table'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-comment">// context menu is drawn once..
+
+    </span><span class="jsdoc-var">contextMenu </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">block </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+        };
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rooui </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.bootstrap</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">Roo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.bootstrap</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">syncValue </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">toolbar.editorcore.syncValue</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">= {};
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">[
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Width: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'ComboBox'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">allowBlank </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">displayField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">editable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listWidth </span><span class="jsdoc-syntax">: 100,
+                </span><span class="jsdoc-var">triggerAction </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'all'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">typeAhead </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">valueField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: 100,
+                </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'width'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">select </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">combo</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">b.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">r.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.form</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">store </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'SimpleStore'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">data </span><span class="jsdoc-syntax">: [
+                        [</span><span class="jsdoc-string">'100%'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'auto'</span><span class="jsdoc-syntax">]
+                    ],
+                    </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">],
+                    </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.data
+                </span><span class="jsdoc-syntax">}
+            },
+            </span><span class="jsdoc-comment">// -------- Cols
+
+            </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Columns: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'-'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.removeColumn</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'+'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.addColumn</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            </span><span class="jsdoc-comment">// -------- ROWS
+            </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Rows: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'-'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.removeRow</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'+'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.addRow</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            </span><span class="jsdoc-comment">// -------- ROWS
+            </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Reset Column Widths'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.resetWidths</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">}
+
+
+
+        ];
+
+    },
+
+
+  </span><span class="jsdoc-comment">/**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     * ?? should it be called with option to hide all editing features?
+     */
+    </span><span class="jsdoc-var">toObject </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret </span><span class="jsdoc-syntax">= {
+            </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'false'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// this stops cell selection from picking the table.
+            </span><span class="jsdoc-string">'data-block' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Table'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: {
+                </span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">this.width</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">border </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'solid 1px #000'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// ??? hard coded?
+                </span><span class="jsdoc-string">'border-collapse' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'collapse'
+            </span><span class="jsdoc-syntax">},
+            </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [
+                { </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'tbody' </span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [] }
+            ]
+        };
+
+        </span><span class="jsdoc-comment">// do we have a head = not really 
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ncols </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.rows</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tr </span><span class="jsdoc-syntax">= {
+                </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'tr'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">margin</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'6px'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">border </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'solid 1px #000'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">textAlign </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'left'
+                </span><span class="jsdoc-syntax">},
+                </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">: [ ]
+            };
+
+            </span><span class="jsdoc-var">ret.cn</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.cn.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tr</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-comment">// does the row have any properties? ?? height?
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nc </span><span class="jsdoc-syntax">= 0;
+            </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">cell </span><span class="jsdoc-syntax">) {
+
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">td </span><span class="jsdoc-syntax">= {
+                    </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'td'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-string">'true'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-string">'data-block' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Td'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">html </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">cell.html</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">cell.style
+                </span><span class="jsdoc-syntax">};
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cell.colspan </span><span class="jsdoc-syntax">&gt; 1) {
+                    </span><span class="jsdoc-var">td.colspan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cell.colspan </span><span class="jsdoc-syntax">;
+                    </span><span class="jsdoc-var">nc </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">cell.colspan</span><span class="jsdoc-syntax">;
+                } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+                    </span><span class="jsdoc-var">nc</span><span class="jsdoc-syntax">++;
+                }
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cell.rowspan </span><span class="jsdoc-syntax">&gt; 1) {
+                    </span><span class="jsdoc-var">td.rowspan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cell.rowspan </span><span class="jsdoc-syntax">;
+                }
+
+
+                </span><span class="jsdoc-comment">// widths ?
+                </span><span class="jsdoc-var">tr.cn.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">td</span><span class="jsdoc-syntax">);
+
+
+            }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">ncols </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Math.max</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nc</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ncols</span><span class="jsdoc-syntax">);
+
+
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">// add the header row..
+
+        </span><span class="jsdoc-var">ncols</span><span class="jsdoc-syntax">++;
+
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">;
+
+    },
+
+    </span><span class="jsdoc-var">readElement </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">node  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.node </span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getVal</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'width'</span><span class="jsdoc-syntax">) || </span><span class="jsdoc-string">'100%'</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-var">this.rows </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-var">this.no_row </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">trs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.rows</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">trs.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">=  [];
+            </span><span class="jsdoc-var">this.rows.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">);
+
+            </span><span class="jsdoc-var">this.no_row</span><span class="jsdoc-syntax">++;
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">no_column </span><span class="jsdoc-syntax">= 0;
+            </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tr.cells</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">td</span><span class="jsdoc-syntax">) {
+
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">add </span><span class="jsdoc-syntax">= {
+                    </span><span class="jsdoc-var">colspan </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">td.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'colspan'</span><span class="jsdoc-syntax">) ? </span><span class="jsdoc-var">td.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'colspan'</span><span class="jsdoc-syntax">)*1 : 1,
+                    </span><span class="jsdoc-var">rowspan </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">td.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">) ? </span><span class="jsdoc-var">td.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">)*1 : 1,
+                    </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">td.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">) ? </span><span class="jsdoc-var">td.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">html </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">td.innerHTML
+                </span><span class="jsdoc-syntax">};
+                </span><span class="jsdoc-var">no_column </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">add.colspan</span><span class="jsdoc-syntax">;
+
+
+                </span><span class="jsdoc-var">row.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">add</span><span class="jsdoc-syntax">);
+
+
+            },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">this.no_col </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Math.max</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.no_col</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">no_column</span><span class="jsdoc-syntax">);
+
+
+        },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+
+
+    },
+    </span><span class="jsdoc-var">normalizeRows</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rid </span><span class="jsdoc-syntax">= -1;
+        </span><span class="jsdoc-var">this.rows.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">++;
+            </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">] = [];
+            </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.normalizeRow</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cid </span><span class="jsdoc-syntax">= 0;
+            </span><span class="jsdoc-var">row.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cid</span><span class="jsdoc-syntax">]) != </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">cid</span><span class="jsdoc-syntax">++;
+                }
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">] = [];
+                }
+                </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cid</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">c.row </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">c.col </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cid</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.rowspan </span><span class="jsdoc-syntax">&lt; 2) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+
+                </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 1 ;</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">c.rowspan</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                        </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = [];
+                    }
+                    </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rid</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cid</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+                }
+            });
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">;
+
+    },
+
+    </span><span class="jsdoc-var">normalizeRow</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-var">row.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.colspan </span><span class="jsdoc-syntax">&lt; 2) {
+                </span><span class="jsdoc-var">ret.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">=0 ;</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">c.colspan</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-var">ret.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+            }
+        });
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">;
+
+    },
+
+    </span><span class="jsdoc-var">deleteColumn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">sel.type </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'col'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.no_col </span><span class="jsdoc-syntax">&lt; 2) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-var">this.rows.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cols </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.normalizeRow</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">col </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cols</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">sel.col</span><span class="jsdoc-syntax">];
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">col.colspan </span><span class="jsdoc-syntax">&gt; 1) {
+                </span><span class="jsdoc-var">col.colspan </span><span class="jsdoc-syntax">--;
+            } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">row.remove</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">);
+            }
+
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.no_col</span><span class="jsdoc-syntax">--;
+
+    },
+    </span><span class="jsdoc-var">removeColumn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.deleteColumn</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'col'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.no_col</span><span class="jsdoc-syntax">-1
+        });
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">();
+    },
+
+
+    </span><span class="jsdoc-var">addColumn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+
+        </span><span class="jsdoc-var">this.rows.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">row.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.emptyCell</span><span class="jsdoc-syntax">());
+
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">();
+    },
+
+    </span><span class="jsdoc-var">deleteRow </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">sel.type </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'row'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.no_row </span><span class="jsdoc-syntax">&lt; 2) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rows </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.normalizeRows</span><span class="jsdoc-syntax">();
+
+
+        </span><span class="jsdoc-var">rows</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">sel.row</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">col.rowspan </span><span class="jsdoc-syntax">&gt; 1) {
+                </span><span class="jsdoc-var">col.rowspan</span><span class="jsdoc-syntax">--;
+            } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">col.remove </span><span class="jsdoc-syntax">= 1; </span><span class="jsdoc-comment">// flage it as removed.
+            </span><span class="jsdoc-syntax">}
+
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">newrows </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-var">this.rows.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">newrow </span><span class="jsdoc-syntax">= [];
+            </span><span class="jsdoc-var">row.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.remove</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">newrow.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+                }
+
+            });
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newrow.length </span><span class="jsdoc-syntax">&gt; 0) {
+                </span><span class="jsdoc-var">newrows.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">);
+            }
+        });
+        </span><span class="jsdoc-var">this.rows </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-var">newrows</span><span class="jsdoc-syntax">;
+
+
+
+        </span><span class="jsdoc-var">this.no_row</span><span class="jsdoc-syntax">--;
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">();
+
+    },
+    </span><span class="jsdoc-var">removeRow </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.deleteRow</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'row'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.no_row</span><span class="jsdoc-syntax">-1
+        });
+
+    },
+
+
+    </span><span class="jsdoc-var">addRow </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">this.no_col</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++ ) {
+
+            </span><span class="jsdoc-var">row.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.emptyCell</span><span class="jsdoc-syntax">());
+
+        }
+        </span><span class="jsdoc-var">this.rows.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">();
+
+    },
+
+    </span><span class="jsdoc-comment">// the default cell object... at present...
+    </span><span class="jsdoc-var">emptyCell </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.htmleditor.BlockTd</span><span class="jsdoc-syntax">({}))</span><span class="jsdoc-var">.toObject</span><span class="jsdoc-syntax">();
+
+
+    },
+
+    </span><span class="jsdoc-var">removeNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.node</span><span class="jsdoc-syntax">;
+    },
+
+
+
+    </span><span class="jsdoc-var">resetWidths </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.node.getElementsByTagName</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'td'</span><span class="jsdoc-syntax">))</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">nn.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">nn.updateElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+        });
+    }
+
+
+
+
+})
+
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_BlockTd.js.html b/docs/src/Roo_htmleditor_BlockTd.js.html
new file mode 100644 (file)
index 0000000..6155c94
--- /dev/null
@@ -0,0 +1,750 @@
+<html><head><title>Roo/htmleditor/BlockTd.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ *
+ * editing a TD?
+ *
+ * since selections really work on the table cell, then editing really should work from there
+ *
+ * The original plan was to support merging etc... - but that may not be needed yet..
+ *
+ * So this simple version will support:
+ *   add/remove cols
+ *   adjust the width +/-
+ *   reset the width...
+ *   
+ *
+ */
+
+
+
+
+/**
+ * @class Roo.htmleditor.BlockTable
+ * Block that manages a table
+ * 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.BlockTd </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.readElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+    }
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+
+
+
+}
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.BlockTd</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Block</span><span class="jsdoc-syntax">, {
+
+    </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">width</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">textAlign </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">valign </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'top'</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">colspan </span><span class="jsdoc-syntax">: 1,
+    </span><span class="jsdoc-var">rowspan </span><span class="jsdoc-syntax">: 1,
+
+
+    </span><span class="jsdoc-comment">// used by context menu
+    </span><span class="jsdoc-var">friendly_name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Table Cell'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">deleteTitle </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// use our customer delete
+
+    // context menu is drawn once..
+
+    </span><span class="jsdoc-var">contextMenu </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cell </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+        };
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">));
+        };
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">lr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">saveSel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+        {
+            </span><span class="jsdoc-var">lr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">toolbar.editorcore.getSelection</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.getRangeAt</span><span class="jsdoc-syntax">(0);
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">restoreSel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+        {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">lr</span><span class="jsdoc-syntax">) {
+                (</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+                    </span><span class="jsdoc-var">toolbar.editorcore.focus</span><span class="jsdoc-syntax">();
+                    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">toolbar.editorcore.getSelection</span><span class="jsdoc-syntax">();
+                    </span><span class="jsdoc-var">cr.removeAllRanges</span><span class="jsdoc-syntax">();
+                    </span><span class="jsdoc-var">cr.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">lr</span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                })</span><span class="jsdoc-var">.defer</span><span class="jsdoc-syntax">(10, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+
+
+            }
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rooui </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.bootstrap</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">Roo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.bootstrap</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">syncValue </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">toolbar.editorcore.syncValue</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">= {};
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">[
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Edit Table'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">toolbar.tb.selectedNode.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                }
+
+            },
+
+
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Column Width: &quot;</span><span class="jsdoc-syntax">,
+                 </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'-'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.shrinkColumn</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                         </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'+'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.growColumn</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Vertical Align: &quot;</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar  </span><span class="jsdoc-comment">//Boostrap?
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'ComboBox'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">allowBlank </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">displayField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">editable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listWidth </span><span class="jsdoc-syntax">: 100,
+                </span><span class="jsdoc-var">triggerAction </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'all'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">typeAhead </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">valueField </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">width </span><span class="jsdoc-syntax">: 100,
+                </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'valign'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">select </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">combo</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">b </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">b.valign </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">r.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">b.updateElement</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.form</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">store </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'SimpleStore'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">data </span><span class="jsdoc-syntax">: [
+                        [</span><span class="jsdoc-string">'top'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'middle'</span><span class="jsdoc-syntax">],
+                        [</span><span class="jsdoc-string">'bottom'</span><span class="jsdoc-syntax">] </span><span class="jsdoc-comment">// there are afew more... 
+                    </span><span class="jsdoc-syntax">],
+                    </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'val'</span><span class="jsdoc-syntax">],
+                    </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">Roo.data
+                </span><span class="jsdoc-syntax">}
+            },
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;Merge Cells: &quot;</span><span class="jsdoc-syntax">,
+                 </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+
+            </span><span class="jsdoc-syntax">},
+
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Right'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.mergeRight</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-comment">//block().growColumn();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Below'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.mergeBelow</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-comment">//block().growColumn();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'TextItem'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;| &quot;</span><span class="jsdoc-syntax">,
+                 </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+
+            </span><span class="jsdoc-syntax">},
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Split'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                    {
+                        </span><span class="jsdoc-comment">//toolbar.editorcore.selectNode(toolbar.tb.selectedNode);
+                        </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.split</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">toolbar.tb.selectedNode</span><span class="jsdoc-syntax">);
+                        </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+
+                    }
+                },
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+            </span><span class="jsdoc-syntax">},
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Fill'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar
+
+            </span><span class="jsdoc-syntax">},
+
+
+            {
+                </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Button'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Delete'</span><span class="jsdoc-syntax">,
+
+                </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.Toolbar</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">menu </span><span class="jsdoc-syntax">: {
+                    </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Menu'</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.menu</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">items </span><span class="jsdoc-syntax">: [
+                        {
+                            </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Item'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">html</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Column'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                                </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                                {
+                                    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">();
+
+                                    </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.deleteColumn</span><span class="jsdoc-syntax">();
+                                    </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+                                    </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t.node</span><span class="jsdoc-syntax">);
+                                    </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+                                }
+                            },
+                            </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.menu
+                        </span><span class="jsdoc-syntax">},
+                        {
+                            </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Item'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">html</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Row'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                                </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                                {
+                                    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">();
+                                    </span><span class="jsdoc-var">cell</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.deleteRow</span><span class="jsdoc-syntax">();
+                                    </span><span class="jsdoc-var">syncValue</span><span class="jsdoc-syntax">();
+
+                                    </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t.node</span><span class="jsdoc-syntax">);
+                                    </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+
+                                }
+                            },
+                            </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.menu
+                        </span><span class="jsdoc-syntax">},
+                       {
+                            </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Separator'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.menu
+                        </span><span class="jsdoc-syntax">},
+                        {
+                            </span><span class="jsdoc-var">xtype </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Item'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">html</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Table'</span><span class="jsdoc-syntax">,
+                            </span><span class="jsdoc-var">listeners </span><span class="jsdoc-syntax">: {
+                                </span><span class="jsdoc-var">click </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">_self</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+                                {
+                                    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">();
+                                    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">t.node.nextSibling </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">t.node.previousSibling</span><span class="jsdoc-syntax">;
+                                    </span><span class="jsdoc-var">t.node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t.node</span><span class="jsdoc-syntax">);
+                                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nn</span><span class="jsdoc-syntax">) {
+                                        </span><span class="jsdoc-var">toolbar.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
+                                    }
+                                    </span><span class="jsdoc-var">toolbar.editorcore.onEditorEvent</span><span class="jsdoc-syntax">();
+
+                                }
+                            },
+                            </span><span class="jsdoc-var">xns </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rooui.menu
+                        </span><span class="jsdoc-syntax">}
+                    ]
+                }
+            }
+
+            </span><span class="jsdoc-comment">// align... &lt;&lt; fixme
+
+        </span><span class="jsdoc-syntax">];
+
+    },
+
+
+  </span><span class="jsdoc-comment">/**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     * ?? should it be called with option to hide all editing features?
+     */
+ /**
+     * create a DomHelper friendly object - for use with
+     * Roo.DomHelper.markup / overwrite / etc..
+     * ?? should it be called with option to hide all editing features?
+     */
+    </span><span class="jsdoc-var">toObject </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret </span><span class="jsdoc-syntax">= {
+            </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'td'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">contenteditable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'true'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// this stops cell selection from picking the table.
+            </span><span class="jsdoc-string">'data-block' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'Td'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">valign </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.valign</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">style </span><span class="jsdoc-syntax">: {
+                </span><span class="jsdoc-string">'text-align' </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">this.textAlign</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">border </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'solid 1px rgb(0, 0, 0)'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// ??? hard coded?
+                </span><span class="jsdoc-string">'border-collapse' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'collapse'</span><span class="jsdoc-syntax">,
+                </span><span class="jsdoc-var">padding </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'6px'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// 8 for desktop / 4 for mobile
+                </span><span class="jsdoc-string">'vertical-align'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.valign
+            </span><span class="jsdoc-syntax">},
+            </span><span class="jsdoc-var">html </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.html
+        </span><span class="jsdoc-syntax">};
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.width </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">ret.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.width</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">ret.style.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.width</span><span class="jsdoc-syntax">;
+        }
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.colspan </span><span class="jsdoc-syntax">&gt; 1) {
+            </span><span class="jsdoc-var">ret.colspan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.colspan </span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.rowspan </span><span class="jsdoc-syntax">&gt; 1) {
+            </span><span class="jsdoc-var">ret.rowspan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.rowspan </span><span class="jsdoc-syntax">;
+        }
+
+
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">;
+
+    },
+
+    </span><span class="jsdoc-var">readElement </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">node  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.node </span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.style.width</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.colspan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Math.max</span><span class="jsdoc-syntax">(1,1*</span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'colspan'</span><span class="jsdoc-syntax">));
+        </span><span class="jsdoc-var">this.rowspan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Math.max</span><span class="jsdoc-syntax">(1,1*</span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">));
+        </span><span class="jsdoc-var">this.html </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.innerHTML</span><span class="jsdoc-syntax">;
+
+
+    },
+
+    </span><span class="jsdoc-comment">// the default cell object... at present...
+    </span><span class="jsdoc-var">emptyCell </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">colspan </span><span class="jsdoc-syntax">:  1,
+            </span><span class="jsdoc-var">rowspan </span><span class="jsdoc-syntax">:  1,
+            </span><span class="jsdoc-var">textAlign </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">html </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;&amp;nbsp;&quot; </span><span class="jsdoc-comment">// is this going to be editable now?
+        </span><span class="jsdoc-syntax">};
+
+    },
+
+    </span><span class="jsdoc-var">removeNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.node.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">);
+
+    },
+
+    </span><span class="jsdoc-var">cellData </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">colWidths </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">toTableArray  </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tab </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.node.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'tr'</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tab.rows</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ri</span><span class="jsdoc-syntax">){
+            </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">ri</span><span class="jsdoc-syntax">] = [];
+        });
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rn </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-var">this.colWidths </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">all_auto </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tab.rows</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ri</span><span class="jsdoc-syntax">){
+
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">= 0;
+            </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r.cells</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ce</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ci</span><span class="jsdoc-syntax">){
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=  {
+                    </span><span class="jsdoc-var">cell </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">ce</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">colspan </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">ce.colSpan</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">rowspan </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">ce.rowSpan
+                </span><span class="jsdoc-syntax">};
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ce.isEqualNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.node</span><span class="jsdoc-syntax">)) {
+                    </span><span class="jsdoc-var">this.cellData </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-comment">// if we have been filled up by a row?
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">]) != </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">]) != </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                        </span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">++;
+                    }
+                    </span><span class="jsdoc-var">c.col </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">;
+                }
+
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">] =   </span><span class="jsdoc-var">ce.style.width</span><span class="jsdoc-syntax">;
+                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">] != </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">) {
+                        </span><span class="jsdoc-var">all_auto </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+                    }
+                }
+
+
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.colspan </span><span class="jsdoc-syntax">&lt; 2 &amp;&amp; </span><span class="jsdoc-var">c.rowspan </span><span class="jsdoc-syntax">&lt; 2 ) {
+                    </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+                    </span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">++;
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">j </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">j </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">c.rowspan</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">j</span><span class="jsdoc-syntax">++) {
+                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">j</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+                        </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// we have a problem..
+                    </span><span class="jsdoc-syntax">}
+                    </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">j</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+                    </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">c.colspan</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+                        </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">j</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+                    }
+                }
+
+                </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c.colspan</span><span class="jsdoc-syntax">;
+            }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">rn</span><span class="jsdoc-syntax">++;
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-comment">// initalize widths.?
+        // either all widths or no widths..
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">all_auto</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[0] = </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// no widths flag.
+        </span><span class="jsdoc-syntax">}
+
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">;
+
+    },
+
+
+
+
+    </span><span class="jsdoc-var">mergeRight</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+
+        </span><span class="jsdoc-comment">// get the contents of the next cell along..
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.node.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'tr'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.prototype.indexOf.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tr.childNodes</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&gt;= </span><span class="jsdoc-var">tr.childNodes.length </span><span class="jsdoc-syntax">- 1) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// no cells on right to merge with.
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.cellData.colspan</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// nothing right?
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.cellData.colspan</span><span class="jsdoc-syntax">];
+        </span><span class="jsdoc-comment">// right cell - must be same rowspan and on the same row.
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">rc.rowspan </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.cellData.rowspan </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">rc.row </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// right hand side is not same rowspan.
+        </span><span class="jsdoc-syntax">}
+
+
+
+        </span><span class="jsdoc-var">this.node.innerHTML </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-string">' ' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">rc.cell.innerHTML</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">tr.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">rc.cell</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.colspan </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">rc.colspan</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.node.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'colspan'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.colspan</span><span class="jsdoc-syntax">);
+
+    },
+
+
+    </span><span class="jsdoc-var">mergeBelow </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.cellData.rowspan</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// no row below
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.cellData.rowspan</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// nothing right?
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">rc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">this.cellData.rowspan</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">];
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">rc.colspan </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.cellData.colspan </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">rc.col </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// right hand side is not same rowspan.
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-var">this.node.innerHTML </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-var">this.node.innerHTML </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">rc.cell.innerHTML </span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">rc.cell.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">rc.cell</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.rowspan </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">rc.rowspan</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.node.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.rowspan</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-var">split</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.node.rowSpan </span><span class="jsdoc-syntax">&lt; 2 &amp;&amp; </span><span class="jsdoc-var">this.node.colSpan </span><span class="jsdoc-syntax">&lt; 2) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cd </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.cellData</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.rowspan </span><span class="jsdoc-syntax">= 1;
+        </span><span class="jsdoc-var">this.colspan </span><span class="jsdoc-syntax">= 1;
+
+        </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cd.row</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">cd.row </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">cd.rowspan</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">++) {
+
+
+
+            </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cd.col</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">cd.col </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">cd.colspan</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">cd.row </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">cd.col</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">this.node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-var">this.node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'colspan'</span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+                }
+
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ntd </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.node.cloneNode</span><span class="jsdoc-syntax">(); </span><span class="jsdoc-comment">// which col/row should be 0..
+                </span><span class="jsdoc-var">ntd.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'id'</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">//
+                //ntd.style.width  = '';
+                </span><span class="jsdoc-var">ntd.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">] = { </span><span class="jsdoc-var">cell </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">ntd</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">col </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">colspan </span><span class="jsdoc-syntax">: 1 , </span><span class="jsdoc-var">rowspan </span><span class="jsdoc-syntax">: 1   };
+            }
+
+        }
+        </span><span class="jsdoc-var">this.redrawAllCells</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+
+
+
+    },
+
+
+
+    </span><span class="jsdoc-var">redrawAllCells</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">)
+    {
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tab </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.node.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'tr'</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'table'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ctr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tab.rows</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.parentNode</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tab.rows</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ri</span><span class="jsdoc-syntax">){
+
+            </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r.cells</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ce</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ci</span><span class="jsdoc-syntax">){
+                </span><span class="jsdoc-var">ce.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ce</span><span class="jsdoc-syntax">);
+            });
+            </span><span class="jsdoc-var">r.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">);
+        });
+        </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= 0 ; </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">table.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">re </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tab.rows</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">];
+
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">re </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tab.ownerDocument.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'tr'</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">ctr.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">re</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= 0 ; </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cell </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+                }
+
+                </span><span class="jsdoc-var">re.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cell</span><span class="jsdoc-syntax">);
+
+                </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cell </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+            }
+        }
+
+    },
+    </span><span class="jsdoc-var">updateWidths </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= 0 ; </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">table.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">++) {
+
+            </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= 0 ; </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cell </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+                }
+
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[0] != </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.colspan </span><span class="jsdoc-syntax">&lt; 2) {
+                    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cell</span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-var">el.width </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Math.floor</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">])  +</span><span class="jsdoc-string">'%'</span><span class="jsdoc-syntax">;
+                    </span><span class="jsdoc-var">el.updateElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el.node</span><span class="jsdoc-syntax">);
+                }
+                </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.cell </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// done
+            </span><span class="jsdoc-syntax">}
+        }
+    },
+    </span><span class="jsdoc-var">normalizeWidths </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[0] === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nw </span><span class="jsdoc-syntax">= 100.0 / </span><span class="jsdoc-var">this.colWidths.length</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.colWidths.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">w</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">nw</span><span class="jsdoc-syntax">;
+            },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">missing </span><span class="jsdoc-syntax">= [];
+
+        </span><span class="jsdoc-var">this.colWidths.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">w</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-comment">//if you mix % and
+            </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] == </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">? 0 : (</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]+</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/[^0-9]+/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)*1;
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">add </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">add </span><span class="jsdoc-syntax">&gt; 0) {
+                </span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">+=</span><span class="jsdoc-var">add</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-var">missing.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">);
+
+
+        },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.colWidths.length</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">missing.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">mult </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">nc </span><span class="jsdoc-syntax">- </span><span class="jsdoc-var">missing.length</span><span class="jsdoc-syntax">) / (1.0 * </span><span class="jsdoc-var">nc</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">mult </span><span class="jsdoc-syntax">* </span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ew </span><span class="jsdoc-syntax">= (100 -</span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">) / (1.0 * </span><span class="jsdoc-var">missing.length</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">this.colWidths.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">w</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">w </span><span class="jsdoc-syntax">&gt; 0) {
+                    </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">w </span><span class="jsdoc-syntax">* </span><span class="jsdoc-var">mult</span><span class="jsdoc-syntax">;
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+
+                </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">ew</span><span class="jsdoc-syntax">;
+            }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-comment">// have to make up numbers..
+
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-comment">// now we should have all the widths..
+
+
+    </span><span class="jsdoc-syntax">},
+
+    </span><span class="jsdoc-var">shrinkColumn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.normalizeWidths</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">col </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nw </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">] * 0.8;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nw </span><span class="jsdoc-syntax">&lt; 5) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">otherAdd </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">]  * 0.2) / (</span><span class="jsdoc-var">this.colWidths.length </span><span class="jsdoc-syntax">-1);
+        </span><span class="jsdoc-var">this.colWidths.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">w</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">) {
+                 </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">nw</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] += </span><span class="jsdoc-var">otherAdd
+        </span><span class="jsdoc-syntax">}, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateWidths</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+
+    },
+    </span><span class="jsdoc-var">growColumn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.normalizeWidths</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">col </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nw </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">] * 1.2;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nw </span><span class="jsdoc-syntax">&gt; 90) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">otherSub </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">]  * 0.2) / (</span><span class="jsdoc-var">this.colWidths.length </span><span class="jsdoc-syntax">-1);
+        </span><span class="jsdoc-var">this.colWidths.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">w</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">nw</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-var">this.colWidths</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] -= </span><span class="jsdoc-var">otherSub
+        </span><span class="jsdoc-syntax">}, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.updateWidths</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+
+    },
+    </span><span class="jsdoc-var">deleteRow </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-comment">// delete this rows 'tr'
+        // if any of the cells in this row have a rowspan &gt; 1 &amp;&amp; row!= this row..
+        // then reduce the rowspan.
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-comment">// this.cellData.row;
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">=0;</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.row </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">) {
+
+                </span><span class="jsdoc-var">c.rowspan</span><span class="jsdoc-syntax">--;
+                </span><span class="jsdoc-var">c.cell.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">c.rowspan</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.rowspan </span><span class="jsdoc-syntax">&gt; 1) {
+                </span><span class="jsdoc-var">c.rowspan</span><span class="jsdoc-syntax">--;
+                </span><span class="jsdoc-var">c.cell.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'rowspan'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">c.rowspan</span><span class="jsdoc-syntax">);
+            }
+        }
+        </span><span class="jsdoc-var">table.splice</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.cellData.row</span><span class="jsdoc-syntax">,1);
+        </span><span class="jsdoc-var">this.redrawAllCells</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+
+    },
+    </span><span class="jsdoc-var">deleteColumn </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">table </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.toTableArray</span><span class="jsdoc-syntax">();
+
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">=0;</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">table.length </span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">];
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.col </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.colspan</span><span class="jsdoc-syntax">--;
+            } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c.colspan </span><span class="jsdoc-syntax">&gt; 1) {
+                </span><span class="jsdoc-var">c.colspan</span><span class="jsdoc-syntax">--;
+                </span><span class="jsdoc-var">c.cell.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'colspan'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">c.colspan</span><span class="jsdoc-syntax">);
+            }
+            </span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.splice</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.cellData.col</span><span class="jsdoc-syntax">,1);
+        }
+
+        </span><span class="jsdoc-var">this.redrawAllCells</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">table</span><span class="jsdoc-syntax">);
+    }
+
+
+
+
+})
+
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_Filter.js.html b/docs/src/Roo_htmleditor_Filter.js.html
new file mode 100644 (file)
index 0000000..fa40c82
--- /dev/null
@@ -0,0 +1,64 @@
+<html><head><title>Roo/htmleditor/Filter.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.Filter
+ * Base Class for filtering htmleditor stuff. - do not use this directly - extend it.
+ * @cfg {DomElement} node The node to iterate and filter
+ * @cfg {boolean|String|Array} tag Tags to replace 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.Filter </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">) {
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-comment">// this does not actually call walk as it's really just a abstract class
+</span><span class="jsdoc-syntax">}
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.Filter.prototype </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">// overrride to do replace comments.
+    </span><span class="jsdoc-var">replaceComment </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">// overrride to do replace or do stuff with tags..
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">walk </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">dom</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">dom.childNodes</span><span class="jsdoc-syntax">), </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">e </span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">switch</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">) {
+
+                </span><span class="jsdoc-keyword">case </span><span class="jsdoc-var">e.nodeType </span><span class="jsdoc-syntax">== 8 &amp;&amp;  </span><span class="jsdoc-var">this.replaceComment  </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">: </span><span class="jsdoc-comment">// comment
+                    </span><span class="jsdoc-var">this.replaceComment</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+
+                </span><span class="jsdoc-keyword">case </span><span class="jsdoc-var">e.nodeType </span><span class="jsdoc-syntax">!= 1: </span><span class="jsdoc-comment">//not a node.
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+
+                </span><span class="jsdoc-keyword">case </span><span class="jsdoc-var">this.tag </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">: </span><span class="jsdoc-comment">// everything
+                </span><span class="jsdoc-keyword">case typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tag</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'object' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.tag.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e.tagName</span><span class="jsdoc-syntax">) &gt; -1: </span><span class="jsdoc-comment">// array and it matches.
+                </span><span class="jsdoc-keyword">case typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tag</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.tag </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">e.tagName</span><span class="jsdoc-syntax">: </span><span class="jsdoc-comment">// array and it matches.
+                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.replaceTag </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-var">this.replaceTag</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)) {
+                        </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                    }
+                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e.hasChildNodes</span><span class="jsdoc-syntax">()) {
+                        </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+                    }
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+
+                </span><span class="jsdoc-keyword">default</span><span class="jsdoc-syntax">:    </span><span class="jsdoc-comment">// tags .. that do not match.
+                    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e.hasChildNodes</span><span class="jsdoc-syntax">()) {
+                        </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+                    }
+            }
+
+        }, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+
+    }
+};</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterAttributes.js.html b/docs/src/Roo_htmleditor_FilterAttributes.js.html
new file mode 100644 (file)
index 0000000..8cfde57
--- /dev/null
@@ -0,0 +1,156 @@
+<html><head><title>Roo/htmleditor/FilterAttributes.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterAttributes
+ * clean attributes and  styles including http:// etc.. in attribute
+ * @constructor
+* Run a new Attribute Filter
+* @param {Object} config Configuration options
+ */
+</span><span class="jsdoc-var">Roo.htmleditor.FilterAttributes </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.attrib_black </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attrib_black </span><span class="jsdoc-syntax">|| [];
+    </span><span class="jsdoc-var">this.attrib_white </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attrib_white </span><span class="jsdoc-syntax">|| [];
+
+    </span><span class="jsdoc-var">this.attrib_clean </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attrib_clean </span><span class="jsdoc-syntax">|| [];
+    </span><span class="jsdoc-var">this.style_white </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.style_white </span><span class="jsdoc-syntax">|| [];
+    </span><span class="jsdoc-var">this.style_black </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.style_black </span><span class="jsdoc-syntax">|| [];
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterAttributes</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+    </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// all tags
+
+    </span><span class="jsdoc-var">attrib_black </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// array
+    </span><span class="jsdoc-var">attrib_clean </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">attrib_white </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">style_white </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">style_black </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">node.attributes </span><span class="jsdoc-syntax">|| !</span><span class="jsdoc-var">node.attributes.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.attributes.length</span><span class="jsdoc-syntax">-1; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&gt; -1 ; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">--) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">a </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
+            </span><span class="jsdoc-comment">//console.log(a);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.attrib_white.length </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.attrib_white.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name.toLowerCase</span><span class="jsdoc-syntax">()) &lt; 0) {
+                </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+
+
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name.toLowerCase</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.substr</span><span class="jsdoc-syntax">(0,2)==</span><span class="jsdoc-string">'on'</span><span class="jsdoc-syntax">)  {
+                </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.attrib_black.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name.toLowerCase</span><span class="jsdoc-syntax">()) &gt; -1) {
+                </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.attrib_clean.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name.toLowerCase</span><span class="jsdoc-syntax">()) &gt; -1) {
+                </span><span class="jsdoc-var">this.cleanAttr</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">a.name</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">a.value</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// fixme..
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.cleanStyle</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">a.name</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">a.value</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-comment">/// clean up MS crap..
+            // tecnically this should be a list of valid class'es..
+
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'class'</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.value.match</span><span class="jsdoc-syntax">(/^Mso/)) {
+                    </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'class'</span><span class="jsdoc-syntax">);
+                }
+
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a.value.match</span><span class="jsdoc-syntax">(/^body$/)) {
+                    </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'class'</span><span class="jsdoc-syntax">);
+                }
+                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+
+
+            </span><span class="jsdoc-comment">// style cleanup!?
+            // class cleanup?
+
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// clean children
+    </span><span class="jsdoc-syntax">},
+
+    </span><span class="jsdoc-var">cleanAttr</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^\./) || </span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^\//)) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^(http|https):\/\//)
+            || </span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^mailto:/)
+            || </span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^ftp:/)
+            || </span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^data:/)
+            ) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^#/)) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/^\{/)) { </span><span class="jsdoc-comment">// allow template editing.
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+</span><span class="jsdoc-comment">//            Roo.log(&quot;(REMOVE TAG)&quot;+ node.tagName +'.' + n + '=' + v);
+        </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+
+    },
+    </span><span class="jsdoc-var">cleanStyle </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">,  </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v.match</span><span class="jsdoc-syntax">(/expression/)) { </span><span class="jsdoc-comment">//XSS?? should we even bother..
+            </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">parts </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">v.split</span><span class="jsdoc-syntax">(/;/);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">clean </span><span class="jsdoc-syntax">= [];
+
+        </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">parts</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.replace</span><span class="jsdoc-syntax">(/^\s+/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/\s+$/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">p.length</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">p.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">':'</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.shift</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/\s+/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">l.replace</span><span class="jsdoc-syntax">(/^\s+/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/\s+$/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">this.style_black.length </span><span class="jsdoc-syntax">&amp;&amp; (</span><span class="jsdoc-var">this.style_black.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">) &gt; -1 || </span><span class="jsdoc-var">this.style_black.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l.toLowerCase</span><span class="jsdoc-syntax">()) &gt; -1)) {
+                </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-comment">//Roo.log()
+            // only allow 'c whitelisted system attributes'
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">this.style_white.length </span><span class="jsdoc-syntax">&amp;&amp;  </span><span class="jsdoc-var">style_white.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">) &lt; 0 &amp;&amp; </span><span class="jsdoc-var">style_white.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">l.toLowerCase</span><span class="jsdoc-syntax">()) &lt; 0 ) {
+                </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+            }
+
+
+            </span><span class="jsdoc-var">clean.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+        },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">clean.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">node.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">clean.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">';'</span><span class="jsdoc-syntax">));
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+        }
+
+    }
+
+
+
+
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterBlack.js.html b/docs/src/Roo_htmleditor_FilterBlack.js.html
new file mode 100644 (file)
index 0000000..b9bac56
--- /dev/null
@@ -0,0 +1,24 @@
+<html><head><title>Roo/htmleditor/FilterBlack.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterBlack
+ * remove blacklisted elements.
+ * @constructor
+ * Run a new Blacklisted Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterBlack </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterBlack</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+    </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// all elements.
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">n.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+    }
+});
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterBlock.js.html b/docs/src/Roo_htmleditor_FilterBlock.js.html
new file mode 100644 (file)
index 0000000..3353b12
--- /dev/null
@@ -0,0 +1,37 @@
+<html><head><title>Roo/htmleditor/FilterBlock.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterBlock
+ * removes id / data-block and contenteditable that are associated with blocks
+ * usage should be done on a cloned copy of the dom
+ * @constructor
+* Run a new Attribute Filter { node : xxxx }}
+* @param {Object} config Configuration options
+ */
+</span><span class="jsdoc-var">Roo.htmleditor.FilterBlock </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">qa </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cfg.node.querySelectorAll</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.removeAttributes</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.removeAttributes</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'contenteditable'</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.removeAttributes</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'id'</span><span class="jsdoc-syntax">);
+
+}
+
+</span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterBlock.prototype</span><span class="jsdoc-syntax">,
+{
+    </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// all tags
+
+
+    </span><span class="jsdoc-var">removeAttributes </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.node.querySelectorAll</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'*[' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">']'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">=0;</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">&lt;</span><span class="jsdoc-var">ar.length</span><span class="jsdoc-syntax">;</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">);
+        }
+    }
+
+
+
+
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterComment.js.html b/docs/src/Roo_htmleditor_FilterComment.js.html
new file mode 100644 (file)
index 0000000..b12b172
--- /dev/null
@@ -0,0 +1,20 @@
+<html><head><title>Roo/htmleditor/FilterComment.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterComment
+ * remove comments.
+ * @constructor
+* Run a new Comments Filter
+* @param {Object} config Configuration options
+ */
+</span><span class="jsdoc-var">Roo.htmleditor.FilterComment </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterComment</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+
+    </span><span class="jsdoc-var">replaceComment </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">n.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+    }
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterKeepChildren.js.html b/docs/src/Roo_htmleditor_FilterKeepChildren.js.html
new file mode 100644 (file)
index 0000000..0a166a6
--- /dev/null
@@ -0,0 +1,56 @@
+<html><head><title>Roo/htmleditor/FilterKeepChildren.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterKeepChildren
+ * remove tags but keep children
+ * @constructor
+ * Run a new Keep Children Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterKeepChildren </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tag </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// dont walk.. (you can use this to use this just to do a child removal on a single tag )
+    </span><span class="jsdoc-syntax">}
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterKeepChildren</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.FilterBlack</span><span class="jsdoc-syntax">,
+{
+
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-comment">// walk children...
+        //Roo.log(node);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">//remove first..
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">ar.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.nodeType </span><span class="jsdoc-syntax">== 1) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(
+                    (</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tag</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'object' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.tag.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.tagName</span><span class="jsdoc-syntax">) &gt; -1)
+                    || </span><span class="jsdoc-comment">// array and it matches
+                    </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tag</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.tag </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.tagName</span><span class="jsdoc-syntax">)
+                ) {
+                    </span><span class="jsdoc-var">this.replaceTag</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]); </span><span class="jsdoc-comment">// child is blacklisted as well...
+                    </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+                }
+            }
+        }
+        </span><span class="jsdoc-var">ar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">ar.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+
+            </span><span class="jsdoc-var">node.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
+            </span><span class="jsdoc-comment">// what if we need to walk these???
+            </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tag </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
+
+            }
+        }
+        </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// don't walk children
+
+
+    </span><span class="jsdoc-syntax">}
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterLongBr.js.html b/docs/src/Roo_htmleditor_FilterLongBr.js.html
new file mode 100644 (file)
index 0000000..52bde6d
--- /dev/null
@@ -0,0 +1,70 @@
+<html><head><title>Roo/htmleditor/FilterLongBr.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterLongBr
+ * BR/BR/BR - keep a maximum of 2...
+ * @constructor
+ * Run a new Long BR Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterLongBr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// no need to apply config.
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterLongBr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+
+
+    </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">ps.nodeType </span><span class="jsdoc-syntax">== 3 &amp;&amp; </span><span class="jsdoc-var">ps.nodeValue.trim</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ps.nextSibling</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">&amp;&amp;  [ </span><span class="jsdoc-string">'TD'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'TH'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'LI'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H1'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H2'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H3'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H4'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H5'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H6' </span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.parentNode.tagName</span><span class="jsdoc-syntax">) &gt; -1) {
+            </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// remove last BR inside one fo these tags
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">ps.nodeType </span><span class="jsdoc-syntax">!= 1) {
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">ps.tagName </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">) {
+
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+
+
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.previousSibling</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">ps.nodeType </span><span class="jsdoc-syntax">== 3 &amp;&amp; </span><span class="jsdoc-var">ps.nodeValue.trim</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ps.previousSibling</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">ps.nodeType </span><span class="jsdoc-syntax">!= 1) {
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-comment">// if header or BR before.. then it's a candidate for removal.. - as we only want '2' of these..
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ps </span><span class="jsdoc-syntax">|| [ </span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H1'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H2'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H3'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H4'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H5'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'H6' </span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ps.tagName</span><span class="jsdoc-syntax">) &lt; 0) {
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// remove me...
+
+        </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// no need to do children
+
+    </span><span class="jsdoc-syntax">}
+
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterParagraph.js.html b/docs/src/Roo_htmleditor_FilterParagraph.js.html
new file mode 100644 (file)
index 0000000..7a47ecb
--- /dev/null
@@ -0,0 +1,52 @@
+<html><head><title>Roo/htmleditor/FilterParagraph.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterParagraph
+ * paragraphs cause a nightmare for shared content - this filter is designed to be called ? at various points when editing
+ * like on 'push' to remove the &lt;p&gt; tags and replace them with line breaks.
+ * @constructor
+ * Run a new Paragraph Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterParagraph </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// no need to apply config.
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterParagraph</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+
+
+    </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'P'</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.childNodes.length </span><span class="jsdoc-syntax">== 1 &amp;&amp;
+            </span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.nodeType </span><span class="jsdoc-syntax">== 3 &amp;&amp;
+            </span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.textContent.trim</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">&lt; 1
+            ) {
+            </span><span class="jsdoc-comment">// remove and replace with '&lt;BR&gt;';
+            </span><span class="jsdoc-var">node.parentNode.replaceChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.ownerDocument.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">),</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// no need to walk..
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">ar.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-var">node.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
+            </span><span class="jsdoc-comment">// what if we need to walk these???
+            </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-comment">// now what about this?
+        // &lt;p&gt; &amp;nbsp; &lt;/p&gt;
+
+        // double BR.
+        </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.ownerDocument.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">), </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.ownerDocument.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">), </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+
+    }
+
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterSpan.js.html b/docs/src/Roo_htmleditor_FilterSpan.js.html
new file mode 100644 (file)
index 0000000..379f730
--- /dev/null
@@ -0,0 +1,31 @@
+<html><head><title>Roo/htmleditor/FilterSpan.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterSpan
+ * filter span's with no attributes out..
+ * @constructor
+ * Run a new Span Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterSpan </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// no need to apply config.
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterSpan</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.FilterKeepChildren</span><span class="jsdoc-syntax">,
+{
+
+    </span><span class="jsdoc-var">tag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'SPAN'</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.attributes </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">node.attributes.length </span><span class="jsdoc-syntax">&gt; 0) {
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// walk if there are any.
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-var">Roo.htmleditor.FilterKeepChildren.prototype.replaceTag.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+
+    }
+
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterStyleToTag.js.html b/docs/src/Roo_htmleditor_FilterStyleToTag.js.html
new file mode 100644 (file)
index 0000000..9e9ae4f
--- /dev/null
@@ -0,0 +1,75 @@
+<html><head><title>Roo/htmleditor/FilterStyleToTag.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterStyleToTag
+ * part of the word stuff... - certain 'styles' should be converted to tags.
+ * eg.
+ *   font-weight: bold -&gt; bold
+ *   ?? super / subscrit etc..
+ * 
+ * @constructor
+* Run a new style to tag filter.
+* @param {Object} config Configuration options
+ */
+</span><span class="jsdoc-var">Roo.htmleditor.FilterStyleToTag </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+
+    </span><span class="jsdoc-var">this.tags </span><span class="jsdoc-syntax">= {
+        </span><span class="jsdoc-var">B  </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'fontWeight' </span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'bold'</span><span class="jsdoc-syntax">],
+        </span><span class="jsdoc-var">I </span><span class="jsdoc-syntax">:  [ </span><span class="jsdoc-string">'fontStyle' </span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'italic'</span><span class="jsdoc-syntax">],
+        </span><span class="jsdoc-comment">//pre :  [ 'font-style' , 'italic'],
+        // h1.. h6 ?? font-size?
+        </span><span class="jsdoc-var">SUP </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'verticalAlign' </span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'super' </span><span class="jsdoc-syntax">],
+        </span><span class="jsdoc-var">SUB </span><span class="jsdoc-syntax">: [ </span><span class="jsdoc-string">'verticalAlign' </span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'sub' </span><span class="jsdoc-syntax">]
+
+
+    };
+
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+
+
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+
+
+
+}
+
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterStyleToTag</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+    </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// all tags
+
+    </span><span class="jsdoc-var">tags </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">inject </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">k </span><span class="jsdoc-keyword">in </span><span class="jsdoc-var">this.tags</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.style</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.tags</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">k</span><span class="jsdoc-syntax">][0]] == </span><span class="jsdoc-var">this.tags</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">k</span><span class="jsdoc-syntax">][1]) {
+                </span><span class="jsdoc-var">inject.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">k</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-var">node.style.removeProperty</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.tags</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">k</span><span class="jsdoc-syntax">][0]);
+            }
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">inject.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">inject</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.ownerDocument.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">nn.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nc</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">nn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">nc</span><span class="jsdoc-syntax">;
+        });
+        </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0;</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">cn.length</span><span class="jsdoc-syntax">;</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">++) {
+            </span><span class="jsdoc-var">node.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
+            </span><span class="jsdoc-var">nn.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
+        }
+        </span><span class="jsdoc-keyword">return true </span><span class="jsdoc-comment">/// iterate thru
+    </span><span class="jsdoc-syntax">}
+
+})</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterTableWidth.js.html b/docs/src/Roo_htmleditor_FilterTableWidth.js.html
new file mode 100644 (file)
index 0000000..96faca4
--- /dev/null
@@ -0,0 +1,60 @@
+<html><head><title>Roo/htmleditor/FilterTableWidth.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterTableWidth
+  try and remove table width data - as that frequently messes up other stuff.
+ * 
+ *      was cleanTableWidths.
+ *
+ * Quite often pasting from word etc.. results in tables with column and widths.
+ * This does not work well on fluid HTML layouts - like emails. - so this code should hunt an destroy them..
+ *
+ * @constructor
+ * Run a new Table Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterTableWidth </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// no need to apply config.
+    </span><span class="jsdoc-var">this.tag </span><span class="jsdoc-syntax">= [</span><span class="jsdoc-string">'TABLE'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'TD'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'TR'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'TH'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'THEAD'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'TBODY' </span><span class="jsdoc-syntax">];
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterTableWidth</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+
+
+
+    </span><span class="jsdoc-var">replaceTag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'width'</span><span class="jsdoc-syntax">)) {
+            </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'width'</span><span class="jsdoc-syntax">);
+        }
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">)) {
+            </span><span class="jsdoc-comment">// pretty basic...
+
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">styles </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;;&quot;</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nstyle </span><span class="jsdoc-syntax">= [];
+            </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">styles</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">s.match</span><span class="jsdoc-syntax">(/:/)) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">kv </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">s.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;:&quot;</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">kv</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.match</span><span class="jsdoc-syntax">(/^\s*(width|min-width)\s*$/)) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-comment">// what ever is left... we allow.
+                </span><span class="jsdoc-var">nstyle.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s</span><span class="jsdoc-syntax">);
+            });
+            </span><span class="jsdoc-var">node.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">nstyle.length </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">nstyle.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">';'</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">nstyle.length</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">);
+            }
+        }
+
+        </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// continue doing children..
+    </span><span class="jsdoc-syntax">}
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_FilterWord.js.html b/docs/src/Roo_htmleditor_FilterWord.js.html
new file mode 100644 (file)
index 0000000..ab26fbf
--- /dev/null
@@ -0,0 +1,118 @@
+<html><head><title>Roo/htmleditor/FilterWord.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.FilterWord
+ * try and clean up all the mess that Word generates.
+ * 
+ * This is the 'nice version' - see 'Heavy' that white lists a very short list of elements, and multi-filters 
+ * @constructor
+ * Run a new Span Filter
+ * @param {Object} config Configuration options
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.FilterWord </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// no need to apply config.
+    </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg.node</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.htmleditor.FilterWord</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.Filter</span><span class="jsdoc-syntax">,
+{
+    </span><span class="jsdoc-var">tag</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-comment">/**
+     * Clean up MS wordisms...
+     */
+    </span><span class="jsdoc-var">replaceTag </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-comment">// no idea what this does - span with text, replaceds with just text.
+        </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(
+                </span><span class="jsdoc-var">node.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'SPAN' </span><span class="jsdoc-syntax">&amp;&amp;
+                !</span><span class="jsdoc-var">node.hasAttributes</span><span class="jsdoc-syntax">() &amp;&amp;
+                </span><span class="jsdoc-var">node.childNodes.length </span><span class="jsdoc-syntax">== 1 &amp;&amp;
+                </span><span class="jsdoc-var">node.firstChild.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">&quot;#text&quot;
+        </span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">textNode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.firstChild</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">node.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">textNode</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'lang'</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'zh-CN'</span><span class="jsdoc-syntax">) {   </span><span class="jsdoc-comment">// do not space pad on chinese characters..
+                </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.ownerDocument.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">), </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            }
+            </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">textNode</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'lang'</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'zh-CN'</span><span class="jsdoc-syntax">) {   </span><span class="jsdoc-comment">// do not space pad on chinese characters..
+                </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.ownerDocument.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">) , </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            }
+
+            </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// dont do chidren - we have remove our node - so no need to do chdhilren?
+        </span><span class="jsdoc-syntax">}
+
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.tagName.toLowerCase</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.match</span><span class="jsdoc-syntax">(/^(style|script|applet|embed|noframes|noscript)$/)) {
+            </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// dont do chidlren
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-comment">//Roo.log(node.tagName);
+        // remove - but keep children..
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.tagName.toLowerCase</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.match</span><span class="jsdoc-syntax">(/^(meta|link|\\?xml:|st1:|o:|v:|font)/)) {
+            </span><span class="jsdoc-comment">//Roo.log('-- removed');
+            </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.childNodes.length</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">[0];
+                </span><span class="jsdoc-var">node.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-var">node.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-comment">// move node to parent - and clean it..
+                </span><span class="jsdoc-var">this.replaceTag</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">);
+            }
+            </span><span class="jsdoc-var">node.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-comment">/// no need to iterate chidlren = it's got none..
+            //this.iterateChildren(node, this.cleanWord);
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// no need to iterate children.
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-comment">// clean styles
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.className.length</span><span class="jsdoc-syntax">) {
+
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.className.split</span><span class="jsdoc-syntax">(/\W+/);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cna </span><span class="jsdoc-syntax">= [];
+            </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cls.match</span><span class="jsdoc-syntax">(/Mso[a-zA-Z]+/)) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-var">cna.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">);
+            });
+            </span><span class="jsdoc-var">node.className </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cna.length </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">cna.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">cna.length</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;class&quot;</span><span class="jsdoc-syntax">);
+            }
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;lang&quot;</span><span class="jsdoc-syntax">)) {
+            </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;lang&quot;</span><span class="jsdoc-syntax">);
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">)) {
+
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">styles </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;;&quot;</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nstyle </span><span class="jsdoc-syntax">= [];
+            </span><span class="jsdoc-var">Roo.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">styles</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">s.match</span><span class="jsdoc-syntax">(/:/)) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">kv </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">s.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;:&quot;</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">kv</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.match</span><span class="jsdoc-syntax">(/^(mso-|line|font|background|margin|padding|color)/)) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-comment">// what ever is left... we allow.
+                </span><span class="jsdoc-var">nstyle.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">s</span><span class="jsdoc-syntax">);
+            });
+            </span><span class="jsdoc-var">node.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;style&quot;</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">nstyle.length </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">nstyle.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">';'</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">nstyle.length</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">node.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">);
+            }
+        }
+        </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// do children
+
+
+
+    </span><span class="jsdoc-syntax">}
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_KeyEnter.js.html b/docs/src/Roo_htmleditor_KeyEnter.js.html
new file mode 100644 (file)
index 0000000..4add76a
--- /dev/null
@@ -0,0 +1,86 @@
+<html><head><title>Roo/htmleditor/KeyEnter.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.KeyEnter
+ * Handle Enter press..
+ * @cfg {Roo.HtmlEditorCore} core the editor.
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+
+
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.KeyEnter </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">) {
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-comment">// this does not actually call walk as it's really just a abstract class
+
+    </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.core.doc.body</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'keypress'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.keypress</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-comment">//Roo.htmleditor.KeyEnter.i = 0;
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.prototype </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-var">core </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">keypress </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e.charCode </span><span class="jsdoc-syntax">!= 13 &amp;&amp; </span><span class="jsdoc-var">e.charCode </span><span class="jsdoc-syntax">!= 10) {
+            </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">([</span><span class="jsdoc-var">e.charCode</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">]);
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">e.preventDefault</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-comment">// https://stackoverflow.com/questions/18552336/prevent-contenteditable-adding-div-on-enter-chrome
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">doc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.core.doc</span><span class="jsdoc-syntax">;
+          </span><span class="jsdoc-comment">//add a new line
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.core.getSelection</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">sel.getRangeAt</span><span class="jsdoc-syntax">(0);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">range.commonAncestorContainer</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">range.closest</span><span class="jsdoc-syntax">([ </span><span class="jsdoc-string">'ol'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'ul'</span><span class="jsdoc-syntax">]);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pli </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">range.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'li'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">pc </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">e.ctrlKey</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">sel.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'br'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'after'</span><span class="jsdoc-syntax">);
+
+            </span><span class="jsdoc-var">this.core.undoManager.addEvent</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.core.fireEditorEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-comment">// deal with &lt;li&gt; insetion
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">pli.innerText.trim</span><span class="jsdoc-syntax">() == </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">&amp;&amp;
+            </span><span class="jsdoc-var">pli.previousSibling </span><span class="jsdoc-syntax">&amp;&amp;
+            </span><span class="jsdoc-var">pli.previousSibling.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'LI' </span><span class="jsdoc-syntax">&amp;&amp;
+            </span><span class="jsdoc-var">pli.previousSibling.innerText.trim</span><span class="jsdoc-syntax">() ==  </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">pli.parentNode.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">pli.previousSibling</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">sel.cursorAfter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">pc</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">this.core.undoManager.addEvent</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.core.fireEditorEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">li </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'LI'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">li.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">'&amp;nbsp;'</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">pli </span><span class="jsdoc-syntax">|| !</span><span class="jsdoc-var">pli.firstSibling</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">pc.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">li</span><span class="jsdoc-syntax">);
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">pli.parentNode.insertBefore</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">li</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">pli.firstSibling</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-var">sel.cursorText </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">li.firstChild</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-var">this.core.undoManager.addEvent</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.core.fireEditorEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+
+
+
+
+
+    }
+};
+    </span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_Tidy.js.html b/docs/src/Roo_htmleditor_Tidy.js.html
new file mode 100644 (file)
index 0000000..9c2f205
--- /dev/null
@@ -0,0 +1,43 @@
+<html><head><title>Roo/htmleditor/Tidy.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/**
+ * @class Roo.htmleditor.Tidy
+ * Tidy HTML 
+ * 
+ * @constructor
+ * Create a new Filter.
+ * @param {Object} config Configuration options
+ */
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.Tidy </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">) {
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-var">this.core.doc.body.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.tidy</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.core.doc.body</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+
+}
+
+</span><span class="jsdoc-var">Roo.htmleditor.Tidy.toString </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Tidy.prototype.tidy</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+}
+
+</span><span class="jsdoc-var">Roo.htmleditor.Tidy.prototype </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-comment">/**
+     *
+     * @cfg {Roo.HtmlEditorCore} core the editor.
+     */
+    </span><span class="jsdoc-var">core </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+
+
+    </span><span class="jsdoc-var">tidy </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">indent</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ser </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.htmleditor.TidySerializer</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">indent </span><span class="jsdoc-syntax">: 2,
+        });
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ser.serialize</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+
+
+    }
+
+}</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_TidyEntities.js.html b/docs/src/Roo_htmleditor_TidyEntities.js.html
new file mode 100644 (file)
index 0000000..02baf8f
--- /dev/null
@@ -0,0 +1,747 @@
+<html><head><title>Roo/htmleditor/TidyEntities.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/***
+ * This is based loosely on tinymce 
+ * @class Roo.htmleditor.TidyEntities
+ * @static
+ * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
+ *
+ * Not 100% sure this is actually used or needed.
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.TidyEntities </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-comment">/**
+     * initialize data..
+     */
+    </span><span class="jsdoc-var">init </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(){
+
+        </span><span class="jsdoc-var">this.namedEntities </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.buildEntitiesLookup</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.namedEntitiesData</span><span class="jsdoc-syntax">, 32);
+
+    },
+
+
+    </span><span class="jsdoc-var">buildEntitiesLookup</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">radix</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">entity</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">lookup </span><span class="jsdoc-syntax">= {};
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">{};
+        }
+        </span><span class="jsdoc-var">items </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">items.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">','</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">radix </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">radix </span><span class="jsdoc-syntax">|| 10;
+        </span><span class="jsdoc-comment">// Build entities lookup table
+        </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">items.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">+= 2) {
+            </span><span class="jsdoc-var">chr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">String.fromCharCode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">parseInt</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">radix</span><span class="jsdoc-syntax">));
+            </span><span class="jsdoc-comment">// Only add non base entities
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.baseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">]) {
+                </span><span class="jsdoc-var">entity </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">'&amp;' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">+ 1] + </span><span class="jsdoc-string">';'</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">lookup</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">entity</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">lookup</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">entity</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">;
+            }
+        }
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">lookup</span><span class="jsdoc-syntax">;
+
+    },
+
+    </span><span class="jsdoc-var">asciiMap </span><span class="jsdoc-syntax">: {
+            128: </span><span class="jsdoc-string">'€'</span><span class="jsdoc-syntax">,
+            130: </span><span class="jsdoc-string">'‚'</span><span class="jsdoc-syntax">,
+            131: </span><span class="jsdoc-string">'ƒ'</span><span class="jsdoc-syntax">,
+            132: </span><span class="jsdoc-string">'„'</span><span class="jsdoc-syntax">,
+            133: </span><span class="jsdoc-string">'…'</span><span class="jsdoc-syntax">,
+            134: </span><span class="jsdoc-string">'†'</span><span class="jsdoc-syntax">,
+            135: </span><span class="jsdoc-string">'‡'</span><span class="jsdoc-syntax">,
+            136: </span><span class="jsdoc-string">'ˆ'</span><span class="jsdoc-syntax">,
+            137: </span><span class="jsdoc-string">'‰'</span><span class="jsdoc-syntax">,
+            138: </span><span class="jsdoc-string">'Š'</span><span class="jsdoc-syntax">,
+            139: </span><span class="jsdoc-string">'‹'</span><span class="jsdoc-syntax">,
+            140: </span><span class="jsdoc-string">'Œ'</span><span class="jsdoc-syntax">,
+            142: </span><span class="jsdoc-string">'Ž'</span><span class="jsdoc-syntax">,
+            145: </span><span class="jsdoc-string">'‘'</span><span class="jsdoc-syntax">,
+            146: </span><span class="jsdoc-string">'’'</span><span class="jsdoc-syntax">,
+            147: </span><span class="jsdoc-string">'“'</span><span class="jsdoc-syntax">,
+            148: </span><span class="jsdoc-string">'”'</span><span class="jsdoc-syntax">,
+            149: </span><span class="jsdoc-string">'•'</span><span class="jsdoc-syntax">,
+            150: </span><span class="jsdoc-string">'–'</span><span class="jsdoc-syntax">,
+            151: </span><span class="jsdoc-string">'—'</span><span class="jsdoc-syntax">,
+            152: </span><span class="jsdoc-string">'˜'</span><span class="jsdoc-syntax">,
+            153: </span><span class="jsdoc-string">'™'</span><span class="jsdoc-syntax">,
+            154: </span><span class="jsdoc-string">'š'</span><span class="jsdoc-syntax">,
+            155: </span><span class="jsdoc-string">'›'</span><span class="jsdoc-syntax">,
+            156: </span><span class="jsdoc-string">'œ'</span><span class="jsdoc-syntax">,
+            158: </span><span class="jsdoc-string">'ž'</span><span class="jsdoc-syntax">,
+            159: </span><span class="jsdoc-string">'Ÿ'
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-comment">// Raw entities
+    </span><span class="jsdoc-var">baseEntities </span><span class="jsdoc-syntax">: {
+        </span><span class="jsdoc-string">'&quot;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;quot;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-comment">// Needs to be escaped since the YUI compressor would otherwise break the code
+        </span><span class="jsdoc-string">'\''</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;#39;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&lt;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;lt;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;gt;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&amp;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;amp;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'`'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;#96;'
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-comment">// Reverse lookup table for raw entities
+    </span><span class="jsdoc-var">reverseEntities </span><span class="jsdoc-syntax">: {
+        </span><span class="jsdoc-string">'&amp;lt;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&lt;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&amp;gt;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&amp;amp;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&amp;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&amp;quot;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'&quot;'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'&amp;apos;'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'\''
+    </span><span class="jsdoc-syntax">},
+
+    </span><span class="jsdoc-var">attrsCharsRegExp </span><span class="jsdoc-syntax">: /[&amp;&lt;&gt;\&quot;\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+    </span><span class="jsdoc-var">textCharsRegExp </span><span class="jsdoc-syntax">: /[&lt;&gt;&amp;\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+    </span><span class="jsdoc-var">rawCharsRegExp </span><span class="jsdoc-syntax">: /[&lt;&gt;&amp;\&quot;\']/g,
+    </span><span class="jsdoc-var">entityRegExp </span><span class="jsdoc-syntax">: /&amp;#([a-z0-9]+);?|&amp;([a-z0-9]+);/gi,
+    </span><span class="jsdoc-var">namedEntities  </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">namedEntitiesData </span><span class="jsdoc-syntax">: [
+        </span><span class="jsdoc-string">'50'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'nbsp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'51'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'iexcl'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'52'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'cent'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'53'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'pound'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'54'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'curren'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'55'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'yen'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'56'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'brvbar'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'57'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sect'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'58'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'uml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'59'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'copy'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5a'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ordf'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5b'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'laquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5c'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'not'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5d'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'shy'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5e'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'reg'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5f'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'macr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5g'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'deg'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5h'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'plusmn'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5i'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sup2'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5j'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sup3'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5k'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'acute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5l'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'micro'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5m'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'para'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5n'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'middot'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5o'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'cedil'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5p'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sup1'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5q'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ordm'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5r'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'raquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5s'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'frac14'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5t'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'frac12'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5u'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'frac34'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'5v'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'iquest'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'60'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Agrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'61'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Aacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'62'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Acirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'63'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Atilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'64'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Auml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'65'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Aring'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'66'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'AElig'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'67'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ccedil'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'68'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Egrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'69'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Eacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6a'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ecirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6b'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Euml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6c'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Igrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6d'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Iacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6e'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Icirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6f'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Iuml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6g'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ETH'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6h'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ntilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6i'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ograve'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6j'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Oacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6k'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ocirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6l'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Otilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6m'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ouml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6n'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'times'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6o'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Oslash'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6p'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ugrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6q'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Uacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6r'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Ucirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6s'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Uuml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6t'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Yacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6u'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'THORN'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'6v'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'szlig'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'70'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'agrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'71'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'aacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'72'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'acirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'73'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'atilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'74'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'auml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'75'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'aring'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'76'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'aelig'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'77'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ccedil'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'78'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'egrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'79'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'eacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7a'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ecirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7b'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'euml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7c'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'igrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7d'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'iacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7e'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'icirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7f'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'iuml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7g'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'eth'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7h'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ntilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7i'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ograve'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7j'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'oacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7k'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ocirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7l'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'otilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7m'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ouml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7n'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'divide'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7o'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'oslash'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7p'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ugrave'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7q'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'uacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7r'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ucirc'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7s'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'uuml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7t'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'yacute'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7u'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'thorn'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'7v'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'yuml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ci'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'fnof'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sh'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Alpha'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'si'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Beta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sj'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Gamma'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sk'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Delta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sl'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Epsilon'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sm'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Zeta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sn'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Eta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'so'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Theta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Iota'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sq'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Kappa'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Lambda'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ss'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Mu'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'st'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Nu'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'su'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Xi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sv'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Omicron'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Pi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t1'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Rho'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t3'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Sigma'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t4'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Tau'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Upsilon'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t6'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Phi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t7'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Chi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t8'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Psi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'t9'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Omega'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'th'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'alpha'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ti'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'beta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tj'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'gamma'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tk'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'delta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tl'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'epsilon'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tm'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'zeta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tn'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'eta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'to'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'theta'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'iota'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tq'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'kappa'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lambda'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ts'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'mu'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tt'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'nu'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tu'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'xi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tv'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'omicron'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'pi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u1'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rho'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u2'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sigmaf'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u3'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sigma'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u4'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tau'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'upsilon'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u6'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'phi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u7'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'chi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u8'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'psi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'u9'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'omega'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'uh'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'thetasym'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ui'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'upsih'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'um'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'piv'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'812'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'bull'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'816'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'hellip'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'81i'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'prime'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'81j'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Prime'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'81u'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'oline'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'824'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'frasl'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'88o'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'weierp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'88h'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'image'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'88s'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'real'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'892'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'trade'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'89l'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'alefsym'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8cg'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'larr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ch'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'uarr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ci'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rarr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8cj'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'darr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ck'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'harr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8dl'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'crarr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8eg'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lArr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8eh'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'uArr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ei'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rArr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ej'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'dArr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ek'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'hArr'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'forall'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g2'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'part'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g3'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'exist'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'empty'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g7'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'nabla'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g8'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'isin'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8g9'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'notin'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gb'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ni'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gf'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'prod'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gh'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sum'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gi'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'minus'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gn'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lowast'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gq'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'radic'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gt'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'prop'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8gu'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'infin'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8h0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ang'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8h7'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'and'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8h8'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'or'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8h9'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'cap'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ha'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'cup'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8hb'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'int'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8hk'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'there4'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8hs'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sim'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8i5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'cong'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8i8'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'asymp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8j0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ne'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8j1'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'equiv'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8j4'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'le'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8j5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ge'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8k2'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sub'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8k3'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sup'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8k4'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'nsub'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8k6'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sube'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8k7'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'supe'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8kl'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'oplus'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8kn'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'otimes'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8l5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'perp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8m5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sdot'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8o8'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lceil'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8o9'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rceil'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8oa'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lfloor'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8ob'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rfloor'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8p9'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lang'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'8pa'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rang'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'9ea'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'loz'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'9j0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'spades'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'9j3'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'clubs'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'9j5'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'hearts'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'9j6'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'diams'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ai'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'OElig'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'aj'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'oelig'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'b0'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Scaron'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'b1'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'scaron'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'bo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Yuml'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'m6'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'circ'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ms'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'tilde'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'802'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ensp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'803'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'emsp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'809'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'thinsp'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80c'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'zwnj'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80d'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'zwj'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80e'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lrm'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80f'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rlm'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80j'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ndash'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80k'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'mdash'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80o'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lsquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80p'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rsquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80q'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'sbquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80s'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'ldquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80t'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rdquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'80u'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'bdquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'810'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'dagger'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'811'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'Dagger'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'81g'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'permil'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'81p'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'lsaquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'81q'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'rsaquo'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'85c'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'euro'
+    </span><span class="jsdoc-syntax">],
+
+
+    </span><span class="jsdoc-comment">/**
+     * 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.
+     */
+    </span><span class="jsdoc-var">encodeRaw</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.attrsCharsRegExp </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.textCharsRegExp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.baseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">;
+        });
+    },
+    </span><span class="jsdoc-comment">/**
+     * 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.
+     */
+    </span><span class="jsdoc-var">encodeAllRaw</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.rawCharsRegExp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.baseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">;
+        });
+    },
+    </span><span class="jsdoc-comment">/**
+     * 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.
+     */
+    </span><span class="jsdoc-var">encodeNumeric</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.attrsCharsRegExp </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.textCharsRegExp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-comment">// Multi byte sequence convert it to a single entity
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">chr.length </span><span class="jsdoc-syntax">&gt; 1) {
+                </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">'&amp;#' </span><span class="jsdoc-syntax">+ (1024 * (</span><span class="jsdoc-var">chr.charCodeAt</span><span class="jsdoc-syntax">(0) - 55296) + (</span><span class="jsdoc-var">chr.charCodeAt</span><span class="jsdoc-syntax">(1) - 56320) + 65536) + </span><span class="jsdoc-string">';'</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.baseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-string">'&amp;#' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">chr.charCodeAt</span><span class="jsdoc-syntax">(0) + </span><span class="jsdoc-string">';'</span><span class="jsdoc-syntax">;
+        });
+    },
+    </span><span class="jsdoc-comment">/**
+     * 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.
+     */
+    </span><span class="jsdoc-var">encodeNamed</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">entities </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">entities </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.namedEntities</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.attrsCharsRegExp </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.textCharsRegExp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.baseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">;
+        });
+    },
+    </span><span class="jsdoc-comment">/**
+     * 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.
+     */
+    </span><span class="jsdoc-var">getEncodeFunc</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">entities </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.buildEntitiesLookup</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">) || </span><span class="jsdoc-var">this.namedEntities</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">function </span><span class="jsdoc-var">encodeNamedAndNumeric</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">t.attrsCharsRegExp </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">t.textCharsRegExp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.baseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-string">'&amp;#' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">chr.charCodeAt</span><span class="jsdoc-syntax">(0) + </span><span class="jsdoc-string">';' </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">chr</span><span class="jsdoc-syntax">;
+            });
+        }
+
+        </span><span class="jsdoc-keyword">function </span><span class="jsdoc-var">encodeCustomNamed</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.encodeNamed</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-comment">// Replace + with , to be compatible with previous TinyMCE versions
+        </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.makeMap</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name.replace</span><span class="jsdoc-syntax">(/\+/g, </span><span class="jsdoc-string">','</span><span class="jsdoc-syntax">));
+        </span><span class="jsdoc-comment">// Named and numeric encoder
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name.named </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">name.numeric</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.encodeNamedAndNumeric</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-comment">// Named encoder
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name.named</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-comment">// Custom names
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">entities</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">encodeCustomNamed</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.encodeNamed</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-comment">// Numeric
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name.numeric</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.encodeNumeric</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-comment">// Raw encoder
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.encodeRaw</span><span class="jsdoc-syntax">;
+    },
+    </span><span class="jsdoc-comment">/**
+     * 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.
+     */
+    </span><span class="jsdoc-var">decode</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var  </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.entityRegExp</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">all</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">numeric</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">numeric</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">numeric </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">'x' </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-var">numeric.charAt</span><span class="jsdoc-syntax">(0)</span><span class="jsdoc-var">.toLowerCase</span><span class="jsdoc-syntax">() ? </span><span class="jsdoc-var">parseInt</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">numeric.substr</span><span class="jsdoc-syntax">(1), 16) : </span><span class="jsdoc-var">parseInt</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">numeric</span><span class="jsdoc-syntax">, 10);
+                </span><span class="jsdoc-comment">// Support upper UTF
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">numeric </span><span class="jsdoc-syntax">&gt; 65535) {
+                    </span><span class="jsdoc-var">numeric </span><span class="jsdoc-syntax">-= 65536;
+                    </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">String.fromCharCode</span><span class="jsdoc-syntax">(55296 + (</span><span class="jsdoc-var">numeric </span><span class="jsdoc-syntax">&gt;&gt; 10), 56320 + (1023 &amp; </span><span class="jsdoc-var">numeric</span><span class="jsdoc-syntax">));
+                }
+                </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.asciiMap</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">numeric</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">String.fromCharCode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">numeric</span><span class="jsdoc-syntax">);
+            }
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">t.reverseEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">all</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">t.namedEntities</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">all</span><span class="jsdoc-syntax">] || </span><span class="jsdoc-var">t.nativeDecode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">all</span><span class="jsdoc-syntax">);
+        });
+    },
+    </span><span class="jsdoc-var">nativeDecode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">;
+    },
+    </span><span class="jsdoc-var">makeMap </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">delim</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">map</span><span class="jsdoc-syntax">) {
+               </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">;
+               </span><span class="jsdoc-var">items </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">items </span><span class="jsdoc-syntax">|| [];
+               </span><span class="jsdoc-var">delim </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">delim </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-string">','</span><span class="jsdoc-syntax">;
+               </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">items </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">&quot;string&quot;</span><span class="jsdoc-syntax">) {
+                       </span><span class="jsdoc-var">items </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">items.split</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">delim</span><span class="jsdoc-syntax">);
+               }
+               </span><span class="jsdoc-var">map </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">map </span><span class="jsdoc-syntax">|| {};
+               </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">items.length</span><span class="jsdoc-syntax">;
+               </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">--) {
+                       </span><span class="jsdoc-var">map</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">items</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]] = {};
+               }
+               </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">map</span><span class="jsdoc-syntax">;
+       }
+};
+
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.TidyEntities.init</span><span class="jsdoc-syntax">();</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_TidySerializer.js.html b/docs/src/Roo_htmleditor_TidySerializer.js.html
new file mode 100644 (file)
index 0000000..f0ab5a1
--- /dev/null
@@ -0,0 +1,121 @@
+<html><head><title>Roo/htmleditor/TidySerializer.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">/***
+ * This is based loosely on tinymce 
+ * @class Roo.htmleditor.TidySerializer
+ * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
+ * @constructor
+ * @method Serializer
+ * @param {Object} settings Name/value settings object.
+ */
+
+
+</span><span class="jsdoc-var">Roo.htmleditor.TidySerializer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">);
+
+    </span><span class="jsdoc-var">this.writer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">);
+
+
+
+};
+</span><span class="jsdoc-var">Roo.htmleditor.TidySerializer.prototype </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-comment">/**
+     * @param {boolean} inner do the inner of the node.
+     */
+    </span><span class="jsdoc-var">inner </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">writer </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">/**
+    * Serializes the specified node into a string.
+    *
+    * @example
+    * new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('&lt;p&gt;text&lt;/p&gt;'));
+    * @method serialize
+    * @param {DomElement} node Node instance to serialize.
+    * @return {String} String with HTML based on DOM tree.
+    */
+    </span><span class="jsdoc-var">serialize </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+
+        </span><span class="jsdoc-comment">// = settings.validate;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">writer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.writer</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">self  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.handlers </span><span class="jsdoc-syntax">= {
+            </span><span class="jsdoc-comment">// #text
+            </span><span class="jsdoc-syntax">3: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+
+                </span><span class="jsdoc-var">writer.text</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nodeValue</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            },
+            </span><span class="jsdoc-comment">// #comment
+            </span><span class="jsdoc-syntax">8: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">writer.comment</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nodeValue</span><span class="jsdoc-syntax">);
+            },
+            </span><span class="jsdoc-comment">// Processing instruction
+            </span><span class="jsdoc-syntax">7: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">writer.pi</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node.nodeValue</span><span class="jsdoc-syntax">);
+            },
+            </span><span class="jsdoc-comment">// Doctype
+            </span><span class="jsdoc-syntax">10: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">writer.doctype</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nodeValue</span><span class="jsdoc-syntax">);
+            },
+            </span><span class="jsdoc-comment">// CDATA
+            </span><span class="jsdoc-syntax">4: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">writer.cdata</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nodeValue</span><span class="jsdoc-syntax">);
+            },
+            </span><span class="jsdoc-comment">// Document fragment
+            </span><span class="jsdoc-syntax">11: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.firstChild</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+                }
+                </span><span class="jsdoc-keyword">while</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">self.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nextSibling
+                </span><span class="jsdoc-syntax">}
+            }
+        };
+        </span><span class="jsdoc-var">writer.reset</span><span class="jsdoc-syntax">();
+        1 != </span><span class="jsdoc-var">node.nodeType </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.inner </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.handlers</span><span class="jsdoc-syntax">[11](</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">writer.getContent</span><span class="jsdoc-syntax">();
+    },
+
+    </span><span class="jsdoc-var">walk</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">attrName</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attrValue</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">sortedAttrs</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">elementRule</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">handler </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.handlers</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">node.nodeType</span><span class="jsdoc-syntax">];
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">handler</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">handler</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nodeName</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">isEmpty </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.childNodes.length </span><span class="jsdoc-syntax">&lt; 1;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">writer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.writer</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">attrs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.attributes</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-comment">// Sort attributes
+
+        </span><span class="jsdoc-var">writer.start</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nodeName</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">isEmpty</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">isEmpty</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.firstChild</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">writer.end</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.walk</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">writer.end</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">);
+
+
+    }
+    </span><span class="jsdoc-comment">// Serialize element and treat all non elements as fragments
+
+</span><span class="jsdoc-syntax">};
+
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_TidyWriter.js.html b/docs/src/Roo_htmleditor_TidyWriter.js.html
new file mode 100644 (file)
index 0000000..3dd6733
--- /dev/null
@@ -0,0 +1,400 @@
+<html><head><title>Roo/htmleditor/TidyWriter.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/***
+ * This is based loosely on tinymce 
+ * @class Roo.htmleditor.TidyWriter
+ * https://github.com/thorn0/tinymce.html/blob/master/tinymce.html.js
+ *
+ * Known issues?
+ * - not tested much with 'PRE' formated elements.
+ * 
+ *
+ *
+ */
+
+</span><span class="jsdoc-var">Roo.htmleditor.TidyWriter </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">)
+{
+
+    </span><span class="jsdoc-comment">// indent, indentBefore, indentAfter, encode, htmlOutput, html = [];
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">settings</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">this.html </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.state </span><span class="jsdoc-syntax">= [];
+
+    </span><span class="jsdoc-var">this.encode </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.TidyEntities.getEncodeFunc</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">settings.entity_encoding </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-string">'raw'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">settings.entities</span><span class="jsdoc-syntax">);
+
+}
+</span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.prototype </span><span class="jsdoc-syntax">= {
+
+
+    </span><span class="jsdoc-var">state </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">indent </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-string">'  '</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-comment">// part of state...
+    </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">last_inline </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">encode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+
+            </span><span class="jsdoc-comment">/**
+    * Writes the a start element such as &lt;p id=&quot;a&quot;&gt;.
+    *
+    * @method start
+    * @param {String} name Name of the element.
+    * @param {Array} attrs Optional attribute array or undefined if it hasn't any.
+    * @param {Boolean} empty Optional empty state if the tag should end like &lt;br /&gt;.
+    */
+    </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">empty</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-comment">// there are some situations where adding line break &amp;&amp; indentation will not work. will not work.
+        // &lt;span / b / i ... formating?
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.in_inline </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">in_pre    </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.in_pre    </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.whitespace_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">is_short   </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">empty </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.shortend_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1 : </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">add_lb </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">add_lb </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.in_pre </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.lastElementEndsWS</span><span class="jsdoc-syntax">()) {
+            </span><span class="jsdoc-var">i_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">=  </span><span class="jsdoc-var">this.indentstr</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-comment">// e_inline = elements that can be inline, but still allow \n before and after?
+        // only 'BR' ??? any others?
+
+        // ADD LINE BEFORE tage
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.in_pre</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-comment">//code
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+                } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.lastElementEndsWS</span><span class="jsdoc-syntax">()) {
+                    </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+                } </span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
+                    </span><span class="jsdoc-comment">// otherwise - no new line. (and dont indent.)
+                    </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+                }
+
+            } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+            }
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'&lt;'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name.toLowerCase</span><span class="jsdoc-syntax">());
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">l </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attrs.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">l</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attrs</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
+                </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr.name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'=&quot;'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr.value</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">), </span><span class="jsdoc-string">'&quot;'</span><span class="jsdoc-syntax">);
+            }
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">empty</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">is_short</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-string">'/&gt;'</span><span class="jsdoc-syntax">;
+            } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+                </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-string">'&gt;&lt;/' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">name.toLowerCase</span><span class="jsdoc-syntax">() + </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">e_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.in_inline</span><span class="jsdoc-syntax">;
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">e_inline </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">this.in_pre</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+            }
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+
+        }
+        </span><span class="jsdoc-comment">// not empty..
+        </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-comment">// there is a special situation, where we need to turn on in_inline - if any of the imediate chidlren are one of these.
+        /*
+        if (!in_inline &amp;&amp; !in_pre) {
+            var cn = node.firstChild;
+            while(cn) {
+                if (Roo.htmleditor.TidyWriter.inline_elements.indexOf(cn.nodeName) &gt; -1) {
+                    in_inline = true
+                    break;
+                }
+                cn = cn.nextSibling;
+            }
+             
+        }
+        */
+
+
+        </span><span class="jsdoc-var">this.pushState</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">in_pre   </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">: (</span><span class="jsdoc-var">this.indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">this.indent</span><span class="jsdoc-syntax">),
+            </span><span class="jsdoc-var">in_pre </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-var">in_inline
+        </span><span class="jsdoc-syntax">});
+        </span><span class="jsdoc-comment">// add a line after if we are not in a
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+        }
+
+
+
+
+    },
+
+    </span><span class="jsdoc-var">lastElementEndsWS </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">&gt; 0 ? </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">-1] : </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return true</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">value.match</span><span class="jsdoc-syntax">(/\s+$/);
+
+    },
+
+    </span><span class="jsdoc-comment">/**
+     * Writes the a end element such as &lt;/p&gt;.
+     *
+     * @method end
+     * @param {String} name Name of the element.
+     */
+    </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.popState</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.in_inline </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">) &gt; -1;
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.in_pre </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">indentstr  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'&lt;/'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name.toLowerCase</span><span class="jsdoc-syntax">(), </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.last_inline </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">in_inline</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-comment">// pop the indent state..
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-comment">/**
+     * Writes a text node.
+     *
+     * In pre - we should not mess with the contents.
+     * 
+     *
+     * @method text
+     * @param {String} text String to write out.
+     * @param {Boolean} raw Optional raw state if true the contents wont get encoded.
+     */
+    </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-comment">// if not in whitespace critical
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.in_pre</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] =  </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.in_inline</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+/g,</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// all white space inc line breaks to a slingle' '
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+/,</span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">);  </span><span class="jsdoc-comment">// all white space to single white space
+
+
+                // if next tag is '&lt;BR&gt;', then we can trim right..
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">&amp;&amp;
+                    </span><span class="jsdoc-var">node.nextSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
+                    </span><span class="jsdoc-var">node.nextSibling.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">)
+                {
+                    </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+$/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+                }
+                </span><span class="jsdoc-comment">// if previous tag was a BR, we can also trim..
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">&amp;&amp;
+                    </span><span class="jsdoc-var">node.previousSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
+                    </span><span class="jsdoc-var">node.previousSibling.nodeName </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'BR' </span><span class="jsdoc-syntax">)
+                {
+                    </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr </span><span class="jsdoc-syntax">+  </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/^\s+/g,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+                }
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text.match</span><span class="jsdoc-syntax">(/\n/)) {
+                    </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(
+                        /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, </span><span class="jsdoc-string">'$1\n' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">this.indentstr
+                    </span><span class="jsdoc-syntax">);
+                    </span><span class="jsdoc-comment">// remoeve the last whitespace / line break.
+                    </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\n\s+$/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+                }
+                </span><span class="jsdoc-comment">// repace long lines
+
+            </span><span class="jsdoc-syntax">}
+
+            </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length</span><span class="jsdoc-syntax">] =  </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-comment">// see if previous element was a inline element.
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+/g,</span><span class="jsdoc-string">&quot; &quot;</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// all whitespace into single white space.
+
+        // should trim left?
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling </span><span class="jsdoc-syntax">&amp;&amp;
+            </span><span class="jsdoc-var">node.previousSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
+            </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.previousSibling.nodeName</span><span class="jsdoc-syntax">) &gt; -1)
+        {
+            </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.addLine</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/^\s+/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// trim left
+
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-comment">// should trim right?
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling </span><span class="jsdoc-syntax">&amp;&amp;
+            </span><span class="jsdoc-var">node.nextSibling.nodeType </span><span class="jsdoc-syntax">== 1 &amp;&amp;
+            </span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node.nextSibling.nodeName</span><span class="jsdoc-syntax">) &gt; -1)
+        {
+          </span><span class="jsdoc-comment">// noop
+
+        </span><span class="jsdoc-syntax">}  </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+$/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// trim right
+        </span><span class="jsdoc-syntax">}
+
+
+
+
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">text.match</span><span class="jsdoc-syntax">(/\n/)) {
+            </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.indentstr </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(
+            /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, </span><span class="jsdoc-string">'$1\n' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">this.indentstr
+        </span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">// remoeve the last whitespace / line break.
+        </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">text.replace</span><span class="jsdoc-syntax">(/\s+$/,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-comment">// split and indent..
+
+
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-comment">/**
+     * Writes a cdata node such as &lt;![CDATA[data]]&gt;.
+     *
+     * @method cdata
+     * @param {String} text String to write out inside the cdata.
+     */
+    </span><span class="jsdoc-var">cdata</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;![CDATA['</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">']]&gt;'</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-comment">/**
+    * Writes a comment node such as &lt;!-- Comment --&gt;.
+    *
+    * @method cdata
+    * @param {String} text String to write out inside the comment.
+    */
+   </span><span class="jsdoc-var">comment</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+       </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;!--'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'--&gt;'</span><span class="jsdoc-syntax">);
+   },
+    </span><span class="jsdoc-comment">/**
+     * Writes a PI node such as &lt;?xml attr=&quot;value&quot; ?&gt;.
+     *
+     * @method pi
+     * @param {String} name Name of the pi.
+     * @param {String} text String to write out inside the pi.
+     */
+    </span><span class="jsdoc-var">pi</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;?'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.encode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">), </span><span class="jsdoc-string">'?&gt;'</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;?'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'?&gt;'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.indent </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-comment">/**
+     * Writes a doctype node such as &lt;!DOCTYPE data&gt;.
+     *
+     * @method doctype
+     * @param {String} text String to write out inside the doctype.
+     */
+    </span><span class="jsdoc-var">doctype</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'&lt;!DOCTYPE'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'&gt;'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.indent </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-string">'\n' </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-comment">/**
+     * Resets the internal buffer if one wants to reuse the writer.
+     *
+     * @method reset
+     */
+    </span><span class="jsdoc-var">reset</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-var">this.state </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-var">this.pushState</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">in_pre </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">in_inline </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false
+        </span><span class="jsdoc-syntax">})
+    },
+    </span><span class="jsdoc-comment">/**
+     * Returns the contents that got serialized.
+     *
+     * @method getContent
+     * @return {String} HTML contents that got written down.
+     */
+    </span><span class="jsdoc-var">getContent</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.html.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.replace</span><span class="jsdoc-syntax">(/\n$/, </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-var">pushState </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">this.state.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-var">popState </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.state.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// nothing to push
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cfg </span><span class="jsdoc-syntax">= {
+            </span><span class="jsdoc-var">in_pre</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">indentstr </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''
+        </span><span class="jsdoc-syntax">};
+        </span><span class="jsdoc-var">this.state.pop</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.state.length </span><span class="jsdoc-syntax">&gt; 0) {
+            </span><span class="jsdoc-var">cfg </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.state</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.state.length</span><span class="jsdoc-syntax">-1];
+        }
+        </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cfg</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-var">addLine</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.html</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.html.length </span><span class="jsdoc-syntax">- 1];
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">value.length </span><span class="jsdoc-syntax">&gt; 0 &amp;&amp; </span><span class="jsdoc-string">'\n' </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.html.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
+        }
+    }
+
+
+</span><span class="jsdoc-comment">//'pre script noscript style textarea video audio iframe object code'
+// shortended... 'area base basefont br col frame hr img input isindex link  meta param embed source wbr track');
+// inline 
+</span><span class="jsdoc-syntax">};
+
+</span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.inline_elements </span><span class="jsdoc-syntax">= [
+        </span><span class="jsdoc-string">'SPAN'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'STRONG'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'B'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'EM'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'I'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'FONT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'STRIKE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'U'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'VAR'</span><span class="jsdoc-syntax">,
+        </span><span class="jsdoc-string">'CITE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'DFN'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'CODE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'MARK'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'Q'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SUP'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SUB'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SAMP'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'A'
+</span><span class="jsdoc-syntax">];
+</span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.shortend_elements </span><span class="jsdoc-syntax">= [
+    </span><span class="jsdoc-string">'AREA'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'BASE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'BASEFONT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'BR'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'COL'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'FRAME'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'HR'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'IMG'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'INPUT'</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-string">'ISINDEX'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'LINK'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'META'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'PARAM'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'EMBED'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SOURCE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'WBR'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'TRACK'
+</span><span class="jsdoc-syntax">];
+
+</span><span class="jsdoc-var">Roo.htmleditor.TidyWriter.whitespace_elements </span><span class="jsdoc-syntax">= [
+    </span><span class="jsdoc-string">'PRE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'SCRIPT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'NOSCRIPT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'STYLE'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'TEXTAREA'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'VIDEO'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'AUDIO'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'IFRAME'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'OBJECT'</span><span class="jsdoc-syntax">,</span><span class="jsdoc-string">'CODE'
+</span><span class="jsdoc-syntax">];</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_htmleditor_namespace.js.html b/docs/src/Roo_htmleditor_namespace.js.html
new file mode 100644 (file)
index 0000000..b5e706c
--- /dev/null
@@ -0,0 +1,3 @@
+<html><head><title>Roo/htmleditor/namespace.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-var">Roo.htmleditor </span><span class="jsdoc-syntax">= {};
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_lib_Range.js.html b/docs/src/Roo_lib_Range.js.html
new file mode 100644 (file)
index 0000000..00a00df
--- /dev/null
@@ -0,0 +1,61 @@
+<html><head><title>Roo/lib/Range.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.lib.Range
+ * @constructor
+ * This is a toolkit, normally used to copy features into a Dom Range element
+ * Roo.lib.Range.wrap(x);
+ *
+ *
+ *
+ */
+</span><span class="jsdoc-var">Roo.lib.Range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() { };
+
+</span><span class="jsdoc-comment">/**
+ * Wrap a Dom Range object, to give it new features...
+ * @static
+ * @param {Range} the range to wrap
+ */
+</span><span class="jsdoc-var">Roo.lib.Range.wrap </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">) {
+    </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.lib.Range.prototype</span><span class="jsdoc-syntax">);
+};
+</span><span class="jsdoc-comment">/**
+ * find a parent node eg. LI / OL
+ * @param {string|Array} node name or array of nodenames
+ * @return {DomElement|false}
+ */
+</span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.lib.Range.prototype</span><span class="jsdoc-syntax">,
+{
+
+    </span><span class="jsdoc-var">closest </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">str</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">str</span><span class="jsdoc-syntax">) != </span><span class="jsdoc-string">'string'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-comment">// assume it's a array.
+            </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0;</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">str.length</span><span class="jsdoc-syntax">;</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">str</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]);
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">;
+                }
+
+            }
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">str </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">str.toLowerCase</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.commonAncestorContainer</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// might not be a node
+        </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.nodeType </span><span class="jsdoc-syntax">!= 1) {
+            </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">n.parentNode</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.nodeName.toLowerCase</span><span class="jsdoc-syntax">() == </span><span class="jsdoc-var">str </span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.nodeName.toLowerCase</span><span class="jsdoc-syntax">() == </span><span class="jsdoc-string">'body'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n.closest</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">str</span><span class="jsdoc-syntax">) || </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+
+    },
+    </span><span class="jsdoc-var">cloneRange </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.lib.Range.wrap</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Range.prototype.cloneRange.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">));
+    }
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_lib_Selection.js.html b/docs/src/Roo_lib_Selection.js.html
new file mode 100644 (file)
index 0000000..46bd7b5
--- /dev/null
@@ -0,0 +1,101 @@
+<html><head><title>Roo/lib/Selection.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * @class Roo.lib.Selection
+ * @constructor
+ * This is a toolkit, normally used to copy features into a Dom Selection element
+ * Roo.lib.Selection.wrap(x);
+ *
+ *
+ *
+ */
+</span><span class="jsdoc-var">Roo.lib.Selection </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() { };
+
+</span><span class="jsdoc-comment">/**
+ * Wrap a Dom Range object, to give it new features...
+ * @static
+ * @param {Range} the range to wrap
+ */
+</span><span class="jsdoc-var">Roo.lib.Selection.wrap </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">) {
+    </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.lib.Selection.prototype</span><span class="jsdoc-syntax">);
+    </span><span class="jsdoc-var">r.ownerDocument </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// usefull so we dont have to keep referening to it.
+    </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">r</span><span class="jsdoc-syntax">;
+};
+</span><span class="jsdoc-comment">/**
+ * find a parent node eg. LI / OL
+ * @param {string|Array} node name or array of nodenames
+ * @return {DomElement|false}
+ */
+</span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.lib.Selection.prototype</span><span class="jsdoc-syntax">,
+{
+    </span><span class="jsdoc-comment">/**
+     * the owner document
+     */
+    </span><span class="jsdoc-var">ownerDocument </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+    </span><span class="jsdoc-var">getRangeAt </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.lib.Range.wrap</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Selection.prototype.getRangeAt.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">));
+    },
+
+    </span><span class="jsdoc-comment">/**
+     * insert node at selection 
+     * @param {DomElement|string} node
+     * @param {string} cursor (after|in|none) where to place the cursor after inserting.
+     */
+    </span><span class="jsdoc-var">insertNode</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">cursor</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.ownerDocument.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cursor </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'in'</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">node.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">'&amp;nbsp;'</span><span class="jsdoc-syntax">;
+            }
+        }
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getRangeAt</span><span class="jsdoc-syntax">(0);
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.type </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'Caret'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">range.deleteContents</span><span class="jsdoc-syntax">();
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.childNodes</span><span class="jsdoc-syntax">[0]; </span><span class="jsdoc-comment">// select the contents.
+
+
+
+        </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cursor </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'after'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">node.insertAdjacentHTML</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'afterend'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'&amp;nbsp;'</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">sn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.nextSibling</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cursor </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'none'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-var">this.cursorText</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sn</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-var">cursorText </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)
+    {
+
+        </span><span class="jsdoc-comment">//var range = this.getRangeAt(0);
+        </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.lib.Range.wrap</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Range</span><span class="jsdoc-syntax">());
+        </span><span class="jsdoc-comment">//range.selectNode(n);
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ix </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.from</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.parentNode.childNodes</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">range.setStart</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.parentNode</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">ix</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">range.setEnd</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.parentNode</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">ix</span><span class="jsdoc-syntax">+1);
+        </span><span class="jsdoc-comment">//range.collapse(false);
+
+        </span><span class="jsdoc-var">this.removeAllRanges</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">range</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">([</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">range</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">this.baseOffset</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">this.extentOffset</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.type</span><span class="jsdoc-syntax">]);
+    },
+    </span><span class="jsdoc-var">cursorAfter </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">n.nextSibling </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">n.nextSibling.nodeValue </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'&amp;nbsp;'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">n.insertAdjacentHTML</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'afterend'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'&amp;nbsp;'</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-var">this.cursorText </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.nextSibling</span><span class="jsdoc-syntax">);
+    }
+
+
+});</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_lib_UndoManager.js.html b/docs/src/Roo_lib_UndoManager.js.html
new file mode 100644 (file)
index 0000000..8127f39
--- /dev/null
@@ -0,0 +1,302 @@
+<html><head><title>Roo/lib/UndoManager.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ * Originally based of this code... - refactored for Roo...
+ * https://github.com/aaalsaleh/undo-manager
+ * undo-manager.js
+ * @author  Abdulrahman Alsaleh 
+ * @copyright 2015 Abdulrahman Alsaleh 
+ * @license  MIT License (c) 
+ *
+ * Hackily modifyed by alan@roojs.com
+ *
+ *
+ *  
+ *
+ *  TOTALLY UNTESTED...
+ *
+ *  Documentation to be done....
+ */
+
+
+/**
+* @class Roo.lib.UndoManager
+* An undo manager implementation in JavaScript. It follows the W3C UndoManager and DOM Transaction
+* Draft and the undocumented and disabled Mozilla Firefox's UndoManager implementation.
+
+ * Usage:
+ * &lt;pre&gt;&lt;code&gt;
+
+
+editor.undoManager = new Roo.lib.UndoManager(1000, editor);
+&lt;/code&gt;&lt;/pre&gt;
+
+* For more information see this blog post with examples:
+*  &lt;a href=&quot;http://www.cnitblog.com/seeyeah/archive/2011/12/30/38728.html/&quot;&gt;DomHelper
+     - Create Elements using DOM, HTML fragments and Templates&lt;/a&gt;. 
+* @constructor
+* @param {Number} limit how far back to go ... use 1000?
+* @param {Object} scope usually use document..
+*/
+
+</span><span class="jsdoc-var">Roo.lib.UndoManager </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">limit</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">undoScopeHost</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">this.stack </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.limit </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">limit</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.scope </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">undoScopeHost</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.fireEvent </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">CustomEvent </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">undoScopeHost </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">undoScopeHost.dispatchEvent</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.bindEvents</span><span class="jsdoc-syntax">();
+    }
+    </span><span class="jsdoc-var">this.reset</span><span class="jsdoc-syntax">();
+
+};
+
+</span><span class="jsdoc-var">Roo.lib.UndoManager.prototype </span><span class="jsdoc-syntax">= {
+
+    </span><span class="jsdoc-var">limit </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">stack </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">fireEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">position </span><span class="jsdoc-syntax">: 0,
+    </span><span class="jsdoc-var">length </span><span class="jsdoc-syntax">: 0,
+
+
+     </span><span class="jsdoc-comment">/**
+     * To push and execute a transaction, the method undoManager.transact
+     * must be called by passing a transaction object as the first argument, and a merge
+     * flag as the second argument. A transaction object has the following properties:
+     *
+     * Usage:
+&lt;pre&gt;&lt;code&gt;
+undoManager.transact({
+    label: 'Typing',
+    execute: function() { ... },
+    undo: function() { ... },
+    // redo same as execute
+    redo: function() { this.execute(); }
+}, false);
+
+// merge transaction
+undoManager.transact({
+    label: 'Typing',
+    execute: function() { ... },  // this will be run...
+    undo: function() { ... }, // what to do when undo is run.
+    // redo same as execute
+    redo: function() { this.execute(); }
+}, true); 
+&lt;/code&gt;&lt;/pre&gt; 
+     *
+     * 
+     * @param {Object} transaction The transaction to add to the stack.
+     * @return {String} The HTML fragment
+     */
+
+
+    </span><span class="jsdoc-var">transact </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">transaction</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">merge</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments.length </span><span class="jsdoc-syntax">&lt; 2) {
+            </span><span class="jsdoc-keyword">throw new </span><span class="jsdoc-var">TypeError</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'Not enough arguments to UndoManager.transact.'</span><span class="jsdoc-syntax">);
+        }
+
+        </span><span class="jsdoc-var">transaction.execute</span><span class="jsdoc-syntax">();
+
+        </span><span class="jsdoc-var">this.stack.splice</span><span class="jsdoc-syntax">(0, </span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">merge </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">transaction</span><span class="jsdoc-syntax">);
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.stack.unshift</span><span class="jsdoc-syntax">([</span><span class="jsdoc-var">transaction</span><span class="jsdoc-syntax">]);
+        }
+
+        </span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">= 0;
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.limit </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.stack.length </span><span class="jsdoc-syntax">&gt; </span><span class="jsdoc-var">this.limit</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.length </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.stack.length </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.limit</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.length </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.stack.length</span><span class="jsdoc-syntax">;
+        }
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.scope.dispatchEvent</span><span class="jsdoc-syntax">(
+                </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">CustomEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'DOMTransaction'</span><span class="jsdoc-syntax">, {
+                    </span><span class="jsdoc-var">detail</span><span class="jsdoc-syntax">: {
+                        </span><span class="jsdoc-var">transactions</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[0]</span><span class="jsdoc-var">.slice</span><span class="jsdoc-syntax">()
+                    },
+                    </span><span class="jsdoc-var">bubbles</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                    </span><span class="jsdoc-var">cancelable</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false
+                </span><span class="jsdoc-syntax">})
+            );
+        }
+
+        </span><span class="jsdoc-comment">//Roo.log(&quot;transaction: pos:&quot; + this.position + &quot; len: &quot; + this.length + &quot; slen:&quot; + this.stack.length);
+
+
+    </span><span class="jsdoc-syntax">},
+
+    </span><span class="jsdoc-var">undo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-comment">//Roo.log(&quot;undo: pos:&quot; + this.position + &quot; len: &quot; + this.length + &quot; slen:&quot; + this.stack.length);
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">this.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">- 1; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&gt;= 0; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">--) {
+                </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.undo</span><span class="jsdoc-syntax">();
+            }
+            </span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">++;
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.scope.dispatchEvent</span><span class="jsdoc-syntax">(
+                    </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">CustomEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'undo'</span><span class="jsdoc-syntax">, {
+                        </span><span class="jsdoc-var">detail</span><span class="jsdoc-syntax">: {
+                            </span><span class="jsdoc-var">transactions</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">- 1]</span><span class="jsdoc-var">.slice</span><span class="jsdoc-syntax">()
+                        },
+                        </span><span class="jsdoc-var">bubbles</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                        </span><span class="jsdoc-var">cancelable</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false
+                    </span><span class="jsdoc-syntax">})
+                );
+            }
+        }
+    },
+
+    </span><span class="jsdoc-var">redo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">&gt; 0) {
+            </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">- 1]</span><span class="jsdoc-var">.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
+                </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">- 1][</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.redo</span><span class="jsdoc-syntax">();
+            }
+            </span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">--;
+
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">this.scope.dispatchEvent</span><span class="jsdoc-syntax">(
+                    </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">CustomEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'redo'</span><span class="jsdoc-syntax">, {
+                        </span><span class="jsdoc-var">detail</span><span class="jsdoc-syntax">: {
+                            </span><span class="jsdoc-var">transactions</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.slice</span><span class="jsdoc-syntax">()
+                        },
+                        </span><span class="jsdoc-var">bubbles</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
+                        </span><span class="jsdoc-var">cancelable</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false
+                    </span><span class="jsdoc-syntax">})
+                );
+            }
+        }
+    },
+
+    </span><span class="jsdoc-var">item </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">&gt;= 0 &amp;&amp; </span><span class="jsdoc-var">index </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">this.length</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.stack</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">index</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.slice</span><span class="jsdoc-syntax">();
+        }
+        </span><span class="jsdoc-keyword">return null</span><span class="jsdoc-syntax">;
+    },
+
+    </span><span class="jsdoc-var">clearUndo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-var">this.stack.length </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.length </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">;
+    },
+
+    </span><span class="jsdoc-var">clearRedo </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-var">this.stack.splice</span><span class="jsdoc-syntax">(0, </span><span class="jsdoc-var">this.position</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-var">this.length </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.stack.length</span><span class="jsdoc-syntax">;
+    },
+    </span><span class="jsdoc-comment">/**
+     * Reset the undo - probaly done on load to clear all history.
+     */
+    </span><span class="jsdoc-var">reset </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.stack </span><span class="jsdoc-syntax">= [];
+        </span><span class="jsdoc-var">this.position </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-var">this.length </span><span class="jsdoc-syntax">= 0;
+        </span><span class="jsdoc-var">this.current_html </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.scope.innerHTML</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.timer </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">clearTimeout</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.timer</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-var">this.timer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.merge </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.addEvent</span><span class="jsdoc-syntax">();
+
+    },
+    </span><span class="jsdoc-var">current_html </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">timer </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">merge </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-comment">// this will handle the undo/redo on the element.?
+    </span><span class="jsdoc-var">bindEvents </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el  </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.scope</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">el.undoManager </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+
+
+        </span><span class="jsdoc-var">this.scope.addEventListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'keydown'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">((</span><span class="jsdoc-var">e.ctrlKey </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">e.metaKey</span><span class="jsdoc-syntax">) &amp;&amp; </span><span class="jsdoc-var">e.keyCode </span><span class="jsdoc-syntax">=== 90) {
+                </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e.shiftKey</span><span class="jsdoc-syntax">) {
+                    </span><span class="jsdoc-var">el.undoManager.redo</span><span class="jsdoc-syntax">(); </span><span class="jsdoc-comment">// Ctrl/Command + Shift + Z
+                </span><span class="jsdoc-syntax">} </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+                    </span><span class="jsdoc-var">el.undoManager.undo</span><span class="jsdoc-syntax">(); </span><span class="jsdoc-comment">// Ctrl/Command + Z
+                </span><span class="jsdoc-syntax">}
+
+                </span><span class="jsdoc-var">e.preventDefault</span><span class="jsdoc-syntax">();
+            }
+        });
+        </span><span class="jsdoc-comment">/// ignore keyup..
+        </span><span class="jsdoc-var">this.scope.addEventListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'keyup'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">((</span><span class="jsdoc-var">e.ctrlKey </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">e.metaKey</span><span class="jsdoc-syntax">) &amp;&amp; </span><span class="jsdoc-var">e.keyCode </span><span class="jsdoc-syntax">=== 90) {
+                </span><span class="jsdoc-var">e.preventDefault</span><span class="jsdoc-syntax">();
+            }
+        });
+
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-var">el.addEventListener</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'input'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el.innerHTML </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">t.current_html</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-comment">// only record events every second.
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t.timer </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+               </span><span class="jsdoc-var">clearTimeout</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t.timer</span><span class="jsdoc-syntax">);
+               </span><span class="jsdoc-var">t.timer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-var">t.timer </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">setTimeout</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() { </span><span class="jsdoc-var">t.merge </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">; }, 1000);
+
+            </span><span class="jsdoc-var">t.addEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">t.merge</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">t.merge </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// ignore changes happening every second..
+        </span><span class="jsdoc-syntax">});
+       },
+    </span><span class="jsdoc-comment">/**
+     * Manually add an event.
+     * Normall called without arguements - and it will just get added to the stack.
+     * 
+     */
+
+    </span><span class="jsdoc-var">addEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">merge</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-comment">//Roo.log(&quot;undomanager +&quot; + (merge ? 'Y':'n'));
+        // not sure if this should clear the timer 
+        </span><span class="jsdoc-var">merge </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">merge</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">merge</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-var">this.scope.undoManager.transact</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.scope</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">oldHTML</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.current_html</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">newHTML</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.scope.innerHTML</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-comment">// nothing to execute (content already changed when input is fired)
+            </span><span class="jsdoc-var">execute</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() { },
+            </span><span class="jsdoc-var">undo</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+                </span><span class="jsdoc-var">this.scope.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.current_html </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.oldHTML</span><span class="jsdoc-syntax">;
+            },
+            </span><span class="jsdoc-var">redo</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
+                </span><span class="jsdoc-var">this.scope.innerHTML </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.current_html </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.newHTML</span><span class="jsdoc-syntax">;
+            }
+        }, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">//merge);
+
+        </span><span class="jsdoc-var">this.merge </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">merge</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-var">this.current_html </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.scope.innerHTML</span><span class="jsdoc-syntax">;
+    }
+
+
+
+
+
+
+};
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Ctrl.js.html b/docs/src/Roo_rtf_Ctrl.js.html
new file mode 100644 (file)
index 0000000..d71c33a
--- /dev/null
@@ -0,0 +1,7 @@
+<html><head><title>Roo/rtf/Ctrl.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-var">Roo.rtf.Ctrl </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">opts</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">this.value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">opts.value</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.param </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">opts.param</span><span class="jsdoc-syntax">;
+};
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Document.js.html b/docs/src/Roo_rtf_Document.js.html
new file mode 100644 (file)
index 0000000..57ac569
--- /dev/null
@@ -0,0 +1,47 @@
+<html><head><title>Roo/rtf/Document.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-comment">// this looks like it's normally the {rtf{ .... }}
+</span><span class="jsdoc-var">Roo.rtf.Document </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+{
+    </span><span class="jsdoc-comment">// we dont want to acutally store parent - it will make debug a nightmare..
+    </span><span class="jsdoc-var">this.rtlch  </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.content </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.cn </span><span class="jsdoc-syntax">= [];
+
+};
+</span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.rtf.Document</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.rtf.Group</span><span class="jsdoc-syntax">, {
+    </span><span class="jsdoc-var">addChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">this.cn.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">switch</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn.type</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">'rtlch'</span><span class="jsdoc-syntax">: </span><span class="jsdoc-comment">// most content seems to be inside this??
+            </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">'listtext'</span><span class="jsdoc-syntax">:
+            </span><span class="jsdoc-keyword">case </span><span class="jsdoc-string">'shpinst'</span><span class="jsdoc-syntax">:
+                </span><span class="jsdoc-var">this.rtlch.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">default</span><span class="jsdoc-syntax">:
+                </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">cn.type</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">;
+        }
+
+    },
+
+    </span><span class="jsdoc-var">getElementsByType </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret </span><span class="jsdoc-syntax">=  [];
+        </span><span class="jsdoc-var">this._getElementsByType</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.cn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'rtf'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">;
+    },
+    </span><span class="jsdoc-var">_getElementsByType </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">search_array</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">path</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">search_array.forEach</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">,</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.type </span><span class="jsdoc-syntax">== </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">n.path </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">path </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'/' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">n.type </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">':' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-var">ret.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">);
+            }
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n.cn.length </span><span class="jsdoc-syntax">&gt; 0) {
+                </span><span class="jsdoc-var">this._getElementsByType</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">ret</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">n.cn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">path </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'/' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">n.type</span><span class="jsdoc-syntax">+</span><span class="jsdoc-string">':'</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">);
+            }
+        },</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
+    }
+
+});
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Group.js.html b/docs/src/Roo_rtf_Group.js.html
new file mode 100644 (file)
index 0000000..a71cc82
--- /dev/null
@@ -0,0 +1,47 @@
+<html><head><title>Roo/rtf/Group.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty">
+<span class="jsdoc-var">Roo.rtf.Group </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">parent</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-comment">// we dont want to acutally store parent - it will make debug a nightmare..
+    </span><span class="jsdoc-var">this.content </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.cn  </span><span class="jsdoc-syntax">= [];
+
+
+
+};
+
+</span><span class="jsdoc-var">Roo.rtf.Group.prototype </span><span class="jsdoc-syntax">= {
+    </span><span class="jsdoc-var">ignorable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">content</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">addContent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-comment">// could set styles...
+        </span><span class="jsdoc-var">this.content.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-var">addChild </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">this.cn.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cn</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-comment">// only for images really...
+    </span><span class="jsdoc-var">toDataURL </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">mimetype </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">switch</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">case </span><span class="jsdoc-var">this.content.filter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a</span><span class="jsdoc-syntax">) { </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">a.value </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'pngblip' </span><span class="jsdoc-syntax">} )</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">&gt; 0:
+                </span><span class="jsdoc-var">mimetype </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">&quot;image/png&quot;</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
+             </span><span class="jsdoc-keyword">case </span><span class="jsdoc-var">this.content.filter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a</span><span class="jsdoc-syntax">) { </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">a.value </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'jpegblip' </span><span class="jsdoc-syntax">} )</span><span class="jsdoc-var">.length </span><span class="jsdoc-syntax">&gt; 0:
+                </span><span class="jsdoc-var">mimetype </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">&quot;image/jpeg&quot;</span><span class="jsdoc-syntax">;
+                </span><span class="jsdoc-keyword">break</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">default </span><span class="jsdoc-syntax">:
+                </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">'about:blank'</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// ?? error?
+        </span><span class="jsdoc-syntax">}
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">hexstring </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.content</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">this.content.length</span><span class="jsdoc-syntax">-1]</span><span class="jsdoc-var">.value</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-string">'data:' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">mimetype </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">';base64,' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">btoa</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">hexstring.match</span><span class="jsdoc-syntax">(/\w{2}/g)</span><span class="jsdoc-var">.map</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">String.fromCharCode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">parseInt</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">a</span><span class="jsdoc-syntax">, 16));
+        })</span><span class="jsdoc-var">.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;&quot;</span><span class="jsdoc-syntax">));
+    }
+
+};</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Hex.js.html b/docs/src/Roo_rtf_Hex.js.html
new file mode 100644 (file)
index 0000000..1c7f989
--- /dev/null
@@ -0,0 +1,5 @@
+<html><head><title>Roo/rtf/Hex.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-var">Roo.rtf.Hex </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">hex</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">this.hexstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">hex</span><span class="jsdoc-syntax">;
+};
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Paragraph.js.html b/docs/src/Roo_rtf_Paragraph.js.html
new file mode 100644 (file)
index 0000000..98e5729
--- /dev/null
@@ -0,0 +1,4 @@
+<html><head><title>Roo/rtf/Paragraph.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-var">Roo.rtf.Paragraph </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">opts</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">this.content </span><span class="jsdoc-syntax">= []; </span><span class="jsdoc-comment">///??? is that used?
+</span><span class="jsdoc-syntax">};</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Parser.js.html b/docs/src/Roo_rtf_Parser.js.html
new file mode 100644 (file)
index 0000000..4c2cc49
--- /dev/null
@@ -0,0 +1,383 @@
+<html><head><title>Roo/rtf/Parser.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/**
+ *
+ *
+ * based on this https://github.com/iarna/rtf-parser
+ * it's really only designed to extract pict from pasted RTF 
+ *
+ * usage:
+ *
+ *  var images = new Roo.rtf.Parser().parse(a_string).filter(function(g) { return g.type == 'pict'; });
+ *  
+ *
+ */
+
+
+
+
+
+</span><span class="jsdoc-var">Roo.rtf.Parser </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) {
+    </span><span class="jsdoc-comment">//super({objectMode: true})
+    </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+    </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+
+    </span><span class="jsdoc-comment">// these are for interpeter...
+    </span><span class="jsdoc-var">this.doc </span><span class="jsdoc-syntax">= {};
+    </span><span class="jsdoc-comment">///this.parserState = this.parseTop
+    </span><span class="jsdoc-var">this.groupStack </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.hexStore </span><span class="jsdoc-syntax">= [];
+    </span><span class="jsdoc-var">this.doc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
+
+    </span><span class="jsdoc-var">this.groups </span><span class="jsdoc-syntax">= []; </span><span class="jsdoc-comment">// where we put the return.
+
+    </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ii </span><span class="jsdoc-syntax">= 0; </span><span class="jsdoc-var">ii </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">text.length</span><span class="jsdoc-syntax">; ++</span><span class="jsdoc-var">ii</span><span class="jsdoc-syntax">) {
+        ++</span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">;
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">ii</span><span class="jsdoc-syntax">] === </span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">) {
+            ++</span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.col </span><span class="jsdoc-syntax">= 1;
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            ++</span><span class="jsdoc-var">this.col</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">this.parserState</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">ii</span><span class="jsdoc-syntax">]);
+    }
+
+
+
+};
+</span><span class="jsdoc-var">Roo.rtf.Parser.prototype </span><span class="jsdoc-syntax">= {
+    </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">, </span><span class="jsdoc-comment">// string being parsed..
+    </span><span class="jsdoc-var">controlWord </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">controlWordParam </span><span class="jsdoc-syntax">:  </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">hexChar </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">doc </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">group</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">groupStack </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+    </span><span class="jsdoc-var">hexStore </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
+
+
+    </span><span class="jsdoc-var">cpos </span><span class="jsdoc-syntax">: 0,
+    </span><span class="jsdoc-var">row </span><span class="jsdoc-syntax">: 1, </span><span class="jsdoc-comment">// reportin?
+    </span><span class="jsdoc-var">col </span><span class="jsdoc-syntax">: 1, </span><span class="jsdoc-comment">//
+
+
+    </span><span class="jsdoc-var">push </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">m </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">'cmd'</span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">el.type</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">m</span><span class="jsdoc-syntax">]) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'invalid cmd:' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">el.type</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">m</span><span class="jsdoc-syntax">](</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">//Roo.log(el);
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-var">flushHexStore </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.hexStore.length </span><span class="jsdoc-syntax">&lt; 1) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">hexstr </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.hexStore.map</span><span class="jsdoc-syntax">(
+            </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">cmd.value</span><span class="jsdoc-syntax">;
+        })</span><span class="jsdoc-var">.join</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">);
+
+        </span><span class="jsdoc-var">this.group.addContent</span><span class="jsdoc-syntax">( </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Hex</span><span class="jsdoc-syntax">( </span><span class="jsdoc-var">hexstr </span><span class="jsdoc-syntax">));
+
+
+        </span><span class="jsdoc-var">this.hexStore.splice</span><span class="jsdoc-syntax">(0)
+
+    },
+
+    </span><span class="jsdoc-var">cmdgroupstart </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.flushHexStore</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.group</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.groupStack.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.group</span><span class="jsdoc-syntax">);
+        }
+         </span><span class="jsdoc-comment">// parent..
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.doc </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.group </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.doc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Document</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+
+        }
+        </span><span class="jsdoc-var">this.group </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Group</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.group</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-var">cmdignorable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.flushHexStore</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.group.ignorable </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
+    },
+    </span><span class="jsdoc-var">cmdendparagraph </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.flushHexStore</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.group.addContent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Paragraph</span><span class="jsdoc-syntax">());
+    },
+    </span><span class="jsdoc-var">cmdgroupend </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.flushHexStore</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">endingGroup </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.group</span><span class="jsdoc-syntax">;
+
+
+        </span><span class="jsdoc-var">this.group </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.groupStack.pop</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.group</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.group.addChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">endingGroup</span><span class="jsdoc-syntax">);
+        }
+
+
+
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">doc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.group </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.doc</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-comment">//if (endingGroup instanceof FontTable) {
+        //  doc.fonts = endingGroup.table
+        //} else if (endingGroup instanceof ColorTable) {
+        //  doc.colors = endingGroup.table
+        //} else if (endingGroup !== this.doc &amp;&amp; !endingGroup.get('ignorable')) {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">endingGroup.ignorable </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-comment">//code
+            </span><span class="jsdoc-var">this.groups.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">endingGroup</span><span class="jsdoc-syntax">);
+           </span><span class="jsdoc-comment">// Roo.log( endingGroup );
+        </span><span class="jsdoc-syntax">}
+            </span><span class="jsdoc-comment">//Roo.each(endingGroup.content, function(item)) {
+            //    doc.addContent(item);
+            //}
+            //process.emit('debug', 'GROUP END', endingGroup.type, endingGroup.get('ignorable'))
+        //}
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-var">cmdtext </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">this.flushHexStore</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.group</span><span class="jsdoc-syntax">) { </span><span class="jsdoc-comment">// an RTF fragment, missing the {\rtf1 header
+            //this.group = this.doc
+        </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-var">this.group.addContent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Span</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">));
+    },
+    </span><span class="jsdoc-var">cmdcontrolword </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-var">this.flushHexStore</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">this.group.type</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.group.type </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cmd.value</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">this.group.addContent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Ctrl</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">));
+        </span><span class="jsdoc-comment">// we actually don't care about ctrl words...
+        </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-comment">/*
+        var method = 'ctrl$' + cmd.value.replace(/-(.)/g, (_, char) =&gt; char.toUpperCase())
+        if (this[method]) {
+            this[method](cmd.param)
+        } else {
+            if (!this.group.get('ignorable')) process.emit('debug', method, cmd.param)
+        }
+        */
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-var">cmdhexchar </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-var">this.hexStore.push</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">);
+    },
+    </span><span class="jsdoc-var">cmderror </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">throw new </span><span class="jsdoc-var">Exception </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cmd.value</span><span class="jsdoc-syntax">);
+    },
+
+    </span><span class="jsdoc-comment">/*
+      _flush (done) {
+        if (this.text !== '\u0000') this.emitText()
+        done()
+      }
+      */
+
+
+    </span><span class="jsdoc-var">parseText </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'\\'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseEscapes</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'{'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitStartGroup</span><span class="jsdoc-syntax">();
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'}'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitEndGroup</span><span class="jsdoc-syntax">();
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'\x0A' </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'\x0D'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-comment">// cr/lf are noise chars
+        </span><span class="jsdoc-syntax">} </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+        }
+    },
+
+    </span><span class="jsdoc-var">parseEscapes</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'\\' </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'{' </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'}'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseControlSymbol</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.parseControlSymbol</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+        }
+    },
+    </span><span class="jsdoc-var">parseControlSymbol</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'~'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-string">'\u00a0'</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// nbsp
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText
+        </span><span class="jsdoc-syntax">} </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'-'</span><span class="jsdoc-syntax">) {
+             </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-string">'\u00ad'</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// soft hyphen
+        </span><span class="jsdoc-syntax">} </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'_'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-string">'\u2011'</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// non-breaking hyphen
+        </span><span class="jsdoc-syntax">} </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'*'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitIgnorable</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">&quot;'&quot;</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseHexChar</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'|'</span><span class="jsdoc-syntax">) { </span><span class="jsdoc-comment">// formula cacter
+            </span><span class="jsdoc-var">this.emitFormula</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">':'</span><span class="jsdoc-syntax">) { </span><span class="jsdoc-comment">// subentry in an index entry
+            </span><span class="jsdoc-var">this.emitIndexSubEntry</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'\x0a'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitEndParagraph</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">'\x0d'</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitEndParagraph</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseControlWord</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.parseControlWord</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+        }
+    },
+    </span><span class="jsdoc-var">parseHexChar</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(/^[A-Fa-f0-9]$/</span><span class="jsdoc-var">.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)) {
+            </span><span class="jsdoc-var">this.hexChar </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.hexChar.length </span><span class="jsdoc-syntax">&gt;= 2) {
+              </span><span class="jsdoc-var">this.emitHexChar</span><span class="jsdoc-syntax">();
+              </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">this.emitError</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;Invalid character \&quot;&quot; </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">&quot;\&quot; in hex literal.&quot;</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+
+    },
+    </span><span class="jsdoc-var">parseControlWord </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)
+    {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitControlWord</span><span class="jsdoc-syntax">();
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(/^[-\d]$/</span><span class="jsdoc-var">.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)) {
+            </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseControlWordParam</span><span class="jsdoc-syntax">;
+            </span><span class="jsdoc-var">this.controlWordParam </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(/^[A-Za-z]$/</span><span class="jsdoc-var">.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)) {
+          </span><span class="jsdoc-var">this.controlWord </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+          </span><span class="jsdoc-var">this.emitControlWord</span><span class="jsdoc-syntax">();
+          </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+          </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+        }
+    },
+    </span><span class="jsdoc-var">parseControlWordParam </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(/^\d$/</span><span class="jsdoc-var">.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">)) {
+          </span><span class="jsdoc-var">this.controlWordParam </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">' '</span><span class="jsdoc-syntax">) {
+          </span><span class="jsdoc-var">this.emitControlWord</span><span class="jsdoc-syntax">();
+          </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+          </span><span class="jsdoc-var">this.emitControlWord</span><span class="jsdoc-syntax">();
+          </span><span class="jsdoc-var">this.parserState </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">;
+          </span><span class="jsdoc-var">this.parseText</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">c</span><span class="jsdoc-syntax">);
+        }
+    },
+
+
+
+
+    </span><span class="jsdoc-var">emitText </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
+        }
+        </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'text'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.text</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+        </span><span class="jsdoc-syntax">});
+        </span><span class="jsdoc-var">this.text </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-var">emitControlWord </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.controlWord </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">this.emitError</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'empty control word'</span><span class="jsdoc-syntax">);
+        } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+                  </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'controlword'</span><span class="jsdoc-syntax">,
+                  </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.controlWord</span><span class="jsdoc-syntax">,
+                  </span><span class="jsdoc-var">param</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.controlWordParam </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-string">'' </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">Number</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.controlWordParam</span><span class="jsdoc-syntax">),
+                  </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+                  </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+                  </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+            </span><span class="jsdoc-syntax">});
+        }
+        </span><span class="jsdoc-var">this.controlWord </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-var">this.controlWordParam </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">;
+    },
+    </span><span class="jsdoc-var">emitStartGroup </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'groupstart'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+        </span><span class="jsdoc-syntax">});
+    },
+    </span><span class="jsdoc-var">emitEndGroup </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'groupend'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+        </span><span class="jsdoc-syntax">});
+    },
+    </span><span class="jsdoc-var">emitIgnorable </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'ignorable'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+        </span><span class="jsdoc-syntax">});
+    },
+    </span><span class="jsdoc-var">emitHexChar </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">()
+    {
+        </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'hexchar'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.hexChar</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+        </span><span class="jsdoc-syntax">});
+        </span><span class="jsdoc-var">this.hexChar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">''
+    </span><span class="jsdoc-syntax">},
+    </span><span class="jsdoc-var">emitError </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">message</span><span class="jsdoc-syntax">)
+    {
+      </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+      </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'error'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">value</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">message</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">char</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos </span><span class="jsdoc-comment">//,
+            //stack: new Error().stack
+        </span><span class="jsdoc-syntax">});
+    },
+    </span><span class="jsdoc-var">emitEndParagraph </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function </span><span class="jsdoc-syntax">() {
+        </span><span class="jsdoc-var">this.emitText</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">this.push</span><span class="jsdoc-syntax">({
+            </span><span class="jsdoc-var">type</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'endparagraph'</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">pos</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.cpos</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">row</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.row</span><span class="jsdoc-syntax">,
+            </span><span class="jsdoc-var">col</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">this.col
+        </span><span class="jsdoc-syntax">});
+    }
+
+} ;</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_Span.js.html b/docs/src/Roo_rtf_Span.js.html
new file mode 100644 (file)
index 0000000..f53f0f0
--- /dev/null
@@ -0,0 +1,5 @@
+<html><head><title>Roo/rtf/Span.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-var">Roo.rtf.Span </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">opts</span><span class="jsdoc-syntax">)
+{
+    </span><span class="jsdoc-var">this.value </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">opts.value</span><span class="jsdoc-syntax">;
+};
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/src/Roo_rtf_namespace.js.html b/docs/src/Roo_rtf_namespace.js.html
new file mode 100644 (file)
index 0000000..a171f66
--- /dev/null
@@ -0,0 +1,2 @@
+<html><head><title>Roo/rtf/namespace.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-var">Roo.rtf </span><span class="jsdoc-syntax">= {}; </span><span class="jsdoc-comment">// namespace
+</span></code></body></html>
\ No newline at end of file
diff --git a/docs/symbols/Roo.MessageBox.json b/docs/symbols/Roo.MessageBox.json
new file mode 100644 (file)
index 0000000..8474e7d
--- /dev/null
@@ -0,0 +1,429 @@
+{
+  "name" : "Roo.MessageBox",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Utility class for generating different styles of message boxes.  The alias Roo.Msg can also be used.\nExample usage:\n<pre><code>\n// Basic alert:\nRoo.Msg.alert('Status', 'Changes saved successfully.');\n\n// Prompt for user data:\nRoo.Msg.prompt('Name', 'Please enter your name:', function(btn, text){\n    if (btn == 'ok'){\n        // process text value...\n    }\n});\n\n// Show a dialog using config options:\nRoo.Msg.show({\n   title:'Save Changes?',\n   msg: 'Your are closing a tab that has unsaved changes. Would you like to save your changes?',\n   buttons: Roo.Msg.YESNOCANCEL,\n   fn: processResult,\n   animEl: 'elId'\n});\n</code></pre>",
+  "isSingleton" : false,
+  "isStatic" : true,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "MessageBox",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "prompt",
+      "type" : "function",
+      "desc" : "Displays a message box with OK and Cancel buttons prompting the user to enter some text (comparable to\nJavaScript's Window.prompt).  The prompt can be a single-line or multi-line textbox.  If a callback function\nis passed it will be called after the user clicks either button, and the id of the button that was clicked\n(could also be the top-right close button) and the text that was entered will be passed as the two\nparameters to the callback.",
+      "sig" : "(title, msg, fn, scope, multiline)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "title",
+          "type" : "String",
+          "desc" : "The title bar text",
+          "isOptional" : false
+        },
+        {
+          "name" : "msg",
+          "type" : "String",
+          "desc" : "The message box body text",
+          "isOptional" : false
+        },
+        {
+          "name" : "fn",
+          "type" : "Function",
+          "desc" : "(optional) The callback function invoked after the message box is closed",
+          "isOptional" : false
+        },
+        {
+          "name" : "scope",
+          "type" : "Object",
+          "desc" : "(optional) The scope of the callback function",
+          "isOptional" : false
+        },
+        {
+          "name" : "multiline",
+          "type" : "Boolean/Number",
+          "desc" : "(optional) True to create a multiline textbox using the defaultTextHeight\nproperty, or the height in pixels to create the textbox (defaults to false / single-line)",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "confirm",
+      "type" : "function",
+      "desc" : "Displays a confirmation message box with Yes and No buttons (comparable to JavaScript's Window.confirm).\nIf a callback function is passed it will be called after the user clicks either button, and the id of the\nbutton that was clicked will be passed as the only parameter to the callback (could also be the top-right close button).",
+      "sig" : "(title, msg, fn, scope)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "title",
+          "type" : "String",
+          "desc" : "The title bar text",
+          "isOptional" : false
+        },
+        {
+          "name" : "msg",
+          "type" : "String",
+          "desc" : "The message box body text",
+          "isOptional" : false
+        },
+        {
+          "name" : "fn",
+          "type" : "Function",
+          "desc" : "(optional) The callback function invoked after the message box is closed",
+          "isOptional" : false
+        },
+        {
+          "name" : "scope",
+          "type" : "Object",
+          "desc" : "(optional) The scope of the callback function",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "updateText",
+      "type" : "function",
+      "desc" : "Updates the message box body text",
+      "sig" : "(text)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "(optional) Replaces the message box element's innerHTML with the specified string (defaults to\nthe XHTML-compliant non-breaking space character '&amp;#160;')",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "updateProgress",
+      "type" : "function",
+      "desc" : "Updates a progress-style message box's text and progress bar.  Only relevant on message boxes\ninitiated via {@link Roo.MessageBox#progress} or by calling {@link Roo.MessageBox#show} with progress: true.",
+      "sig" : "(value, text)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "value",
+          "type" : "Number",
+          "desc" : "Any number between 0 and 1 (e.g., .5)",
+          "isOptional" : false
+        },
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "(optional) If defined, the message box's body text is replaced with the specified string (defaults to undefined)",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "hide",
+      "type" : "function",
+      "desc" : "Hides the message box if it is displayed",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    },
+    {
+      "name" : "show",
+      "type" : "function",
+      "desc" : "Displays a new message box, or reinitializes an existing message box, based on the config options\npassed in. All functions (e.g. prompt, alert, etc) on MessageBox call this function internally.\nThe following config object properties are supported:\n<pre>\nProperty    Type             Description\n----------  ---------------  ------------------------------------------------------------------------------------\nanimEl            String/Element   An id or Element from which the message box should animate as it opens and\n                                   closes (defaults to undefined)\nbuttons           Object/Boolean   A button config object (e.g., Roo.MessageBox.OKCANCEL or {ok:'Foo',\n                                   cancel:'Bar'}), or false to not show any buttons (defaults to false)\nclosable          Boolean          False to hide the top-right close button (defaults to true).  Note that\n                                   progress and wait dialogs will ignore this property and always hide the\n                                   close button as they can only be closed programmatically.\ncls               String           A custom CSS class to apply to the message box element\ndefaultTextHeight Number           The default height in pixels of the message box's multiline textarea if\n                                   displayed (defaults to 75)\nfn                Function         A callback function to execute after closing the dialog.  The arguments to the\n                                   function will be btn (the name of the button that was clicked, if applicable,\n                                   e.g. \"ok\"), and text (the value of the active text field, if applicable).\n                                   Progress and wait dialogs will ignore this option since they do not respond to\n                                   user actions and can only be closed programmatically, so any required function\n                                   should be called by the same code after it closes the dialog.\nicon              String           A CSS class that provides a background image to be used as an icon for\n                                   the dialog (e.g., Roo.MessageBox.WARNING or 'custom-class', defaults to '')\nmaxWidth          Number           The maximum width in pixels of the message box (defaults to 600)\nminWidth          Number           The minimum width in pixels of the message box (defaults to 100)\nmodal             Boolean          False to allow user interaction with the page while the message box is\n                                   displayed (defaults to true)\nmsg               String           A string that will replace the existing message box body text (defaults\n                                   to the XHTML-compliant non-breaking space character '&#160;')\nmultiline         Boolean          True to prompt the user to enter multi-line text (defaults to false)\nprogress          Boolean          True to display a progress bar (defaults to false)\nprogressText      String           The text to display inside the progress bar if progress = true (defaults to '')\nprompt            Boolean          True to prompt the user to enter single-line text (defaults to false)\nproxyDrag         Boolean          True to display a lightweight proxy while dragging (defaults to false)\ntitle             String           The title text\nvalue             String           The string value to set into the active textbox element if displayed\nwait              Boolean          True to display a progress bar (defaults to false)\nwidth             Number           The width of the dialog in pixels\n</pre>\n\nExample usage:\n<pre><code>\nRoo.Msg.show({\n   title: 'Address',\n   msg: 'Please enter your address:',\n   width: 300,\n   buttons: Roo.MessageBox.OKCANCEL,\n   multiline: true,\n   fn: saveAddress,\n   animEl: 'addAddressBtn'\n});\n</code></pre>",
+      "sig" : "(config)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "config",
+          "type" : "Object",
+          "desc" : "Configuration options",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "getDialog",
+      "type" : "function",
+      "desc" : "Returns a reference to the underlying {@link Roo.BasicDialog} element",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.BasicDialog",
+          "desc" : "The BasicDialog element"
+        }
+      ]
+    },
+    {
+      "name" : "isVisible",
+      "type" : "function",
+      "desc" : "Returns true if the message box is currently displayed",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Boolean",
+          "desc" : "True if the message box is visible, else false"
+        }
+      ]
+    },
+    {
+      "name" : "wait",
+      "type" : "function",
+      "desc" : "Displays a message box with an infinitely auto-updating progress bar.  This can be used to block user\ninteraction while waiting for a long-running process to complete that does not have defined intervals.\nYou are responsible for closing the message box when the process is complete.",
+      "sig" : "(msg, title)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "msg",
+          "type" : "String",
+          "desc" : "The message box body text",
+          "isOptional" : false
+        },
+        {
+          "name" : "title",
+          "type" : "String",
+          "desc" : "(optional) The title bar text",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "alert",
+      "type" : "function",
+      "desc" : "Displays a standard read-only message box with an OK button (comparable to the basic JavaScript Window.alert).\nIf a callback function is passed it will be called after the user clicks the button, and the\nid of the button that was clicked will be passed as the only parameter to the callback\n(could also be the top-right close button).",
+      "sig" : "(title, msg, fn, scope)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "title",
+          "type" : "String",
+          "desc" : "The title bar text",
+          "isOptional" : false
+        },
+        {
+          "name" : "msg",
+          "type" : "String",
+          "desc" : "The message box body text",
+          "isOptional" : false
+        },
+        {
+          "name" : "fn",
+          "type" : "Function",
+          "desc" : "(optional) The callback function invoked after the message box is closed",
+          "isOptional" : false
+        },
+        {
+          "name" : "scope",
+          "type" : "Object",
+          "desc" : "(optional) The scope of the callback function",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    },
+    {
+      "name" : "progress",
+      "type" : "function",
+      "desc" : "Displays a message box with a progress bar.  This message box has no buttons and is not closeable by\nthe user.  You are responsible for updating the progress bar as needed via {@link Roo.MessageBox#updateProgress}\nand closing the message box when the process is complete.",
+      "sig" : "(title, msg)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "title",
+          "type" : "String",
+          "desc" : "The title bar text",
+          "isOptional" : false
+        },
+        {
+          "name" : "msg",
+          "type" : "String",
+          "desc" : "The message box body text",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "Roo.MessageBox",
+          "desc" : "This message box"
+        }
+      ]
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.Block.json b/docs/symbols/Roo.htmleditor.Block.json
new file mode 100644 (file)
index 0000000..937671c
--- /dev/null
@@ -0,0 +1,238 @@
+{
+  "name" : "Roo.htmleditor.Block",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Base class for html editor blocks - do not use it directly .. extend it..",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Block",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [
+    {
+      "name" : "Context",
+      "type" : "Object",
+      "desc" : "menu - see Roo.form.HtmlEditor.ToolbarContext",
+      "memberOf" : ""
+    },
+    {
+      "name" : "friendly_name",
+      "type" : "String",
+      "desc" : "the name that appears in the context bar about this block",
+      "memberOf" : ""
+    },
+    {
+      "name" : "node",
+      "type" : "DomElement",
+      "desc" : "The node to apply stuff to.",
+      "memberOf" : ""
+    }
+  ],
+  "methods" : [
+    {
+      "name" : "getVal",
+      "type" : "function",
+      "desc" : "used by readEleemnt to extract data from a node\nmay need improving as it's pretty basic",
+      "sig" : "(node, tag, attribute, style)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "node",
+          "type" : "DomElement",
+          "desc" : "",
+          "isOptional" : false
+        },
+        {
+          "name" : "tag",
+          "type" : "String",
+          "desc" : "- tag to find, eg. IMG ?? might be better to use DomQuery ?",
+          "isOptional" : false
+        },
+        {
+          "name" : "attribute",
+          "type" : "String",
+          "desc" : "(use html - for contents, or style for using next param as style)",
+          "isOptional" : false
+        },
+        {
+          "name" : "style",
+          "type" : "String",
+          "desc" : "the style property - eg. text-align",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "toObject",
+      "type" : "function",
+      "desc" : "create a DomHelper friendly object - for use with \nRoo.DomHelper.markup / overwrite / etc..\n(override this)",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    },
+    {
+      "name" : "initAll",
+      "type" : "function",
+      "desc" : "initalize all Elements from content that are 'blockable'",
+      "sig" : "(the)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "the",
+          "type" : "",
+          "desc" : "body element",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "toHTML",
+      "type" : "function",
+      "desc" : "convert to plain HTML for calling insertAtCursor..",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    },
+    {
+      "name" : "readElement",
+      "type" : "function",
+      "desc" : "Read a node that has a 'data-block' property - and extract the values from it.",
+      "sig" : "(node)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "node",
+          "type" : "DomElement",
+          "desc" : "- the node",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "factory",
+      "type" : "function",
+      "desc" : "factory method to get the block from an element (using cache if necessary)",
+      "sig" : "(the)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "the",
+          "type" : "HtmlElement",
+          "desc" : "dom element",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "updateElement",
+      "type" : "function",
+      "desc" : "Update a node with values from this object",
+      "sig" : "(node)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "node",
+          "type" : "DomElement",
+          "desc" : "",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.BlockFigure.json b/docs/symbols/Roo.htmleditor.BlockFigure.json
new file mode 100644 (file)
index 0000000..cb4b7dd
--- /dev/null
@@ -0,0 +1,89 @@
+{
+  "name" : "Roo.htmleditor.BlockFigure",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Block that has an image and a figcaption",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "BlockFigure",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [
+    {
+      "name" : "image_height",
+      "type" : "String|number",
+      "desc" : "the height of the image number or %?",
+      "memberOf" : ""
+    },
+    {
+      "name" : "align",
+      "type" : "String",
+      "desc" : "t) alignment for the block default left",
+      "memberOf" : ""
+    },
+    {
+      "name" : "image_src",
+      "type" : "String",
+      "desc" : "the url for the image",
+      "memberOf" : ""
+    },
+    {
+      "name" : "caption_display",
+      "type" : "String",
+      "desc" : "e) display or not the caption",
+      "memberOf" : ""
+    },
+    {
+      "name" : "caption",
+      "type" : "String",
+      "desc" : "the text to appear below  (and in the alt tag)",
+      "memberOf" : ""
+    },
+    {
+      "name" : "image_width",
+      "type" : "String|number",
+      "desc" : "the width of the image number or %?",
+      "memberOf" : ""
+    }
+  ],
+  "methods" : [
+    {
+      "name" : "toObject",
+      "type" : "function",
+      "desc" : "create a DomHelper friendly object - for use with\nRoo.DomHelper.markup / overwrite / etc..",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.BlockTable.json b/docs/symbols/Roo.htmleditor.BlockTable.json
new file mode 100644 (file)
index 0000000..f2e6430
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "name" : "Roo.htmleditor.BlockTable",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Block that manages a table",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "BlockTable",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "toObject",
+      "type" : "function",
+      "desc" : "create a DomHelper friendly object - for use with\nRoo.DomHelper.markup / overwrite / etc..\n?? should it be called with option to hide all editing features?",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.BlockTd.json b/docs/symbols/Roo.htmleditor.BlockTd.json
new file mode 100644 (file)
index 0000000..6d6231d
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "name" : "Roo.htmleditor.BlockTd",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Block that manages a table",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "BlockTd",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "toObject",
+      "type" : "function",
+      "desc" : "create a DomHelper friendly object - for use with\nRoo.DomHelper.markup / overwrite / etc..\n?? should it be called with option to hide all editing features?",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.Filter.json b/docs/symbols/Roo.htmleditor.Filter.json
new file mode 100644 (file)
index 0000000..99e0bd5
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  "name" : "Roo.htmleditor.Filter",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Base Class for filtering htmleditor stuff. - do not use this directly - extend it.",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Filter",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [
+    {
+      "name" : "tag",
+      "type" : "boolean|String|Array",
+      "desc" : "Tags to replace",
+      "memberOf" : ""
+    },
+    {
+      "name" : "node",
+      "type" : "DomElement",
+      "desc" : "The node to iterate and filter",
+      "memberOf" : ""
+    }
+  ],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterAttributes.json b/docs/symbols/Roo.htmleditor.FilterAttributes.json
new file mode 100644 (file)
index 0000000..33082fc
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterAttributes",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "clean attributes and  styles including http:// etc.. in attribute",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterAttributes",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterBlack.json b/docs/symbols/Roo.htmleditor.FilterBlack.json
new file mode 100644 (file)
index 0000000..1d95f51
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterBlack",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "remove blacklisted elements.",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterBlack",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterBlock.json b/docs/symbols/Roo.htmleditor.FilterBlock.json
new file mode 100644 (file)
index 0000000..970689f
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterBlock",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "removes id / data-block and contenteditable that are associated with blocks\nusage should be done on a cloned copy of the dom",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterBlock",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterComment.json b/docs/symbols/Roo.htmleditor.FilterComment.json
new file mode 100644 (file)
index 0000000..8e02fd9
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterComment",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "remove comments.",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterComment",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterKeepChildren.json b/docs/symbols/Roo.htmleditor.FilterKeepChildren.json
new file mode 100644 (file)
index 0000000..dbd75a1
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterKeepChildren",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "remove tags but keep children",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterKeepChildren",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterLongBr.json b/docs/symbols/Roo.htmleditor.FilterLongBr.json
new file mode 100644 (file)
index 0000000..42c0fcc
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterLongBr",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "BR/BR/BR - keep a maximum of 2...",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterLongBr",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterParagraph.json b/docs/symbols/Roo.htmleditor.FilterParagraph.json
new file mode 100644 (file)
index 0000000..4aceb09
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterParagraph",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "paragraphs cause a nightmare for shared content - this filter is designed to be called ? at various points when editing\nlike on 'push' to remove the <p> tags and replace them with line breaks.",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterParagraph",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterSpan.json b/docs/symbols/Roo.htmleditor.FilterSpan.json
new file mode 100644 (file)
index 0000000..02bdcb9
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterSpan",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "filter span's with no attributes out..",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterSpan",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterStyleToTag.json b/docs/symbols/Roo.htmleditor.FilterStyleToTag.json
new file mode 100644 (file)
index 0000000..29f9fd6
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterStyleToTag",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "part of the word stuff... - certain 'styles' should be converted to tags.\neg.\n  font-weight: bold -> bold\n  ?? super / subscrit etc..",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterStyleToTag",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterTableWidth.json b/docs/symbols/Roo.htmleditor.FilterTableWidth.json
new file mode 100644 (file)
index 0000000..8cc18f9
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "name" : "Roo.htmleditor.FilterTableWidth",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "try and remove table width data - as that frequently messes up other stuff.\n\n     was cleanTableWidths.\n\nQuite often pasting from word etc.. results in tables with column and widths.\nThis does not work well on fluid HTML layouts - like emails. - so this code should hunt an destroy them..",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterTableWidth",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.FilterWord.json b/docs/symbols/Roo.htmleditor.FilterWord.json
new file mode 100644 (file)
index 0000000..eb1aeba
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "name" : "Roo.htmleditor.FilterWord",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "try and clean up all the mess that Word generates.\n\nThis is the 'nice version' - see 'Heavy' that white lists a very short list of elements, and multi-filters",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "FilterWord",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "replaceTag",
+      "type" : "function",
+      "desc" : "Clean up MS wordisms...",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.KeyEnter.json b/docs/symbols/Roo.htmleditor.KeyEnter.json
new file mode 100644 (file)
index 0000000..f77fa19
--- /dev/null
@@ -0,0 +1,39 @@
+{
+  "name" : "Roo.htmleditor.KeyEnter",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Handle Enter press..",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "KeyEnter",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [
+    {
+      "name" : "core",
+      "type" : "Roo.HtmlEditorCore",
+      "desc" : "the editor.",
+      "memberOf" : ""
+    }
+  ],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.Tidy.json b/docs/symbols/Roo.htmleditor.Tidy.json
new file mode 100644 (file)
index 0000000..f3ba513
--- /dev/null
@@ -0,0 +1,39 @@
+{
+  "name" : "Roo.htmleditor.Tidy",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "Tidy HTML",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Tidy",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "config",
+      "type" : "Object",
+      "desc" : "Configuration options",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [
+    {
+      "name" : "core",
+      "type" : "Roo.HtmlEditorCore",
+      "desc" : "the editor.",
+      "memberOf" : ""
+    }
+  ],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.TidyEntities.json b/docs/symbols/Roo.htmleditor.TidyEntities.json
new file mode 100644 (file)
index 0000000..5b4327a
--- /dev/null
@@ -0,0 +1,267 @@
+{
+  "name" : "Roo.htmleditor.TidyEntities",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "This is based loosely on tinymce",
+  "isSingleton" : false,
+  "isStatic" : true,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "TidyEntities",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "getEncodeFunc",
+      "type" : "function",
+      "desc" : "Returns an encode function based on the name(s) and it's optional entities.",
+      "sig" : "(name, entities)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "name",
+          "type" : "String",
+          "desc" : "Comma separated list of encoders for example named,numeric.",
+          "isOptional" : false
+        },
+        {
+          "name" : "entities",
+          "type" : "String",
+          "desc" : "Optional parameter with entities to use instead of the built in set.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "function",
+          "desc" : "Encode function to be used."
+        }
+      ]
+    },
+    {
+      "name" : "encodeAllRaw",
+      "type" : "function",
+      "desc" : "Encoded the specified text with both the attributes and text entities. This function will produce larger text contents\nsince it doesn't know if the context is within a attribute or text node. This was added for compatibility\nand is exposed as the DOMUtils.encode function.",
+      "sig" : "(text)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "Text to encode.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "Entity encoded text."
+        }
+      ]
+    },
+    {
+      "name" : "encodeRaw",
+      "type" : "function",
+      "desc" : "Encodes the specified string using raw entities. This means only the required XML base entities will be encoded.",
+      "sig" : "(text, attr)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "Text to encode.",
+          "isOptional" : false
+        },
+        {
+          "name" : "attr",
+          "type" : "Boolean",
+          "desc" : "Optional flag to specify if the text is attribute contents.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "Entity encoded text."
+        }
+      ]
+    },
+    {
+      "name" : "encodeNumeric",
+      "type" : "function",
+      "desc" : "Encodes the specified string using numeric entities. The core entities will be\nencoded as named ones but all non lower ascii characters will be encoded into numeric entities.",
+      "sig" : "(text, attr)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "Text to encode.",
+          "isOptional" : false
+        },
+        {
+          "name" : "attr",
+          "type" : "Boolean",
+          "desc" : "Optional flag to specify if the text is attribute contents.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "Entity encoded text."
+        }
+      ]
+    },
+    {
+      "name" : "encodeNamed",
+      "type" : "function",
+      "desc" : "Encodes the specified string using named entities. The core entities will be encoded\nas named ones but all non lower ascii characters will be encoded into named entities.",
+      "sig" : "(text, attr, entities)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "Text to encode.",
+          "isOptional" : false
+        },
+        {
+          "name" : "attr",
+          "type" : "Boolean",
+          "desc" : "Optional flag to specify if the text is attribute contents.",
+          "isOptional" : false
+        },
+        {
+          "name" : "entities",
+          "type" : "Object",
+          "desc" : "Optional parameter with entities to use.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "Entity encoded text."
+        }
+      ]
+    },
+    {
+      "name" : "init",
+      "type" : "function",
+      "desc" : "initialize data..",
+      "sig" : "()\n{\n\n}",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    },
+    {
+      "name" : "decode",
+      "type" : "function",
+      "desc" : "Decodes the specified string, this will replace entities with raw UTF characters.",
+      "sig" : "(text)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "Text to entity decode.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "Entity decoded string."
+        }
+      ]
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.TidySerializer.json b/docs/symbols/Roo.htmleditor.TidySerializer.json
new file mode 100644 (file)
index 0000000..66eb772
--- /dev/null
@@ -0,0 +1,91 @@
+{
+  "name" : "Roo.htmleditor.TidySerializer",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "This is based loosely on tinymce",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "TidySerializer",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "settings",
+      "type" : "Object",
+      "desc" : "Name/value settings object.",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "inner",
+      "type" : "function",
+      "desc" : "",
+      "sig" : "(inner)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "inner",
+          "type" : "boolean",
+          "desc" : "do the inner of the node.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "serialize",
+      "type" : "function",
+      "desc" : "Serializes the specified node into a string.",
+      "sig" : "(node)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "new tinymce.html.Serializer().serialize(new tinymce.html.DomParser().parse('<p>text</p>'));",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "node",
+          "type" : "DomElement",
+          "desc" : "Node instance to serialize.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "String with HTML based on DOM tree."
+        }
+      ]
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.TidyWriter.json b/docs/symbols/Roo.htmleditor.TidyWriter.json
new file mode 100644 (file)
index 0000000..6cf301b
--- /dev/null
@@ -0,0 +1,276 @@
+{
+  "name" : "Roo.htmleditor.TidyWriter",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "This is based loosely on tinymce",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "TidyWriter",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "doctype",
+      "type" : "function",
+      "desc" : "Writes a doctype node such as <!DOCTYPE data>.",
+      "sig" : "(text)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "String to write out inside the doctype.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "reset",
+      "type" : "function",
+      "desc" : "Resets the internal buffer if one wants to reuse the writer.",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    },
+    {
+      "name" : "text",
+      "type" : "function",
+      "desc" : "Writes a text node.\n\nIn pre - we should not mess with the contents.",
+      "sig" : "(text, raw)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "String to write out.",
+          "isOptional" : false
+        },
+        {
+          "name" : "raw",
+          "type" : "Boolean",
+          "desc" : "Optional raw state if true the contents wont get encoded.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "getContent",
+      "type" : "function",
+      "desc" : "Returns the contents that got serialized.",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "HTML contents that got written down."
+        }
+      ]
+    },
+    {
+      "name" : "comment",
+      "type" : "function",
+      "desc" : "Writes a comment node such as <!-- Comment -->.",
+      "sig" : "(text)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "String to write out inside the comment.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "end",
+      "type" : "function",
+      "desc" : "Writes the a end element such as </p>.",
+      "sig" : "(name)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "name",
+          "type" : "String",
+          "desc" : "Name of the element.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "pi",
+      "type" : "function",
+      "desc" : "Writes a PI node such as <?xml attr=\"value\" ?>.",
+      "sig" : "(name, text)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "name",
+          "type" : "String",
+          "desc" : "Name of the pi.",
+          "isOptional" : false
+        },
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "String to write out inside the pi.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "start",
+      "type" : "function",
+      "desc" : "Writes the a start element such as <p id=\"a\">.",
+      "sig" : "(name, attrs, empty)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "name",
+          "type" : "String",
+          "desc" : "Name of the element.",
+          "isOptional" : false
+        },
+        {
+          "name" : "attrs",
+          "type" : "Array",
+          "desc" : "Optional attribute array or undefined if it hasn't any.",
+          "isOptional" : false
+        },
+        {
+          "name" : "empty",
+          "type" : "Boolean",
+          "desc" : "Optional empty state if the tag should end like <br />.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "cdata",
+      "type" : "function",
+      "desc" : "Writes a cdata node such as <![CDATA[data]]>.",
+      "sig" : "(text)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "text",
+          "type" : "String",
+          "desc" : "String to write out inside the cdata.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.htmleditor.json b/docs/symbols/Roo.htmleditor.json
new file mode 100644 (file)
index 0000000..fab0876
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "name" : "Roo.htmleditor",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Roo.htmleditor",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.lib.Range.json b/docs/symbols/Roo.lib.Range.json
new file mode 100644 (file)
index 0000000..06b6d3c
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "name" : "Roo.lib.Range",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "This is a toolkit, normally used to copy features into a Dom Range element\nRoo.lib.Range.wrap(x);",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Range",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "wrap",
+      "type" : "function",
+      "desc" : "Wrap a Dom Range object, to give it new features...",
+      "sig" : "(the)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "the",
+          "type" : "Range",
+          "desc" : "range to wrap",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.lib.Selection.json b/docs/symbols/Roo.lib.Selection.json
new file mode 100644 (file)
index 0000000..901f43a
--- /dev/null
@@ -0,0 +1,84 @@
+{
+  "name" : "Roo.lib.Selection",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "This is a toolkit, normally used to copy features into a Dom Selection element\nRoo.lib.Selection.wrap(x);",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Selection",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "wrap",
+      "type" : "function",
+      "desc" : "Wrap a Dom Range object, to give it new features...",
+      "sig" : "(the)",
+      "static" : true,
+      "memberOf" : "",
+      "isStatic" : true,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "the",
+          "type" : "Range",
+          "desc" : "range to wrap",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    },
+    {
+      "name" : "insertNode",
+      "type" : "function",
+      "desc" : "insert node at selection",
+      "sig" : "(node, cursor)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "node",
+          "type" : "DomElement|string",
+          "desc" : "",
+          "isOptional" : false
+        },
+        {
+          "name" : "cursor",
+          "type" : "string",
+          "desc" : "(after|in|none) where to place the cursor after inserting.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.lib.UndoManager.json b/docs/symbols/Roo.lib.UndoManager.json
new file mode 100644 (file)
index 0000000..665dce8
--- /dev/null
@@ -0,0 +1,109 @@
+{
+  "name" : "Roo.lib.UndoManager",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "An undo manager implementation in JavaScript. It follows the W3C UndoManager and DOM Transaction\nDraft and the undocumented and disabled Mozilla Firefox's UndoManager implementation.\nUsage:\n<pre><code>\n\n\neditor.undoManager = new Roo.lib.UndoManager(1000, editor);\n \n</code></pre>\nFor more information see this blog post with examples:\n <a href=\"http://www.cnitblog.com/seeyeah/archive/2011/12/30/38728.html/\">DomHelper\n     - Create Elements using DOM, HTML fragments and Templates</a>.",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "UndoManager",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [
+    {
+      "name" : "limit",
+      "type" : "Number",
+      "desc" : "how far back to go ... use 1000?",
+      "isOptional" : false
+    },
+    {
+      "name" : "scope",
+      "type" : "Object",
+      "desc" : "usually use document..",
+      "isOptional" : false
+    }
+  ],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [
+    {
+      "name" : "transact",
+      "type" : "function",
+      "desc" : "To push and execute a transaction, the method undoManager.transact\nmust be called by passing a transaction object as the first argument, and a merge\nflag as the second argument. A transaction object has the following properties:\n\nUsage:\n<pre><code>\nundoManager.transact({\n    label: 'Typing',\n    execute: function() { ... },\n    undo: function() { ... },\n    // redo same as execute\n    redo: function() { this.execute(); }\n}, false);\n\n// merge transaction\nundoManager.transact({\n    label: 'Typing',\n    execute: function() { ... },  // this will be run...\n    undo: function() { ... }, // what to do when undo is run.\n    // redo same as execute\n    redo: function() { this.execute(); }\n}, true); \n</code></pre>",
+      "sig" : "(transaction)",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [
+        {
+          "name" : "transaction",
+          "type" : "Object",
+          "desc" : "The transaction to add to the stack.",
+          "isOptional" : false
+        }
+      ],
+      "returns" : [
+        {
+          "name" : "",
+          "type" : "String",
+          "desc" : "The HTML fragment"
+        }
+      ]
+    },
+    {
+      "name" : "reset",
+      "type" : "function",
+      "desc" : "Reset the undo - probaly done on load to clear all history.",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    },
+    {
+      "name" : "addEvent",
+      "type" : "function",
+      "desc" : "Manually add an event.\nNormall called without arguements - and it will just get added to the stack.",
+      "sig" : "()\n{\n\n}",
+      "static" : false,
+      "memberOf" : "",
+      "isStatic" : false,
+      "isConstructor" : false,
+      "isPrivate" : false,
+      "example" : "",
+      "deprecated" : "",
+      "since" : "",
+      "see" : "",
+      "exceptions" : "",
+      "requires" : "",
+      "params" : [],
+      "returns" : []
+    }
+  ],
+  "events" : []
+}
\ No newline at end of file
diff --git a/docs/symbols/Roo.rtf.json b/docs/symbols/Roo.rtf.json
new file mode 100644 (file)
index 0000000..a73baed
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "name" : "Roo.rtf",
+  "augments" : [],
+  "childClasses" : {  },
+  "tree_children" : [],
+  "tree_parent" : [],
+  "desc" : "",
+  "isSingleton" : false,
+  "isStatic" : false,
+  "isBuiltin" : false,
+  "isAbstract" : false,
+  "isBuilderTop" : false,
+  "memberOf" : "Roo.rtf",
+  "example" : "",
+  "deprecated" : "",
+  "since" : "",
+  "see" : "",
+  "params" : [],
+  "returns" : [],
+  "throws" : "",
+  "requires" : "",
+  "config" : [],
+  "methods" : [],
+  "events" : []
+}
\ No newline at end of file