JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.5.3
[ckeditor.git] / _source / plugins / scayt / dialogs / options.js
1 /*\r
2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 CKEDITOR.dialog.add( 'scaytcheck', function( editor )\r
7 {\r
8         var firstLoad = true,\r
9                 captions,\r
10                 doc = CKEDITOR.document,\r
11                 editorName = editor.name,\r
12                 tags = CKEDITOR.plugins.scayt.getUiTabs( editor ),\r
13                 i,\r
14                 contents = [],\r
15                 userDicActive = 0,\r
16                 dic_buttons = [\r
17                         // [0] contains buttons for creating\r
18                         "dic_create_" + editorName + ",dic_restore_" + editorName,\r
19                         // [1] contains buton for manipulation\r
20                         "dic_rename_" + editorName + ",dic_delete_" + editorName\r
21                 ],\r
22                 optionsIds = [ 'mixedCase', 'mixedWithDigits', 'allCaps', 'ignoreDomainNames' ];\r
23 \r
24         // common operations\r
25 \r
26         function getBOMAllOptions()\r
27         {\r
28                 if (typeof document.forms["optionsbar_" + editorName] != "undefined")\r
29                         return document.forms["optionsbar_" + editorName]["options"];\r
30                 return [];\r
31         }\r
32         function getBOMAllLangs()\r
33         {\r
34                 if (typeof document.forms["languagesbar_" + editorName] != "undefined")\r
35                         return document.forms["languagesbar_" + editorName]["scayt_lang"];\r
36                 return [];\r
37         }\r
38 \r
39         function setCheckedValue( radioObj, newValue )\r
40         {\r
41                 if ( !radioObj )\r
42                         return;\r
43                 var radioLength = radioObj.length;\r
44                 if ( radioLength == undefined )\r
45                 {\r
46                         radioObj.checked = radioObj.value == newValue.toString();\r
47                         return;\r
48                 }\r
49                 for ( var i = 0; i < radioLength; i++ )\r
50                 {\r
51                         radioObj[i].checked = false;\r
52                         if ( radioObj[i].value == newValue.toString() )\r
53                                 radioObj[i].checked = true;\r
54                 }\r
55         }\r
56 \r
57         var lang = editor.lang.scayt;\r
58         var tags_contents =  [\r
59                                 {\r
60                                         id : 'options',\r
61                                         label : lang.optionsTab,\r
62                                         elements : [\r
63                                                 {\r
64                                                         type : 'html',\r
65                                                         id : 'options',\r
66                                                         html :  '<form name="optionsbar_' + editorName + '"><div class="inner_options">' +\r
67                                                                         '       <div class="messagebox"></div>' +\r
68                                                                         '       <div style="display:none;">' +\r
69                                                                         '               <input type="checkbox" name="options"  id="allCaps_' + editorName + '" />' +\r
70                                                                         '               <label for="allCaps" id="label_allCaps_' + editorName + '"></label>' +\r
71                                                                         '       </div>' +\r
72                                                                         '       <div style="display:none;">' +\r
73                                                                         '               <input name="options" type="checkbox"  id="ignoreDomainNames_' + editorName + '" />' +\r
74                                                                         '               <label for="ignoreDomainNames" id="label_ignoreDomainNames_' + editorName + '"></label>' +\r
75                                                                         '       </div>' +\r
76                                                                         '       <div style="display:none;">' +\r
77                                                                         '       <input name="options" type="checkbox"  id="mixedCase_' + editorName + '" />' +\r
78                                                                         '               <label for="mixedCase" id="label_mixedCase_' + editorName + '"></label>' +\r
79                                                                         '       </div>' +\r
80                                                                         '       <div style="display:none;">' +\r
81                                                                         '               <input name="options" type="checkbox"  id="mixedWithDigits_' + editorName + '" />' +\r
82                                                                         '               <label for="mixedWithDigits" id="label_mixedWithDigits_' + editorName + '"></label>' +\r
83                                                                         '       </div>' +\r
84                                                                         '</div></form>'\r
85                                                 }\r
86                                         ]\r
87                                 },\r
88                                 {\r
89                                         id : 'langs',\r
90                                         label : lang.languagesTab,\r
91                                         elements : [\r
92                                                 {\r
93                                                         type : 'html',\r
94                                                         id : 'langs',\r
95                                                         html :  '<form name="languagesbar_' + editorName + '"><div class="inner_langs">' +\r
96                                                                         '       <div class="messagebox"></div>  ' +\r
97                                                                         '   <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_' + editorName + '" ></div>' +\r
98                                                                         '   <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_' + editorName + '"></div>' +\r
99                                                                         '</div></form>'\r
100                                                 }\r
101                                         ]\r
102                                 },\r
103                                 {\r
104                                         id : 'dictionaries',\r
105                                         label : lang.dictionariesTab,\r
106                                         elements : [\r
107                                                 {\r
108                                                         type : 'html',\r
109                                                         style: '',\r
110                                                         id : 'dictionaries',\r
111                                                         html :  '<form name="dictionarybar_' + editorName + '"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">' +\r
112                                                                         '       <div style="margin:5px auto; width:80%;white-space:normal; overflow:hidden;" id="dic_message_' + editorName + '"> </div>' +\r
113                                                                         '       <div style="margin:5px auto; width:80%;white-space:normal;"> ' +\r
114                                                                         '       <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>'+\r
115                                                                         '               <span class="cke_dialog_ui_labeled_content" >'+\r
116                                                                         '                       <div class="cke_dialog_ui_input_text">'+\r
117                                                                         '                               <input id="dic_name_' + editorName + '" type="text" class="cke_dialog_ui_input_text"/>'+\r
118                                                                         '               </div></span></div>'+\r
119                                                                         '               <div style="margin:5px auto; width:80%;white-space:normal;">'+\r
120                                                                         '                       <a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_' + editorName + '">'+\r
121                                                                         '                               </a>' +\r
122                                                                         '                       <a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_' + editorName + '">'+\r
123                                                                         '                               </a>' +\r
124                                                                         '                       <a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_' + editorName + '">'+\r
125                                                                         '                               </a>' +\r
126                                                                         '                       <a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_' + editorName + '">'+\r
127                                                                         '                               </a>' +\r
128                                                                         '               </div>' +\r
129                                                                         '       <div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_' + editorName + '"></div>' +\r
130                                                                         '</div></form>'\r
131                                                 }\r
132                                         ]\r
133                                 },\r
134                                 {\r
135                                         id : 'about',\r
136                                         label : lang.aboutTab,\r
137                                         elements : [\r
138                                                 {\r
139                                                         type : 'html',\r
140                                                         id : 'about',\r
141                                                         style : 'margin: 5px 5px;',\r
142                                                         html : '<div id="scayt_about_' + editorName + '"></div>'\r
143                                                 }\r
144                                         ]\r
145                                 }\r
146                         ];\r
147 \r
148         var dialogDefiniton = {\r
149                 title : lang.title,\r
150                 minWidth : 360,\r
151                 minHeight : 220,\r
152                 onShow : function()\r
153                 {\r
154                         var dialog = this;\r
155                         dialog.data = editor.fire( 'scaytDialog', {} );\r
156                         dialog.options = dialog.data.scayt_control.option();\r
157                         dialog.chosed_lang = dialog.sLang = dialog.data.scayt_control.sLang;\r
158 \r
159                         if ( !dialog.data || !dialog.data.scayt || !dialog.data.scayt_control )\r
160                         {\r
161                                 alert( 'Error loading application service' );\r
162                                 dialog.hide();\r
163                                 return;\r
164                         }\r
165 \r
166                         var stop = 0;\r
167                         if ( firstLoad )\r
168                         {\r
169                                 dialog.data.scayt.getCaption( editor.langCode || 'en', function( caps )\r
170                                 {\r
171                                         if ( stop++ > 0 )       // Once only\r
172                                                 return;\r
173                                         captions = caps;\r
174                                         init_with_captions.apply( dialog );\r
175                                         reload.apply( dialog );\r
176                                         firstLoad = false;\r
177                                 });\r
178                         }\r
179                         else\r
180                                 reload.apply( dialog );\r
181 \r
182                         dialog.selectPage( dialog.data.tab );\r
183                 },\r
184                 onOk : function()\r
185                 {\r
186                         var scayt_control =  this.data.scayt_control;\r
187                         scayt_control.option( this.options );\r
188                         // Setup language if it was changed.\r
189                         var csLang = this.chosed_lang;\r
190                         scayt_control.setLang( csLang );\r
191                         scayt_control.refresh();\r
192                 },\r
193                 onCancel: function()\r
194                 {\r
195                         var o = getBOMAllOptions();\r
196                         for ( var i in o )\r
197                                 o[i].checked = false;\r
198 \r
199                         setCheckedValue( getBOMAllLangs(), "" );\r
200                 },\r
201                 contents : contents\r
202         };\r
203 \r
204         var scayt_control = CKEDITOR.plugins.scayt.getScayt( editor );\r
205 \r
206         for ( i = 0; i < tags.length; i++ )\r
207         {\r
208                 if ( tags[ i ] == 1 )\r
209                         contents[ contents.length ] = tags_contents[ i ];\r
210         }\r
211         if ( tags[2] == 1 )\r
212                 userDicActive = 1;\r
213 \r
214         var init_with_captions = function()\r
215         {\r
216                 var dialog = this,\r
217                         lang_list = dialog.data.scayt.getLangList(),\r
218                         buttonCaptions = [ 'dic_create', 'dic_delete', 'dic_rename', 'dic_restore' ],\r
219                         buttonIds = [],\r
220                         langList = [],\r
221                         labels = optionsIds,\r
222                         i;\r
223 \r
224                 // Add buttons titles\r
225                 if ( userDicActive )\r
226                 {\r
227                         for ( i = 0; i < buttonCaptions.length; i++ )\r
228                         {\r
229                                 buttonIds[ i ] = buttonCaptions[ i ] + "_" + editorName;\r
230                                 doc.getById( buttonIds[ i ] ).setHtml( '<span class="cke_dialog_ui_button">' + captions[ 'button_' + buttonCaptions[ i ]]  +'</span>' );\r
231                         }\r
232                         doc.getById( 'dic_info_' + editorName ).setHtml( captions[ 'dic_info' ] );\r
233                 }\r
234 \r
235                 // Fill options and dictionary labels.\r
236                 if ( tags[0] == 1 )\r
237                 {\r
238                         for ( i in labels )\r
239                         {\r
240                                 var labelCaption = 'label_' + labels[ i ],\r
241                                         labelId = labelCaption + '_' + editorName,\r
242                                         labelElement = doc.getById( labelId );\r
243 \r
244                                 if (  'undefined' != typeof labelElement\r
245                                    && 'undefined' != typeof captions[ labelCaption ]\r
246                                    && 'undefined' != typeof dialog.options[labels[ i ]] )\r
247                                 {\r
248                                         labelElement.setHtml( captions[ labelCaption ] );\r
249                                         var labelParent = labelElement.getParent();\r
250                                         labelParent.$.style.display = "block";\r
251                                 }\r
252                         }\r
253                 }\r
254 \r
255                 var about = '<p><img src="' + window.scayt.getAboutInfo().logoURL + '" /></p>' +\r
256                                 '<p>' + captions[ 'version' ] + window.scayt.getAboutInfo().version.toString() + '</p>' +\r
257                                 '<p>' + captions[ 'about_throwt_copy' ] + '</p>';\r
258 \r
259                 doc.getById( 'scayt_about_' + editorName ).setHtml( about );\r
260 \r
261                 // Create languages tab.\r
262                 var createOption = function( option, list )\r
263                 {\r
264                         var label = doc.createElement( 'label' );\r
265                         label.setAttribute( 'for', 'cke_option' + option );\r
266                         label.setHtml( list[ option ] );\r
267 \r
268                         if ( dialog.sLang == option )   // Current.\r
269                                 dialog.chosed_lang = option;\r
270 \r
271                         var div = doc.createElement( 'div' );\r
272                         var radio = CKEDITOR.dom.element.createFromHtml( '<input id="cke_option' +\r
273                                         option + '" type="radio" ' +\r
274                                         ( dialog.sLang == option ? 'checked="checked"' : '' ) +\r
275                                         ' value="' + option + '" name="scayt_lang" />' );\r
276 \r
277                         radio.on( 'click', function()\r
278                                 {\r
279                                         this.$.checked = true;\r
280                                         dialog.chosed_lang = option;\r
281                                 });\r
282 \r
283                         div.append( radio );\r
284                         div.append( label );\r
285 \r
286                         return {\r
287                                 lang : list[ option ],\r
288                                 code : option,\r
289                                 radio : div\r
290                         };\r
291                 };\r
292 \r
293                 if ( tags[1] ==1 )\r
294                 {\r
295                         for ( i in lang_list.rtl )\r
296                                 langList[ langList.length ] = createOption( i, lang_list.ltr );\r
297 \r
298                         for ( i in lang_list.ltr )\r
299                                 langList[ langList.length  ] = createOption( i, lang_list.ltr );\r
300 \r
301                         langList.sort(  function( lang1, lang2 )\r
302                                 {\r
303                                         return ( lang2.lang > lang1.lang ) ? -1 : 1 ;\r
304                                 });\r
305 \r
306                         var fieldL = doc.getById( 'scayt_lcol_' + editorName ),\r
307                                 fieldR = doc.getById( 'scayt_rcol_' + editorName );\r
308                         for ( i=0; i < langList.length; i++ )\r
309                         {\r
310                                 var field = ( i < langList.length / 2 ) ? fieldL : fieldR;\r
311                                 field.append( langList[ i ].radio );\r
312                         }\r
313                 }\r
314 \r
315                 // user dictionary handlers\r
316                 var dic = {};\r
317                 dic.dic_create = function( el, dic_name , dic_buttons )\r
318                 {\r
319                         // comma separated button's ids include repeats if exists\r
320                         var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];\r
321 \r
322                         var err_massage = captions["err_dic_create"];\r
323                         var suc_massage = captions["succ_dic_create"];\r
324 \r
325                         window.scayt.createUserDictionary( dic_name,\r
326                                 function( arg )\r
327                                 {\r
328                                         hide_dic_buttons ( all_buttons );\r
329                                         display_dic_buttons ( dic_buttons[1] );\r
330                                         suc_massage = suc_massage.replace("%s" , arg.dname );\r
331                                         dic_success_message (suc_massage);\r
332                                 },\r
333                                 function( arg )\r
334                                 {\r
335                                         err_massage = err_massage.replace("%s" ,arg.dname );\r
336                                         dic_error_message ( err_massage + "( "+ (arg.message || "") +")");\r
337                                 });\r
338 \r
339                 };\r
340 \r
341                 dic.dic_rename = function( el, dic_name )\r
342                 {\r
343                         //\r
344                         // try to rename dictionary\r
345                         var err_massage = captions["err_dic_rename"] || "";\r
346                         var suc_massage = captions["succ_dic_rename"] || "";\r
347                         window.scayt.renameUserDictionary( dic_name,\r
348                                 function( arg )\r
349                                         {\r
350                                                 suc_massage = suc_massage.replace("%s" , arg.dname );\r
351                                                 set_dic_name( dic_name );\r
352                                                 dic_success_message ( suc_massage );\r
353                                         },\r
354                                 function( arg )\r
355                                         {\r
356                                                 err_massage = err_massage.replace("%s" , arg.dname  );\r
357                                                 set_dic_name( dic_name );\r
358                                                 dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );\r
359                                         });\r
360                 };\r
361 \r
362                 dic.dic_delete = function( el, dic_name , dic_buttons )\r
363                 {\r
364                         var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];\r
365                         var err_massage = captions["err_dic_delete"];\r
366                         var suc_massage = captions["succ_dic_delete"];\r
367 \r
368                         // try to delete dictionary\r
369                         window.scayt.deleteUserDictionary(\r
370                                 function( arg )\r
371                                 {\r
372                                         suc_massage = suc_massage.replace("%s" , arg.dname );\r
373                                         hide_dic_buttons ( all_buttons );\r
374                                         display_dic_buttons ( dic_buttons[0] );\r
375                                         set_dic_name( "" ); // empty input field\r
376                                         dic_success_message( suc_massage );\r
377                                 },\r
378                                 function( arg )\r
379                                 {\r
380                                         err_massage = err_massage.replace("%s" , arg.dname );\r
381                                         dic_error_message(err_massage);\r
382                                 });\r
383                 };\r
384 \r
385                 dic.dic_restore = dialog.dic_restore || function( el, dic_name , dic_buttons )\r
386                         {\r
387                                 // try to restore existing dictionary\r
388                                 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];\r
389                                 var err_massage = captions["err_dic_restore"];\r
390                                 var suc_massage = captions["succ_dic_restore"];\r
391 \r
392                                 window.scayt.restoreUserDictionary(dic_name,\r
393                                         function( arg )\r
394                                         {\r
395                                                 suc_massage = suc_massage.replace("%s" , arg.dname );\r
396                                                 hide_dic_buttons ( all_buttons );\r
397                                                 display_dic_buttons(dic_buttons[1]);\r
398                                                 dic_success_message( suc_massage );\r
399                                         },\r
400                                         function( arg )\r
401                                         {\r
402                                                 err_massage = err_massage.replace("%s" , arg.dname );\r
403                                                 dic_error_message( err_massage );\r
404                                         });\r
405                         };\r
406 \r
407                 function onDicButtonClick( ev )\r
408                 {\r
409                         var dic_name = doc.getById('dic_name_' + editorName).getValue();\r
410                         if ( !dic_name )\r
411                         {\r
412                                 dic_error_message(" Dictionary name should not be empty. ");\r
413                                 return false;\r
414                         }\r
415                         try{\r
416                                 var el = ev.data.getTarget().getParent();\r
417                                 var id = /(dic_\w+)_[\w\d]+/.exec(el.getId())[1];\r
418                                 dic[ id ].apply( null, [ el, dic_name, dic_buttons ] );\r
419                         }\r
420                         catch(err)\r
421                         {\r
422                                 dic_error_message(" Dictionary error. ");\r
423                         }\r
424 \r
425                         return true;\r
426                 }\r
427 \r
428                 // ** bind event listeners\r
429                 var arr_buttons = ( dic_buttons[0] + ',' + dic_buttons[1] ).split( ',' ),\r
430                         l;\r
431 \r
432                 for ( i = 0, l = arr_buttons.length ; i < l ; i += 1 )\r
433                 {\r
434                         var dic_button = doc.getById(arr_buttons[i]);\r
435                         if ( dic_button )\r
436                                 dic_button.on( 'click', onDicButtonClick, this );\r
437                 }\r
438         };\r
439 \r
440         var reload = function()\r
441         {\r
442                 var dialog = this;\r
443                 // for enabled options tab\r
444                 if ( tags[0] == 1 ){\r
445                         var opto = getBOMAllOptions();\r
446 \r
447                         // Animate options.\r
448                         for ( var k=0,l = opto.length; k<l;k++ )\r
449                         {\r
450 \r
451                                 var i = opto[k].id;\r
452                                 var checkbox = doc.getById( i );\r
453 \r
454                                 if ( checkbox )\r
455                                 {\r
456                                         opto[k].checked = false;\r
457                                         //alert (opto[k].removeAttribute)\r
458                                         if ( dialog.options[ i.split("_")[0] ] == 1 )\r
459                                         {\r
460                                                 opto[k].checked = true;\r
461                                         }\r
462 \r
463 \r
464                                         // Bind events. Do it only once.\r
465                                         if ( firstLoad )\r
466                                         {\r
467                                                 checkbox.on( 'click', function()\r
468                                                 {\r
469                                                         dialog.options[ this.getId().split("_")[0] ] = this.$.checked ? 1 : 0 ;\r
470                                                 });\r
471                                         }\r
472                                 }\r
473                         }\r
474                 }\r
475 \r
476                 //for enabled languages tab\r
477                 if ( tags[1] == 1 )\r
478                 {\r
479                         var domLang = doc.getById("cke_option" + dialog.sLang);\r
480                         setCheckedValue( domLang.$,dialog.sLang );\r
481                 }\r
482 \r
483                 // * user dictionary\r
484                 if ( userDicActive )\r
485                 {\r
486                         window.scayt.getNameUserDictionary(\r
487                                 function( o )\r
488                                 {\r
489                                         var dic_name = o.dname;\r
490                                         hide_dic_buttons( dic_buttons[0] + ',' + dic_buttons[1] );\r
491                                         if ( dic_name )\r
492                                         {\r
493                                                 doc.getById( 'dic_name_' + editorName ).setValue(dic_name);\r
494                                                 display_dic_buttons( dic_buttons[1] );\r
495                                         }\r
496                                         else\r
497                                                 display_dic_buttons( dic_buttons[0] );\r
498 \r
499                                 },\r
500                                 function()\r
501                                 {\r
502                                         doc.getById( 'dic_name_' + editorName ).setValue("");\r
503                                 });\r
504                         dic_success_message("");\r
505                 }\r
506 \r
507         };\r
508 \r
509         function dic_error_message( m )\r
510         {\r
511                 doc.getById('dic_message_' + editorName).setHtml('<span style="color:red;">' + m + '</span>' );\r
512         }\r
513         function dic_success_message( m )\r
514         {\r
515                 doc.getById('dic_message_' + editorName).setHtml('<span style="color:blue;">' + m + '</span>') ;\r
516         }\r
517         function display_dic_buttons( sIds )\r
518         {\r
519                 sIds = String( sIds );\r
520                 var aIds = sIds.split(',');\r
521                 for ( var i=0, l = aIds.length; i < l ; i+=1)\r
522                         doc.getById( aIds[i] ).$.style.display = "inline";\r
523         }\r
524         function hide_dic_buttons( sIds )\r
525         {\r
526                 sIds = String( sIds );\r
527                 var aIds = sIds.split(',');\r
528                 for ( var i = 0, l = aIds.length; i < l ; i += 1 )\r
529                         doc.getById( aIds[i] ).$.style.display = "none";\r
530         }\r
531         function set_dic_name( dic_name )\r
532         {\r
533                 doc.getById('dic_name_' + editorName).$.value= dic_name;\r
534         }\r
535 \r
536         return dialogDefiniton;\r
537 });\r