* 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
\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
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
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
});\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
'[',']','^','_','`',\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
- 'Œ','œ','Ŵ','Ŷ','ŵ','ŷ','‚',\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
+ 'Ŷ(LATIN CAPITAL LETTER Y WITH CIRCUMFLEX)','ŵ(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, '&' ), '"' +\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
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
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