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