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