JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.5
[ckeditor.git] / _source / plugins / specialchar / dialogs / specialchar.js
index b419cf5..01b0f86 100644 (file)
@@ -12,29 +12,6 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
        var dialog,\r
                lang = editor.lang.specialChar;\r
 \r
-       var insertSpecialChar = function ( specialChar )\r
-       {\r
-               var selection = editor.getSelection(),\r
-                       ranges    = selection.getRanges(),\r
-                       range, textNode;\r
-\r
-               editor.fire( 'saveSnapshot' );\r
-\r
-               for ( var i = 0, len = ranges.length ; i < len ; i++ )\r
-               {\r
-                       range = ranges[ i ];\r
-                       range.deleteContents();\r
-\r
-                       textNode =  CKEDITOR.dom.element.createFromHtml( specialChar );\r
-                       range.insertNode( textNode );\r
-               }\r
-\r
-               range.moveToPosition( textNode, CKEDITOR.POSITION_AFTER_END );\r
-               range.select();\r
-\r
-               editor.fire( 'saveSnapshot' );\r
-       };\r
-\r
        var onChoice = function( evt )\r
        {\r
                var target, value;\r
@@ -48,11 +25,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                        target.removeClass( "cke_light_background" );\r
                        dialog.hide();\r
 \r
-                       // Firefox has bug on insert chars into a element use its own API. (#5170)\r
-                       if ( CKEDITOR.env.gecko )\r
-                               insertSpecialChar( value );\r
-                       else\r
-                               editor.insertHtml( value );\r
+                       editor.insertHtml( value );\r
                }\r
        };\r
 \r
@@ -109,8 +82,8 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                // Get an Anchor element.\r
                var element = ev.getTarget();\r
                var relative, nodeToMove;\r
-               var keystroke = ev.getKeystroke();\r
-               var rtl = editor.lang.dir == 'rtl';\r
+               var keystroke = ev.getKeystroke(),\r
+                       rtl = editor.lang.dir == 'rtl';\r
 \r
                switch ( keystroke )\r
                {\r
@@ -219,50 +192,14 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                minHeight : 280,\r
                buttons : [ CKEDITOR.dialog.cancelButton ],\r
                charColumns : 17,\r
-               chars :\r
-                       [\r
-                               '!','&quot;','#','$','%','&amp;',"'",'(',')','*','+','-','.','/',\r
-                               '0','1','2','3','4','5','6','7','8','9',':',';',\r
-                               '&lt;','=','&gt;','?','@',\r
-                               'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',\r
-                               'P','Q','R','S','T','U','V','W','X','Y','Z',\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
-                               '{','|','}','~','&euro;(EURO SIGN)','&lsquo;(LEFT SINGLE QUOTATION MARK)','&rsquo;(RIGHT SINGLE QUOTATION MARK)','&ldquo;(LEFT DOUBLE QUOTATION MARK)',\r
-                               '&rdquo;(RIGHT DOUBLE QUOTATION MARK)','&ndash;(EN DASH)','&mdash;(EM DASH)','&iexcl;(INVERTED EXCLAMATION MARK)','&cent;(CENT SIGN)','&pound;(POUND SIGN)',\r
-                               '&curren;(CURRENCY SIGN)','&yen;(YEN SIGN)','&brvbar;(BROKEN BAR)','&sect;(SECTION SIGN)','&uml;(DIAERESIS)','&copy;(COPYRIGHT SIGN)','&ordf;(FEMININE ORDINAL INDICATOR)',\r
-                               '&laquo;(LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)','&not;(NOT SIGN)','&reg;(REGISTERED SIGN)','&macr;(MACRON)','&deg;(DEGREE SIGN)','&plusmn;(PLUS-MINUS SIGN)','&sup2;(SUPERSCRIPT TWO)',\r
-                               '&sup3;(SUPERSCRIPT THREE)','&acute;(ACUTE ACCENT)','&micro;(MICRO SIGN)','&para;(PILCROW SIGN)','&middot;(MIDDLE DOT)','&cedil;(CEDILLA)',\r
-                               '&sup1;(SUPERSCRIPT ONE)','&ordm;(MASCULINE ORDINAL INDICATOR)','&raquo;(RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)','&frac14;(VULGAR FRACTION ONE QUARTER)','&frac12;(VULGAR FRACTION ONE HALF)','&frac34;(VULGAR FRACTION THREE QUARTERS)',\r
-                               '&iquest;(INVERTED QUESTION MARK)','&Agrave;(LATIN CAPITAL LETTER A WITH GRAVE)','&Aacute;(LATIN CAPITAL LETTER A WITH ACUTE)','&Acirc;(LATIN CAPITAL LETTER A WITH CIRCUMFLEX)','&Atilde;(LATIN CAPITAL LETTER A WITH TILDE)','&Auml;(LATIN CAPITAL LETTER A WITH DIAERESIS)',\r
-                               '&Aring;(LATIN CAPITAL LETTER A WITH RING ABOVE)','&AElig;(LATIN CAPITAL LETTER AE)','&Ccedil;(LATIN CAPITAL LETTER C WITH CEDILLA)','&Egrave;(LATIN CAPITAL LETTER E WITH GRAVE)','&Eacute;(LATIN CAPITAL LETTER E WITH ACUTE)','&Ecirc;(LATIN CAPITAL LETTER E WITH CIRCUMFLEX)',\r
-                               '&Euml;(LATIN CAPITAL LETTER E WITH DIAERESIS)','&Igrave;(LATIN CAPITAL LETTER I WITH GRAVE)','&Iacute;(LATIN CAPITAL LETTER I WITH ACUTE)','&Icirc;(LATIN CAPITAL LETTER I WITH CIRCUMFLEX)','&Iuml;(LATIN CAPITAL LETTER I WITH DIAERESIS)','&ETH;(LATIN CAPITAL LETTER ETH)',\r
-                               '&Ntilde;(LATIN CAPITAL LETTER N WITH TILDE)','&Ograve;(LATIN CAPITAL LETTER O WITH GRAVE)','&Oacute;(LATIN CAPITAL LETTER O WITH ACUTE)','&Ocirc;(LATIN CAPITAL LETTER O WITH CIRCUMFLEX)','&Otilde;(LATIN CAPITAL LETTER O WITH TILDE)','&Ouml;(LATIN CAPITAL LETTER O WITH DIAERESIS)',\r
-                               '&times;(MULTIPLICATION SIGN)','&Oslash;(LATIN CAPITAL LETTER O WITH STROKE)','&Ugrave;(LATIN CAPITAL LETTER U WITH GRAVE)','&Uacute;(LATIN CAPITAL LETTER U WITH ACUTE)','&Ucirc;(LATIN CAPITAL LETTER U WITH CIRCUMFLEX)','&Uuml;(LATIN CAPITAL LETTER U WITH DIAERESIS)',\r
-                               '&Yacute;(LATIN CAPITAL LETTER Y WITH ACUTE)','&THORN;(LATIN CAPITAL LETTER THORN)','&szlig;(LATIN SMALL LETTER SHARP S)','&agrave;(LATIN SMALL LETTER A WITH GRAVE)','&aacute;(LATIN SMALL LETTER A WITH ACUTE)','&acirc;(LATIN SMALL LETTER A WITH CIRCUMFLEX)',\r
-                               '&atilde;(LATIN SMALL LETTER A WITH TILDE)','&auml;(LATIN SMALL LETTER A WITH DIAERESIS)','&aring;(LATIN SMALL LETTER A WITH RING ABOVE)','&aelig;(LATIN SMALL LETTER AE)','&ccedil;(LATIN SMALL LETTER C WITH CEDILLA)','&egrave;(LATIN SMALL LETTER E WITH GRAVE)',\r
-                               '&eacute;(LATIN SMALL LETTER E WITH ACUTE)','&ecirc;(LATIN SMALL LETTER E WITH CIRCUMFLEX)','&euml;(LATIN SMALL LETTER E WITH DIAERESIS)','&igrave;(LATIN SMALL LETTER I WITH GRAVE)','&iacute;(LATIN SMALL LETTER I WITH ACUTE)','&icirc;(LATIN SMALL LETTER I WITH CIRCUMFLEX)',\r
-                               '&iuml;(LATIN SMALL LETTER I WITH DIAERESIS)','&eth;(LATIN SMALL LETTER ETH)','&ntilde;(LATIN SMALL LETTER N WITH TILDE)','&ograve;(LATIN SMALL LETTER O WITH GRAVE)','&oacute;(LATIN SMALL LETTER O WITH ACUTE)','&ocirc;(LATIN SMALL LETTER O WITH CIRCUMFLEX)',\r
-                               '&otilde;(LATIN SMALL LETTER O WITH TILDE)','&ouml;(LATIN SMALL LETTER O WITH DIAERESIS)',\r
-                               '&divide;(DIVISION SIGN)','&oslash;(LATIN SMALL LETTER O WITH STROKE)',\r
-                               '&ugrave;(LATIN SMALL LETTER U WITH GRAVE)','&uacute;(LATIN SMALL LETTER U WITH ACUTE)',\r
-                               '&ucirc;(LATIN SMALL LETTER U WITH CIRCUMFLEX)','&uuml;(LATIN SMALL LETTER U WITH DIAERESIS)',\r
-                               '&uuml;(LATIN SMALL LETTER U WITH DIAERESIS)','&yacute;(LATIN SMALL LETTER Y WITH ACUTE)','&thorn;(LATIN SMALL LETTER THORN)','&yuml;(LATIN SMALL LETTER Y WITH DIAERESIS)',\r
-                               '&OElig;(LATIN CAPITAL LIGATURE OE)',\r
-                               '&oelig;(LATIN SMALL LIGATURE OE)','&#372;(LATIN CAPITAL LETTER W WITH CIRCUMFLEX)',\r
-                               '&#374(LATIN CAPITAL LETTER Y WITH CIRCUMFLEX)','&#373(LATIN SMALL LETTER W WITH CIRCUMFLEX)',\r
-                               '&#375;(LATIN SMALL LETTER Y WITH CIRCUMFLEX)','&sbquo;(SINGLE LOW-9 QUOTATION MARK)',\r
-                               '&#8219;(SINGLE HIGH-REVERSED-9 QUOTATION MARK)','&bdquo;(DOUBLE LOW-9 QUOTATION MARK)','&hellip;(HORIZONTAL ELLIPSIS)',\r
-                               '&trade;(TRADE MARK SIGN)','&#9658;(BLACK RIGHT-POINTING POINTER)','&bull;(BULLET)',\r
-                               '&rarr;(RIGHTWARDS ARROW)','&rArr;(RIGHTWARDS DOUBLE ARROW)','&hArr;(LEFT RIGHT DOUBLE ARROW)','&diams;(BLACK DIAMOND SUIT)','&asymp;(ALMOST EQUAL TO)'\r
-                       ],\r
                onLoad :  function()\r
                {\r
                        var columns = this.definition.charColumns,\r
-                               chars = this.definition.chars;\r
+                               extraChars = editor.config.extraSpecialChars,\r
+                               chars = editor.config.specialChars;\r
 \r
-                       var html = [ '<table role="listbox" aria-labelledby="specialchar_table_label"' +\r
+                       var charsTableLabel =  CKEDITOR.tools.getNextId() + '_specialchar_table_label';\r
+                       var html = [ '<table role="listbox" aria-labelledby="' + charsTableLabel + '"' +\r
                                                                        ' style="width: 320px; height: 100%; border-collapse: separate;"' +\r
                                                                        ' align="center" cellspacing="2" cellpadding="2" border="0">' ];\r
 \r
@@ -280,21 +217,28 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                        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
+                                               if ( character instanceof Array )\r
+                                               {\r
+                                                       charDesc = character[ 1 ];\r
+                                                       character = character[ 0 ];\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       var _tmpName = character.toLowerCase().replace( '&', '' ).replace( ';', '' ).replace( '#', '' );\r
+\r
+                                                       // Use character in case description unavailable.\r
+                                                       charDesc = lang[ _tmpName ] || character;\r
+                                               }\r
+\r
+                                               var charLabelId =  'cke_specialchar_label_' + i + '_' + CKEDITOR.tools.getNextNumber();\r
 \r
                                                html.push(\r
                                                        '<td class="cke_dark_background" style="cursor: default" role="presentation">' +\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
+                                                       ' aria-labelledby="' + charLabelId + '"',\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
@@ -302,7 +246,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                        '<span style="margin: 0 auto;cursor: inherit">' +\r
                                                        character +\r
                                                        '</span>' +\r
-                                                       '<span class="cke_voice_label" id="cke_specialchar_label_' + i + '">' +\r
+                                                       '<span class="cke_voice_label" id="' + charLabelId + '">' +\r
                                                        charDesc +\r
                                                        '</span></a>');\r
                                        }\r
@@ -314,7 +258,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                html.push( '</tr>' );\r
                        }\r
 \r
-                       html.push( '</tbody></table>', '<span id="specialchar_table_label" class="cke_voice_label">' + lang.options +'</span>' );\r
+                       html.push( '</tbody></table>', '<span id="' + charsTableLabel + '" class="cke_voice_label">' + lang.options +'</span>' );\r
 \r
                        this.getContentElement( 'info', 'charContainer' ).getElement().setHtml( html.join( '' ) );\r
                },\r
@@ -341,11 +285,11 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                                focus : function()\r
                                                                {\r
                                                                        var firstChar = this.getElement().getElementsByTag( 'a' ).getItem( 0 );\r
-                                                                       setTimeout(function()\r
+                                                                       setTimeout( function()\r
                                                                        {\r
                                                                                firstChar.focus();\r
                                                                                onFocus( null, firstChar );\r
-                                                                       });\r
+                                                                       }, 0 );\r
                                                                },\r
                                                                onShow : function()\r
                                                                {\r
@@ -354,7 +298,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                                                {\r
                                                                                        firstChar.focus();\r
                                                                                        onFocus( null, firstChar );\r
-                                                                               });\r
+                                                                               }, 0 );\r
                                                                },\r
                                                                onLoad : function( event )\r
                                                                {\r