JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
434911c4dc34f09488959eb4d900465a29c255a4
[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                 if ( value )\r
40                         element.setAttribute( attrName, value );\r
41                 else\r
42                         element.removeAttribute( attrName, value );\r
43         }\r
44 }\r
45 \r
46 var isUpdating;\r
47 \r
48 CKEDITOR.plugins.add( 'dialogadvtab',\r
49 {\r
50         /**\r
51          *\r
52          * @param tabConfig\r
53          * id, dir, classes, styles\r
54          */\r
55         createAdvancedTab : function( editor, tabConfig )\r
56         {\r
57                 if ( !tabConfig )\r
58                         tabConfig = { id:1, dir:1, classes:1, styles:1 };\r
59 \r
60                 var lang = editor.lang.common;\r
61 \r
62                 var result =\r
63                 {\r
64                         id : 'advanced',\r
65                         label : lang.advanced,\r
66                         title : lang.advanced,\r
67                         elements :\r
68                                 [\r
69                                         {\r
70                                                 type : 'vbox',\r
71                                                 padding : 1,\r
72                                                 children : []\r
73                                         }\r
74                                 ]\r
75                 };\r
76 \r
77                 var contents = [];\r
78 \r
79                 if ( tabConfig.id || tabConfig.dir )\r
80                 {\r
81                         if ( tabConfig.id )\r
82                         {\r
83                                 contents.push(\r
84                                         {\r
85                                                 id : 'advId',\r
86                                                 att : 'id',\r
87                                                 type : 'text',\r
88                                                 label : lang.id,\r
89                                                 setup : setupAdvParams,\r
90                                                 commit : commitAdvParams\r
91                                         });\r
92                         }\r
93 \r
94                         if ( tabConfig.dir )\r
95                         {\r
96                                 contents.push(\r
97                                         {\r
98                                                 id : 'advLangDir',\r
99                                                 att : 'dir',\r
100                                                 type : 'select',\r
101                                                 label : lang.langDir,\r
102                                                 'default' : '',\r
103                                                 style : 'width:110px',\r
104                                                 items :\r
105                                                 [\r
106                                                         [ lang.notSet, '' ],\r
107                                                         [ lang.langDirLTR, 'ltr' ],\r
108                                                         [ lang.langDirRTL, 'rtl' ]\r
109                                                 ],\r
110                                                 setup : setupAdvParams,\r
111                                                 commit : commitAdvParams\r
112                                         });\r
113                         }\r
114 \r
115                         result.elements[ 0 ].children.push(\r
116                                 {\r
117                                         type : 'hbox',\r
118                                         widths : [ '50%', '50%' ],\r
119                                         children : [].concat( contents )\r
120                                 });\r
121                 }\r
122 \r
123                 if ( tabConfig.styles || tabConfig.classes )\r
124                 {\r
125                         contents = [];\r
126 \r
127                         if ( tabConfig.id )\r
128                         {\r
129                                 contents.push(\r
130                                         {\r
131                                                 id : 'advStyles',\r
132                                                 att : 'style',\r
133                                                 type : 'text',\r
134                                                 label : lang.styles,\r
135                                                 'default' : '',\r
136 \r
137                                                 onChange : function(){},\r
138 \r
139                                                 getStyle : function( name, defaultValue )\r
140                                                 {\r
141                                                         var match = this.getValue().match( new RegExp( name + '\\s*:\s*([^;]*)', 'i') );\r
142                                                         return match ? match[ 1 ] : defaultValue;\r
143                                                 },\r
144 \r
145                                                 updateStyle : function( name, value )\r
146                                                 {\r
147                                                         if ( isUpdating )\r
148                                                                 return;\r
149 \r
150                                                         // Flag to avoid recursion.\r
151                                                         isUpdating = 1;\r
152 \r
153                                                         var styles = this.getValue();\r
154 \r
155                                                         // Remove the current value.\r
156                                                         if ( styles )\r
157                                                         {\r
158                                                                 styles = styles\r
159                                                                         .replace( new RegExp( '\\s*' + name + '\s*:[^;]*(?:$|;\s*)', 'i' ), '' )\r
160                                                                         .replace( /^[;\s]+/, '' )\r
161                                                                         .replace( /\s+$/, '' );\r
162                                                         }\r
163 \r
164                                                         if ( value )\r
165                                                         {\r
166                                                                 styles && !(/;\s*$/).test( styles ) && ( styles += '; ' );\r
167                                                                 styles += name + ': ' + value;\r
168                                                         }\r
169 \r
170                                                         this.setValue( styles );\r
171 \r
172                                                         isUpdating = 0;\r
173                                                 },\r
174 \r
175                                                 setup : setupAdvParams,\r
176 \r
177                                                 commit : commitAdvParams\r
178 \r
179                                         });\r
180                         }\r
181 \r
182                         if ( tabConfig.classes )\r
183                         {\r
184                                 contents.push(\r
185                                         {\r
186                                                 type : 'hbox',\r
187                                                 widths : [ '45%', '55%' ],\r
188                                                 children :\r
189                                                 [\r
190                                                         {\r
191                                                                 id : 'advCSSClasses',\r
192                                                                 att : 'class',\r
193                                                                 type : 'text',\r
194                                                                 label : lang.cssClasses,\r
195                                                                 'default' : '',\r
196                                                                 setup : setupAdvParams,\r
197                                                                 commit : commitAdvParams\r
198 \r
199                                                         }\r
200                                                 ]\r
201                                         });\r
202                         }\r
203 \r
204                         result.elements[ 0 ].children.push(\r
205                                 {\r
206                                         type : 'hbox',\r
207                                         widths : [ '50%', '50%' ],\r
208                                         children : [].concat( contents )\r
209                                 });\r
210                 }\r
211 \r
212                 return result;\r
213         }\r
214 });\r
215 \r
216 })();\r