blob: 3ee8a78dc7e0820eceba76bb9db5265c557dc5c6 [file] [log] [blame]
Felix Meschbergerca29a962008-05-16 11:59:32 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18
19function configure() {
20 var span = document.getElementById('configField');
21 if (!span) {
22 return;
23 }
Felix Meschbergercd169b22008-06-13 12:19:36 +000024 var select = document.getElementById('configSelection_pid');
Felix Meschbergerca29a962008-05-16 11:59:32 +000025 var pid = select.options[select.selectedIndex].value;
Felix Meschbergerb6c7aec2008-06-17 11:43:01 +000026 var parm = pluginRoot + '/' + pid;
27 sendRequest('POST', parm, displayConfigForm);
Felix Meschbergerca29a962008-05-16 11:59:32 +000028}
29
Felix Meschbergercd169b22008-06-13 12:19:36 +000030
31function create() {
Felix Meschbergerca29a962008-05-16 11:59:32 +000032 var span = document.getElementById('configField');
33 if (!span) {
34 return;
35 }
Felix Meschbergercd169b22008-06-13 12:19:36 +000036 var select = document.getElementById('configSelection_factory');
37 var pid = select.options[select.selectedIndex].value;
Felix Meschbergerb6c7aec2008-06-17 11:43:01 +000038 var parm = pluginRoot + '/' + pid + '?create=true';
39 sendRequest('POST', parm, displayConfigForm);
Felix Meschbergercd169b22008-06-13 12:19:36 +000040}
41
42function displayConfigForm(obj) {
43 var span1 = document.getElementById('configField');
44 var span2 = document.getElementById('factoryField');
45 if (!span1 && !span2) {
46 return;
47 }
48
Felix Meschberger5af75272008-06-25 20:26:13 +000049 var parent = span1 ? span1.parentNode : span2.parentNode;
50
51 clearChildren( parent );
Felix Meschbergercd169b22008-06-13 12:19:36 +000052
53 if (span1) {
Felix Meschberger5af75272008-06-25 20:26:13 +000054 parent.appendChild( span1 );
Felix Meschbergercd169b22008-06-13 12:19:36 +000055 }
56 if (span2) {
Felix Meschberger5af75272008-06-25 20:26:13 +000057 parent.appendChild( span2 );
Felix Meschbergercd169b22008-06-13 12:19:36 +000058 }
59
Felix Meschberger5af75272008-06-25 20:26:13 +000060 var trEl = tr( "content" );
Felix Meschberger018b1442008-06-25 23:09:26 +000061 var tdEl = createElement( "th", "content", { colSpan: "2" } );
Felix Meschberger5af75272008-06-25 20:26:13 +000062 addText( tdEl, obj.title );
63 trEl.appendChild( tdEl );
64 parent.appendChild( trEl );
65
Felix Meschberger5af75272008-06-25 20:26:13 +000066 trEl = tr( "content" );
67 parent.appendChild( trEl );
Felix Meschbergercd169b22008-06-13 12:19:36 +000068
Felix Meschberger5af75272008-06-25 20:26:13 +000069 tdEl = td( "content" );
70 addText( tdEl, "\u00a0" );
71 trEl.appendChild( tdEl );
72
Felix Meschberger5af75272008-06-25 20:26:13 +000073 tdEl = td( "content" );
74 trEl.appendChild( tdEl );
75
Felix Meschberger5af75272008-06-25 20:26:13 +000076 var formEl = createElement( "form", null, {
Carsten Ziegeler2d009d42009-03-05 17:55:53 +000077 method: "POST",
Felix Meschberger5af75272008-06-25 20:26:13 +000078 action: pluginRoot + "/" + obj.pid
79 });
80 tdEl.appendChild( formEl );
81
82 var inputEl = createElement( "input", null, {
83 type: "hidden",
84 name: "apply",
85 value: "true"
86 });
87 formEl.appendChild( inputEl );
Felix Meschbergerb6c7aec2008-06-17 11:43:01 +000088
89 // add the factory PID as a hidden form field if present
90 if (obj.factoryPid)
91 {
Felix Meschberger5af75272008-06-25 20:26:13 +000092 inputEl = createElement( "input", null, {
93 type: "hidden",
94 name: "factoryPid",
95 value: obj.factoryPid
96 });
97 formEl.appendChild( inputEl );
Felix Meschbergerb6c7aec2008-06-17 11:43:01 +000098 }
99
Felix Meschbergerc76ee7f2008-09-29 11:00:33 +0000100 // add the PID filter as a hidden form field if present
101 if (obj.pidFilter)
102 {
103 inputEl = createElement( "input", null, {
104 type: "hidden",
105 name: "pidFilter",
106 value: obj.pidFilter
107 });
108 formEl.appendChild( inputEl );
109 }
110
Felix Meschberger5af75272008-06-25 20:26:13 +0000111 inputEl = createElement( "input", null, {
112 type: "hidden",
113 name: "action",
114 value: "ajaxConfigManager"
115 });
116 formEl.appendChild( inputEl );
Felix Meschbergercd169b22008-06-13 12:19:36 +0000117
Felix Meschberger5af75272008-06-25 20:26:13 +0000118 var tableEl = createElement( "table", null, {
119 border: 0,
120 width: "100%"
121 });
122 formEl.appendChild( tableEl );
Felix Meschbergercd169b22008-06-13 12:19:36 +0000123
Felix Meschberger5af75272008-06-25 20:26:13 +0000124 var bodyEl = createElement( "tbody" );
125 tableEl.appendChild( bodyEl );
126
127 if (obj.description)
128 {
Felix Meschberger5af75272008-06-25 20:26:13 +0000129 trEl = tr( "content" );
Felix Meschberger018b1442008-06-25 23:09:26 +0000130 tdEl = td( "content", { colSpan: "2" } );
Felix Meschberger5af75272008-06-25 20:26:13 +0000131 addText( tdEl, obj.description );
132 trEl.appendChild( tdEl );
133 bodyEl.appendChild( trEl );
134 }
135
136 if (obj.propertylist == 'properties')
137 {
138 printTextArea(bodyEl, obj.properties);
139 }
140 else
141 {
142 printForm(bodyEl, obj);
143 }
144
Felix Meschberger5af75272008-06-25 20:26:13 +0000145 trEl = tr( "content" );
146 bodyEl.appendChild( trEl );
147
Felix Meschberger5af75272008-06-25 20:26:13 +0000148 tdEl = td( "content" );
149 addText( tdEl, "\u00a0" );
150 trEl.appendChild( tdEl );
151
Felix Meschberger5af75272008-06-25 20:26:13 +0000152 tdEl = td( "content" );
153 trEl.appendChild( tdEl );
Felix Meschberger5af75272008-06-25 20:26:13 +0000154
Felix Meschberger018b1442008-06-25 23:09:26 +0000155 // define this TD as innerHTML otherwise the onClick event handler
156 // of the Delete button is not accepted by IE...
157 var innerHTML = '<input type="submit" class="submit" name="submit" value="Save" />';
158 innerHTML += '&nbsp;&nbsp;&nbsp;';
159 innerHTML += '<input type="reset" class="submit" name="reset" value="Reset" />';
160 innerHTML += '&nbsp;&nbsp;&nbsp;';
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000161 innerHTML += '<input type="submit" class="submit" name="delete" value="Delete" onClick="return confirmDelete(\'' + obj.pid + '\', \'' + obj.bundleLocation + '\');"/>';
Felix Meschberger018b1442008-06-25 23:09:26 +0000162 tdEl.innerHTML = innerHTML;
Felix Meschberger5af75272008-06-25 20:26:13 +0000163
Felix Meschberger5af75272008-06-25 20:26:13 +0000164 printConfigurationInfo(parent, obj);
Felix Meschbergerca29a962008-05-16 11:59:32 +0000165}
166
Felix Meschberger018b1442008-06-25 23:09:26 +0000167function printTextArea(/* Element */ parent, props )
168{
Felix Meschberger5af75272008-06-25 20:26:13 +0000169
170 var propsValue = "";
Felix Meschberger018b1442008-06-25 23:09:26 +0000171 for (var key in props)
172 {
Felix Meschberger5af75272008-06-25 20:26:13 +0000173 propsValue += key + ' = ' + props[key] + '\r\n';
174 }
175
Felix Meschberger52247062009-10-23 22:15:54 +0000176 parent.appendChild(
177 tr( "content", null, [
178 td( "content aligntop", null, [
179 text( "Properties" )
180 ]),
181 td( "content", { style: { width: "99%" } }, [
182 createElement( "textarea", null, {
183 name: "properties",
184 style: { height: "50%", width: "99%" }
185 }, [ text( propsValue ) ] ),
186 text( "Enter Name-Value pairs of configuration properties" )
187 ])
Felix Meschberger5af75272008-06-25 20:26:13 +0000188 ])
Felix Meschberger52247062009-10-23 22:15:54 +0000189 );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000190}
191
Felix Meschberger5af75272008-06-25 20:26:13 +0000192function printForm( /* Element */ parent, obj ) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000193 var propList;
Felix Meschberger5af75272008-06-25 20:26:13 +0000194 for (var idx in obj.propertylist)
195 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000196 var prop = obj.propertylist[idx];
197 var attr = obj[prop];
Felix Meschberger5af75272008-06-25 20:26:13 +0000198
Felix Meschberger5af75272008-06-25 20:26:13 +0000199 var trEl = tr( "content", null, [
200 td( "content aligntop", null, [ text( attr.name ) ] )
201 ]);
202 parent.appendChild( trEl );
203
Felix Meschberger018b1442008-06-25 23:09:26 +0000204 var tdEl = td( "content", { style: { width: "99%" } } );
Felix Meschberger5af75272008-06-25 20:26:13 +0000205 trEl.appendChild( tdEl );
206
207 if (attr.value != undefined)
208 {
209 // check is required to also handle empty strings, 0 and false
210 tdEl.appendChild( createInput( prop, attr.value, attr.type, '99%' ) );
211 tdEl.appendChild( createElement( "br" ) );
212 }
213 else if (typeof(attr.type) == 'object')
214 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000215 // assume attr.values and multiselect
Felix Meschberger5af75272008-06-25 20:26:13 +0000216 createMultiSelect( tdEl, prop, attr.values, attr.type, '99%' );
217 tdEl.appendChild( createElement( "br" ) );
218 }
219 else if (attr.values.length == 0)
220 {
221 tdEl.appendChild( createSpan( prop, "", attr.type ) );
222 }
223 else
224 {
Carsten Ziegelere626d302009-03-05 18:55:47 +0000225 for (var i=0;i<attr.values.length;i++)
Felix Meschberger5af75272008-06-25 20:26:13 +0000226 {
Carsten Ziegelere626d302009-03-05 18:55:47 +0000227 tdEl.appendChild( createSpan( prop, attr.values[i], attr.type ) );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000228 }
229 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000230
231 if (attr.description)
232 {
233 addText( tdEl, attr.description );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000234 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000235
Felix Meschbergerca29a962008-05-16 11:59:32 +0000236 if (propList) {
237 propList += ',' + prop;
238 } else {
239 propList = prop;
240 }
241 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000242
Felix Meschberger5af75272008-06-25 20:26:13 +0000243 parent.appendChild( createElement( "input", null, {
244 type: "hidden",
245 name: "propertylist",
246 value: propList
247 })
248 );
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000249 // FIX for IE6 and above: checkbox can only be checked after it is in the DOM
250 $(".checked_box").attr("checked", true).removeClass("checked_box");
Felix Meschbergerca29a962008-05-16 11:59:32 +0000251}
252
Felix Meschberger5af75272008-06-25 20:26:13 +0000253function printConfigurationInfo( /* Element */ parent, obj )
254{
Felix Meschberger5af75272008-06-25 20:26:13 +0000255 parent.appendChild( tr( "content", null, [
Felix Meschberger018b1442008-06-25 23:09:26 +0000256 createElement( "th", "content", { colSpan: "2" }, [
Felix Meschberger5af75272008-06-25 20:26:13 +0000257 text( "Configuration Information" )
258 ])
259 ])
260 );
Felix Meschbergercd169b22008-06-13 12:19:36 +0000261
Felix Meschberger5af75272008-06-25 20:26:13 +0000262 parent.appendChild( tr( "content", null, [
263 td( "content", null, [
264 text( "Persistent Identity (PID)" )
265 ]),
266 td( "content", null, [
267 text( obj.pid )
268 ])
269 ])
270 );
271
Carsten Ziegelerf7eab262008-12-21 17:59:09 +0000272 if (obj.factoryPid)
Felix Meschberger5af75272008-06-25 20:26:13 +0000273 {
Felix Meschberger5af75272008-06-25 20:26:13 +0000274 parent.appendChild( tr( "content", null, [
275 td( "content", null, [
276 text( "Factory Peristent Identifier (Factory PID)" )
277 ]),
278 td( "content", null, [
Carsten Ziegelerf7eab262008-12-21 17:59:09 +0000279 text( obj.factoryPid )
Felix Meschberger5af75272008-06-25 20:26:13 +0000280 ])
281 ])
282 );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000283 }
Felix Meschbergercd169b22008-06-13 12:19:36 +0000284
285 var binding = obj.bundleLocation;
Felix Meschberger5af75272008-06-25 20:26:13 +0000286 if (!binding)
287 {
Felix Meschbergercd169b22008-06-13 12:19:36 +0000288 binding = "Unbound or new configuration";
289 }
290
Felix Meschberger5af75272008-06-25 20:26:13 +0000291 parent.appendChild( tr( "content", null, [
292 td( "content", null, [
293 text( "Configuration Binding" )
294 ]),
295 td( "content", null, [
296 text( binding )
297 ])
298 ])
299 );
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000300
301 if (obj.bundleLocation)
302 {
303 parent.appendChild( tr( "content", null, [
304 td( "content", null, [
305 text( " " )
306 ]),
307 td( "content", null, [
308 createElement( "form", null, {
309 method: "POST",
310 action: pluginRoot + "/" + obj.pid
311 }, [
312 createElement( "input", null, {
313 type: "hidden",
314 name: "unbind",
315 value: "true"
316 }),
317 createElement( "input", "submit", {
318 type: "submit",
319 name: "submit",
320 value: "Unbind",
321 title: "Unbind Configuration from Bundle",
322 onClick: "return confirmUnbind('" + obj.pid + "', '" + obj.bundleLocation + "');"
323 })
324 ])
325 ])
326 ])
327 );
328 }
Felix Meschbergerca29a962008-05-16 11:59:32 +0000329}
330
Felix Meschbergerca29a962008-05-16 11:59:32 +0000331
332var spanCounter = 0;
Felix Meschberger5af75272008-06-25 20:26:13 +0000333/* Element */ function createSpan(prop, value, type) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000334 spanCounter++;
335 var newId = prop + spanCounter;
Felix Meschberger5af75272008-06-25 20:26:13 +0000336
Carsten Ziegelere626d302009-03-05 18:55:47 +0000337 var addButton = createElement("input", "input",
338 { type: "button",
339 style: {width : "5%"},
340 value: "+"
341 }
342 );
343 $(addButton).click(function() {addValue(prop, newId)});
344 var remButton = createElement("input", "input",
345 { type: "button",
346 style: {width : "5%"},
347 value: "-"
348 }
349 );
350 $(remButton).click(function() {removeValue(newId)});
Felix Meschberger018b1442008-06-25 23:09:26 +0000351 var spanEl = createElement( "span", null, { id: newId }, [
Carsten Ziegelere626d302009-03-05 18:55:47 +0000352 createInput( prop, value, type, '89%' ), addButton, remButton,
353 createElement("br")
Felix Meschberger5af75272008-06-25 20:26:13 +0000354 ]);
Felix Meschberger018b1442008-06-25 23:09:26 +0000355
Felix Meschberger018b1442008-06-25 23:09:26 +0000356 return spanEl;
Felix Meschbergerca29a962008-05-16 11:59:32 +0000357}
358
Felix Meschberger5af75272008-06-25 20:26:13 +0000359/* Element */ function createInput(prop, value, type, width) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000360 if (type == 11) { // AttributeDefinition.BOOLEAN
Felix Meschberger5af75272008-06-25 20:26:13 +0000361
362 var inputEl = createElement( "input", "input", {
363 type: "checkbox",
364 name: prop,
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000365 value: "true"
Felix Meschberger5af75272008-06-25 20:26:13 +0000366 });
367
368 if (value && typeof(value) != "boolean")
369 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000370 value = value.toString().toLowerCase() == "true";
371 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000372 if (value)
373 {
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000374 $(inputEl).addClass("checked_box");
Felix Meschberger5af75272008-06-25 20:26:13 +0000375 }
Carsten Ziegeleraad8b882008-10-15 12:13:54 +0000376 var hiddenEl = createElement( "input", "input", {
377 type: "hidden",
378 name: prop,
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000379 value: "false"
Carsten Ziegeleraad8b882008-10-15 12:13:54 +0000380 });
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000381 var divEl = createElement("div");
Carsten Ziegeleraad8b882008-10-15 12:13:54 +0000382 divEl.appendChild(inputEl);
383 divEl.appendChild(hiddenEl);
384 return divEl;
Felix Meschberger5af75272008-06-25 20:26:13 +0000385
Felix Meschbergerca29a962008-05-16 11:59:32 +0000386 } else if (typeof(type) == "object") { // predefined values
Felix Meschberger5af75272008-06-25 20:26:13 +0000387
388 var selectEl = createElement( "select", "select", {
389 name: prop,
Felix Meschberger018b1442008-06-25 23:09:26 +0000390 style: { width: width }
Felix Meschberger5af75272008-06-25 20:26:13 +0000391 });
392
Felix Meschbergerca29a962008-05-16 11:59:32 +0000393 var labels = type.labels;
394 var values = type.values;
Felix Meschberger5af75272008-06-25 20:26:13 +0000395 for (var idx in labels) {
396 var optionEl = createElement( "option", null, {
397 value: values[idx]
398 }, [ text( labels[idx] ) ]);
399
400 if (value == values[idx])
401 {
402 optionEl.setAttribute( "selected", true );
403 }
404 selectEl.appendChild( optionEl );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000405 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000406
407 return selectEl;
408
Felix Meschbergerca29a962008-05-16 11:59:32 +0000409 } else { // Simple
Felix Meschberger5af75272008-06-25 20:26:13 +0000410 return createElement( "input", "input", {
411 type: "text",
412 name: prop,
413 value: value,
Felix Meschberger018b1442008-06-25 23:09:26 +0000414 style: { width: width }
Felix Meschberger5af75272008-06-25 20:26:13 +0000415 });
Felix Meschbergerca29a962008-05-16 11:59:32 +0000416 }
417}
418
Felix Meschberger5af75272008-06-25 20:26:13 +0000419function createMultiSelect(/* Element */ parent, prop, values, options, width) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000420 // convert value list into 'set'
421 var valueSet = new Object();
422 for (var idx in values) {
423 valueSet[ values[idx] ] = true;
424 }
425
426 var labels = options.labels;
427 var values = options.values;
Felix Meschbergerca29a962008-05-16 11:59:32 +0000428 for (var idx in labels) {
Felix Meschberger5af75272008-06-25 20:26:13 +0000429
430 var inputEl = createElement( "input", null, {
431 type: "checkbox",
432 name: prop,
433 value: values[idx]
434 });
435
436 if (valueSet[ values[idx] ])
437 {
438 inputEl.setAttribute( "checked", true );
439 }
440
Felix Meschberger8f915312009-09-08 13:58:45 +0000441 var labelEl = createElement( "label", "multiselect" );
Felix Meschberger5af75272008-06-25 20:26:13 +0000442 labelEl.appendChild( inputEl );
443 addText( labelEl, labels[idx] );
444
445 parent.appendChild( labelEl );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000446 }
Felix Meschbergerca29a962008-05-16 11:59:32 +0000447}
448
Felix Meschberger5af75272008-06-25 20:26:13 +0000449
450function addValue(prop, vidx)
451{
Felix Meschbergerca29a962008-05-16 11:59:32 +0000452 var span = document.getElementById(vidx);
Felix Meschberger5af75272008-06-25 20:26:13 +0000453 if (!span)
454 {
455 return;
456 }
457 var newSpan = createSpan(prop, '');
458 span.parentNode.insertBefore(newSpan, span.nextSibling);
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000459 // FIX for IE6 and above: checkbox can only be checked after it is in the DOM
460 $(".checked_box").attr("checked", true).removeClass("checked_box");
Felix Meschberger5af75272008-06-25 20:26:13 +0000461}
462
463function removeValue(vidx)
464{
465 var span = document.getElementById(vidx);
466 if (!span)
467 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000468 return;
469 }
470 span.parentNode.removeChild(span);
471}
472
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000473function configConfirm(/* String */ message, /* String */ title, /* String */ location)
Felix Meschberger5af75272008-06-25 20:26:13 +0000474{
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000475 var message = "Are you sure to delete this configuration ?";
476
477 if (title) {
478 message += "\r\nConfiguration: " + title;
479 }
480 if (location) {
481 message += "\r\nBundle: " + location;
482 }
483
484 return confirm(message);
485}
486
487function confirmDelete(/* String */ title, /* String */ location)
488{
489 return configConfirm("Are you sure to unbind this configuration ?", title, location);
490}
491
492function confirmUnbind(/* String */ title, /* String */ location)
493{
494 return configConfirm("Are you sure to unbind this configuration ?", title, location);
Felix Meschbergerca29a962008-05-16 11:59:32 +0000495}