blob: d026a7724082cb45183f3463ab03ab47d594bb60 [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, {
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 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;';
161 innerHTML += '<input type="submit" class="submit" name="delete" value="Delete" onClick="return confirmDelete();"/>';
162 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
176 return tr( "content", null, [
177 td( "content aligntop", null, [
178 text( "Properties" )
179 ]),
Felix Meschberger018b1442008-06-25 23:09:26 +0000180 td( "content", { style: { width: "99%" } }, [
Felix Meschberger5af75272008-06-25 20:26:13 +0000181 createElement( "textarea", null, {
182 name: "properties",
Felix Meschberger018b1442008-06-25 23:09:26 +0000183 style: { height: "50%", width: "99%" }
Felix Meschberger5af75272008-06-25 20:26:13 +0000184 }, [ text( propsValue ) ] ),
185 text( "Enter Name-Value pairs of configuration properties" )
186 ])
187 ]);
Felix Meschbergerca29a962008-05-16 11:59:32 +0000188}
189
Felix Meschberger5af75272008-06-25 20:26:13 +0000190function printForm( /* Element */ parent, obj ) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000191 var propList;
Felix Meschberger5af75272008-06-25 20:26:13 +0000192 for (var idx in obj.propertylist)
193 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000194 var prop = obj.propertylist[idx];
195 var attr = obj[prop];
Felix Meschberger5af75272008-06-25 20:26:13 +0000196
Felix Meschberger5af75272008-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 Meschberger018b1442008-06-25 23:09:26 +0000202 var tdEl = td( "content", { style: { width: "99%" } } );
Felix Meschberger5af75272008-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 Meschbergerca29a962008-05-16 11:59:32 +0000213 // assume attr.values and multiselect
Felix Meschberger5af75272008-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 Meschbergerca29a962008-05-16 11:59:32 +0000226 }
227 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000228
229 if (attr.description)
230 {
231 addText( tdEl, attr.description );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000232 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000233
Felix Meschbergerca29a962008-05-16 11:59:32 +0000234 if (propList) {
235 propList += ',' + prop;
236 } else {
237 propList = prop;
238 }
239 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000240
Felix Meschberger5af75272008-06-25 20:26:13 +0000241 parent.appendChild( createElement( "input", null, {
242 type: "hidden",
243 name: "propertylist",
244 value: propList
245 })
246 );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000247}
248
Felix Meschberger5af75272008-06-25 20:26:13 +0000249function printConfigurationInfo( /* Element */ parent, obj )
250{
Felix Meschberger5af75272008-06-25 20:26:13 +0000251 parent.appendChild( tr( "content", null, [
Felix Meschberger018b1442008-06-25 23:09:26 +0000252 createElement( "th", "content", { colSpan: "2" }, [
Felix Meschberger5af75272008-06-25 20:26:13 +0000253 text( "Configuration Information" )
254 ])
255 ])
256 );
Felix Meschbergercd169b22008-06-13 12:19:36 +0000257
Felix Meschberger5af75272008-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 Meschberger5af75272008-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 Meschbergerca29a962008-05-16 11:59:32 +0000279 }
Felix Meschbergercd169b22008-06-13 12:19:36 +0000280
281 var binding = obj.bundleLocation;
Felix Meschberger5af75272008-06-25 20:26:13 +0000282 if (!binding)
283 {
Felix Meschbergercd169b22008-06-13 12:19:36 +0000284 binding = "Unbound or new configuration";
285 }
286
Felix Meschberger5af75272008-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 Meschbergerca29a962008-05-16 11:59:32 +0000296}
297
Felix Meschbergerca29a962008-05-16 11:59:32 +0000298
299var spanCounter = 0;
Felix Meschberger5af75272008-06-25 20:26:13 +0000300/* Element */ function createSpan(prop, value, type) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000301 spanCounter++;
302 var newId = prop + spanCounter;
Felix Meschberger5af75272008-06-25 20:26:13 +0000303
Felix Meschberger018b1442008-06-25 23:09:26 +0000304 var spanEl = createElement( "span", null, { id: newId }, [
305 createInput( prop, value, type, '89%' )
Felix Meschberger5af75272008-06-25 20:26:13 +0000306 ]);
Felix Meschberger018b1442008-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 Meschbergerca29a962008-05-16 11:59:32 +0000316}
317
Felix Meschberger5af75272008-06-25 20:26:13 +0000318/* Element */ function createInput(prop, value, type, width) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000319 if (type == 11) { // AttributeDefinition.BOOLEAN
Felix Meschberger5af75272008-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 Meschbergerca29a962008-05-16 11:59:32 +0000329 value = value.toString().toLowerCase() == "true";
330 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000331 if (value)
332 {
333 inputEl.setAttribute( "checked", true );
334 }
335
336 return inputEl;
337
Felix Meschbergerca29a962008-05-16 11:59:32 +0000338 } else if (typeof(type) == "object") { // predefined values
Felix Meschberger5af75272008-06-25 20:26:13 +0000339
340 var selectEl = createElement( "select", "select", {
341 name: prop,
Felix Meschberger018b1442008-06-25 23:09:26 +0000342 style: { width: width }
Felix Meschberger5af75272008-06-25 20:26:13 +0000343 });
344
Felix Meschbergerca29a962008-05-16 11:59:32 +0000345 var labels = type.labels;
346 var values = type.values;
Felix Meschberger5af75272008-06-25 20:26:13 +0000347 for (var idx in labels) {
348 var optionEl = createElement( "option", null, {
349 value: values[idx]
350 }, [ text( labels[idx] ) ]);
351
352 if (value == values[idx])
353 {
354 optionEl.setAttribute( "selected", true );
355 }
356 selectEl.appendChild( optionEl );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000357 }
Felix Meschberger5af75272008-06-25 20:26:13 +0000358
359 return selectEl;
360
Felix Meschbergerca29a962008-05-16 11:59:32 +0000361 } else { // Simple
Felix Meschberger5af75272008-06-25 20:26:13 +0000362
363 return createElement( "input", "input", {
364 type: "text",
365 name: prop,
366 value: value,
Felix Meschberger018b1442008-06-25 23:09:26 +0000367 style: { width: width }
Felix Meschberger5af75272008-06-25 20:26:13 +0000368 });
Felix Meschbergerca29a962008-05-16 11:59:32 +0000369 }
370}
371
Felix Meschberger5af75272008-06-25 20:26:13 +0000372function createMultiSelect(/* Element */ parent, prop, values, options, width) {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000373 // convert value list into 'set'
374 var valueSet = new Object();
375 for (var idx in values) {
376 valueSet[ values[idx] ] = true;
377 }
378
379 var labels = options.labels;
380 var values = options.values;
Felix Meschbergerca29a962008-05-16 11:59:32 +0000381 for (var idx in labels) {
Felix Meschberger5af75272008-06-25 20:26:13 +0000382
383 var inputEl = createElement( "input", null, {
384 type: "checkbox",
385 name: prop,
386 value: values[idx]
387 });
388
389 if (valueSet[ values[idx] ])
390 {
391 inputEl.setAttribute( "checked", true );
392 }
393
394 var labelEl = createElement( "label" );
395 labelEl.appendChild( inputEl );
396 addText( labelEl, labels[idx] );
397
398 parent.appendChild( labelEl );
Felix Meschbergerca29a962008-05-16 11:59:32 +0000399 }
Felix Meschbergerca29a962008-05-16 11:59:32 +0000400}
401
Felix Meschberger5af75272008-06-25 20:26:13 +0000402
403function addValue(prop, vidx)
404{
Felix Meschbergerca29a962008-05-16 11:59:32 +0000405 var span = document.getElementById(vidx);
Felix Meschberger5af75272008-06-25 20:26:13 +0000406 if (!span)
407 {
408 return;
409 }
410 var newSpan = createSpan(prop, '');
411 span.parentNode.insertBefore(newSpan, span.nextSibling);
412}
413
414function removeValue(vidx)
415{
416 var span = document.getElementById(vidx);
417 if (!span)
418 {
Felix Meschbergerca29a962008-05-16 11:59:32 +0000419 return;
420 }
421 span.parentNode.removeChild(span);
422}
423
Felix Meschberger5af75272008-06-25 20:26:13 +0000424function confirmDelete()
425{
Felix Meschbergerca29a962008-05-16 11:59:32 +0000426 return confirm("Are you sure to delete this configuration ?");
427}