JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
3642e5caf49cd560b646486dadbafc6bbb34ccef
[ckeditor.git] / _source / plugins / dialogadvtab / plugin.js
1 /*\r
2 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 (function()\r
7 {\r
8 \r
9 function setupAdvParams( element )\r
10 {\r
11         var attrName = this.att;\r
12 \r
13         var value = element && element.hasAttribute( attrName ) && element.getAttribute( attrName ) || '';\r
14 \r
15         if ( value !== undefined )\r
16                 this.setValue( value );\r
17 }\r
18 \r
19 function commitAdvParams()\r
20 {\r
21         // Dialogs may use different parameters in the commit list, so, by\r
22         // definition, we take the first CKEDITOR.dom.element available.\r
23         var element;\r
24 \r
25         for ( var i = 0 ; i < arguments.length ; i++ )\r
26         {\r
27                 if ( arguments[ i ] instanceof CKEDITOR.dom.element )\r
28                 {\r
29                         element = arguments[ i ];\r
30                         break;\r
31                 }\r
32         }\r
33 \r
34         if ( element )\r
35         {\r
36                 var attrName = this.att,\r
37                         value = this.getValue();\r
38 \r
39                 // Broadcast Lang Dir change\r
40                 if ( attrName == 'dir' )\r
41                 {\r
42                         var dir = element.getAttribute( attrName, value );\r
43                         if ( dir != value && element.getParent() )\r
44                                         this._.dialog._.editor.fire( 'dirChanged', element );\r
45                 }\r
46 \r
47                 if ( value )\r
48                         element.setAttribute( attrName, value );\r
49                 else\r
50                         element.removeAttribute( attrName, value );\r
51         }\r
52 }\r
53 \r
54 CKEDITOR.plugins.add( 'dialogadvtab',\r
55 {\r
56         /**\r
57          *\r
58          * @param tabConfig\r
59          * id, dir, classes, styles\r
60          */\r
61         createAdvancedTab : function( editor, tabConfig )\r
62         {\r
63                 if ( !tabConfig )\r
64                         tabConfig = { id:1, dir:1, classes:1, styles:1 };\r
65 \r
66                 var lang = editor.lang.common;\r
67 \r
68                 var result =\r
69                 {\r
70                         id : 'advanced',\r
71                         label : lang.advancedTab,\r
72                         title : lang.advancedTab,\r
73                         elements :\r
74                                 [\r
75                                         {\r
76                                                 type : 'vbox',\r
77                                                 padding : 1,\r
78                                                 children : []\r
79                                         }\r
80                                 ]\r
81                 };\r
82 \r
83                 var contents = [];\r
84 \r
85                 if ( tabConfig.id || tabConfig.dir )\r
86                 {\r
87                         if ( tabConfig.id )\r
88                         {\r
89                                 contents.push(\r
90                                         {\r
91                                                 id : 'advId',\r
92                                                 att : 'id',\r
93                                                 type : 'text',\r
94                                                 label : lang.id,\r
95                                                 setup : setupAdvParams,\r
96                                                 commit : commitAdvParams\r
97                                         });\r
98                         }\r
99 \r
100                         if ( tabConfig.dir )\r
101                         {\r
102                                 contents.push(\r
103                                         {\r
104                                                 id : 'advLangDir',\r
105                                                 att : 'dir',\r
106                                                 type : 'select',\r
107                                                 label : lang.langDir,\r
108                                                 'default' : '',\r
109                                                 style : 'width:100%',\r
110                                                 items :\r
111                                                 [\r
112                                                         [ lang.notSet, '' ],\r
113                                                         [ lang.langDirLTR, 'ltr' ],\r
114                                                         [ lang.langDirRTL, 'rtl' ]\r
115                                                 ],\r
116                                                 setup : setupAdvParams,\r
117                                                 commit : commitAdvParams\r
118                                         });\r
119                         }\r
120 \r
121                         result.elements[ 0 ].children.push(\r
122                                 {\r
123                                         type : 'hbox',\r
124                                         widths : [ '50%', '50%' ],\r
125                                         children : [].concat( contents )\r
126                                 });\r
127                 }\r
128 \r
129                 if ( tabConfig.styles || tabConfig.classes )\r
130                 {\r
131                         contents = [];\r
132 \r
133                         if ( tabConfig.styles )\r
134                         {\r
135                                 contents.push(\r
136                                         {\r
137                                                 id : 'advStyles',\r
138                                                 att : 'style',\r
139                                                 type : 'text',\r
140                                                 label : lang.styles,\r
141                                                 'default' : '',\r
142 \r
143                                                 getStyle : function( name, defaultValue )\r
144                                                 {\r
145                                                         var match = this.getValue().match( new RegExp( name + '\\s*:\s*([^;]*)', 'i') );\r
146                                                         return match ? match[ 1 ] : defaultValue;\r
147                                                 },\r
148 \r
149                                                 updateStyle : function( name, value )\r
150                                                 {\r
151                                                         var styles = this.getValue();\r
152 \r
153                                                         // Remove the current value.\r
154                                                         if ( styles )\r
155                                                         {\r
156                                                                 styles = styles\r
157                                                                         .replace( new RegExp( '\\s*' + name + '\s*:[^;]*(?:$|;\s*)', 'i' ), '' )\r
158                                                                         .replace( /^[;\s]+/, '' )\r
159                                                                         .replace( /\s+$/, '' );\r
160                                                         }\r
161 \r
162                                                         if ( value )\r
163                                                         {\r
164                                                                 styles && !(/;\s*$/).test( styles ) && ( styles += '; ' );\r
165                                                                 styles += name + ': ' + value;\r
166                                                         }\r
167 \r
168                                                         this.setValue( styles, 1 );\r
169 \r
170                                                 },\r
171 \r
172                                                 setup : setupAdvParams,\r
173 \r
174                                                 commit : commitAdvParams\r
175 \r
176                                         });\r
177                         }\r
178 \r
179                         if ( tabConfig.classes )\r
180                         {\r
181                                 contents.push(\r
182                                         {\r
183                                                 type : 'hbox',\r
184                                                 widths : [ '45%', '55%' ],\r
185                                                 children :\r
186                                                 [\r
187                                                         {\r
188                                                                 id : 'advCSSClasses',\r
189                                                                 att : 'class',\r
190                                                                 type : 'text',\r
191                                                                 label : lang.cssClasses,\r
192                                                                 'default' : '',\r
193                                                                 setup : setupAdvParams,\r
194                                                                 commit : commitAdvParams\r
195 \r
196                                                         }\r
197                                                 ]\r
198                                         });\r
199                         }\r
200 \r
201                         result.elements[ 0 ].children.push(\r
202                                 {\r
203                                         type : 'hbox',\r
204                                         widths : [ '50%', '50%' ],\r
205                                         children : [].concat( contents )\r
206                                 });\r
207                 }\r
208 \r
209                 return result;\r
210         }\r
211 });\r
212 \r
213 })();\r