blob: 02ca0ff72bde4f04d1e089520060ffd3d0729e61 [file] [log] [blame]
Felix Meschbergerb812b2e2010-02-18 15:36:53 +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 */
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000017// tables container - will get hidden, when no config service available
18var configContent = false;
19
20// config table list
21var configTable = false;
22var configBody = false;
23var configRow = false;
24
25// factories table list
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000026var factoryBody = false;
27var factoryRow = false;
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000028
29
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000030// editor dialog
31var editor = false;
Valentin Valchevde160882010-03-22 09:30:38 +000032var editorMessage = false;
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000033
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000034function configure(pid, create) {
35 var uri = pluginRoot + '/' + pid;
Carsten Ziegelerd2637c32012-12-11 17:46:47 +000036 // we have to add a cache killer for IE8
Carsten Ziegeler0d98fa912013-10-21 11:11:43 +000037 var postUri = uri + '?post=true&';
Carsten Ziegelerd2637c32012-12-11 17:46:47 +000038 if ( create ) {
Felix Meschberger27870e82012-12-28 15:19:38 +000039 postUri += param.create + '=1&';
Carsten Ziegelerd2637c32012-12-11 17:46:47 +000040 }
41 postUri = postUri + 'ts='+new Date().getMilliseconds();
Carsten Ziegeler0d98fa912013-10-21 11:11:43 +000042 $.get(postUri, null, displayConfigForm, 'json');
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000043}
44
45function displayConfigForm(obj) {
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000046 var parent = document.getElementById('editorTable');
47 clearChildren( parent )
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000048
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000049 var trEl = tr( );
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000050 parent.appendChild( trEl );
51
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000052 var tdEl = td( null, { colSpan: "2" } );
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000053 trEl.appendChild( tdEl );
54
55 var formEl = createElement( "form", null, {
Carsten Ziegeler149faaa2010-03-10 16:41:53 +000056 id : "editorForm",
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000057 method: "POST",
58 action: pluginRoot + "/" + obj.pid
59 });
60 tdEl.appendChild( formEl );
61
62 var inputEl = createElement( "input", null, {
63 type: "hidden",
Felix Meschberger27870e82012-12-28 15:19:38 +000064 name: param.apply,
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000065 value: "true"
66 });
67 formEl.appendChild( inputEl );
68
69 // add the factory PID as a hidden form field if present
70 if (obj.factoryPid)
71 {
72 inputEl = createElement( "input", null, {
73 type: "hidden",
74 name: "factoryPid",
75 value: obj.factoryPid
76 });
77 formEl.appendChild( inputEl );
78 }
79
80 // add the PID filter as a hidden form field if present
Felix Meschberger27870e82012-12-28 15:19:38 +000081 if (obj[ param.pidFilter ])
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000082 {
83 inputEl = createElement( "input", null, {
84 type: "hidden",
Felix Meschberger27870e82012-12-28 15:19:38 +000085 name: param.pidFilter,
Felix Meschbergerb812b2e2010-02-18 15:36:53 +000086 value: obj.pidFilter
87 });
88 formEl.appendChild( inputEl );
89 }
90
91 inputEl = createElement( "input", null, {
92 type: "hidden",
93 name: "action",
94 value: "ajaxConfigManager"
95 });
96 formEl.appendChild( inputEl );
97
98 var tableEl = createElement( "table", null, {
99 border: 0,
100 width: "100%"
101 });
102 formEl.appendChild( tableEl );
103
104 var bodyEl = createElement( "tbody" );
105 tableEl.appendChild( bodyEl );
106
107 if (obj.description)
108 {
109 trEl = tr( );
110 tdEl = td( null, { colSpan: "2" } );
111 addText( tdEl, obj.description );
112 trEl.appendChild( tdEl );
113 bodyEl.appendChild( trEl );
114 }
115
Felix Meschbergera87e8592011-12-17 16:19:41 +0000116 if (obj.properties)
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000117 {
Felix Meschbergera87e8592011-12-17 16:19:41 +0000118 printForm(bodyEl, obj.properties);
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000119 }
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000120
121 printConfigurationInfo(parent, obj);
Valentin Valchevde160882010-03-22 09:30:38 +0000122 if ( obj.service_location && obj.bundle_location && obj.service_location != obj.bundle_location) {
123 editorMessage.removeClass('ui-helper-hidden').text(i18n.err_bind.msgFormat(obj.pid, obj.bundle_location, obj.service_location));
124 } else editorMessage.addClass('ui-helper-hidden');
Valentin Valchev0fc8b7b2010-04-15 12:33:58 +0000125
126 // ugly workaround for IE6 and IE7 - these browsers don't show correctly the dialog
127 var ua = navigator.userAgent;
128 if (ua.indexOf('MSIE 6') != -1 || ua.indexOf('MSIE 7') != -1) $(parent).html(parent.innerHTML);
129
Felix Meschberger07741202011-07-07 11:55:53 +0000130 initStaticWidgets(editor
131 .attr('__pid', obj.pid)
132 .attr('__location', obj.bundleLocation?obj.bundleLocation:'')
133 .dialog('option', 'title', obj.title)
134 .dialog('open'));
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000135}
136
Felix Meschbergera87e8592011-12-17 16:19:41 +0000137function printForm( /* Element */ parent, /* Object */ properties ) {
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000138 var propList;
Felix Meschbergera87e8592011-12-17 16:19:41 +0000139 for (var prop in properties)
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000140 {
Felix Meschbergera87e8592011-12-17 16:19:41 +0000141 var attr = properties[prop];
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000142
143 var trEl = tr( null, null, [
144 td( null, null, [ text( attr.name ) ] )
145 ]);
146 parent.appendChild( trEl );
147
148 var tdEl = td( null, { style: { width: "99%" } } );
149 trEl.appendChild( tdEl );
150
151 if (attr.value != undefined)
152 {
153 // check is required to also handle empty strings, 0 and false
Valentin Valchevcb68caa2014-10-20 07:48:07 +0000154 var inputName = (prop == "action" || prop == "propertylist" || prop == "apply" || prop == "delete") ? '$' + prop : prop;
155 tdEl.appendChild( createInput( inputName, attr.value, attr.type, '99%' ) );
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000156 tdEl.appendChild( createElement( "br" ) );
157 }
158 else if (typeof(attr.type) == 'object')
159 {
160 // assume attr.values and multiselect
161 createMultiSelect( tdEl, prop, attr.values, attr.type, '99%' );
162 tdEl.appendChild( createElement( "br" ) );
163 }
164 else if (attr.values.length == 0)
165 {
166 tdEl.appendChild( createSpan( prop, "", attr.type ) );
167 }
168 else
169 {
170 for (var i=0;i<attr.values.length;i++)
171 {
172 tdEl.appendChild( createSpan( prop, attr.values[i], attr.type ) );
173 }
174 }
175
176 if (attr.description)
177 {
178 addText( tdEl, attr.description );
179 }
180
181 if (propList) {
182 propList += ',' + prop;
183 } else {
184 propList = prop;
185 }
186 }
187
188 parent.appendChild( createElement( "input", null, {
189 type: "hidden",
Felix Meschberger27870e82012-12-28 15:19:38 +0000190 name: param.propertylist,
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000191 value: propList
192 })
193 );
Felix Meschbergera87e8592011-12-17 16:19:41 +0000194
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000195 // FIX for IE6 and above: checkbox can only be checked after it is in the DOM
196 $(".checked_box").attr("checked", true).removeClass("checked_box");
197}
198
199function printConfigurationInfo( /* Element */ parent, obj )
200{
201 parent.appendChild( tr( null, null, [
202 createElement( "th", null, { colSpan: "2" }, [
203 text( i18n.cfg_title )
204 ])
205 ])
206 );
207
208 parent.appendChild( tr( null, null, [
209 td( null, null, [
210 text( i18n.pid )
211 ]),
212 td( null, null, [
213 text( obj.pid )
214 ])
215 ])
216 );
217
218 if (obj.factoryPid)
219 {
220 parent.appendChild( tr( null, null, [
221 td( null, null, [
222 text( i18n.fpid )
223 ]),
224 td( null, null, [
225 text( obj.factoryPid )
226 ])
227 ])
228 );
229 }
230
231 var binding = obj.bundleLocation;
232 if (!binding)
233 {
234 binding = i18n.unbound;
235 }
236
237 parent.appendChild( tr( null, null, [
238 td( null, null, [
239 text( i18n.binding )
240 ]),
241 td( null, null, [
242 text( binding )
243 ])
244 ])
245 );
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000246
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000247}
248
249
250var spanCounter = 0;
251/* Element */ function createSpan(prop, value, type) {
252 spanCounter++;
253 var newId = prop + spanCounter;
254
255 var addButton = createElement("input", null,
256 { type: "button",
257 style: {width : "5%"},
258 value: "+"
259 }
260 );
261 $(addButton).click(function() {addValue(prop, newId)});
262 var remButton = createElement("input", null,
263 { type: "button",
264 style: {width : "5%"},
265 value: "-"
266 }
267 );
268 $(remButton).click(function() {removeValue(newId)});
269 var spanEl = createElement( "span", null, { id: newId }, [
270 createInput( prop, value, type, '89%' ), addButton, remButton,
271 createElement("br")
272 ]);
273
274 return spanEl;
275}
276
277/* Element */ function createInput(prop, value, type, width) {
278 if (type == 11) { // AttributeDefinition.BOOLEAN
279
280 var inputEl = createElement( "input", null, {
281 type: "checkbox",
282 name: prop,
283 value: "true"
284 });
285
286 if (value && typeof(value) != "boolean")
287 {
288 value = value.toString().toLowerCase() == "true";
289 }
290 if (value)
291 {
292 $(inputEl).addClass("checked_box");
293 }
294 var hiddenEl = createElement( "input", null, {
295 type: "hidden",
296 name: prop,
297 value: "false"
298 });
299 var divEl = createElement("div");
300 divEl.appendChild(inputEl);
301 divEl.appendChild(hiddenEl);
302 return divEl;
303
304 } else if (typeof(type) == "object") { // predefined values
305
306 var selectEl = createElement( "select", null, {
307 name: prop,
308 style: { width: width }
309 });
310
311 var labels = type.labels;
312 var values = type.values;
313 for (var idx in labels) {
314 var optionEl = createElement( "option", null, {
315 value: values[idx]
316 }, [ text( labels[idx] ) ]);
317
318 if (value == values[idx])
319 {
320 optionEl.setAttribute( "selected", true );
321 }
322 selectEl.appendChild( optionEl );
323 }
324
325 return selectEl;
326
327 } else { // Simple
Felix Meschbergerd5fe6b62011-12-17 15:26:02 +0000328 // Metatype 1.2: Attr type 12 is PASSWORD
329 var elType = (type == 12) ? "password" : "text";
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000330 return createElement( "input", null, {
Felix Meschbergerd5fe6b62011-12-17 15:26:02 +0000331 type: elType,
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000332 name: prop,
333 value: value,
334 style: { width: width }
335 });
336 }
337}
338
339function createMultiSelect(/* Element */ parent, prop, values, options, width) {
340 // convert value list into 'set'
341 var valueSet = new Object();
342 for (var idx in values) {
343 valueSet[ values[idx] ] = true;
344 }
345
346 var labels = options.labels;
347 var values = options.values;
348 for (var idx in labels) {
349
350 var inputEl = createElement( "input", null, {
351 type: "checkbox",
352 name: prop,
353 value: values[idx]
354 });
355
356 if (valueSet[ values[idx] ])
357 {
358 inputEl.setAttribute( "checked", true );
359 }
360
361 var labelEl = createElement( "label", "multiselect" );
362 labelEl.appendChild( inputEl );
363 addText( labelEl, labels[idx] );
364
365 parent.appendChild( labelEl );
366 }
367}
368
369
370function addValue(prop, vidx)
371{
372 var span = document.getElementById(vidx);
373 if (!span)
374 {
375 return;
376 }
377 var newSpan = createSpan(prop, '');
378 span.parentNode.insertBefore(newSpan, span.nextSibling);
379 // FIX for IE6 and above: checkbox can only be checked after it is in the DOM
380 $(".checked_box").attr("checked", true).removeClass("checked_box");
381 //$(span).ready(initStaticWidgets);
382}
383
384function removeValue(vidx)
385{
386 var span = document.getElementById(vidx);
387 if (!span)
388 {
389 return;
390 }
391 span.parentNode.removeChild(span);
392}
393
394function configConfirm(/* String */ message, /* String */ title, /* String */ location)
395{
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000396 if (title) {
397 message += "\r\n" + i18n.del_config + title;
398 }
399 if (location) {
400 message += "\r\n" + i18n.del_bundle + location;
401 }
402
403 return confirm(message);
404}
405
Felix Meschberger07741202011-07-07 11:55:53 +0000406function deleteConfig(/* String */ configId, /* String */ bundleLocation)
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000407{
Felix Meschberger07741202011-07-07 11:55:53 +0000408 if ( configConfirm(i18n.del_ask, configId, bundleLocation) ) {
Felix Meschbergerc89425a2013-11-04 16:08:19 +0000409 $.post(pluginRoot + '/' + configId, param.apply + '=1&' + param.dele + '=1', null, function() {
Felix Meschberger07741202011-07-07 11:55:53 +0000410 document.location.href = pluginRoot;
411 }, 'json');
412 return true;
413 }
414 return false;
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000415}
416
Felix Meschberger07741202011-07-07 11:55:53 +0000417function unbindConfig(/* String */ configId, /* String */ bundleLocation)
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000418{
Felix Meschberger07741202011-07-07 11:55:53 +0000419 if ( configConfirm(i18n.unbind_ask, configId, bundleLocation) ) {
Felix Meschbergerc89425a2013-11-04 16:08:19 +0000420 $.post(pluginRoot + '/' + configId, param.unbind + '=1', null, function() {
Felix Meschberger07741202011-07-07 11:55:53 +0000421 document.location.href = pluginRoot + '/' + configId;
422 }, 'json');
423 return true;
424 }
425 return false;
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000426}
427
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000428function addConfig(conf) {
429 var tr = configRow.clone().appendTo(configBody);
Felix Meschberger67726fe2010-03-17 06:55:00 +0000430
431 // rendering name - indented if factory pid is set
Valentin Valchev0fc8b7b2010-04-15 12:33:58 +0000432 var nms = tr.find('td:eq(0) div');
Felix Meschberger67726fe2010-03-17 06:55:00 +0000433 if (conf.fpid) {
434 nms.after(conf.id);
435 tr.attr('fpid', conf.name);
436 } else {
437 nms.addClass('ui-helper-hidden').parent().text(conf.name);
438 }
439
440 tr.find('td:eq(0)').click(function() { // name & edit
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000441 configure(conf.id);
442 });
Felix Meschberger67726fe2010-03-17 06:55:00 +0000443 tr.find('td:eq(1)').html(conf.bundle ? '<a href="' + pluginRoot + '/../bundles/' + conf.bundle + '">' + conf.bundle_name + '</a>' : '-'); // binding
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000444
445 // buttons
446 tr.find('li:eq(0)').click(function() { // edit
447 configure(conf.id);
448 });
449 tr.find('li:eq(2)').click(function() { // delete
Felix Meschberger07741202011-07-07 11:55:53 +0000450 deleteConfig(conf.id, conf.bundle_name);
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000451 });
Felix Meschberger07741202011-07-07 11:55:53 +0000452 if (conf.bundle) {
453 tr.find('li:eq(1)').click(function() { // unbind
454 unbindConfig(conf.id, conf.bundle_name);
455 }).removeClass('ui-state-disabled');
456 }
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000457}
458
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000459function addFactoryConfig(conf) {
Felix Meschberger67726fe2010-03-17 06:55:00 +0000460 var tr = factoryRow.clone().appendTo(configTable).attr('fpid', conf.name);
461 //tr.find('td:eq(1)').text(conf.id); // fpid
Felix Meschberger1e671e12010-03-13 15:09:51 +0000462 tr.find('td:eq(0)').text(conf.name).click(function() { // name & edit
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000463 configure(conf.id, true);
464 });
465 // buttons
466 tr.find('li:eq(0)').click(function() { // edit
467 configure(conf.id, true);
468 });
469}
470
Felix Meschberger67726fe2010-03-17 06:55:00 +0000471function treetableExtraction(node) {
472 var td = $(node);
473 var text = td.text();
474 if (!text) return text;
475
476 // current sort order
477 var desc = $(this)[0].sortList[0][1];
478
479 var row = td.parent();
480 var fpid = row.attr('fpid');
481
482 // factory row
483 if ( row.hasClass('fpid') && fpid) return fpid + (desc==0?1:0) + text;
484
485 // bundle or name row
486 if ( fpid ) return fpid + desc + text;
487
488 return mixedLinksExtraction(node);
489};
490
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000491$(document).ready(function() {
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000492 configContent = $('#configContent');
493 // config table list
Felix Meschberger67726fe2010-03-17 06:55:00 +0000494 configTable = $('#configTable');
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000495 configBody = configTable.find('tbody');
Felix Meschberger67726fe2010-03-17 06:55:00 +0000496 configRow = configBody.find('tr:eq(0)').clone();
497 factoryRow = configBody.find('tr:eq(1)').clone();
Felix Meschberger1e671e12010-03-13 15:09:51 +0000498
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000499 // setup button - cannot inline in dialog option because of i18n
500 var _buttons = {};
501 _buttons[i18n.abort] = function() {
502 $(this).dialog('close');
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000503 }
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000504 _buttons[i18n.reset] = function() {
505 var form = document.getElementById('editorForm');
506 if (form) form.reset();
507 }
Felix Meschberger07741202011-07-07 11:55:53 +0000508 _buttons[i18n.del] = function() {
509 if (deleteConfig($(this).attr('__pid'), $(this).attr('__location'))) {
510 $(this).dialog('close');
511 }
512 }
513 _buttons[i18n.unbind_btn] = function() {
514 unbindConfig($(this).attr('__pid'), $(this).attr('__location'));
515 }
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000516 _buttons[i18n.save] = function() {
Felix Meschbergerc89425a2013-11-04 16:08:19 +0000517 $.post(pluginRoot + '/' + $(this).attr('__pid'), $(this).find('form').serialize(), function() {
Valentin Valchev4b25d4f2011-09-15 07:06:36 +0000518 // reload on success - prevents AJAX errors - see FELIX-3116
519 document.location.href = pluginRoot;
520 });
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000521 $(this).dialog('close');
522 }
523 // prepare editor, but don't open yet!
524 editor = $('#editor').dialog({
525 autoOpen : false,
526 modal : true,
527 width : '90%',
528 closeText: i18n.abort,
529 buttons : _buttons
530 });
Valentin Valchevde160882010-03-22 09:30:38 +0000531 editorMessage = editor.find('p');
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000532
533 // display the configuration data
534 $(".statline").html(configData.status ? i18n.stat_ok : i18n.stat_missing);
535 if (configData.status) {
Felix Meschberger67726fe2010-03-17 06:55:00 +0000536 configBody.empty();
537 var factories = {};
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000538
Felix Meschberger67726fe2010-03-17 06:55:00 +0000539 for(var i in configData.pids) {
540 var c = configData.pids[i];
541 if (c.fpid) {
542 if (!factories[c.fpid]) factories[c.fpid] = new Array();
543 factories[c.fpid].push(c);
544 } else {
545 addConfig(c);
546 }
547 }
548 for(var i in configData.fpids) {
549 addFactoryConfig(configData.fpids[i]);
Felix Meschberger1e671e12010-03-13 15:09:51 +0000550
Felix Meschbergerb58af942011-12-19 12:54:03 +0000551 var fpid = configData.fpids[i].id;
552 var confs = factories[ fpid ];
553 if (confs) {
554 for (var j in confs) {
555 addConfig(confs[j]);
556 }
557 delete factories[ fpid ];
Felix Meschberger67726fe2010-03-17 06:55:00 +0000558 }
559 }
Felix Meschbergerb58af942011-12-19 12:54:03 +0000560 for(var fpid in factories) {
561 var flist = factories[fpid];
562 for(var i in flist) {
563 delete flist[i].fpid; // render as regular config
564 addConfig(flist[i]);
565 }
566 }
Felix Meschberger67726fe2010-03-17 06:55:00 +0000567 initStaticWidgets(configTable);
568
569 // init tablesorte
570 configTable.tablesorter({
571 headers: { 2: { sorter: false } },
572 sortList: [[0,1]],
573 textExtraction: treetableExtraction
574 }).bind('sortStart', function() { // clear cache, otherwse extraction will not work
575 var table = $(this).trigger('update');
576 }).find('th:eq(0)').click();
Carsten Ziegeler149faaa2010-03-10 16:41:53 +0000577 } else {
578 configContent.addClass('ui-helper-hidden');
579 }
580 if (selectedPid) configure(selectedPid);
Felix Meschbergerb812b2e2010-02-18 15:36:53 +0000581});