1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
\r
3 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
4 * Copyright (C) 2003-2010 Frederico Caldeira Knabben
\r
6 * == BEGIN LICENSE ==
\r
8 * Licensed under the terms of any of the following licenses at your
\r
11 * - GNU General Public License Version 2 or later (the "GPL")
\r
12 * http://www.gnu.org/licenses/gpl.html
\r
14 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
15 * http://www.gnu.org/licenses/lgpl.html
\r
17 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
18 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
24 <title>SCAYT Properties</title>
\r
25 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
\r
26 <meta content="noindex, nofollow" name="robots">
\r
27 <script src="common/fck_dialog_common.js" type="text/javascript"></script>
\r
28 <link type="text/css" href="fck_scayt/scayt_dialog.css" rel="stylesheet" />
\r
29 <script type="text/javascript">
\r
31 var dialog = window.parent ;
\r
32 var oEditor = dialog.InnerDialogLoaded() ;
\r
33 var FCKLang = oEditor.FCKLang;
\r
34 var scayt = oEditor.scayt;
\r
35 var scayt_control = oEditor.scayt_control;
\r
41 var tabs = scayt_control.uiTags || [1,1,0,1];
\r
42 var userDicActive = tabs[2] == 1;
\r
45 // [0] contains buttons for creating
\r
46 "dic_create,dic_restore",
\r
47 // [1] contains buton for manipulation
\r
48 "dic_rename,dic_delete"
\r
54 var mergeObjs = function(obj1, obj2)
\r
62 var removeWhitespaces = function( s )
\r
64 s = s.replace( new RegExp("^ +| +$"), '' ) ;
\r
68 var addEvent = function( el ,sEventName, fTodo )
\r
70 if (el.addEventListener) {
\r
71 el.addEventListener (sEventName,fTodo,false);
\r
73 } else if (el.attachEvent) {
\r
74 el.attachEvent ("on"+sEventName,fTodo);
\r
77 el["on"+sEventName] = fTodo;
\r
81 var getElementsByClassName = function (node,classname ,strTag) {
\r
82 strTag = strTag || "*";
\r
83 node = node || document;
\r
84 if (node.getElementsByClassName)
\r
85 return node.getElementsByClassName(classname);
\r
87 var objColl = node.getElementsByTagName(strTag);
\r
88 if (!objColl.length && strTag == "*" && node.all) objColl = node.all;
\r
89 var arr = new Array();
\r
90 var delim = classname.indexOf('|') != -1 ? '|' : ' ';
\r
91 var arrClass = classname.split(delim);
\r
92 for (var i = 0, j = objColl.length; i < j; i++) {
\r
93 var arrObjClass = objColl[i].className.split(' ');
\r
94 if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
\r
97 for ( var k = 0, l = arrObjClass.length ; k < l ; k++ )
\r
99 for ( var m = 0, n = arrClass.length ; m < n ; m++ )
\r
101 if ( arrClass[m] == arrObjClass[k] )
\r
104 if ( ( delim == '|' && c == 1 ) || ( delim == ' ' && c == arrClass.length ) )
\r
106 arr.push( objColl[i] ) ;
\r
107 break comparisonLoop ;
\r
116 var hasClassName = function ( sClassName, elem ) {
\r
118 var aCnames = elem.className.split(/\s+/) || [];
\r
119 for (var i=0, l=aCnames.length; i<l ; i++){
\r
120 if (sClassName == aCnames[i])
\r
127 addClass : function ( sClassName ) {
\r
128 //console.info( sClassName, this.className, );
\r
129 if ( hasClassName(sClassName , this) )
\r
131 var s = removeWhitespaces(this.className + " " +sClassName);
\r
132 this.className = s;
\r
136 removeClass : function ( sClassName ) {
\r
137 var s = removeWhitespaces(this.className.replace(sClassName,""));
\r
138 this.className = s;
\r
141 setStyle : function( oStyles )
\r
143 for ( var style in oStyles )
\r
145 this.style[style] = oStyles[style] ;
\r
149 bindOnclick : function ( handler ) {
\r
150 //addEvent( this, "click" , handler);
\r
151 this.onclick = handler;
\r
154 bindOnchange : function ( handler ) {
\r
155 //addEvent( this, "change" , handler);
\r
156 this.onchange = handler;
\r
159 getAttr : function ( sAttrName )
\r
164 return this[sAttrName];
\r
166 setAttr : function ( sAttrName , attrVal )
\r
168 if ( !sAttrName || !attrVal )
\r
171 this[sAttrName] = attrVal;
\r
175 remAttr : function ( sAttrName )
\r
182 var singleCaller = function ( sMethod,args ) {
\r
183 for ( var i=0, l=this.length; i<l ; i++ ){
\r
184 var oItem = mergeObjs( single, this[i] );
\r
185 oItem[sMethod].apply(this[i],args);
\r
192 addClass : function ( sClassName ){
\r
193 singleCaller.call(this, "addClass", [sClassName])
\r
196 removeClass : function ( sClassName ) {
\r
197 singleCaller.call(this, "removeClass", [sClassName])
\r
200 setStyle : function ( oStyles ) {
\r
201 singleCaller.call(this, "setStyle", [oStyles])
\r
204 bindOnclick : function ( f ) {
\r
205 singleCaller.call(this, "bindOnclick", [f])
\r
208 bindOnchange : function ( f ) {
\r
209 singleCaller.call(this, "bindOnchange", [f])
\r
213 forEach : function ( fTodo ) {
\r
215 for (var i=0, l=this.length; i<l ; i++){
\r
216 fTodo.apply(this[i], [this[i],i ]);
\r
225 this.byClass = function( sClassName ){
\r
226 var o = getElementsByClassName(document, sClassName );
\r
227 return o ? mergeObjs( collection, o ) : o;
\r
230 this.byId = function( sId ){
\r
231 var o = document.getElementById( sId );
\r
232 return o ? mergeObjs( single, o ) : o;
\r
235 this.gup = function ( name ){
\r
236 name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
\r
237 var regexS = '[\\?&]' + name + '=([^&#]*)' ;
\r
238 var regex = new RegExp( regexS ) ;
\r
239 var results = regex.exec( window.location.href ) ;
\r
241 if( results == null )
\r
244 return results[ 1 ] ;
\r
246 this.wrap = function ( o ) {
\r
247 return o ? mergeObjs( single, o ) : o;
\r
249 this.forEach = function ( oScope, fTodo ){
\r
250 collection.forEach.apply( oScope,[fTodo] );
\r
257 // Add the dialog tabs.
\r
258 tabs[0] == 1 && dialog.AddTab( 'options', 'Options' ) ;
\r
259 tabs[1] == 1 && dialog.AddTab( 'langs', 'Languages' ) ;
\r
260 tabs[2] == 1 && dialog.AddTab( 'dictionary', 'Dictionary' ) ;
\r
261 tabs[3] == 1 && dialog.AddTab( 'about', 'About' ) ;
\r
263 // Function called when a dialog tab is selected.
\r
264 function OnDialogTabChange( tabCode )
\r
266 ShowE('inner_options' , ( tabCode == 'options' ) ) ;
\r
267 ShowE('inner_langs' , ( tabCode == 'langs' ) ) ;
\r
268 ShowE('inner_dictionary' , ( tabCode == 'dictionary' ) ) ;
\r
269 ShowE('inner_about' , ( tabCode == 'about' ) ) ;
\r
276 window.onload = function()
\r
278 // Things to do when the page is loaded.
\r
280 if ( document.location.search.length )
\r
281 dialog.SetSelectedTab( document.location.search.substr(1) ) ;
\r
283 dialog.SetOkButton( true ) ;
\r
286 if (!scayt) throw "SCAYT is undefined";
\r
287 if (!scayt_control) throw "SCAYT_CONTROL is undefined";
\r
289 // show alowed tabs
\r
290 tabs = scayt_control.uiTags || [1,1,1,0];
\r
293 sLang = scayt_control.getLang();
\r
295 options = scayt_control.option();
\r
297 scayt.getCaption( fckLang, function( caps )
\r
299 //console.info( "scayt.getCaption runned" )
\r
302 //lang_list = scayt.getLangList();
\r
303 lang_list = scayt.getLangList() ;//|| {ltr: {"en_US" : "English","en_GB" : "British English","pt_BR" : "Brazilian Portuguese","da_DK" : "Danish","nl_NL" : "Dutch","en_CA" : "English Canadian","fi_FI" : "Finnish","fr_FR" : "French","fr_CA" : "French Canadian","de_DE" : "German","el_GR" : "Greek","hu_HU" : "Hungarian","it_IT" : "Italian","nb_NO" : "Norwegian","pl_PL" : "Polish","pt_PT" : "Portuguese","ru_RU" : "Russian","es_ES" : "Spanish","sv_SE" : "Swedish","tr_TR" : "Turkish","uk_UA" : "Ukrainian","cy_GB" : "Welsh"},rtl: {"ar_EG" : "Arabic"}};
\r
308 // ** animate options
\r
309 get.byClass("_scayt_option").forEach(function(el,i){
\r
311 if ('undefined' != typeof(options[el.name])) {
\r
312 // *** set default values
\r
314 if ( 1 == options[ el.name ] ){
\r
315 //el.setAttribute("checked","true");
\r
316 get.wrap(el).setAttr("checked" ,true)
\r
317 //document.all_options[el.name].checked = "true";
\r
318 //el.checked = true;
\r
319 //alert( options[ dojo.attr(el ,'name') ] + " el " )
\r
321 //console.info(options)
\r
323 get.wrap(el).bindOnclick( function(ev){
\r
325 var that = get.wrap(this);
\r
326 var isCheck = that.getAttr("checked");
\r
327 //console.info(isCheck)
\r
328 if ( isCheck == false ) {
\r
330 //that.setAttr("checked",false);
\r
331 options[ this.name ] = 0;
\r
333 //that.setAttr("checked",true);
\r
334 options[ this.name ] = 1;
\r
336 //console.info(options)
\r
342 // * Create languages tab
\r
343 // ** convert langs obj to array
\r
346 for (var k in lang_list.rtl){
\r
347 // find curent lang
\r
349 chosed_lang = lang_list.rtl[k] + "::" + k;
\r
350 lang_arr[lang_arr.length] = lang_list.rtl[k] + "::" + k;
\r
353 for (var k in lang_list.ltr){
\r
354 // find curent lang
\r
356 chosed_lang = lang_list.ltr[k] + "::" + k;
\r
357 lang_arr[lang_arr.length] = lang_list.ltr[k] + "::" + k;
\r
361 // ** find lang containers
\r
363 var lcol = get.byId("lcolid");
\r
364 var rcol = get.byId("rcolid");
\r
365 // ** place langs in DOM
\r
367 get.forEach(lang_arr , function( l , i ){
\r
369 //console.info( l,i );
\r
371 var l_arr = l.split('::');
\r
372 var l_name = l_arr[0];
\r
373 var l_code = l_arr[1];
\r
374 var row = document.createElement('div');
\r
376 row.className = "li";
\r
377 // split langs on half
\r
378 var col = ( i < lang_arr.length/2 ) ? lcol:rcol ;
\r
381 //console.dir( col )
\r
382 col.appendChild(row);
\r
383 var row_dom = get.byId( l_code )
\r
384 row_dom.innerHTML = l_name;
\r
386 var checkActiveLang = function( id ){
\r
387 return chosed_lang.split("::")[1] == id;
\r
390 row_dom.bindOnclick(function(ev){
\r
392 if ( checkActiveLang(this.id) ) return false;
\r
393 var elId = this.id;
\r
395 .addClass("Button")
\r
396 .removeClass("DarkBackground");
\r
398 window.setTimeout( function (){ get.byId(elId).setStyle({opacity:"0.5",cursor:"no-drop"}); } ,300 );
\r
400 get.byId(chosed_lang.split("::")[1])
\r
401 .addClass("DarkBackground")
\r
402 .removeClass("Button")
\r
403 .setStyle({opacity:"1",cursor:"pointer"});
\r
405 chosed_lang = this.innerHTML + "::" + this.id;
\r
411 // select current lang
\r
412 if (l == chosed_lang)
\r
413 row_dom.addClass("Button").setStyle({opacity:"0.5",cursor:"no-drop"});
\r
415 row_dom.addClass("DarkBackground").setStyle({opacity:"1"});
\r
418 // * user dictionary
\r
419 if ( userDicActive ){
\r
420 initUserDictionary()
\r
432 var buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ];
\r
433 var labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ];
\r
436 function apllyCaptions ( )
\r
439 // fill tabs headers
\r
440 // add missing captions
\r
442 get.byClass("PopupTab").forEach(function(el,i){
\r
444 if ( tabs[i] == 1 ){
\r
445 el.style.display = "block";
\r
447 el.innerHTML = captions['tab_'+el.id];
\r
451 // Fill options labels.
\r
452 for ( i in labels )
\r
454 var label = 'label_' + labels[ i ],
\r
455 labelElement = document.getElementById( label );
\r
457 if ( 'undefined' != typeof labelElement
\r
458 && 'undefined' != typeof captions[ label ] && captions[ label ] !== ""
\r
459 && 'undefined' != typeof options[labels[ i ]] )
\r
461 labelElement.innerHTML = captions[ label ];
\r
462 var labelParent = labelElement.parentNode;
\r
463 labelParent.style.display = "block";
\r
466 // fill dictionary section
\r
467 for ( var i in buttons )
\r
469 var button = buttons[ i ];
\r
470 get.byId( button ).innerHTML = '<span>' + captions[ 'button_' + button] +'</span>' ;
\r
472 get.byId("dname").innerHTML = captions['label_dname'];
\r
473 get.byId( 'dic_info' ).innerHTML = captions[ 'dic_info' ];
\r
476 var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
\r
477 '<p>' + captions[ 'version' ] + scayt.version.toString() + '</p>' +
\r
478 '<p>' + captions[ 'about_throwt_copy' ] + '</p>';
\r
480 get.byId( 'scayt_about' ).innerHTML = about;
\r
485 function initUserDictionary () {
\r
487 scayt.getNameUserDictionary(
\r
490 var dic_name = o.dname;
\r
493 get.byId( 'dic_name' ).value = dic_name;
\r
494 display_dic_buttons( dic_buttons[1] );
\r
497 display_dic_buttons( dic_buttons[0] );
\r
502 get.byId( 'dic_name' ).value("");
\r
503 dic_error_message(captions["err_dic_enable"] || "Used dictionary are unaveilable now.")
\r
507 dic_success_message("");
\r
509 // ** bind event listeners
\r
510 get.byClass("button").bindOnclick(function( ){
\r
513 var dic_name = get.byId('dic_name').value ;
\r
514 // check common dictionary rules
\r
516 dic_error_message(" Dictionary name should not be empty. ");
\r
520 window[this.id].apply( window, [this, dic_name, dic_buttons ] );
\r
522 //console.info( typeof window[this.id], window[this.id].calle )
\r
528 dic_create = function( el, dic_name , dic_buttons )
\r
530 // comma separated button's ids include repeats if exists
\r
531 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
\r
533 var err_massage = captions["err_dic_create"];
\r
534 var suc_massage = captions["succ_dic_create"];
\r
535 //console.info("--plugin ");
\r
537 scayt.createUserDictionary(dic_name,
\r
540 //console.info( "dic_create callback called with args" , arg );
\r
541 hide_dic_buttons ( all_buttons );
\r
542 display_dic_buttons ( dic_buttons[1] );
\r
543 suc_massage = suc_massage.replace("%s" , arg.dname );
\r
544 dic_success_message (suc_massage);
\r
548 //console.info( "dic_create errorback called with args" , arg )
\r
549 err_massage = err_massage.replace("%s" ,arg.dname );
\r
550 dic_error_message ( err_massage + "( "+ (arg.message || "") +")");
\r
555 dic_rename = function( el, dic_name , dic_buttons )
\r
558 // try to rename dictionary
\r
559 // @TODO: rename dict
\r
560 //console.info ( captions["err_dic_rename"] )
\r
561 var err_massage = captions["err_dic_rename"] || "";
\r
562 var suc_massage = captions["succ_dic_rename"] || "";
\r
563 scayt.renameUserDictionary(dic_name,
\r
566 //console.info( "dic_rename callback called with args" , arg );
\r
567 suc_massage = suc_massage.replace("%s" , arg.dname );
\r
568 set_dic_name( dic_name );
\r
569 dic_success_message ( suc_massage );
\r
573 //console.info( "dic_rename errorback called with args" , arg )
\r
574 err_massage = err_massage.replace("%s" , arg.dname );
\r
575 set_dic_name( dic_name );
\r
576 dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );
\r
580 dic_delete = function ( el, dic_name , dic_buttons )
\r
582 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
\r
583 var err_massage = captions["err_dic_delete"];
\r
584 var suc_massage = captions["succ_dic_delete"];
\r
586 // try to delete dictionary
\r
587 // @TODO: delete dict
\r
588 scayt.deleteUserDictionary(
\r
591 //console.info( "dic_delete callback " , dic_name ,arg );
\r
592 suc_massage = suc_massage.replace("%s" , arg.dname );
\r
593 hide_dic_buttons ( all_buttons );
\r
594 display_dic_buttons ( dic_buttons[0] );
\r
595 set_dic_name( "" ); // empty input field
\r
596 dic_success_message( suc_massage );
\r
600 //console.info( " dic_delete errorback called with args" , arg )
\r
601 err_massage = err_massage.replace("%s" , arg.dname );
\r
602 dic_error_message(err_massage);
\r
606 dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
\r
608 // try to restore existing dictionary
\r
609 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
\r
610 var err_massage = captions["err_dic_restore"];
\r
611 var suc_massage = captions["succ_dic_restore"];
\r
613 scayt.restoreUserDictionary(dic_name,
\r
616 //console.info( "dic_restore callback called with args" , arg );
\r
617 suc_massage = suc_massage.replace("%s" , arg.dname );
\r
618 hide_dic_buttons ( all_buttons );
\r
619 display_dic_buttons(dic_buttons[1]);
\r
620 dic_success_message( suc_massage );
\r
624 //console.info( " dic_restore errorback called with args" , arg )
\r
625 err_massage = err_massage.replace("%s" , arg.dname );
\r
626 dic_error_message( err_massage );
\r
630 function dic_error_message( m )
\r
635 get.byId('dic_message').innerHTML = '<span class="error">' + m + '</span>' ;
\r
638 function dic_success_message( m )
\r
643 get.byId('dic_message').innerHTML = '<span class="success">' + m + '</span>' ;
\r
646 function display_dic_buttons ( sIds ){
\r
647 sIds = new String( sIds );
\r
648 get.forEach( sIds.split(','), function ( id,i) {
\r
649 get.byId(id).setStyle({display:"inline"});
\r
652 function hide_dic_buttons ( sIds ){
\r
653 sIds = new String( sIds );
\r
654 get.forEach( sIds.split(','), function ( id,i) {
\r
655 get.byId(id).setStyle({display:"none"});
\r
658 function set_dic_name ( dic_name ) {
\r
659 get.byId('dic_name').value = dic_name;
\r
661 function display_dic_tab () {
\r
662 get.byId("dic_tab").style.display = "block";
\r
667 // Things to do when the Ok button is clicked.
\r
669 // set upp options if any was set
\r
670 var o = scayt_control.option();
\r
671 //console.info(options)
\r
672 for ( var oN in options ) {
\r
674 if ( o[oN] != options[oN] && c == 0){
\r
675 //console.info( "set option " )
\r
676 scayt_control.option( options );
\r
680 //setup languge if it was change
\r
681 var csLang = chosed_lang.split("::")[1];
\r
682 if ( csLang && sLang != csLang ){
\r
683 scayt_control.setLang( csLang );
\r
684 //console.info(sLang+" -> "+csLang , scayt_control)
\r
688 if ( c > 0 ) scayt_control.refresh();
\r
690 return dialog.Cancel();
\r
696 <body style="OVERFLOW: hidden" scroll="no">
\r
697 <div class="tab_container" id="inner_options">
\r
699 <ul id="scayt_options">
\r
700 <li class="_scayt_options">
\r
701 <input class="_scayt_option" type="checkbox" value="0" name="allCaps" />
\r
702 <label for="allCaps" id="label_allCaps"></label>
\r
705 <input class="_scayt_option" type="checkbox" value="0" name="ignoreDomainNames" />
\r
706 <label for="ignoreDomainNames" id="label_ignoreDomainNames"></label>
\r
709 <input class="_scayt_option" type="checkbox" value="0" name="mixedCase" />
\r
710 <label for="mixedCase" id="label_mixedCase"></label>
\r
713 <input class="_scayt_option" type="checkbox" value="0" name="mixedWithDigits" />
\r
714 <label for="mixedWithDigits" id="label_mixedWithDigits"></label>
\r
718 <div class="tab_container" id="inner_langs">
\r
720 <div class="lcol" id="lcolid"></div>
\r
721 <div class="rcol" id="rcolid"></div>
\r
723 <div class="tab_container" id="inner_dictionary">
\r
725 <div id="dic_message"></div>
\r
726 <div id="_off_dic_tab" class="dictionary" >
\r
727 <div style="padding-left:10px;">
\r
728 <label id="dname" for="dname"></label>
\r
729 <input type="text" size="14" maxlength="15" value="" id="dic_name" name="dic_name"/>
\r
731 <div class="dic_buttons">
\r
732 <a href="#" id="dic_create" class="button"> </a>
\r
733 <a href="#" id="dic_delete" class="button"> </a>
\r
734 <a href="#" id="dic_rename" class="button"> </a>
\r
735 <a href="#" id="dic_restore" class="button"> </a>
\r
738 <div id="dic_info"></div>
\r
742 <div id="inner_about" class="tab_container">
\r
743 <div id="scayt_about"></div>
\r