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