1 /* 2 Copyright (c) 2003-2012, 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 }); 538