ff07429cb7c8aa5a6347ae9b947e76b36280e6f2
[ckeditor.git] / skins / ckeditor / _source / plugins / a11yhelp / dialogs / a11yhelp.js
1 /*
2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3 For licensing, see LICENSE.html or http://ckeditor.com/license
4 */
5
6 CKEDITOR.dialog.add( 'a11yHelp', function( editor )
7 {
8 var lang = editor.lang.accessibilityHelp,
9 id = CKEDITOR.tools.getNextId();
10
11 // CharCode <-> KeyChar.
12 var keyMap =
13 {
14 8 : "BACKSPACE",
15 9 : "TAB" ,
16 13 : "ENTER" ,
17 16 : "SHIFT" ,
18 17 : "CTRL" ,
19 18 : "ALT" ,
20 19 : "PAUSE" ,
21 20 : "CAPSLOCK" ,
22 27 : "ESCAPE" ,
23 33 : "PAGE UP" ,
24 34 : "PAGE DOWN" ,
25 35 : "END" ,
26 36 : "HOME" ,
27 37 : "LEFT ARROW" ,
28 38 : "UP ARROW" ,
29 39 : "RIGHT ARROW" ,
30 40 : "DOWN ARROW" ,
31 45 : "INSERT" ,
32 46 : "DELETE" ,
33 91 : "LEFT WINDOW KEY" ,
34 92 : "RIGHT WINDOW KEY" ,
35 93 : "SELECT KEY" ,
36 96 : "NUMPAD 0" ,
37 97 : "NUMPAD 1" ,
38 98 : "NUMPAD 2" ,
39 99 : "NUMPAD 3" ,
40 100 : "NUMPAD 4" ,
41 101 : "NUMPAD 5" ,
42 102 : "NUMPAD 6" ,
43 103 : "NUMPAD 7" ,
44 104 : "NUMPAD 8" ,
45 105 : "NUMPAD 9" ,
46 106 : "MULTIPLY" ,
47 107 : "ADD" ,
48 109 : "SUBTRACT" ,
49 110 : "DECIMAL POINT" ,
50 111 : "DIVIDE" ,
51 112 : "F1" ,
52 113 : "F2" ,
53 114 : "F3" ,
54 115 : "F4" ,
55 116 : "F5" ,
56 117 : "F6" ,
57 118 : "F7" ,
58 119 : "F8" ,
59 120 : "F9" ,
60 121 : "F10" ,
61 122 : "F11" ,
62 123 : "F12" ,
63 144 : "NUM LOCK" ,
64 145 : "SCROLL LOCK" ,
65 186 : "SEMI-COLON" ,
66 187 : "EQUAL SIGN" ,
67 188 : "COMMA" ,
68 189 : "DASH" ,
69 190 : "PERIOD" ,
70 191 : "FORWARD SLASH" ,
71 192 : "GRAVE ACCENT" ,
72 219 : "OPEN BRACKET" ,
73 220 : "BACK SLASH" ,
74 221 : "CLOSE BRAKET" ,
75 222 : "SINGLE QUOTE"
76 };
77
78 // Modifier keys override.
79 keyMap[ CKEDITOR.ALT ] = 'ALT';
80 keyMap[ CKEDITOR.SHIFT ] = 'SHIFT';
81 keyMap[ CKEDITOR.CTRL ] = 'CTRL';
82
83 // Sort in desc.
84 var modifiers = [ CKEDITOR.ALT, CKEDITOR.SHIFT, CKEDITOR.CTRL ];
85
86 function representKeyStroke( keystroke )
87 {
88 var quotient,
89 modifier,
90 presentation = [];
91
92 for ( var i = 0; i < modifiers.length; i++ )
93 {
94 modifier = modifiers[ i ];
95 quotient = keystroke / modifiers[ i ];
96 if ( quotient > 1 && quotient <= 2 )
97 {
98 keystroke -= modifier;
99 presentation.push( keyMap[ modifier ] );
100 }
101 }
102
103 presentation.push( keyMap[ keystroke ]
104 || String.fromCharCode( keystroke ) );
105
106 return presentation.join( '+' );
107 }
108
109 var variablesPattern = /\$\{(.*?)\}/g;
110 function replaceVariables( match, name )
111 {
112 var keystrokes = editor.config.keystrokes,
113 definition,
114 length = keystrokes.length;
115
116 for ( var i = 0; i < length; i++ )
117 {
118 definition = keystrokes[ i ];
119 if ( definition[ 1 ] == name )
120 break;
121 }
122 return representKeyStroke( definition[ 0 ] );
123 }
124
125 // Create the help list directly from lang file entries.
126 function buildHelpContents()
127 {
128 var pageTpl = '<div class="cke_accessibility_legend" role="document" aria-labelledby="' + id + '_arialbl" tabIndex="-1">%1</div>' +
129 '<span id="' + id + '_arialbl" class="cke_voice_label">' + lang.contents + ' </span>',
130 sectionTpl = '<h1>%1</h1><dl>%2</dl>',
131 itemTpl = '<dt>%1</dt><dd>%2</dd>';
132
133 var pageHtml = [],
134 sections = lang.legend,
135 sectionLength = sections.length;
136
137 for ( var i = 0; i < sectionLength; i++ )
138 {
139 var section = sections[ i ],
140 sectionHtml = [],
141 items = section.items,
142 itemsLength = items.length;
143
144 for ( var j = 0; j < itemsLength; j++ )
145 {
146 var item = items[ j ],
147 itemHtml;
148 itemHtml = itemTpl.replace( '%1', item.name ).
149 replace( '%2', item.legend.replace( variablesPattern, replaceVariables ) );
150 sectionHtml.push( itemHtml );
151 }
152
153 pageHtml.push( sectionTpl.replace( '%1', section.name ).replace( '%2', sectionHtml.join( '' ) ) );
154 }
155
156 return pageTpl.replace( '%1', pageHtml.join( '' ) );
157 }
158
159 return {
160 title : lang.title,
161 minWidth : 600,
162 minHeight : 400,
163 contents : [
164 {
165 id : 'info',
166 label : editor.lang.common.generalTab,
167 expand : true,
168 elements :
169 [
170 {
171 type : 'html',
172 id : 'legends',
173 style : 'white-space:normal;',
174 focus : function() {},
175 html : buildHelpContents() +
176 '<style type="text/css">' +
177 '.cke_accessibility_legend' +
178 '{' +
179 'width:600px;' +
180 'height:400px;' +
181 'padding-right:5px;' +
182 'overflow-y:auto;' +
183 'overflow-x:hidden;' +
184 '}' +
185 // Some adjustments are to be done for IE6 and Quirks to work "properly" (#5757)
186 '.cke_browser_quirks .cke_accessibility_legend,' +
187 '.cke_browser_ie6 .cke_accessibility_legend' +
188 '{' +
189 'height:390px' +
190 '}' +
191 // Override non-wrapping white-space rule in reset css.
192 '.cke_accessibility_legend *' +
193 '{' +
194 'white-space:normal;' +
195 '}' +
196 '.cke_accessibility_legend h1' +
197 '{' +
198 'font-size: 20px;' +
199 'border-bottom: 1px solid #AAA;' +
200 'margin: 5px 0px 15px;' +
201 '}' +
202 '.cke_accessibility_legend dl' +
203 '{' +
204 'margin-left: 5px;' +
205 '}' +
206 '.cke_accessibility_legend dt' +
207 '{' +
208 'font-size: 13px;' +
209 'font-weight: bold;' +
210 '}' +
211 '.cke_accessibility_legend dd' +
212 '{' +
213 'margin:10px' +
214 '}' +
215 '</style>'
216 }
217 ]
218 }
219 ],
220 buttons : [ CKEDITOR.dialog.cancelButton ]
221 };
222 });