JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.2
[ckeditor.git] / _source / plugins / specialchar / dialogs / specialchar.js
index 995436d..597f7e1 100644 (file)
@@ -9,7 +9,8 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
         * Simulate "this" of a dialog for non-dialog events.\r
         * @type {CKEDITOR.dialog}\r
         */\r
-       var dialog;\r
+       var dialog,\r
+               lang = editor.lang.specialChar;\r
        var onChoice = function( evt )\r
        {\r
                var target, value;\r
@@ -83,33 +84,6 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
 \r
                switch ( keystroke )\r
                {\r
-                       // RIGHT-ARROW\r
-                       case 39 :\r
-                               // relative is TD\r
-                               if ( ( relative = element.getParent().getNext() ) )\r
-                               {\r
-                                       nodeToMove = relative.getChild( 0 );\r
-                                       if ( nodeToMove.type == 1 )\r
-                                       {\r
-                                               nodeToMove.focus();\r
-                                               onBlur( null, element );\r
-                                               onFocus( null, nodeToMove );\r
-                                       }\r
-                               }\r
-                               ev.preventDefault();\r
-                               break;\r
-                       // LEFT-ARROW\r
-                       case 37 :\r
-                               // relative is TD\r
-                               if ( ( relative = element.getParent().getPrevious() ) )\r
-                               {\r
-                                       nodeToMove = relative.getChild( 0 );\r
-                                       nodeToMove.focus();\r
-                                       onBlur( null, element );\r
-                                       onFocus( null, nodeToMove );\r
-                               }\r
-                               ev.preventDefault();\r
-                               break;\r
                        // UP-ARROW\r
                        case 38 :\r
                                // relative is TR\r
@@ -143,6 +117,9 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                onChoice( { data: ev } );\r
                                ev.preventDefault();\r
                                break;\r
+\r
+                       // RIGHT-ARROW\r
+                       case 39 :\r
                        // TAB\r
                        case 9 :\r
                                // relative is TD\r
@@ -174,6 +151,9 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                onBlur( null, element );\r
                                }\r
                                break;\r
+\r
+                       // LEFT-ARROW\r
+                       case 37 :\r
                        // SHIFT + TAB\r
                        case CKEDITOR.SHIFT + 9 :\r
                                // relative is TD\r
@@ -204,7 +184,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
        });\r
 \r
        return {\r
-               title : editor.lang.specialChar.title,\r
+               title : lang.title,\r
                minWidth : 430,\r
                minHeight : 280,\r
                buttons : [ CKEDITOR.dialog.cancelButton ],\r
@@ -219,51 +199,81 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                '[',']','^','_','`',\r
                                'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',\r
                                'q','r','s','t','u','v','w','x','y','z',\r
-                               '{','|','}','~','€','‘','’','’','“',\r
-                               '”','–','—','¡','¢','£',\r
-                               '¤','¥','¦','§','¨','©','ª',\r
-                               '«','¬','®','¯','°','±','²',\r
-                               '³','´','µ','¶','·','¸',\r
-                               '¹','º','»','¼','½','¾',\r
-                               '¿','À','Á','Â','Ã','Ä',\r
-                               'Å','Æ','Ç','È','É','Ê',\r
-                               'Ë','Ì','Í','Î','Ï','Ð',\r
-                               'Ñ','Ò','Ó','Ô','Õ','Ö',\r
-                               '×','Ø','Ù','Ú','Û','Ü',\r
-                               'Ý','Þ','ß','à','á','â',\r
-                               'ã','ä','å','æ','ç','è',\r
-                               'é','ê','ë','ì','í','î',\r
-                               'ï','ð','ñ','ò','ó','ô',\r
-                               'õ','ö','÷','ø','ù','ú',\r
-                               'û','ü','ü','ý','þ','ÿ',\r
-                               'Œ','œ','Ŵ','&#374','&#373','ŷ','‚',\r
-                               '‛','„','…','™','►','•',\r
-                               '→','⇒','⇔','♦','≈'\r
+                               '{','|','}','~','€(EURO SIGN)','‘(LEFT SINGLE QUOTATION MARK)','’(RIGHT SINGLE QUOTATION MARK)','“(LEFT DOUBLE QUOTATION MARK)',\r
+                               '”(RIGHT DOUBLE QUOTATION MARK)','–(EN DASH)','—(EM DASH)','¡(INVERTED EXCLAMATION MARK)','¢(CENT SIGN)','£(POUND SIGN)',\r
+                               '¤(CURRENCY SIGN)','¥(YEN SIGN)','¦(BROKEN BAR)','§(SECTION SIGN)','¨(DIAERESIS)','©(COPYRIGHT SIGN)','ª(FEMININE ORDINAL INDICATOR)',\r
+                               '«(LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)','¬(NOT SIGN)','®(REGISTERED SIGN)','¯(MACRON)','°(DEGREE SIGN)','±(PLUS-MINUS SIGN)','²(SUPERSCRIPT TWO)',\r
+                               '³(SUPERSCRIPT THREE)','´(ACUTE ACCENT)','µ(MICRO SIGN)','¶(PILCROW SIGN)','·(MIDDLE DOT)','¸(CEDILLA)',\r
+                               '¹(SUPERSCRIPT ONE)','º(MASCULINE ORDINAL INDICATOR)','»(RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)','¼(VULGAR FRACTION ONE QUARTER)','½(VULGAR FRACTION ONE HALF)','¾(VULGAR FRACTION THREE QUARTERS)',\r
+                               '¿(INVERTED QUESTION MARK)','À(LATIN CAPITAL LETTER A WITH GRAVE)','Á(LATIN CAPITAL LETTER A WITH ACUTE)','Â(LATIN CAPITAL LETTER A WITH CIRCUMFLEX)','Ã(LATIN CAPITAL LETTER A WITH TILDE)','Ä(LATIN CAPITAL LETTER A WITH DIAERESIS)',\r
+                               'Å(LATIN CAPITAL LETTER A WITH RING ABOVE)','Æ(LATIN CAPITAL LETTER AE)','Ç(LATIN CAPITAL LETTER C WITH CEDILLA)','È(LATIN CAPITAL LETTER E WITH GRAVE)','É(LATIN CAPITAL LETTER E WITH ACUTE)','Ê(LATIN CAPITAL LETTER E WITH CIRCUMFLEX)',\r
+                               'Ë(LATIN CAPITAL LETTER E WITH DIAERESIS)','Ì(LATIN CAPITAL LETTER I WITH GRAVE)','Í(LATIN CAPITAL LETTER I WITH ACUTE)','Î(LATIN CAPITAL LETTER I WITH CIRCUMFLEX)','Ï(LATIN CAPITAL LETTER I WITH DIAERESIS)','Ð(LATIN CAPITAL LETTER ETH)',\r
+                               'Ñ(LATIN CAPITAL LETTER N WITH TILDE)','Ò(LATIN CAPITAL LETTER O WITH GRAVE)','Ó(LATIN CAPITAL LETTER O WITH ACUTE)','Ô(LATIN CAPITAL LETTER O WITH CIRCUMFLEX)','Õ(LATIN CAPITAL LETTER O WITH TILDE)','Ö(LATIN CAPITAL LETTER O WITH DIAERESIS)',\r
+                               '×(MULTIPLICATION SIGN)','Ø(LATIN CAPITAL LETTER O WITH STROKE)','Ù(LATIN CAPITAL LETTER U WITH GRAVE)','Ú(LATIN CAPITAL LETTER U WITH ACUTE)','Û(LATIN CAPITAL LETTER U WITH CIRCUMFLEX)','Ü(LATIN CAPITAL LETTER U WITH DIAERESIS)',\r
+                               'Ý(LATIN CAPITAL LETTER Y WITH ACUTE)','Þ(LATIN CAPITAL LETTER THORN)','ß(LATIN SMALL LETTER SHARP S)','à(LATIN SMALL LETTER A WITH GRAVE)','á(LATIN SMALL LETTER A WITH ACUTE)','â(LATIN SMALL LETTER A WITH CIRCUMFLEX)',\r
+                               'ã(LATIN SMALL LETTER A WITH TILDE)','ä(LATIN SMALL LETTER A WITH DIAERESIS)','å(LATIN SMALL LETTER A WITH RING ABOVE)','æ(LATIN SMALL LETTER AE)','ç(LATIN SMALL LETTER C WITH CEDILLA)','è(LATIN SMALL LETTER E WITH GRAVE)',\r
+                               'é(LATIN SMALL LETTER E WITH ACUTE)','ê(LATIN SMALL LETTER E WITH CIRCUMFLEX)','ë(LATIN SMALL LETTER E WITH DIAERESIS)','ì(LATIN SMALL LETTER I WITH GRAVE)','í(LATIN SMALL LETTER I WITH ACUTE)','î(LATIN SMALL LETTER I WITH CIRCUMFLEX)',\r
+                               'ï(LATIN SMALL LETTER I WITH DIAERESIS)','ð(LATIN SMALL LETTER ETH)','ñ(LATIN SMALL LETTER N WITH TILDE)','ò(LATIN SMALL LETTER O WITH GRAVE)','ó(LATIN SMALL LETTER O WITH ACUTE)','ô(LATIN SMALL LETTER O WITH CIRCUMFLEX)',\r
+                               'õ(LATIN SMALL LETTER O WITH TILDE)','ö(LATIN SMALL LETTER O WITH DIAERESIS)',\r
+                               '÷(DIVISION SIGN)','ø(LATIN SMALL LETTER O WITH STROKE)',\r
+                               'ù(LATIN SMALL LETTER U WITH GRAVE)','ú(LATIN SMALL LETTER U WITH ACUTE)',\r
+                               'û(LATIN SMALL LETTER U WITH CIRCUMFLEX)','ü(LATIN SMALL LETTER U WITH DIAERESIS)',\r
+                               'ü(LATIN SMALL LETTER U WITH DIAERESIS)','ý(LATIN SMALL LETTER Y WITH ACUTE)','þ(LATIN SMALL LETTER THORN)','ÿ(LATIN SMALL LETTER Y WITH DIAERESIS)',\r
+                               'Œ(LATIN CAPITAL LIGATURE OE)',\r
+                               'œ(LATIN SMALL LIGATURE OE)','Ŵ(LATIN CAPITAL LETTER W WITH CIRCUMFLEX)',\r
+                               '&#374(LATIN CAPITAL LETTER Y WITH CIRCUMFLEX)','&#373(LATIN SMALL LETTER W WITH CIRCUMFLEX)',\r
+                               'ŷ(LATIN SMALL LETTER Y WITH CIRCUMFLEX)','‚(SINGLE LOW-9 QUOTATION MARK)',\r
+                               '‛(SINGLE HIGH-REVERSED-9 QUOTATION MARK)','„(DOUBLE LOW-9 QUOTATION MARK)','…(HORIZONTAL ELLIPSIS)',\r
+                               '™(TRADE MARK SIGN)','►(BLACK RIGHT-POINTING POINTER)','•(BULLET)',\r
+                               '→(RIGHTWARDS ARROW)','⇒(RIGHTWARDS DOUBLE ARROW)','⇔(LEFT RIGHT DOUBLE ARROW)','♦(BLACK DIAMOND SUIT)','≈(ALMOST EQUAL TO)'\r
                        ],\r
                onLoad :  function()\r
                {\r
                        var columns = this.definition.charColumns,\r
                                chars = this.definition.chars;\r
 \r
-                       var html = [ '<table style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">' ];\r
+                       var html = [ '<table role="listbox" aria-labelledby="specialchar_table_label"' +\r
+                                                                       ' style="width: 320px; height: 100%; border-collapse: separate;"' +\r
+                                                                       ' align="center" cellspacing="2" cellpadding="2" border="0">' ];\r
+\r
+                       var i = 0,\r
+                               size = chars.length,\r
+                               character,\r
+                               charDesc;\r
 \r
-                       var i = 0 ;\r
-                       while ( i < chars.length )\r
+                       while ( i < size )\r
                        {\r
                                html.push( '<tr>' ) ;\r
 \r
                                for ( var j = 0 ; j < columns ; j++, i++ )\r
                                {\r
-                                       if ( chars[ i ] )\r
+                                       if ( ( character = chars[ i ] ) )\r
                                        {\r
+                                               charDesc = '';\r
+                                               character = character.replace( /\((.*?)\)/, function( match, desc )\r
+                                                       {\r
+                                                               charDesc = desc;\r
+                                                               return '';\r
+                                                       } );\r
+\r
+                                               // Use character in case description unavailable.\r
+                                               charDesc = charDesc || character;\r
+\r
                                                html.push(\r
                                                        '<td class="cke_dark_background" style="cursor: default">' +\r
-                                                       '<a href="javascript: void(0);" style="cursor: inherit; display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="', chars[i].replace( /&/g, '&amp;' ), '"' +\r
+                                                       '<a href="javascript: void(0);" role="option"' +\r
+                                                       ' aria-posinset="' + ( i +1 ) + '"',\r
+                                                       ' aria-setsize="' + size + '"',\r
+                                                       ' aria-labelledby="cke_specialchar_label_' + i + '"',\r
+                                                       ' style="cursor: inherit; display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="', CKEDITOR.tools.htmlEncode( charDesc ), '"' +\r
                                                        ' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydown + ', event, this )"' +\r
                                                        ' onclick="CKEDITOR.tools.callFunction(' + onClick + ', this); return false;"' +\r
                                                        ' tabindex="-1">' +\r
                                                        '<span style="margin: 0 auto;cursor: inherit">' +\r
-                                                       chars[i] +\r
+                                                       character +\r
+                                                       '</span>' +\r
+                                                       '<span class="cke_voice_label" id="cke_specialchar_label_' + i + '">' +\r
+                                                       charDesc +\r
                                                        '</span></a>');\r
                                        }\r
                                        else\r
@@ -274,7 +284,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                html.push( '</tr>' );\r
                        }\r
 \r
-                       html.push( '</tbody></table>' );\r
+                       html.push( '</tbody></table>', '<span id="specialchar_table_label" class="cke_voice_label">' + editor.lang.common.options +'</span>' );\r
 \r
                        this.getContentElement( 'info', 'charContainer' ).getElement().setHtml( html.join( '' ) );\r
                },\r
@@ -300,22 +310,21 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                                onMouseout : onBlur,\r
                                                                focus : function()\r
                                                                {\r
-                                                                       var firstChar = this.getElement().getChild( [0, 0, 0, 0, 0] );\r
+                                                                       var firstChar = this.getElement().getElementsByTag( 'a' ).getItem( 0 );\r
                                                                        setTimeout(function()\r
                                                                        {\r
                                                                                firstChar.focus();\r
                                                                                onFocus( null, firstChar );\r
                                                                        });\r
                                                                },\r
-                                                               // Needed only for webkit.\r
                                                                onShow : function()\r
                                                                {\r
-                                                                       var firstChar = this.getElement().getChild( [0, 0, 0, 0, 0] );\r
-                                                                       setTimeout(function()\r
-                                                                       {\r
-                                                                               firstChar.focus();\r
-                                                                               onFocus( null, firstChar );\r
-                                                                       });\r
+                                                                       var firstChar = this.getElement().getChild( [ 0, 0, 0, 0, 0 ] );\r
+                                                                       setTimeout( function()\r
+                                                                               {\r
+                                                                                       firstChar.focus();\r
+                                                                                       onFocus( null, firstChar );\r
+                                                                               });\r
                                                                },\r
                                                                onLoad : function( event )\r
                                                                {\r