blob: 8e46b6ce5d1e4d26fc9f0c4e501b3eefa9b0dae1 [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
Felix Meschbergere7551df2009-10-26 13:39:09 +0000156 // of the Delete button is not accepted by IE6 (!)...
Felix Meschberger018b1442008-06-25 23:09:26 +0000157 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",
Guillaume Nodet283faa32010-03-04 20:54:39 +0000184 style: { height: "20em", width: "99%" }
Felix Meschberger52247062009-10-23 22:15:54 +0000185 }, [ text( propsValue ) ] ),
Guillaume Nodet283faa32010-03-04 20:54:39 +0000186 createElement( "br" ),
Felix Meschberger52247062009-10-23 22:15:54 +0000187 text( "Enter Name-Value pairs of configuration properties" )
188 ])
Felix Meschberger5af75272008-06-25 20:26:13 +0000189 ])
Felix Meschberger52247062009-10-23 22:15:54 +0000190 );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000191}
192
Felix Meschberger5af75272008-06-25 20:26:13 +0000193function printForm( /* Element */ parent, obj ) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000194 var propList;
Felix Meschberger5af75272008-06-25 20:26:13 +0000195 for (var idx in obj.propertylist)
196 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000197 var prop = obj.propertylist[idx];
198 var attr = obj[prop];
Felix Meschberger5af75272008-06-25 20:26:13 +0000199
Felix Meschberger5af75272008-06-25 20:26:13 +0000200 var trEl = tr( "content", null, [
201 td( "content aligntop", null, [ text( attr.name ) ] )
202 ]);
203 parent.appendChild( trEl );
204
Felix Meschberger018b1442008-06-25 23:09:26 +0000205 var tdEl = td( "content", { style: { width: "99%" } } );
Felix Meschberger5af75272008-06-25 20:26:13 +0000206 trEl.appendChild( tdEl );
207
208 if (attr.value != undefined)
209 {
210 // check is required to also handle empty strings, 0 and false
211 tdEl.appendChild( createInput( prop, attr.value, attr.type, '99%' ) );
212 tdEl.appendChild( createElement( "br" ) );
213 }
214 else if (typeof(attr.type) == 'object')
215 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000216 // assume attr.values and multiselect
Felix Meschberger5af75272008-06-25 20:26:13 +0000217 createMultiSelect( tdEl, prop, attr.values, attr.type, '99%' );
218 tdEl.appendChild( createElement( "br" ) );
219 }
220 else if (attr.values.length == 0)
221 {
222 tdEl.appendChild( createSpan( prop, "", attr.type ) );
223 }
224 else
225 {
Carsten Ziegelere626d302009-03-05 18:55:47 +0000226 for (var i=0;i<attr.values.length;i++)
Felix Meschberger5af75272008-06-25 20:26:13 +0000227 {
Carsten Ziegelere626d302009-03-05 18:55:47 +0000228 tdEl.appendChild( createSpan( prop, attr.values[i], attr.type ) );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000229 }
230 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000231
232 if (attr.description)
233 {
234 addText( tdEl, attr.description );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000235 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000236
Felix Meschbergerca29a962008-05-16 11:59:32 +0000237 if (propList) {
238 propList += ',' + prop;
239 } else {
240 propList = prop;
241 }
242 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000243
Felix Meschberger5af75272008-06-25 20:26:13 +0000244 parent.appendChild( createElement( "input", null, {
245 type: "hidden",
246 name: "propertylist",
247 value: propList
248 })
249 );
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000250 // FIX for IE6 and above: checkbox can only be checked after it is in the DOM
251 $(".checked_box").attr("checked", true).removeClass("checked_box");
Felix Meschbergerca29a962008-05-16 11:59:32 +0000252}
253
Felix Meschberger5af75272008-06-25 20:26:13 +0000254function printConfigurationInfo( /* Element */ parent, obj )
255{
Felix Meschberger5af75272008-06-25 20:26:13 +0000256 parent.appendChild( tr( "content", null, [
Felix Meschberger018b1442008-06-25 23:09:26 +0000257 createElement( "th", "content", { colSpan: "2" }, [
Felix Meschberger5af75272008-06-25 20:26:13 +0000258 text( "Configuration Information" )
259 ])
260 ])
261 );
Felix Meschbergercd169b22008-06-13 12:19:36 +0000262
Felix Meschberger5af75272008-06-25 20:26:13 +0000263 parent.appendChild( tr( "content", null, [
264 td( "content", null, [
265 text( "Persistent Identity (PID)" )
266 ]),
267 td( "content", null, [
268 text( obj.pid )
269 ])
270 ])
271 );
272
Carsten Ziegelerf7eab262008-12-21 17:59:09 +0000273 if (obj.factoryPid)
Felix Meschberger5af75272008-06-25 20:26:13 +0000274 {
Felix Meschberger5af75272008-06-25 20:26:13 +0000275 parent.appendChild( tr( "content", null, [
276 td( "content", null, [
277 text( "Factory Peristent Identifier (Factory PID)" )
278 ]),
279 td( "content", null, [
Carsten Ziegelerf7eab262008-12-21 17:59:09 +0000280 text( obj.factoryPid )
Felix Meschberger5af75272008-06-25 20:26:13 +0000281 ])
282 ])
283 );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000284 }
Felix Meschbergercd169b22008-06-13 12:19:36 +0000285
286 var binding = obj.bundleLocation;
Felix Meschberger5af75272008-06-25 20:26:13 +0000287 if (!binding)
288 {
Felix Meschbergercd169b22008-06-13 12:19:36 +0000289 binding = "Unbound or new configuration";
290 }
291
Felix Meschberger5af75272008-06-25 20:26:13 +0000292 parent.appendChild( tr( "content", null, [
293 td( "content", null, [
294 text( "Configuration Binding" )
295 ]),
296 td( "content", null, [
297 text( binding )
298 ])
299 ])
300 );
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000301
302 if (obj.bundleLocation)
303 {
Felix Meschbergere7551df2009-10-26 13:39:09 +0000304 var form = createElement( "form", null, {
305 method: "POST",
306 action: pluginRoot + "/" + obj.pid
307 });
308
309 // define this form contents as innerHTML otherwise the onClick
310 // event handler of the Unbind button is not accepted by IE6 (!)...
311 var formInner = '<input type="hidden" name="unbind" value="true"/>';
312 formInner += '<input type="submit" name="submit" value="Unbind" class="submit" title="Unbind Configuration from Bundle" onClick="return confirmUnbind(\'' + obj.pid + '\', \'' + obj.bundleLocation + '\');"/>';
313 form.innerHTML = formInner;
314
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000315 parent.appendChild( tr( "content", null, [
316 td( "content", null, [
317 text( " " )
318 ]),
Felix Meschbergere7551df2009-10-26 13:39:09 +0000319 td( "content", null, [ form ] )
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000320 ])
321 );
322 }
Felix Meschbergerca29a962008-05-16 11:59:32 +0000323}
324
Felix Meschbergerca29a962008-05-16 11:59:32 +0000325
326var spanCounter = 0;
Felix Meschberger5af75272008-06-25 20:26:13 +0000327/* Element */ function createSpan(prop, value, type) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000328 spanCounter++;
329 var newId = prop + spanCounter;
Felix Meschberger5af75272008-06-25 20:26:13 +0000330
Carsten Ziegelere626d302009-03-05 18:55:47 +0000331 var addButton = createElement("input", "input",
332 { type: "button",
333 style: {width : "5%"},
334 value: "+"
335 }
336 );
337 $(addButton).click(function() {addValue(prop, newId)});
338 var remButton = createElement("input", "input",
339 { type: "button",
340 style: {width : "5%"},
341 value: "-"
342 }
343 );
344 $(remButton).click(function() {removeValue(newId)});
Felix Meschberger018b1442008-06-25 23:09:26 +0000345 var spanEl = createElement( "span", null, { id: newId }, [
Carsten Ziegelere626d302009-03-05 18:55:47 +0000346 createInput( prop, value, type, '89%' ), addButton, remButton,
347 createElement("br")
Felix Meschberger5af75272008-06-25 20:26:13 +0000348 ]);
Felix Meschberger018b1442008-06-25 23:09:26 +0000349
Felix Meschberger018b1442008-06-25 23:09:26 +0000350 return spanEl;
Felix Meschbergerca29a962008-05-16 11:59:32 +0000351}
352
Felix Meschberger5af75272008-06-25 20:26:13 +0000353/* Element */ function createInput(prop, value, type, width) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000354 if (type == 11) { // AttributeDefinition.BOOLEAN
Felix Meschberger5af75272008-06-25 20:26:13 +0000355
356 var inputEl = createElement( "input", "input", {
357 type: "checkbox",
358 name: prop,
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000359 value: "true"
Felix Meschberger5af75272008-06-25 20:26:13 +0000360 });
361
362 if (value && typeof(value) != "boolean")
363 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000364 value = value.toString().toLowerCase() == "true";
365 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000366 if (value)
367 {
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000368 $(inputEl).addClass("checked_box");
Felix Meschberger5af75272008-06-25 20:26:13 +0000369 }
Carsten Ziegeleraad8b882008-10-15 12:13:54 +0000370 var hiddenEl = createElement( "input", "input", {
371 type: "hidden",
372 name: prop,
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000373 value: "false"
Carsten Ziegeleraad8b882008-10-15 12:13:54 +0000374 });
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000375 var divEl = createElement("div");
Carsten Ziegeleraad8b882008-10-15 12:13:54 +0000376 divEl.appendChild(inputEl);
377 divEl.appendChild(hiddenEl);
378 return divEl;
Felix Meschberger5af75272008-06-25 20:26:13 +0000379
Felix Meschbergerca29a962008-05-16 11:59:32 +0000380 } else if (typeof(type) == "object") { // predefined values
Felix Meschberger5af75272008-06-25 20:26:13 +0000381
382 var selectEl = createElement( "select", "select", {
383 name: prop,
Felix Meschberger018b1442008-06-25 23:09:26 +0000384 style: { width: width }
Felix Meschberger5af75272008-06-25 20:26:13 +0000385 });
386
Felix Meschbergerca29a962008-05-16 11:59:32 +0000387 var labels = type.labels;
388 var values = type.values;
Felix Meschberger5af75272008-06-25 20:26:13 +0000389 for (var idx in labels) {
390 var optionEl = createElement( "option", null, {
391 value: values[idx]
392 }, [ text( labels[idx] ) ]);
393
394 if (value == values[idx])
395 {
396 optionEl.setAttribute( "selected", true );
397 }
398 selectEl.appendChild( optionEl );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000399 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000400
401 return selectEl;
402
Felix Meschbergerca29a962008-05-16 11:59:32 +0000403 } else { // Simple
Felix Meschberger5af75272008-06-25 20:26:13 +0000404 return createElement( "input", "input", {
405 type: "text",
406 name: prop,
407 value: value,
Felix Meschberger018b1442008-06-25 23:09:26 +0000408 style: { width: width }
Felix Meschberger5af75272008-06-25 20:26:13 +0000409 });
Felix Meschbergerca29a962008-05-16 11:59:32 +0000410 }
411}
412
Felix Meschberger5af75272008-06-25 20:26:13 +0000413function createMultiSelect(/* Element */ parent, prop, values, options, width) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000414 // convert value list into 'set'
415 var valueSet = new Object();
416 for (var idx in values) {
417 valueSet[ values[idx] ] = true;
418 }
419
420 var labels = options.labels;
421 var values = options.values;
Felix Meschbergerca29a962008-05-16 11:59:32 +0000422 for (var idx in labels) {
Felix Meschberger5af75272008-06-25 20:26:13 +0000423
424 var inputEl = createElement( "input", null, {
425 type: "checkbox",
426 name: prop,
427 value: values[idx]
428 });
429
430 if (valueSet[ values[idx] ])
431 {
432 inputEl.setAttribute( "checked", true );
433 }
434
Felix Meschberger8f915312009-09-08 13:58:45 +0000435 var labelEl = createElement( "label", "multiselect" );
Felix Meschberger5af75272008-06-25 20:26:13 +0000436 labelEl.appendChild( inputEl );
437 addText( labelEl, labels[idx] );
438
439 parent.appendChild( labelEl );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000440 }
Felix Meschbergerca29a962008-05-16 11:59:32 +0000441}
442
Felix Meschberger5af75272008-06-25 20:26:13 +0000443
444function addValue(prop, vidx)
445{
Felix Meschbergerca29a962008-05-16 11:59:32 +0000446 var span = document.getElementById(vidx);
Felix Meschberger5af75272008-06-25 20:26:13 +0000447 if (!span)
448 {
449 return;
450 }
451 var newSpan = createSpan(prop, '');
452 span.parentNode.insertBefore(newSpan, span.nextSibling);
Carsten Ziegelerbd5b5012009-03-05 19:47:40 +0000453 // FIX for IE6 and above: checkbox can only be checked after it is in the DOM
454 $(".checked_box").attr("checked", true).removeClass("checked_box");
Felix Meschberger5af75272008-06-25 20:26:13 +0000455}
456
457function removeValue(vidx)
458{
459 var span = document.getElementById(vidx);
460 if (!span)
461 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000462 return;
463 }
464 span.parentNode.removeChild(span);
465}
466
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000467function configConfirm(/* String */ message, /* String */ title, /* String */ location)
Felix Meschberger5af75272008-06-25 20:26:13 +0000468{
Felix Meschberger6a6b9aa2009-10-26 13:06:41 +0000469 var message = "Are you sure to delete this configuration ?";
470
471 if (title) {
472 message += "\r\nConfiguration: " + title;
473 }
474 if (location) {
475 message += "\r\nBundle: " + location;
476 }
477
478 return confirm(message);
479}
480
481function confirmDelete(/* String */ title, /* String */ location)
482{
483 return configConfirm("Are you sure to unbind this configuration ?", title, location);
484}
485
486function confirmUnbind(/* String */ title, /* String */ location)
487{
488 return configConfirm("Are you sure to unbind this configuration ?", title, location);
Felix Meschbergerca29a962008-05-16 11:59:32 +0000489}