Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / themes / advanced / editor_template_src.js
index 12cf1fe2ca2b74a04399111eb73c0aa459682abb..bee26e161025b55d7efa965e4dcf449c300f26f9 100644 (file)
@@ -66,6 +66,9 @@
                        t.url = url;\r
                        t.onResolveName = new tinymce.util.Dispatcher(this);\r
 \r
+                       ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast();\r
+                       ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin;\r
+\r
                        // Default settings\r
                        t.settings = s = extend({\r
                                theme_advanced_path : true,\r
@@ -81,6 +84,8 @@
                                theme_advanced_resize_horizontal : 1,\r
                                theme_advanced_resizing_use_cookie : 1,\r
                                theme_advanced_font_sizes : "1,2,3,4,5,6,7",\r
+                               theme_advanced_font_selector : "span",\r
+                               theme_advanced_show_current_color: 0,\r
                                readonly : ed.settings.readonly\r
                        }, ed.settings);\r
 \r
                        if (s.theme_advanced_statusbar_location == 'none')\r
                                s.theme_advanced_statusbar_location = 0;\r
 \r
+                       if (ed.settings.content_css !== false)\r
+                               ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css"));\r
+\r
                        // Init editor\r
                        ed.onInit.add(function() {\r
-                               if (!ed.settings.readonly)\r
+                               if (!ed.settings.readonly) {\r
                                        ed.onNodeChange.add(t._nodeChanged, t);\r
-\r
-                               if (ed.settings.content_css !== false)\r
-                                       ed.dom.loadCSS(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css"));\r
+                                       ed.onKeyUp.add(t._updateUndoStatus, t);\r
+                                       ed.onMouseUp.add(t._updateUndoStatus, t);\r
+                                       ed.dom.bind(ed.dom.getRoot(), 'dragend', function() {\r
+                                               t._updateUndoStatus(ed);\r
+                                       });\r
+                               }\r
                        });\r
 \r
                        ed.onSetProgressState.add(function(ed, b, ti) {\r
                                DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css");\r
                },\r
 \r
+               _isHighContrast : function() {\r
+                       var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'});\r
+\r
+                       actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, '');\r
+                       DOM.remove(div);\r
+\r
+                       return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56';\r
+               },\r
+\r
                createControl : function(n, cf) {\r
                        var cd, c;\r
 \r
 \r
                                        // Toggle off the current format\r
                                        matches = ed.formatter.matchAll(formatNames);\r
-                                       if (!name || matches[0] == name)\r
-                                               ed.formatter.remove(matches[0]);\r
-                                       else\r
+                                       if (!name || matches[0] == name) {\r
+                                               if (matches[0]) \r
+                                                       ed.formatter.remove(matches[0]);\r
+                                       } else\r
                                                ed.formatter.apply(name);\r
 \r
                                        ed.undoManager.add();\r
                                                return v == sv;\r
                                        });\r
 \r
+                                       if (cur && cur.value == v) {\r
+                                               c.select(null);\r
+                                       }\r
+\r
                                        return false; // No auto select\r
                                }\r
                        });\r
                                        return v == sv;\r
                                });\r
 \r
+                               if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] == v['class'])) {\r
+                                       c.select(null);\r
+                               }\r
+\r
                                return false; // No auto select\r
                        }});\r
 \r
                                samp : 'advanced.samp'\r
                        }, t = this;\r
 \r
-                       c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'});\r
+                       c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) {\r
+                               t.editor.execCommand('FormatBlock', false, v);\r
+                               return false;\r
+                       }});\r
+\r
                        if (c) {\r
                                each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {\r
                                        c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v});\r
                renderUI : function(o) {\r
                        var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl;\r
 \r
-                       n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});\r
+                       if (ed.settings) {\r
+                               ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut');\r
+                       }\r
+\r
+                       // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for.\r
+                       // Maybe actually inherit it from the original textara?\r
+                       n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});\r
+                       DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label);\r
 \r
                        if (!DOM.boxModel)\r
                                n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});\r
 \r
-                       n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});\r
+                       n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});\r
                        n = tb = DOM.add(n, 'tbody');\r
 \r
                        switch ((s.theme_advanced_layout_manager || '').toLowerCase()) {\r
                        n = o.targetNode;\r
 \r
                        // Add classes to first and last TRs\r
-                       nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8\r
+                       nl = sc.rows;\r
                        DOM.addClass(nl[0], 'mceFirst');\r
                        DOM.addClass(nl[nl.length - 1], 'mceLast');\r
 \r
                        t.deltaHeight = o.deltaHeight;\r
                        o.targetNode = null;\r
 \r
+                       ed.onKeyDown.add(function(ed, evt) {\r
+                               var DOM_VK_F10 = 121, DOM_VK_F11 = 122;\r
+\r
+                               if (evt.altKey) {\r
+                                       if (evt.keyCode === DOM_VK_F10) {\r
+                                               window.focus();\r
+                                               t.toolbarGroup.focus();\r
+                                               return Event.cancel(evt);\r
+                                       } else if (evt.keyCode === DOM_VK_F11) {\r
+                                               DOM.get(ed.id + '_path_row').focus();\r
+                                               return Event.cancel(evt);\r
+                                       }\r
+                               }\r
+                       });\r
+\r
+                       // alt+0 is the UK recommended shortcut for accessing the list of access controls.\r
+                       ed.addShortcut('alt+0', '', 'mceShortcuts', t);\r
+\r
                        return {\r
                                iframeContainer : ic,\r
                                editorContainer : ed.id + '_parent',\r
                },\r
 \r
                resizeBy : function(dw, dh) {\r
-                       var e = DOM.get(this.editor.id + '_tbl');\r
+                       var e = DOM.get(this.editor.id + '_ifr');\r
 \r
                        this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);\r
                },\r
                        each(explode(s.theme_advanced_containers || ''), function(c, i) {\r
                                var v = s['theme_advanced_container_' + c] || '';\r
 \r
-                               switch (v.toLowerCase()) {\r
+                               switch (c.toLowerCase()) {\r
                                        case 'mceeditor':\r
                                                n = DOM.add(tb, 'tr');\r
                                                n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});\r
                },\r
 \r
                _addToolbars : function(c, o) {\r
-                       var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a;\r
+                       var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup;\r
 \r
-                       a = s.theme_advanced_toolbar_align.toLowerCase();\r
-                       a = 'mce' + t._ufirst(a);\r
+                       toolbarGroup = cf.createToolbarGroup('toolbargroup', {\r
+                               'name': ed.getLang('advanced.toolbar'),\r
+                               'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar')\r
+                       });\r
 \r
-                       n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a});\r
+                       t.toolbarGroup = toolbarGroup;\r
 \r
-                       if (!ed.getParam('accessibility_focus'))\r
-                               h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));\r
+                       a = s.theme_advanced_toolbar_align.toLowerCase();\r
+                       a = 'mce' + t._ufirst(a);\r
 \r
-                       h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->'));\r
+                       n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"});\r
 \r
                        // Create toolbar and add the controls\r
                        for (i=1; (v = s['theme_advanced_buttons' + i]); i++) {\r
                                        v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v;\r
 \r
                                t._addControls(v, tb);\r
-\r
-                               //n.appendChild(n = tb.render());\r
-                               h.push(tb.renderHTML());\r
+                               toolbarGroup.add(tb);\r
 \r
                                o.deltaHeight -= s.theme_advanced_row_height;\r
                        }\r
-\r
+                       h.push(toolbarGroup.renderHTML());\r
                        h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));\r
                        DOM.setHTML(n, h.join(''));\r
                },\r
                        var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;\r
 \r
                        n = DOM.add(tb, 'tr');\r
-                       n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});\r
-                       n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : '&#160;');\r
-                       DOM.add(n, 'a', {href : '#', accesskey : 'x'});\r
+                       n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); \r
+                       n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'});\r
+                       if (s.theme_advanced_path) {\r
+                               DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path'));\r
+                               DOM.add(n, 'span', {}, ': ');\r
+                       } else {\r
+                               DOM.add(n, 'span', {}, '&#160;');\r
+                       }\r
+                       \r
 \r
                        if (s.theme_advanced_resizing) {\r
-                               DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'});\r
+                               DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"});\r
 \r
                                if (s.theme_advanced_resizing_use_cookie) {\r
                                        ed.onPostRender.add(function() {\r
                        n = tb = null;\r
                },\r
 \r
+               _updateUndoStatus : function(ed) {\r
+                       var cm = ed.controlManager, um = ed.undoManager;\r
+\r
+                       cm.setDisabled('undo', !um.hasUndo() && !um.typing);\r
+                       cm.setDisabled('redo', !um.hasRedo());\r
+               },\r
+\r
                _nodeChanged : function(ed, cm, n, co, ob) {\r
-                       var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches;\r
+                       var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches;\r
 \r
                        tinymce.each(t.stateControls, function(c) {\r
                                cm.setActive(c, ed.queryCommandState(t.controls[c][1]));\r
                        };\r
 \r
                        cm.setActive('visualaid', ed.hasVisual);\r
-                       cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);\r
-                       cm.setDisabled('redo', !ed.undoManager.hasRedo());\r
+                       t._updateUndoStatus(ed);\r
                        cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));\r
 \r
                        p = getParent('A');\r
                        }\r
 \r
                        if (c = cm.get('anchor')) {\r
-                               c.setActive(!!p && p.name);\r
+                               c.setActive(!co && !!p && p.name);\r
                        }\r
 \r
                        p = getParent('IMG');\r
                        if (c = cm.get('image'))\r
-                               c.setActive(!!p && n.className.indexOf('mceItem') == -1);\r
+                               c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1);\r
 \r
                        if (c = cm.get('styleselect')) {\r
                                t._importClasses();\r
                                if (n.nodeName === 'SPAN') {\r
                                        if (!cl && n.className)\r
                                                cl = n.className;\r
+                               }\r
 \r
+                               if (ed.dom.is(n, s.theme_advanced_font_selector)) {\r
                                        if (!fz && n.style.fontSize)\r
                                                fz = n.style.fontSize;\r
 \r
                                        if (!fn && n.style.fontFamily)\r
                                                fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();\r
+                                       \r
+                                       if (!fc && n.style.color)\r
+                                               fc = n.style.color;\r
+\r
+                                       if (!bc && n.style.backgroundColor)\r
+                                               bc = n.style.backgroundColor;\r
                                }\r
 \r
                                return false;\r
                                                return true;\r
                                });\r
                        }\r
+                       \r
+                       if (s.theme_advanced_show_current_color) {\r
+                               function updateColor(controlId, color) {\r
+                                       if (c = cm.get(controlId)) {\r
+                                               if (!color)\r
+                                                       color = c.settings.default_color;\r
+                                               if (color !== c.value) {\r
+                                                       c.displayColor(color);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               updateColor('forecolor', fc);\r
+                               updateColor('backcolor', bc);\r
+                       }\r
+\r
+                       if (s.theme_advanced_show_current_color) {\r
+                               function updateColor(controlId, color) {\r
+                                       if (c = cm.get(controlId)) {\r
+                                               if (!color)\r
+                                                       color = c.settings.default_color;\r
+                                               if (color !== c.value) {\r
+                                                       c.displayColor(color);\r
+                                               }\r
+                                       }\r
+                               };\r
+\r
+                               updateColor('forecolor', fc);\r
+                               updateColor('backcolor', bc);\r
+                       }\r
 \r
                        if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {\r
                                p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});\r
+\r
+                               if (t.statusKeyboardNavigation) {\r
+                                       t.statusKeyboardNavigation.destroy();\r
+                                       t.statusKeyboardNavigation = null;\r
+                               }\r
+\r
                                DOM.setHTML(p, '');\r
 \r
                                getParent(function(n) {\r
                                        var na = n.nodeName.toLowerCase(), u, pi, ti = '';\r
 \r
-                                       /*if (n.getAttribute('_mce_bogus'))\r
-                                               return;\r
-*/\r
-                                       // Ignore non element and hidden elements\r
-                                       if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))\r
+                                       // Ignore non element and bogus/hidden elements\r
+                                       if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))\r
                                                return;\r
 \r
-                                       // Fake name\r
-                                       if (v = DOM.getAttrib(n, 'mce_name'))\r
-                                               na = v;\r
-\r
                                        // Handle prefix\r
                                        if (tinymce.isIE && n.scopeName !== 'HTML')\r
                                                na = n.scopeName + ':' + na;\r
                                        na = na.name;\r
 \r
                                        //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');";\r
-                                       pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);\r
+                                       pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);\r
 \r
                                        if (p.hasChildNodes()) {\r
-                                               p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild);\r
+                                               p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild);\r
                                                p.insertBefore(pi, p.firstChild);\r
                                        } else\r
                                                p.appendChild(pi);\r
                                }, ed.getBody());\r
+\r
+                               if (DOM.select('a', p).length > 0) {\r
+                                       t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({\r
+                                               root: ed.id + "_path_row",\r
+                                               items: DOM.select('a', p),\r
+                                               excludeFromTabOrder: true,\r
+                                               onCancel: function() {\r
+                                                       ed.focus();\r
+                                               }\r
+                                       }, DOM);\r
+                               }\r
                        }\r
                },\r
 \r
                        });\r
                },\r
 \r
+               _mceShortcuts : function() {\r
+                       var ed = this.editor;\r
+                       ed.windowManager.open({\r
+                               url: this.url + '/shortcuts.htm',\r
+                               width: 480,\r
+                               height: 380,\r
+                               inline: true\r
+                       }, {\r
+                               theme_url: this.url\r
+                       });\r
+               },\r
+\r
                _mceColorPicker : function(u, v) {\r
                        var ed = this.editor;\r
 \r
        });\r
 \r
        tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);\r
-}(tinymce));
\ No newline at end of file
+}(tinymce));\r