blob: 392c154fbd3327effb429cec4f9a62a8db282c03 [file] [log] [blame]
Felix Meschbergerbb30b0c2008-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 Meschberger5611f012008-06-13 12:19:36 +000024 var select = document.getElementById('configSelection_pid');
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +000025 var pid = select.options[select.selectedIndex].value;
Felix Meschberger0407e252008-06-17 11:43:01 +000026 var parm = pluginRoot + '/' + pid;
27 sendRequest('POST', parm, displayConfigForm);
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +000028}
29
Felix Meschberger5611f012008-06-13 12:19:36 +000030
31function create() {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +000032 var span = document.getElementById('configField');
33 if (!span) {
34 return;
35 }
Felix Meschberger5611f012008-06-13 12:19:36 +000036 var select = document.getElementById('configSelection_factory');
37 var pid = select.options[select.selectedIndex].value;
Felix Meschberger0407e252008-06-17 11:43:01 +000038 var parm = pluginRoot + '/' + pid + '?create=true';
39 sendRequest('POST', parm, displayConfigForm);
Felix Meschberger5611f012008-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 Meschbergerc07350a2008-06-25 20:26:13 +000049 var parent = span1 ? span1.parentNode : span2.parentNode;
50
51 clearChildren( parent );
Felix Meschberger5611f012008-06-13 12:19:36 +000052
53 if (span1) {
Felix Meschbergerc07350a2008-06-25 20:26:13 +000054 parent.appendChild( span1 );
Felix Meschberger5611f012008-06-13 12:19:36 +000055 }
56 if (span2) {
Felix Meschbergerc07350a2008-06-25 20:26:13 +000057 parent.appendChild( span2 );
Felix Meschberger5611f012008-06-13 12:19:36 +000058 }
59
Felix Meschbergerc07350a2008-06-25 20:26:13 +000060 var trEl = tr( "content" );
Felix Meschbergerfb550db2008-06-25 23:09:26 +000061 var tdEl = createElement( "th", "content", { colSpan: "2" } );
Felix Meschbergerc07350a2008-06-25 20:26:13 +000062 addText( tdEl, obj.title );
63 trEl.appendChild( tdEl );
64 parent.appendChild( trEl );
65
Felix Meschbergerc07350a2008-06-25 20:26:13 +000066 trEl = tr( "content" );
67 parent.appendChild( trEl );
Felix Meschberger5611f012008-06-13 12:19:36 +000068
Felix Meschbergerc07350a2008-06-25 20:26:13 +000069 tdEl = td( "content" );
70 addText( tdEl, "\u00a0" );
71 trEl.appendChild( tdEl );
72
Felix Meschbergerc07350a2008-06-25 20:26:13 +000073 tdEl = td( "content" );
74 trEl.appendChild( tdEl );
75
Felix Meschbergerc07350a2008-06-25 20:26:13 +000076 var formEl = createElement( "form", null, {
77 method: "post",
78 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 Meschberger0407e252008-06-17 11:43:01 +000088
89 // add the factory PID as a hidden form field if present
90 if (obj.factoryPid)
91 {
Felix Meschbergerc07350a2008-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 Meschberger0407e252008-06-17 11:43:01 +000098 }
99
Felix Meschberger05d2e9b2008-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 Meschbergerc07350a2008-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 Meschberger5611f012008-06-13 12:19:36 +0000117
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000118 var tableEl = createElement( "table", null, {
119 border: 0,
120 width: "100%"
121 });
122 formEl.appendChild( tableEl );
Felix Meschberger5611f012008-06-13 12:19:36 +0000123
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000124 var bodyEl = createElement( "tbody" );
125 tableEl.appendChild( bodyEl );
126
127 if (obj.description)
128 {
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000129 trEl = tr( "content" );
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000130 tdEl = td( "content", { colSpan: "2" } );
Felix Meschbergerc07350a2008-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 Meschbergerc07350a2008-06-25 20:26:13 +0000145 trEl = tr( "content" );
146 bodyEl.appendChild( trEl );
147
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000148 tdEl = td( "content" );
149 addText( tdEl, "\u00a0" );
150 trEl.appendChild( tdEl );
151
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000152 tdEl = td( "content" );
153 trEl.appendChild( tdEl );
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000154
Felix Meschbergerfb550db2008-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;';
161 innerHTML += '<input type="submit" class="submit" name="delete" value="Delete" onClick="return confirmDelete();"/>';
162 tdEl.innerHTML = innerHTML;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000163
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000164 printConfigurationInfo(parent, obj);
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000165}
166
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000167function printTextArea(/* Element */ parent, props )
168{
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000169
170 var propsValue = "";
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000171 for (var key in props)
172 {
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000173 propsValue += key + ' = ' + props[key] + '\r\n';
174 }
175
176 return tr( "content", null, [
177 td( "content aligntop", null, [
178 text( "Properties" )
179 ]),
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000180 td( "content", { style: { width: "99%" } }, [
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000181 createElement( "textarea", null, {
182 name: "properties",
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000183 style: { height: "50%", width: "99%" }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000184 }, [ text( propsValue ) ] ),
185 text( "Enter Name-Value pairs of configuration properties" )
186 ])
187 ]);
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000188}
189
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000190function printForm( /* Element */ parent, obj ) {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000191 var propList;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000192 for (var idx in obj.propertylist)
193 {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000194 var prop = obj.propertylist[idx];
195 var attr = obj[prop];
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000196
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000197 var trEl = tr( "content", null, [
198 td( "content aligntop", null, [ text( attr.name ) ] )
199 ]);
200 parent.appendChild( trEl );
201
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000202 var tdEl = td( "content", { style: { width: "99%" } } );
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000203 trEl.appendChild( tdEl );
204
205 if (attr.value != undefined)
206 {
207 // check is required to also handle empty strings, 0 and false
208 tdEl.appendChild( createInput( prop, attr.value, attr.type, '99%' ) );
209 tdEl.appendChild( createElement( "br" ) );
210 }
211 else if (typeof(attr.type) == 'object')
212 {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000213 // assume attr.values and multiselect
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000214 createMultiSelect( tdEl, prop, attr.values, attr.type, '99%' );
215 tdEl.appendChild( createElement( "br" ) );
216 }
217 else if (attr.values.length == 0)
218 {
219 tdEl.appendChild( createSpan( prop, "", attr.type ) );
220 }
221 else
222 {
223 for (var vidx in attr.values)
224 {
225 tdEl.appendChild( createSpan( prop, attr.values[vidx], attr.type ) );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000226 }
227 }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000228
229 if (attr.description)
230 {
231 addText( tdEl, attr.description );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000232 }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000233
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000234 if (propList) {
235 propList += ',' + prop;
236 } else {
237 propList = prop;
238 }
239 }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000240
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000241 parent.appendChild( createElement( "input", null, {
242 type: "hidden",
243 name: "propertylist",
244 value: propList
245 })
246 );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000247}
248
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000249function printConfigurationInfo( /* Element */ parent, obj )
250{
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000251 parent.appendChild( tr( "content", null, [
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000252 createElement( "th", "content", { colSpan: "2" }, [
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000253 text( "Configuration Information" )
254 ])
255 ])
256 );
Felix Meschberger5611f012008-06-13 12:19:36 +0000257
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000258 parent.appendChild( tr( "content", null, [
259 td( "content", null, [
260 text( "Persistent Identity (PID)" )
261 ]),
262 td( "content", null, [
263 text( obj.pid )
264 ])
265 ])
266 );
267
268 if (obj.factoryPID)
269 {
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000270 parent.appendChild( tr( "content", null, [
271 td( "content", null, [
272 text( "Factory Peristent Identifier (Factory PID)" )
273 ]),
274 td( "content", null, [
275 text( obj.factoryPID )
276 ])
277 ])
278 );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000279 }
Felix Meschberger5611f012008-06-13 12:19:36 +0000280
281 var binding = obj.bundleLocation;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000282 if (!binding)
283 {
Felix Meschberger5611f012008-06-13 12:19:36 +0000284 binding = "Unbound or new configuration";
285 }
286
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000287 parent.appendChild( tr( "content", null, [
288 td( "content", null, [
289 text( "Configuration Binding" )
290 ]),
291 td( "content", null, [
292 text( binding )
293 ])
294 ])
295 );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000296}
297
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000298
299var spanCounter = 0;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000300/* Element */ function createSpan(prop, value, type) {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000301 spanCounter++;
302 var newId = prop + spanCounter;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000303
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000304 var spanEl = createElement( "span", null, { id: newId }, [
305 createInput( prop, value, type, '89%' )
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000306 ]);
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000307
308 // define this SPAN as innerHTML otherwise the onClick event handler
309 // of the buttons is not accepted by IE...
310 var innerHTML = "<input type='button' class='input' style='width:\"5%\"' value='+' onClick='addValue(\"" + prop + "\", \"" + newId + "\")' />";
311 innerHTML += "<input type='button' class='input' style='width:\"5%\"' value='-' onClick='removeValue(\"" + newId + "\")' />";
312 innerHTML += "<br />";
313 spanEl.innerHTML += innerHTML;
314
315 return spanEl;
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000316}
317
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000318/* Element */ function createInput(prop, value, type, width) {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000319 if (type == 11) { // AttributeDefinition.BOOLEAN
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000320
321 var inputEl = createElement( "input", "input", {
322 type: "checkbox",
323 name: prop,
324 value: true
325 });
326
327 if (value && typeof(value) != "boolean")
328 {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000329 value = value.toString().toLowerCase() == "true";
330 }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000331 if (value)
332 {
333 inputEl.setAttribute( "checked", true );
334 }
Carsten Ziegeler5f193ed2008-10-15 12:13:54 +0000335
336 var hiddenEl = createElement( "input", "input", {
337 type: "hidden",
338 name: prop,
339 value: false
340 });
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000341
Carsten Ziegeler5f193ed2008-10-15 12:13:54 +0000342 var divEl = createElement("div", "div");
343 divEl.appendChild(inputEl);
344 divEl.appendChild(hiddenEl);
345 return divEl;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000346
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000347 } else if (typeof(type) == "object") { // predefined values
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000348
349 var selectEl = createElement( "select", "select", {
350 name: prop,
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000351 style: { width: width }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000352 });
353
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000354 var labels = type.labels;
355 var values = type.values;
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000356 for (var idx in labels) {
357 var optionEl = createElement( "option", null, {
358 value: values[idx]
359 }, [ text( labels[idx] ) ]);
360
361 if (value == values[idx])
362 {
363 optionEl.setAttribute( "selected", true );
364 }
365 selectEl.appendChild( optionEl );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000366 }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000367
368 return selectEl;
369
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000370 } else { // Simple
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000371
372 return createElement( "input", "input", {
373 type: "text",
374 name: prop,
375 value: value,
Felix Meschbergerfb550db2008-06-25 23:09:26 +0000376 style: { width: width }
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000377 });
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000378 }
379}
380
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000381function createMultiSelect(/* Element */ parent, prop, values, options, width) {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000382 // convert value list into 'set'
383 var valueSet = new Object();
384 for (var idx in values) {
385 valueSet[ values[idx] ] = true;
386 }
387
388 var labels = options.labels;
389 var values = options.values;
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000390 for (var idx in labels) {
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000391
392 var inputEl = createElement( "input", null, {
393 type: "checkbox",
394 name: prop,
395 value: values[idx]
396 });
397
398 if (valueSet[ values[idx] ])
399 {
400 inputEl.setAttribute( "checked", true );
401 }
402
403 var labelEl = createElement( "label" );
404 labelEl.appendChild( inputEl );
405 addText( labelEl, labels[idx] );
406
407 parent.appendChild( labelEl );
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000408 }
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000409}
410
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000411
412function addValue(prop, vidx)
413{
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000414 var span = document.getElementById(vidx);
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000415 if (!span)
416 {
417 return;
418 }
419 var newSpan = createSpan(prop, '');
420 span.parentNode.insertBefore(newSpan, span.nextSibling);
421}
422
423function removeValue(vidx)
424{
425 var span = document.getElementById(vidx);
426 if (!span)
427 {
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000428 return;
429 }
430 span.parentNode.removeChild(span);
431}
432
Felix Meschbergerc07350a2008-06-25 20:26:13 +0000433function confirmDelete()
434{
Felix Meschbergerbb30b0c2008-05-16 11:59:32 +0000435 return confirm("Are you sure to delete this configuration ?");
436}