Subversion Repositories DevTools

Rev

Rev 6614 | Rev 6706 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6576 dpurdie 1
<%@LANGUAGE="VBSCRIPT"%>
2
<%
3
'=====================================================
4
'|                                                   |
5
'|          Edit/View Build Configuration            |
6
'|                                                   |
7
'=====================================================
8
%>
9
<%
10
Option explicit
11
' Good idea to set when using redirect
12
Response.Expires = 0   ' always load the page, dont store
13
%>
14
<!--#include file="common/conf.asp"-->
15
<!--#include file="common/globals.asp"-->
16
<!--#include file="common/formating.asp"-->
17
<!--#include file="common/qstr.asp"-->
18
<!--#include file="common/common_subs.asp"-->
19
<!--#include file="common/_form_window_common.asp"-->
20
<!--#include file="_action_buttons.asp"-->
21
<!--#include file="class/classActionButtonControl.asp"-->
22
<% '------------ ACCESS CONTROL ------------------ %>
23
<!--#include file="_access_control_login.asp"-->
24
<!--#include file="_access_control_general.asp"-->
25
<!--#include file="_access_control_action_project.asp"-->
26
<%
27
'------------ Variable Definition -------------
28
Dim parRtagId
6579 dpurdie 29
Dim pkgCount : pkgCount= 0
30
Dim pkgTestCount : pkgTestCount= 0
31
Dim testCount: testCount = 0
6576 dpurdie 32
'------------ Constants Declaration -----------
33
'------------ Variable Init -------------------
34
parRtagId = Request("rtag_id")
35
objPMod.PersistInQryString("rtag_id")
36
'----------------------------------------------
37
%>
38
<%
39
'------------ RUN BEFORE PAGE RENDER ----------
6579 dpurdie 40
'
41
'   Generate table data as JSON
42
'   Could generate via AJAX call too, but for the amount of data in the table
43
'
44
Sub GenerateData
45
    Dim rsQry
46
 
47
    OraDatabase.Parameters.Add "RTAG_ID", parRtagId, ORAPARM_INPUT, ORATYPE_NUMBER
48
    Set rsQry = OraDatabase.DbCreateDynaset( GetQuery("release_stats.sql"), 0 )
49
	OraDatabase.Parameters.Remove "RTAG_ID"
50
 
51
    Response.Write "<script type=""text/javascript"" charset=""utf-8"">" + vbCRLF
52
    Response.Write "var dataSet = [" + vbCRLF
53
 
54
    Do While (NOT rsQry.BOF) AND (NOT rsQry.EOF)
55
        pkgCount = pkgCount + 1
56
        Dim tcount : tcount = NiceInt(rsQry("test_count"), 0)
57
        If tcount > 0 Then
58
            pkgTestCount = pkgTestCount + 1
59
            testCount = testCount + tcount 
60
        End If
61
 
62
        Dim vrefStr, prefStr, crefStr
6582 dpurdie 63
        Dim buildId, buildTime, lastBuild, codeLines, isDeployable, viewName, isSdk
6579 dpurdie 64
 
6580 dpurdie 65
        buildId = rsQry("build_id")
6579 dpurdie 66
        crefStr = "unit_test_log.asp?pv_id=" & rsQry("pv_id") & "&rtag_id=" & parRtagId 
67
        prefStr = "view_by_version.asp?pkg_id=" & rsQry("pkg_id")  & "&listby=1"
68
        vrefStr = "dependencies.asp?pv_id=" & rsQry("pv_id") & "&rtag_id=" & parRtagId
69
        buildTime = rsQry("build_time")
70
        If isNull(buildTime) Then buildTime = ""
71
        lastBuild = rsQry("lastBuild")
72
        If isNull(lastBuild) Then lastBuild = ""
6580 dpurdie 73
        codeLines = rsQry("code_lines")
74
        If isNull(codeLines) Then codeLines = ""
75
        isDeployable = rsQry("is_deployable")
76
        If isNull(isDeployable) Then isDeployable = "N"
77
        viewName = rsQry("view_name")
6582 dpurdie 78
        isSdk = rsQry("isSdk") 
6580 dpurdie 79
        If IsNull(buildId) Then tcount = ""
6579 dpurdie 80
 
81
        Response.Write "["
82
        Response.Write """<a href=" + prefStr + ">" + rsQry("pkg_name") + "</a>"""
83
        Response.Write ",""<a href=" + vrefStr + ">" + rsQry("pkg_version") + "</a>"""
6580 dpurdie 84
        Response.Write ",""<a href=" + crefStr + ">" & tcount & "</a>"""
85
        Response.Write ",""" + codeLines + """"
6579 dpurdie 86
        Response.Write ",""" + buildTime + """"
87
        Response.Write ",""" + lastBuild + """"
6580 dpurdie 88
        Response.Write ",""" + isDeployable + """"
89
        Response.Write ",""" + viewName + """"
6582 dpurdie 90
        Response.Write ",""" + isSdk + """"
6579 dpurdie 91
        Response.Write "],"  + vbCRLF
92
    rsQry.MoveNext
93
    Loop
94
    Response.Write "]"  + vbCRLF
95
    Response.Write "</script>"  + vbCRLF
96
    rsQry.close
97
    Set rsQry = nothing
98
End Sub
99
 
6576 dpurdie 100
'----------------------------------------------------
101
Sub LeftPanelContent
102
%>
6577 dpurdie 103
<fieldset class="body_rowg fset">
104
    <legend>Display</legend>
105
    <input id="noScroll" type="checkbox" name="noScroll" value="1"> No Scroll
6580 dpurdie 106
    <br><input id="noGroups" type="checkbox" name="noGroups" value="1"> No Groups
6579 dpurdie 107
    <br><input id="noCots" type="checkbox" name="noCots" value="1"> Ignore Cots
6580 dpurdie 108
    <br><input id="noDeploy" type="checkbox" name="noDeploy" value="1"> Ignore Deployable
6582 dpurdie 109
    <br><input id="noSdk" type="checkbox" name="noSdk" value="1"> Ignore SDKs
6577 dpurdie 110
</fieldset>
111
<fieldset class="body_rowg fset">
112
    <legend>Export</legend>
6641 dpurdie 113
    <input id="noDetails" type="checkbox" name="noDetails" value="1">  Summary Only
114
    <br><input id="btnExport"  name="btn" type="submit" class="form_btn" value="Test Counts as CSV"><%=Quick_Help("h_export")%>
6577 dpurdie 115
</fieldset>
6576 dpurdie 116
<%
117
End Sub
118
 
119
Sub MainPanelContent
120
%>
121
   <table class="embedded_table" style="margin-bottom:20px">
122
      <tr>
123
         <td>
124
            <!-- Box Title -->
125
            <div class="form_ttl nowrap" align="left">
126
                 Package Unit Tests
127
            </div>
128
         </td>
129
      </tr>
130
      <tr>
131
         <td>
132
            <!-- Box Content -->
133
            <div class="rounded_box">
134
               <div style="background-color: white;border-left: white solid 10px;border-right: white solid 10px;">
135
                    <!-- MESSAGE +++++++++++++++++++++++++++++++++++++++++++++++++++ -->
136
                    <!--#include file="messages/_msg_inline.asp"-->
137
                    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
6582 dpurdie 138
                    <div id="packageStatsHolder">
6577 dpurdie 139
                    <table id="packageStats" width="100%" class="embedded_table">
140
                        <thead class="envGroup">
141
                           <tr class="body_col envGroup">
142
                              <td valign="top" nowrap>Package</td>
143
                              <td valign="top" nowrap>Version</td>
6587 dpurdie 144
                              <td valign="top" nowrap>Unit<br>Tests</td>
145
                              <td valign="top" nowrap>Lines<br>of Code</td>
6580 dpurdie 146
                              <td valign="top" nowrap>Build<br>Duration</td>
147
                              <td valign="top" nowrap>Build Date</td>
148
                              <td valign="top" nowrap>Deployable</td>
149
                              <td valign="top" nowrap>View Name</td>
6582 dpurdie 150
                              <td valign="top" nowrap>SDK</td>
6577 dpurdie 151
                           </tr>
152
                        </thead>
6576 dpurdie 153
                  </table>
6582 dpurdie 154
                  </div>
6579 dpurdie 155
                  <table width="100%" class="embedded_table">
6580 dpurdie 156
                  <tr class="body_col envGroup"><th colspan=5>Summary</th></tr>
157
                  <tr class="body_rowg"><td colspan=4>Total Packages</td><td id="pkgCount"></td></tr>
158
                  <tr class="body_rowg"><td colspan=4>Total Packages with Tests</td><td id="pkgTestCount"></td></tr>
159
                  <tr class="body_rowg"><td colspan=4>Total Unit Tests</td><td id="testCount"></td></tr>
6587 dpurdie 160
                  <tr class="body_rowg"><td colspan=4>Total Lines of Code</td><td id="tloc"></td></tr>
6579 dpurdie 161
                  </table>
6576 dpurdie 162
               </div>
163
            </div>
164
         </td>
165
      </tr>
166
   </table>
167
<%
168
End Sub
169
%>
170
<NOSCRIPT LANGUAGE="VBScript" RUNAT=SERVER SRC="common/VarDump.vbs"></NOSCRIPT> 
171
<html>
172
   <head>
173
      <title>Release Manager</title>
174
      <link rel="shortcut icon" href="<%=FavIcon%>"/>
175
      <meta http-equiv="Pragma" content="no-cache">
176
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6579 dpurdie 177
      <link rel="stylesheet" href="images/release_manager_style.css?ver=<%=VixVerNum%>" type="text/css">
178
      <link rel="stylesheet" href="images/navigation.css?ver=<%=VixVerNum%>" type="text/css">
179
      <script language="JavaScript" src="images/common.js?ver=<%=VixVerNum%>"></script>
6576 dpurdie 180
      <!-- DROPDOWN MENUS -->
6577 dpurdie 181
      <%bJqueryDataTables = TRUE%>
6576 dpurdie 182
      <!--#include file="_jquery_includes.asp"-->
183
      <!--#include file="_menu_def.asp"-->
6579 dpurdie 184
      <script language="JavaScript1.2" src="images/popup_menu.js?ver=<%=VixVerNum%>"></script>
185
      <script language="JavaScript" src="images/tipster.js?ver=<%=VixVerNum%>"></script>
186
      <script language="JavaScript" src="images/_help_tips.js?ver=<%=VixVerNum%>"></script>
6577 dpurdie 187
      <script language="JavaScript" type="text/JavaScript">
188
      formTips.tips.h_export       = stdTip(300, 'Export Test Count', 'Unit test counts will be copied to the users clipboard is CSV format.' +
189
                                                                  '<p>The data is to be integrated into other reports.' 
190
                                                                  );
191
      </script>
6579 dpurdie 192
      <%Call GenerateData%>
6580 dpurdie 193
      <style type="text/css">
194
          table.dataTable tbody tr.baseGroup{background:#dad7c8;}
195
          table.dataTable tbody tr.baseGroup td{border-bottom:1pt solid black;;border-top:1pt solid black;}
196
          table.dataTable tbody tr td.header{color:black;font-weight:bold;}
197
          table.dataTable tbody tr td.info{color:gray;font-weight:normal;}
198
      </style>
6577 dpurdie 199
      <script type="text/javascript" charset="utf-8">
6579 dpurdie 200
 
6582 dpurdie 201
          // Helper object to contain unit tests stats
202
        function groupStats() {
203
            this.total = 0;
204
            this.withTests = 0;
205
            this.testCount = 0;
6587 dpurdie 206
            this.loc = 0;
6582 dpurdie 207
        };
6580 dpurdie 208
 
6582 dpurdie 209
        var pkgStats = {
210
            // Ref to the current table
211
            table : null ,
212
 
213
            // A copy of the original table body
214
            html : null,
215
 
216
            // Display package groups
217
            noGroup : false,
218
 
219
            // Counters for all and for each groups
220
            info : null,
221
            groupinfo : null,
222
 
223
            // Part of config - with groups
224
            withGroups : [
225
                    { "visible": false, "targets": [6,7,8] },
6587 dpurdie 226
                    { "className" : 'nowrap', targets: [1,2,3,4,5] },
6582 dpurdie 227
                    { "orderData" : [7,0], targets : 0 },
228
                    { "orderData" : [7,1], targets : 1 },
229
                    { "orderData" : [7,2], targets : 2 },
230
                    { "orderData" : [7,3], targets : 3 },
231
                    { "orderData" : [7,4], targets : 4 },
232
                    { "orderData" : [7,5], targets : 5 },
233
                    { "orderData" : [7,0], targets : 7 },
234
                ],
235
 
236
            // Part of config - with out groups
237
            withNoGroups : [
238
                    { "visible": false, "targets": [6,7,8] },
6587 dpurdie 239
                    { "className" : 'nowrap', targets: [1,2,3,4,5] },
6582 dpurdie 240
                ],
241
 
242
            // Basic table config
243
            tableConfig : {
244
                //  Vix Usage
245
                //  Used so that the internal functions can access the rest of the pkgStats data
246
                //  Will be filled in with a function to return the data
247
                parentRef : null,
248
 
249
                // Standard config
250
                //    scrollY and columnDefs will be provided before table is created
251
                dom:            "lfrti",
252
                scrollY:        "65vh",
253
                scrollCollapse: true,
254
                paging:         false,
255
                language : { info: "Showing _TOTAL_ entries" },
256
                columnDefs: null,
257
                order: [[0,'asc']],
258
                drawCallback: function ( settings ) {
259
                    var api = this.api();
260
                    var parentRef = api.init().parentRef();
261
                    if (parentRef.noGroup) {
262
                        return;
6580 dpurdie 263
                    }
6577 dpurdie 264
 
6582 dpurdie 265
                    var groupinfo = parentRef.groupinfo;
266
                    $('#noGroups').prop('checked', false)
267
                    var rows = api.rows( { page: 'current' }).nodes();
268
                    var last=null;
269
                    api.column(7, {page:'current'} ).data().each( function ( group, i ) {
270
                        if ( last !== group ) {
271
                            last = group;
272
                            var gdata = groupinfo[group];
273
                            var gtext = new Array();
274
                            gtext.push('Packages: ' + gdata.total + '.');
275
                            gtext.push('With Tests: ' + gdata.withTests + '.');
276
                            gtext.push('Unit Tests: ' + gdata.testCount + '.');
6587 dpurdie 277
                            gtext.push('LoC: ' + gdata.loc + '.');
6582 dpurdie 278
                            $(rows).eq( i ).before(
6587 dpurdie 279
                                '<tr class="baseGroup"><td class="header" colspan="2">'+group+ '</td><td class="info nowrap" colspan="4">'+gtext.join(' ') + '</td></tr>'
6582 dpurdie 280
                            );
281
                        }
282
                    });
6587 dpurdie 283
                    parentRef.setHeight();
6582 dpurdie 284
                }
285
            },
286
 
287
            // Create a basic DataTable
288
            //  Then populate it
289
            createPkgStatsTable : function(){
290
                 // Save or restore the original HTML of the table
291
                 if ( !this.html ) {
292
                     this.html = $('#packageStatsHolder').html();
293
                 } else {
294
                     //  Basically need to kill of the multi column ordering, but I can't do it programatically
295
                     //  Destroy / rebuild the table
296
                     //  The destoy() function in the 1.10.8 crashes when used with 'false'
297
                     //  Using 'true' removes the html of the table - so we save it and put it back
298
                     this.table.destroy(true);
299
                     $('#packageStatsHolder').html(this.html);
300
                 }
301
 
302
                 this.noGroup = $('#noGroups').get(0).checked;
303
                 this.tableConfig.columnDefs = this.noGroup ? this.withNoGroups : this.withGroups;
304
 
305
                 var that = this;
6587 dpurdie 306
                 var tableConfig = Object.assign({}, this.tableConfig);
307
                 tableConfig.parentRef = function(){return that;};
308
                 this.table = $('#packageStats').DataTable(tableConfig);
6582 dpurdie 309
                 this.insertAllData();
310
            },
311
 
6579 dpurdie 312
            //
313
            //  Filter data and insert into the table
6582 dpurdie 314
            insertAllData : function () {
6580 dpurdie 315
                var noDeploy = $('#noDeploy').get(0).checked; 
6582 dpurdie 316
                var noCots   = $('#noCots').get(0).checked;
317
                var noSdk    = $('#noSdk').get(0).checked;
6580 dpurdie 318
 
6579 dpurdie 319
                var ii;
6582 dpurdie 320
                this.table.clear();
321
                this.info = new groupStats();
322
                this.groupinfo = {};
6579 dpurdie 323
 
324
                for (ii = 0; ii < dataSet.length; ii++) {
6580 dpurdie 325
                    if ( noCots ) {
326
                        var vdata = $(dataSet[ii][1]).text();
327
                        if ( vdata.match(/.cots$/) || vdata.match(/.tool$/) ) {
328
                            continue;
6579 dpurdie 329
                        }
330
                    }
6580 dpurdie 331
 
332
                    if ( noDeploy ) {
333
                        var dData = dataSet[ii][6];
334
                        if ( dData == 'Y' ) {
335
                            continue;
336
                        }
337
                    }
338
 
6582 dpurdie 339
                    if ( noSdk ) {
340
                        var dData = dataSet[ii][8];
341
                        if ( dData == 'Y' ) {
342
                            continue;
343
                        }
344
                    }
345
 
6580 dpurdie 346
                    var group = dataSet[ii][7];
6582 dpurdie 347
                    var gdata = this.groupinfo[group];
348
                    if ( !gdata ) {
349
                        this.groupinfo[group] = new groupStats();
350
                        gdata = this.groupinfo[group];
6580 dpurdie 351
                    }
352
 
6582 dpurdie 353
                    this.table.row.add( dataSet[ii]);
354
                    this.info.total ++;
6580 dpurdie 355
                    gdata.total++;
356
                    var count = parseInt($(dataSet[ii][2]).text());
6587 dpurdie 357
                    var loc = parseInt(dataSet[ii][3]);
6580 dpurdie 358
                    if ( !isNaN(count) && count > 0 ) {
6582 dpurdie 359
                        this.info.withTests++;
6580 dpurdie 360
                        gdata.withTests++;
6582 dpurdie 361
                        this.info.testCount += count;
6580 dpurdie 362
                        gdata.testCount += count;
363
                    }
6587 dpurdie 364
                    if ( !isNaN(loc) && loc > 0 ) {
365
                        this.info.loc += loc;
366
                        gdata.loc += loc;
367
                    }
6579 dpurdie 368
                }
6582 dpurdie 369
                this.table.draw();
6579 dpurdie 370
 
6582 dpurdie 371
                $('#pkgCount').text(this.info.total);
372
                $('#pkgTestCount').text(this.info.withTests);
373
                $('#testCount').text(this.info.testCount);
6587 dpurdie 374
                $('#tloc').text(this.info.loc);
6582 dpurdie 375
            },
6579 dpurdie 376
 
6582 dpurdie 377
            setHeight : function () {
378
                 var noScroll = $('#noScroll').get(0).checked;
379
                 if ( noScroll ) {
380
                     var ScrollBody = $('#packageStats').closest('.dataTables_scrollBody');
381
                     // work on Datatables 1.10.12 ++, but not on 1.10.8, although lots else works better
382
                     ScrollBody.css('max-height', "100%");
383
                     ScrollBody.css('height', "100%");
384
                 }
385
            },
6577 dpurdie 386
 
6582 dpurdie 387
        };
6577 dpurdie 388
 
6582 dpurdie 389
        $(document).ready(function() {
6579 dpurdie 390
 
6582 dpurdie 391
        // Instantiate the table
392
        pkgStats.createPkgStatsTable();
6580 dpurdie 393
 
6582 dpurdie 394
        // Enable / Disable full table display
395
        // Use / Don't use base View groups
396
        $('#noScroll,#noGroups').click(function(e){
397
            pkgStats.createPkgStatsTable();
398
        });
6580 dpurdie 399
 
6582 dpurdie 400
        // Hide / Show the the COTS packages
401
        // Hide / Show the the Deployed packages
402
        // Hide / Show the packages from SDKs
403
        $('#noCots,#noDeploy,#noSdk').click(function(e){
404
            pkgStats.insertAllData();
405
        });
6577 dpurdie 406
 
6587 dpurdie 407
        // Copy multi-line data to the users clipboard
6582 dpurdie 408
        function copyToClipboard(string) {
6587 dpurdie 409
            var $temp = $("<textarea>");
6582 dpurdie 410
            $("body").append($temp);
411
            $temp.val(string).select();
412
            document.execCommand("copy");
413
            $temp.remove();
414
        };
6577 dpurdie 415
 
6582 dpurdie 416
        // Export Data
417
        $('#btnExport').click(function(e){
418
            var csv = [];
6614 dpurdie 419
            var csvHdr = [];
6587 dpurdie 420
            var lines = [];
6614 dpurdie 421
            var linesHdr = '';
6582 dpurdie 422
            var date = new Date();
423
            var tstamp = (date.getFullYear() * 10000) + ((date.getMonth() + 1) * 100) + date.getDate()
6641 dpurdie 424
            var noDetails = $('#noDetails').get(0).checked;
6577 dpurdie 425
 
6587 dpurdie 426
            function createHeader() {
427
                //  Insert DateStamp as YYMMDD
428
                csv.push(tstamp);
6614 dpurdie 429
                csvHdr.push('Date');
6579 dpurdie 430
 
6587 dpurdie 431
                //  Insert Release ID
432
                csv.push(<%=DB_RTAG_ID%>);
6614 dpurdie 433
                csvHdr.push('RtagId');
6610 dpurdie 434
                csv.push("<%=DB_PROJ_NAME%>");
6614 dpurdie 435
                csvHdr.push('Project Name');
6610 dpurdie 436
                csv.push("<%=DB_RTAG_NAME%>");
6614 dpurdie 437
                csvHdr.push('Release Name');
6587 dpurdie 438
            }
439
 
440
            function addInfo(info) {
441
                csv.push(info.total);
6614 dpurdie 442
                csvHdr.push('Total Packages');
6587 dpurdie 443
                csv.push(info.withTests);
6614 dpurdie 444
                csvHdr.push('Packages with Tests');
6587 dpurdie 445
                csv.push(info.testCount);
6614 dpurdie 446
                csvHdr.push('Total Unit Tests');
6587 dpurdie 447
                csv.push(info.loc);
6614 dpurdie 448
                csvHdr.push('Total Lines of Code');
6587 dpurdie 449
            }
450
 
451
            function saveCsv() {
452
                if ( csv.length ) {
453
                    lines.push(csv.join(","));
454
                    csv = [];
6614 dpurdie 455
 
456
                    var nextLineHdr = csvHdr.join(",");
457
                    if ( nextLineHdr.length > linesHdr.length ) {
458
                        linesHdr = nextLineHdr 
459
                    }
460
 
461
                    lines.push();
462
                    csvHdr = [];
6587 dpurdie 463
                }
464
            }
465
 
6582 dpurdie 466
            // Generate a CSV representation of the data in the table
6587 dpurdie 467
            // Support two forms - grouped and un grouped
468
            //
469
            if (pkgStats.noGroup) {
470
                // Ungrouped - all packages
471
                createHeader();
6594 dpurdie 472
                csv.push('ALL');
6614 dpurdie 473
                csvHdr.push('Group');
6641 dpurdie 474
                addInfo(pkgStats.info);
475
                if ( !noDetails )
476
                {
477
                    pkgStats.table.rows().every(function(rowIdx, tableLoop, rowLoop) {
478
                        var data = this.data();
479
                        csv.push($(data[0]).text(), $(data[2]).text(), data[3] );
480
                        csvHdr.push('Package','Tests','LoC');
481
                    });
482
                }
6587 dpurdie 483
                saveCsv();
484
            } else {
485
                // Grouped by package
486
                var lastGroup = null;
487
                pkgStats.table.rows().every( function ( rowIdx, tableLoop, rowLoop ) {
488
                    var data = this.data();
489
                    var group = data[7];
490
                    if ( group != lastGroup ) {
491
                        lastGroup = group;
492
                        saveCsv();
493
                        createHeader();
494
                        csv.push(group);
6614 dpurdie 495
                        csvHdr.push('Group');
6587 dpurdie 496
                        addInfo(pkgStats.groupinfo[group]);
497
                    }
6641 dpurdie 498
                    if ( !noDetails )
499
                    {
500
                        csv.push($(data[0]).text(), $(data[2]).text(), data[3]);
501
                        csvHdr.push('Package','Tests','LoC');
502
                    }
6587 dpurdie 503
                });
504
                saveCsv();
505
            }
6614 dpurdie 506
            lines.unshift(linesHdr);
6589 dpurdie 507
            vixTextToClipBoard(lines.join('\r\n'),{note:'CSV Data copied to clipboard'});
6577 dpurdie 508
            });
509
        });
6582 dpurdie 510
  </script>
6577 dpurdie 511
 
6576 dpurdie 512
   </head>
513
   <body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="0">
514
      <!-- HEADER -->
515
      <!--#include file="_header.asp"-->
516
      <!-- BODY ---->
517
      <table class="full_table">
518
         <tr>
519
            <td width="146px" class="panel_bg" valign="top">
520
                <%Call LeftPanelContent%>
521
            </td>
6577 dpurdie 522
            <td width="90%" rowspan="2" align="center" valign="top" bgcolor="#EEEFEF">
6576 dpurdie 523
                <%Call MainPanelContent%>
524
            </td>
525
         </tr>
526
         <tr>
527
            <td class="panel_bg" valign="bottom" align="center" height="350">
528
                <img src="images/release_stats.png" vspace="20" hspace="30"></td>
529
         </tr>
530
      </table>
531
      <!-- FOOTER -->
532
      <!--#include file="_footer.asp"-->
533
   </body>
534
</html>
535