blob: 9158026e0cf7605cde5534956aa25f4251fb4550 [file] [log] [blame]
Felix Meschberger1c336462008-06-19 11:08:47 +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
18function renderDataTable( /* Array of Data Objects */ components )
19{
20 // number of actions plus 3 -- id, name and state
21 var columns = components.numActions + 3;
22
23 header( columns );
24
25 if (components.error)
26 {
27 error( columns, components.error );
28 }
29 else
30 {
31 data ( components.data );
32 }
33
34 footer( columns );
35}
36
37
38function header( /* int */ columns )
39{
40 document.write( "<table class='content' cellpadding='0' cellspacing='0' width='100%'>" );
41
42 document.write( "<tr class='content'>" );
43 document.write( "<td colspan='" + columns + "' class='content'>&nbsp;</th>" );
44 document.write( "</tr>" );
45
46 document.write( "<tr class='content'>" );
47 document.write( "<th class='content'>ID</th>" );
48 document.write( "<th class='content' width='100%'>Name</th>" );
49 document.write( "<th class='content'>Status</th>" );
50 document.write( "<th class='content' colspan='" + (columns - 3) + "'>Actions</th>" );
51 document.write( "</tr>" );
52
53}
54
55
56function error( /* int */ columns, /* String */ message )
57{
58 document.write( "<tr class='content'>" );
59 document.write( "<td class='content'>&nbsp;</td>" );
60 document.write( "<td class='content' colspan='" + (columns - 1) + "'>" + message + "</td>" );
61 document.write( "</tr>" );
62}
63
64
65function data( /* Array of Object */ dataArray )
66{
67 // render components
Felix Meschberger3effda92008-06-26 15:00:50 +000068 if (dataArray.length == 1)
Felix Meschberger1c336462008-06-19 11:08:47 +000069 {
Felix Meschberger3effda92008-06-26 15:00:50 +000070 entry( dataArray[0], true );
71 }
72 else {
73 for ( var idx in dataArray )
74 {
75 entry( dataArray[idx] );
76 }
Felix Meschberger1c336462008-06-19 11:08:47 +000077 }
78}
79
80
81function footer( /* int */ columns )
82{
83 document.write( "<tr class='content'>" );
84 document.write( "<td colspan='" + columns + "' class='content'>&nbsp;</th>" );
85 document.write( "</tr>" );
86
87 document.write( "</table>" );
88}
89
90
Felix Meschberger3effda92008-06-26 15:00:50 +000091function entry( /* Object */ dataEntry, /* boolean */ singleEntry )
Felix Meschberger1c336462008-06-19 11:08:47 +000092{
Felix Meschberger88c3dcb2008-06-25 08:44:16 +000093 var trElement = tr( null, { id: "entry" + dataEntry.id } );
Felix Meschberger3effda92008-06-26 15:00:50 +000094 entryInternal( trElement, dataEntry, singleEntry );
Felix Meschberger88c3dcb2008-06-25 08:44:16 +000095 document.write( serialize( trElement ) );
Felix Meschberger1c336462008-06-19 11:08:47 +000096
97 // dataEntry detailed properties
Felix Meschberger88c3dcb2008-06-25 08:44:16 +000098 trElement = tr( null, { id: "entry" + dataEntry.id + "_details" } );
Felix Meschberger1c336462008-06-19 11:08:47 +000099 if (dataEntry.props)
100 {
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000101 getDataEntryDetails( trElement, dataEntry.props );
Felix Meschberger1c336462008-06-19 11:08:47 +0000102 }
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000103 document.write( serialize( trElement ) );
Felix Meschberger1c336462008-06-19 11:08:47 +0000104}
105
106
Felix Meschberger3effda92008-06-26 15:00:50 +0000107function entryInternal( /* Element */ parent, /* Object */ dataEntry, /* boolean */ singleEntry )
Felix Meschberger1c336462008-06-19 11:08:47 +0000108{
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000109
Felix Meschberger1c336462008-06-19 11:08:47 +0000110 var id = dataEntry.id;
111 var name = dataEntry.name;
112 var state = dataEntry.state;
Felix Meschberger3effda92008-06-26 15:00:50 +0000113 var icon = singleEntry ? "left" : (dataEntry.props ? "down" : "right");
114 var event = singleEntry ? "history.back()" : "showDataEntryDetails(" + id + ")";
Felix Meschberger1c336462008-06-19 11:08:47 +0000115
Felix Meschberger3effda92008-06-26 15:00:50 +0000116 parent.appendChild( td( "content right", null, [ text( id ) ] ) );
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000117
Felix Meschberger3effda92008-06-26 15:00:50 +0000118 parent.appendChild( td( "content", null, [
119 createElement( "img", null, {
120 src: appRoot + "/res/imgs/" + icon + ".gif",
121 onClick: event,
122 id: "entry" + id + "_inline"
123 } ),
124 text( "\u00a0" ),
125 createElement( "a", null, {
126 href: pluginRoot + "/" + id
127 }, [ text( name ) ]
128 )]
129 )
130 );
Felix Meschberger1c336462008-06-19 11:08:47 +0000131
Felix Meschberger3effda92008-06-26 15:00:50 +0000132 parent.appendChild( td( "content center", null, [ text( state ) ] ) );
Felix Meschberger1c336462008-06-19 11:08:47 +0000133
134 for ( var aidx in dataEntry.actions )
135 {
136 var action = dataEntry.actions[aidx];
Felix Meschbergere6704c32008-12-22 13:15:29 +0000137 parent.appendChild( actionButton( action.enabled, id, action.link, action.name, action.title ) );
Felix Meschberger1c336462008-06-19 11:08:47 +0000138 }
Felix Meschberger1c336462008-06-19 11:08:47 +0000139}
140
141
Felix Meschbergere6704c32008-12-22 13:15:29 +0000142/* Element */ function actionButton( /* boolean */ enabled, /* long */ id, /* String */ op, /* String */ opLabel, /* String */ title )
Felix Meschberger1c336462008-06-19 11:08:47 +0000143{
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000144 var buttonTd = td( "content", { align: "right" } );
Felix Meschberger1c336462008-06-19 11:08:47 +0000145 if ( op )
146 {
Carsten Ziegelerf9879152009-02-05 10:45:35 +0000147 var input;
148 if ( title ) {
149 input = createElement( "input", null, {
150 type: 'image',
151 alt: opLabel,
152 src: imgRoot + '/bundle_' + title + '.gif',
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000153 onClick: 'changeDataEntryState(' + id + ', "' + op + '");'
154 });
Carsten Ziegelerf9879152009-02-05 10:45:35 +0000155
156 } else {
157 var input = createElement( "input", "submit", {
158 type: 'button',
159 value: opLabel,
160 onClick: 'changeDataEntryState(' + id + ', "' + op + '");'
161 });
162 }
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000163 if (!enabled)
164 {
165 input.setAttribute( "disabled", true );
166 }
167 buttonTd.appendChild( input );
Felix Meschberger1c336462008-06-19 11:08:47 +0000168 }
169 else
170 {
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000171 addText( buttonTd, "\u00a0" );
Felix Meschberger1c336462008-06-19 11:08:47 +0000172 }
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000173
174 return buttonTd;
Felix Meschberger1c336462008-06-19 11:08:47 +0000175}
176
177
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000178function getDataEntryDetails( /* Element */ parent, /* Array of Object */ details )
Felix Meschberger1c336462008-06-19 11:08:47 +0000179{
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000180 parent.appendChild( addText( td( "content"), "\u00a0" ) );
181
182 var tdEl = td( "content", { colspan: 4 } );
183 parent.appendChild( tdEl );
184
185 var tableEl = createElement( "table", null, { border: 0 } );
186 tdEl.appendChild( tableEl );
187
188 var tbody = createElement( "tbody" );
189 tableEl.appendChild( tbody );
Felix Meschberger1c336462008-06-19 11:08:47 +0000190 for (var idx in details)
191 {
192 var prop = details[idx];
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000193
194
195 var trEl = tr();
196 trEl.appendChild( addText( td( "aligntop", { noWrap: true } ), prop.key ) );
197
198 var proptd = td( "aligntop" );
199 trEl.appendChild( proptd );
200
Felix Meschbergera10aa072008-10-24 06:29:15 +0000201 if (prop.value)
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000202 {
203 var values = new String( prop.value ).split( "<br />" );
204 for (var i=0; i < values.length; i++)
205 {
206 if (i > 0) { proptd.appendChild( createElement( "br" ) ); }
Felix Meschbergera10aa072008-10-24 06:29:15 +0000207
208 var span;
209 if (values[i].substring(0, 2) == "!!") {
210 span = createElement( "span", null, { style: { color: "red" } } );
211 proptd.appendChild( span );
212 } else {
213 span = proptd;
214 }
215
216 addText( span, values[i] );
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000217 }
218 }
219 else
220 {
221 addText( proptd, "\u00a0" );
222 }
223
224 tbody.appendChild( trEl );
Felix Meschberger1c336462008-06-19 11:08:47 +0000225 }
Felix Meschberger1c336462008-06-19 11:08:47 +0000226 }
227
228
Felix Meschberger3effda92008-06-26 15:00:50 +0000229function showDetails(bundleId)
230{
Felix Meschberger1c336462008-06-19 11:08:47 +0000231 var span = document.getElementById('bundle' + bundleId + '_details');
232}
233
234
235function showDataEntryDetails( id )
236{
237 var span = document.getElementById( 'entry' + id + '_details' );
238 if (span)
239 {
Felix Meschberger76f5d0a2008-06-25 09:19:37 +0000240 if (span.firstChild)
Felix Meschberger1c336462008-06-19 11:08:47 +0000241 {
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000242 clearChildren( span );
Felix Meschberger1c336462008-06-19 11:08:47 +0000243 newLinkValue( id, appRoot + "/res/imgs/right.gif" );
244 }
245 else
246 {
247 sendRequest( 'POST', pluginRoot + '/' + id, displayDataEntryDetails );
248 newLinkValue( id, appRoot + "/res/imgs/down.gif" );
249 }
250 }
251}
252
253
254function newLinkValue( /* long */ id, /* String */ newLinkValue )
255{
256
257 var link = document.getElementById( "entry" + id + "_inline" );
258 if (link)
259 {
260 link.src = newLinkValue;
261 }
262}
263
264
265function displayDataEntryDetails( obj )
266{
267 var span = document.getElementById('entry' + obj.id + '_details');
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000268 if (span)
Felix Meschberger1c336462008-06-19 11:08:47 +0000269 {
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000270 clearChildren( span );
271 getDataEntryDetails( span, obj.props );
Felix Meschberger1c336462008-06-19 11:08:47 +0000272 }
273
Felix Meschberger1c336462008-06-19 11:08:47 +0000274}
275
276
277function changeDataEntryState(/* long */ id, /* String */ action)
278{
279 var parm = pluginRoot + "/" + id + "?action=" + action;
280 sendRequest('POST', parm, dataEntryStateChanged);
281}
282
283
284function dataEntryStateChanged(obj)
285{
286 if (obj.reload)
287 {
288 document.location = document.location;
289 }
290 else
291 {
292 var id = obj.id;
293 if (obj.state)
294 {
295 // has status, so draw the line
296 if (obj.props)
297 {
298 var span = document.getElementById('entry' + id + '_details');
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000299 if (span && span.firstChild)
Felix Meschberger1c336462008-06-19 11:08:47 +0000300 {
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000301 clearChildren( span );
302 getDataEntryDetails( span, obj.props );
Felix Meschberger1c336462008-06-19 11:08:47 +0000303 }
304 else
305 {
306 obj.props = false;
307 }
308 }
309
310 var span = document.getElementById('entry' + id);
311 if (span)
312 {
Felix Meschberger88c3dcb2008-06-25 08:44:16 +0000313 clearChildren( span );
314 entryInternal( span, obj );
Felix Meschberger1c336462008-06-19 11:08:47 +0000315 }
Felix Meschberger1c336462008-06-19 11:08:47 +0000316 }
317 else
318 {
319 // no status, dataEntry has been removed/uninstalled
320 var span = document.getElementById('entry' + id);
321 if (span)
322 {
323 span.parentNode.removeChild(span);
324 }
325 var span = document.getElementById('entry' + id + '_details');
326 if (span)
327 {
328 span.parentNode.removeChild(span);
329 }
330 }
331 }
332}
333
334