Web Report - Singale Computer Properties Report

(imported topic written by ckcheong)

Hello,

I need to create a simple computer properties report base on the Identify Number. For example…

Identifying number : (for customer to enter)

'After entered the above Identifying Number, the following details will display.

Computer Name: (Display computer name that’s belong to the identifying number)

Computer Manufacture:

Computer Model:

IP Address:

ETC….

Does anyone can guide me how to create this type of report? Thank you.

Regards,

CK

(imported comment written by SystemAdmin)

Hey CK

Here is a quick mock up of what you want.

Most of the code is pulled from other reports, and the only thing you really need to look at is the relevance expression on line 29. It shouldn’t be too much trouble to edit this to return what you want. Let me know if anything doesn’t make sense.

<div id=
"input"> computer name: <INPUT id=
"User_Input" size=30 type=
"text" style=
"margine-right:4px;" > <BUTTON id=
"evaluate_button" type=button size=50 style=
"margin-left: 4px;" onclick=
"checkValidInput()">Show Results</BUTTON><hr> </div> <div id=
"ErrorBox" class=
"wr_warningBox" style=
"display: none;"></div> <div id=
"Loader" style=
"display:none;">Loading...</div> <div id=
"ResultsDiv" style=
"display:none;"></div> <script language=
"javascript"> var results_div = document.getElementById(
'ResultsDiv'); var loader                   = document.getElementById(
'Loader'      ); var error_box      = document.getElementById(
'ErrorBox'  ); var tableSeries = 

new Array();   function RegisterEventHandlers() 
{ evaluate_button.onclick        = checkValidInput; User_Input.onkeyup   = checkEnter; 
} function getResults()
{ 

try
{ 
//relevance expression, will fail if user inputs a name that doesn't exist results_div.innerHTML = EvaluateRelevance(
'(it as html) of ("Computer Name: " &link of item 3 of it &"<br>Computer Manufactuer: "& value of results( item 0 of it, item 3 of it) &"<br>Computer Model: "& value of results( item 1 of it, item 3 of it) &"<br>IP Addresses"& (concatenation "," of values of results (item 2 of it, item 3 of it)) )  of (item 0 of it, item 1 of it, item 2 of it,  bes computers) whose(exists name of item 3 of it AND name of item 3 of it = "'+User_Input.value+
'") of( bes property whose(name of it ="Computer Manufacturer" AND id of it = 49 ) , bes property whose (name of it = "Computer Model" AND id of it = 50), bes property whose(name of it = "IP Address" AND id of it = 27))'); 
//edit this 
}

catch(E)
{ errorMessage(
"Relevance expression failed to evaluate:"+E.description); 

return 

false; 
} loader.style.display = 
"none"; results_div.style.display = 
'block'; 
} 
// code for handling user input function showLoading()
{ 

if(isValid)
{ isValid = 

false; clearInterval(inputCheckInterval); getResults(); 

return 

true; 
} 

return 

false; 
} function checkValidInput()
{ inputCheckInterval = setInterval(
"showLoading()", 300); 

if(trim(User_Input.value) == 

null )
{ isValid = 

false; 

return 

false; 
} isValid = 

true; ResultsDiv.style.display = 
'none'; Loader.style.display = 
"block"; 
} function trim(str) 
{ str = str.replace(/^\s*|\s*$/g,
""); 

return str; 
} function checkEnter(e)
{ 

if(e == undefined) e = window.event; var keycode = e.which || e.keyCode; 

if(keycode == 13)
{ checkValidInput(); 
} 
} function errorMessage(message)
{ loader.style.display = 
'none'; error_box.innerHTML         =  message; error_box.style.display =
''; results_div.style.display = 
'none'; 
} </script>

-zak

(imported comment written by ckcheong)

Hello Zak,

I received this error msg when i run it.

Relevance expression failed to evaluate:The operator “equal” is not defined.

Regards,

CK

(imported comment written by RP12)

I have a need for a report like this one, but get the same error.

Relevance expression failed to evaluate:The operator “equal” is not defined.

Can someone define what the error message means, so I can figure it out?

Thanks

(imported comment written by SystemAdmin)

Sorry guys, i missed the original reply.

The error “the operator ‘’ is not defined” means that you are trying to preform an operation on two different types that dont apply to that operation.

In this report the problem was that, in 7.0, id of returns an integer tuple. It then tried to compare that to a simple integer, which is not allowed.

I fixed this, and added some additional error checking to remove some other potential problems.

<div id=
"input"> computer name: <INPUT id=
"User_Input" size=30 type=
"text" style=
"margine-right:4px;" > <BUTTON id=
"evaluate_button" type=button size=50 style=
"margin-left: 4px;" onclick=
"checkValidInput()">Show Results</BUTTON><hr> </div> <div id=
"ErrorBox" class=
"wr_warningBox" style=
"display: none;"></div> <div id=
"Loader" style=
"display:none;">Loading...</div> <div id=
"ResultsDiv" style=
"display:none;"></div> <script language=
"javascript"> var results_div = document.getElementById(
'ResultsDiv'); var loader             = document.getElementById(
'Loader'      ); var error_box     = document.getElementById(
'ErrorBox'  ); var tableSeries = 

new Array();   function RegisterEventHandlers() 
{ evaluate_button.onclick    = checkValidInput; User_Input.onkeyup    = checkEnter; 
} function getResults()
{ 

try
{ 
//relevance expression, will fail if user inputs a name that doesn't exist results_div.innerHTML = EvaluateRelevance(
'(it as html) of ("Computer Name: " &link of item 3 of it &"<br>Computer Manufactuer: "& value of results( item 0 of it, item 3 of it) &"<br>Computer Model: "& value of results( item 1 of it, item 3 of it) &"<br>IP Addresses"& (concatenation "," of values of results (item 2 of it, item 3 of it)) )  of (item 0 of it, item 1 of it, item 2 of it,  bes computers) whose(exists name of item 3 of it AND exists  results (item 2 of it, item 3 of it) whose(not error flag of it) AND exists results( item 1 of it, item 3 of it) whose(not error flag of it) AND exists results( item 0 of it, item 3 of it) whose(not error flag of it) AND name of item 3 of it as lowercase  = "'+User_Input.value+
'" as lowercase  AND exists link of item 3 of it ) of( bes properties whose(name of it = "Computer Manufacturer"  ) , bes properties whose (name of it = "Computer Model" ), bes properties whose(name of it = "IP Address" ))'); 
//edit this 
}

catch(E)
{ errorMessage(
"Relevance expression failed to evaluate:"+E.description); 

return 

false; 
} loader.style.display = 
"none"; results_div.style.display = 
'block'; 
} 
// code for handling user input function showLoading()
{ 

if(isValid)
{ isValid = 

false; clearInterval(inputCheckInterval); getResults(); 

return 

true; 
} 

return 

false; 
} function checkValidInput()
{ inputCheckInterval = setInterval(
"showLoading()", 300); 

if(trim(User_Input.value) == 

null )
{ isValid = 

false; 

return 

false; 
} isValid = 

true; ResultsDiv.style.display = 
'none'; Loader.style.display = 
"block"; 
} function trim(str) 
{ str = str.replace(/^\s*|\s*$/g,
""); 

return str; 
} function checkEnter(e)
{ 

if(e == undefined) e = window.event; var keycode = e.which || e.keyCode; 

if(keycode == 13)
{ checkValidInput(); 
} 
} function errorMessage(message)
{ loader.style.display = 
'none'; error_box.innerHTML     =  message; error_box.style.display =
''; results_div.style.display = 
'none'; 
} </script>

-Zak

(imported comment written by anthonymap91)

This would be really useful to me. I tried to use this in webreports, but it did not work. It starts “loading” Then I get a blank page…no results.

Thanks

(imported comment written by SystemAdmin)

That code looks VERY familiar to me… it’s actually an early version of a report I created.

There are a few issues with it, for example, I have never done any testing for cross browser compatibility and I have heard reports that it doesn’t work in firefox (and probably anything but IE).

Below is the current version of the same report. It relies on a “primary user”, “service tag”, and “asset tag” that you may not be collecting. So it will require some modification to suit your environement.

The code is actually pretty simple. Use a decent text editor (I use notepad++) and you should be able to follow it. the second section was something I downloaded that allows the columns to sort, you shouldn’t need to change anything there.

<div id=
"input"> <table> <tr><td>Computer Name:</td><td><INPUT id=
"Computer_Name_Input" size=10 type=
"text" style=
"margine-right:4px;" ></td><td></td></tr> <tr><td>IP:</td><td><INPUT id=
"IP_Address_Input" size=10 type=
"text" style=
"margine-right:4px;" ></td><td></td></tr> <tr><td>Username:</td><td><INPUT id=
"Primary_User_Input" size=10 type=
"text" style=
"margine-right:4px;" ></td><td></td></tr> <tr><td>Service Tag:</td><td><INPUT id=
"Service_Tag_Input" size=10 type=
"text" style=
"margine-right:4px;" ></td><td></td></tr> <tr><td>Asset Tag (from BIOS):</td><td><INPUT id=
"Asset_Tag_Input" size=10 type=
"text" style=
"margine-right:4px;" ></td><td></td></tr> <tr><td>Match Type:</td><td><INPUT type=
"radio" name=
"matchType" value=
"partial" checked>Partial </td><td><INPUT type=
"radio" name=
"matchType" value=
"exact">Exact </td></tr> <tr><td>AND/OR Inputs:</td><td><INPUT type=
"radio" name=
"ANDOR" value=
"AND" checked>AND </td><td><INPUT type=
"radio" name=
"ANDOR" value=
"OR">OR </td></tr> <tr><td>One Result per:</td><td><INPUT type=
"radio" name=
"perLine" value=
"computer" checked>Computer </td><td><INPUT type=
"radio" name=
"perLine" value=
"ip">IP </td><td><INPUT type=
"radio" name=
"perLine" value=
"user">User </td></tr> <tr><td><BUTTON id=
"evaluate_button" type=button size=50 style=
"margin-left: 4px;" onclick=
"checkValidInput()">Execute</BUTTON></td><td></td><td></td><td></td></tr> </table> <hr> </div>   <div id=
"ErrorBox" class=
"wr_warningBox" style=
"display: none;"></div> <div id=
"StatusBox" style=
"display: none;"></div> <div id=
"Loader" style=
"display:none;">Loading...</div> <div id=
"ResultsDiv" style=
"display:none;"></div>   <script language=
"javascript"> var results_div = document.getElementById(
'ResultsDiv'); var loader = document.getElementById(
'Loader'); var error_box = document.getElementById(
'ErrorBox'); var status_box = document.getElementById(
'StatusBox'); var tableSeries = 

new Array(); RegisterEventHandlers()   function RegisterEventHandlers()
{ evaluate_button.onclick   = checkValidInput; Computer_Name_Input.onkeyup  = checkEnter; IP_Address_Input.onkeyup  = checkEnter; Primary_User_Input.onkeyup        = checkEnter; Service_Tag_Input.onkeyup = checkEnter; Computer_Name_Input.focus();  
//set the focus 
} function getResults()
{ 
// are we doing a partial or full text search? 

if(matchType[0].checked)
{ matchType_Relevance = 
' contains '; 
} 

else 

if (matchType[1].checked)
{ matchType_Relevance = 
' = '; 
} 
// are we going to AND or OR the inputs? 

if(ANDOR[0].checked)
{ AND_OR_Relevance = 
' AND '; 
} 

else 

if (ANDOR[1].checked)
{ AND_OR_Relevance = 
' OR '; 
} 
// Heres the relevance blocks for the 'where' portion of the query Computer_Name_Relevance = 
'(name of it as lowercase '+matchType_Relevance+
' "'+Computer_Name_Input.value+
'" as lowercase)'; IP_Address_Relevance = 
'(exist ip address whose (it as string '+matchType_Relevance+
' "'+IP_Address_Input.value+
'") of it)'; Primary_User_Relevance = 
'(exist value whose (it as lowercase '+matchType_Relevance+
' "'+Primary_User_Input.value+
'" as lowercase) of (results(bes properties ("Primary User"), it)))'; Service_Tag_Relevance = 
'(exist value whose (it as lowercase '+matchType_Relevance+
' "'+Service_Tag_Input.value+
'" as lowercase) of (results(bes properties ("Service Tag"), it)))'; Asset_Tag_Relevance = 
'(exist value whose (it as lowercase '+matchType_Relevance+
' "'+Asset_Tag_Input.value+
'" as lowercase) of (results(bes properties ("Asset Tag: PCN/CS Number - From BIOS"), it)))'; Relevance_Criteria = 
""; 
//Build the search relevance criteria Bbsed on which inputs were populated 

if(Computer_Name_Input.value != 
"")
{ Relevance_Criteria = Computer_Name_Relevance; 
} 

if(IP_Address_Input.value != 
"")
{ 

if (Relevance_Criteria != 
"")
{ Relevance_Criteria = Relevance_Criteria + AND_OR_Relevance; 
} Relevance_Criteria = Relevance_Criteria + IP_Address_Relevance; 
} 

if(Primary_User_Input.value != 
"")
{ 

if (Relevance_Criteria != 
"")
{ Relevance_Criteria = Relevance_Criteria + AND_OR_Relevance; 
} Relevance_Criteria = Relevance_Criteria + Primary_User_Relevance; 
} 

if(Service_Tag_Input.value != 
"")
{ 

if (Relevance_Criteria != 
"")
{ Relevance_Criteria = Relevance_Criteria + AND_OR_Relevance; 
} Relevance_Criteria = Relevance_Criteria + Service_Tag_Relevance; 
} 

if(Asset_Tag_Input.value != 
"")
{ 

if (Relevance_Criteria != 
"")
{ Relevance_Criteria = Relevance_Criteria + AND_OR_Relevance; 
} Relevance_Criteria = Relevance_Criteria + Asset_Tag_Relevance; 
} 
//Build the Table header tablestart = 
'<table class="sortable" id="resultsTable"><tbody><tr><th>Computer Name</th><th>Service Tag</th><th>IP Addresses</th><th>Primary User(s)</th><th>Last Report Date</th></tr>'; 
//Here is the relevance for the output part of the query ComputerNameColumnRelevance = 
'(link of it)'; ServiceTagColumnRelevance = 
'((if (exist value of it) then (value of it) else ("")) of (results(bes properties ("Service Tag"), it)))' ; IPAddressColumnRelevance = 
'(concatenation ", " of (ip addresses of it as string))'; PrimaryUserColumnRelevance = 
'(concatenation ", " of substrings separated by ";" of ((if (exist value of it) then (value of it) else ("")) of (results(bes properties ("Primary User"), it))))'; LastReportDateColumnRelevance = 
'((((year of it as string)& "/"& (month of it as two digits)& "/"& (day_of_month of it as two digits))of date ("est" as time zone) of it& " - "& time of time ("est" as time zone) of it as string ) of (last report time of it))' 
//Modify the output relevance for one-line-per options 

if(perLine[0].checked) 
{ 
// default selection is one line per computer name no changes necessary 
} 

if (perLine[1].checked) 
{ 
// one line per IP address, override the ip address column IPAddressColumnRelevance = 
'(ip addresses of it as string)'; 
} 

if (perLine[2].checked) 
{ 
// one line per Primary User, override the primary user column PrimaryUserColumnRelevance = 
'(substrings separated by ";" of ((if (exist value of it) then (value of it) else ("")) of (results(bes properties ("Primary User"), it))))'; 
} 
//combine all of the relevance parts into one relevance statement relevance = 
'concatenation of (trs of ((td of item 0 of it & td of item 1 of it & td of item 2 of it & td of item 3 of it & td of item 4 of it) of ('+ComputerNameColumnRelevance+
', '+ServiceTagColumnRelevance+
', '+IPAddressColumnRelevance+
', '+PrimaryUserColumnRelevance+
', '+LastReportDateColumnRelevance+
'))) of (BES Computers whose ('+Relevance_Criteria+
'))'; 
//close the table tableend=
'</tbody></table>' 
//run the query and output it to the results_div 

try
{ results_div.innerHTML = tablestart + EvaluateRelevance(relevance) + tableend; 
}

catch(E)
{ 

if(E.description = 
"Object required") 
{ errorMessage(
"No results found.  Search again."); 
} 

else 
{ errorMessage(
"Relevance expression failed to evaluate:"+E.description); 
} 

return 

false; 
} sortables_init();  
//make output sortable loader.style.display = 
"none";  
//hide loading message results_div.style.display = 
'block';  
//show resultsDiv rowCount = document.getElementById(
'resultsTable').rows.length - 1;  
//count the results statusMessage( 
"<h3>" + rowCount + 
" result(s) found: </h3>");  
//Display the result count 
} 
// code for handling user input function showLoading()
{ 

if(isValid)
{ isValid = 

false; clearInterval(inputCheckInterval); getResults(); 

return 

true; 
} 

return 

false; 
} function checkValidInput()
{ inputCheckInterval = setInterval(
"showLoading()", 300); 

if(trim(Computer_Name_Input.value) + trim(IP_Address_Input.value) + trim(Primary_User_Input.value) + trim(Service_Tag_Input.value) + trim(Asset_Tag_Input.value) == 
"")
{ isValid = 

false; 

return 

false; 
} isValid = 

true; ResultsDiv.style.display = 
'none'; error_box.style.display = 
'none'; status_box.style.display = 
'none'; Loader.style.display = 
"block"; 
} function trim(str) 
{ str = str.replace(/^\s*|\s*$/g,
""); 

return str; 
} function checkEnter(e)
{ 

if(e == undefined) e = window.event; var keycode = e.which || e.keyCode; 

if(keycode == 13)
{ checkValidInput(); 
} 
} function errorMessage(message)
{ loader.style.display = 
'none'; error_box.innerHTML   =  message; error_box.style.display =
''; status_box.style.display = 
'none'; results_div.style.display = 
'none'; 
} function statusMessage(message)
{ loader.style.display = 
'none'; status_box.innerHTML        =  message; status_box.style.display =
''; results_div.style.display = 
''; 
} </script>   <style type=
"text/css"> a img 
{border:none; 
} .odd 
{background-color: #ebedef;
} .even 
{background-color: #fff;
} </style>   <script language=
"javascript"> 
/* Table sorting script  by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/. Based on a script from http://www.kryogenix.org/code/browser/sorttable/. Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html . Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk. Version 1.5.7 */   
/* You can change these values */ var image_path = 
"/images/besreports/ENU/"; var image_up = 
"minimizebutton.gif"; var image_down = 
"maximizebutton.gif"; var image_none = 
"arrow.gif"; var europeandate = 

false; var alternate_row_colors = 

true;   
/* Don't change anything below this unless you know what you're doing */ 
// addEvent(window, "load", sortables_init);   var SORT_COLUMN_INDEX; var thead = 

false;   function sortables_init() 
{ 
// Find all tables with class sortable and make them sortable 

if (!document.getElementsByTagName) 

return; tbls = document.getElementsByTagName(
"table"); 

for (ti=0;ti<tbls.length;ti++) 
{ thisTbl = tbls[ti]; 

if (((
' '+thisTbl.className+
' ').indexOf(
"sortable") != -1) && (thisTbl.id)) 
{ ts_makeSortable(thisTbl); 
} 
} 
}   function ts_makeSortable(t) 
{ 

if (t.rows && t.rows.length > 0) 
{ 

if (t.tHead && t.tHead.rows.length > 0) 
{ var firstRow = t.tHead.rows[t.tHead.rows.length-1]; thead = 

true; 
} 

else 
{ var firstRow = t.rows[0]; 
} 
} 

if (!firstRow) 

return; 
// We have a first row: assume it's the header, and make its contents clickable links 

for (var i=0;i<firstRow.cells.length;i++) 
{ var cell = firstRow.cells+; var txt = ts_getInnerText(cell); 

if (cell.className != 
"unsortable" && cell.className.indexOf(
"unsortable") == -1) 
{ cell.innerHTML = 
'<a href="#" class="sortheader" onclick="ts_resortTable(this, '+i+
');return false;">'+txt+
'<span class="sortarrow">  <img src="'+ image_path + image_none + 
'" alt="&darr;"/></span></a>'; 
} 
} 

if (alternate_row_colors) 
{ alternate(t); 
} 
}   function ts_getInnerText(el) 
{ 

if (typeof el == 
"string") 

return el; 

if (typeof el == 
"undefined") 
{ 

return el 
}; 

if (el.innerText) 

return el.innerText;   
//Not needed but it is faster var str = 
""; var cs = el.childNodes; var l = cs.length; 

for (var i = 0; i < l; i++) 
{ 

switch (cs+.nodeType) 
{ 

case 1: 
//ELEMENT_NODE str += ts_getInnerText(cs+); 

break; 

case 3:      
//TEXT_NODE str += cs+.nodeValue; 

break; 
} 
} 

return str; 
}   function ts_resortTable(lnk, clid) 
{ var span; 

for (var ci=0;ci<lnk.childNodes.length;ci++) 
{ 

if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 
'span') span = lnk.childNodes[ci]; 
} var spantext = ts_getInnerText(span); var td = lnk.parentNode; var column = clid || td.cellIndex; var t = getParent(td,
'TABLE'); 
// Work out a type for the column 

if (t.rows.length <= 1) 

return; var itm = 
""; var i = 0; 

while (itm == 
"" && i < t.tBodies[0].rows.length) 
{ var itm = ts_getInnerText(t.tBodies[0].rows+.cells[column]); itm = trim(itm); 

if (itm.substr(0,4) == 
"<!--" || itm.length == 0) 
{ itm = 
""; 
} i++; 
} 

if (itm == 
"") 

return; sortfn = ts_sort_caseinsensitive; 

if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) sortfn = ts_sort_date; 

if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d
{2
}?$/)) sortfn = ts_sort_date; 

if (itm.match(/^-?[£$€Û¢´]\d/)) sortfn = ts_sort_numeric; 

if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) sortfn = ts_sort_numeric; SORT_COLUMN_INDEX = column; var firstRow = 

new Array(); var newRows = 

new Array(); 

for (k=0;k<t.tBodies.length;k++) 
{ 

for (i=0;i<t.tBodies[k].rows[0].length;i++) 
{ firstRow+ = t.tBodies[k].rows[0]+; 
} 
} 

for (k=0;k<t.tBodies.length;k++) 
{ 

if (!thead) 
{ 
// Skip the first row 

for (j=1;j<t.tBodies[k].rows.length;j++) 
{ newRows[j-1] = t.tBodies[k].rows[j]; 
} 
} 

else 
{ 
// Do NOT skip the first row 

for (j=0;j<t.tBodies[k].rows.length;j++) 
{ newRows[j] = t.tBodies[k].rows[j]; 
} 
} 
} newRows.sort(sortfn); 

if (span.getAttribute(
"sortdir") == 
'down') 
{ ARROW = 
'  <img src="'+ image_path + image_down + 
'" alt="&darr;"/>'; newRows.reverse(); span.setAttribute(
'sortdir',
'up'); 
} 

else 
{ ARROW = 
'  <img src="'+ image_path + image_up + 
'" alt="&uarr;"/>'; span.setAttribute(
'sortdir',
'down'); 
} 
// We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones 
// don't do sortbottom rows 

for (i=0; i<newRows.length; i++) 
{ 

if (!newRows+.className || (newRows+.className && (newRows+.className.indexOf(
'sortbottom') == -1))) 
{ t.tBodies[0].appendChild(newRows+); 
} 
} 
// do sortbottom rows only 

for (i=0; i<newRows.length; i++) 
{ 

if (newRows+.className && (newRows+.className.indexOf(
'sortbottom') != -1)) t.tBodies[0].appendChild(newRows+); 
} 
// Delete any other arrows there may be showing var allspans = document.getElementsByTagName(
"span"); 

for (var ci=0;ci<allspans.length;ci++) 
{ 

if (allspans[ci].className == 
'sortarrow') 
{ 

if (getParent(allspans[ci],
"table") == getParent(lnk,
"table")) 
{ 
// in the same table as us? allspans[ci].innerHTML = 
'  <img src="'+ image_path + image_none + 
'" alt="&darr;"/>'; 
} 
} 
} span.innerHTML = ARROW; alternate(t); 
}   function getParent(el, pTagName) 
{ 

if (el == 

null) 
{ 

return 

null; 
} 

else 

if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) 
{ 

return el; 
} 

else 
{ 

return getParent(el.parentNode, pTagName); 
} 
}   function sort_date(date) 
{ 
// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX dt = 
"00000000"; 

if (date.length == 11) 
{ mtstr = date.substr(3,3); mtstr = mtstr.toLowerCase(); 

switch(mtstr) 
{ 

case 
"jan": var mt = 
"01"; 

break; 

case 
"feb": var mt = 
"02"; 

break; 

case 
"mar": var mt = 
"03"; 

break; 

case 
"apr": var mt = 
"04"; 

break; 

case 
"may": var mt = 
"05"; 

break; 

case 
"jun": var mt = 
"06"; 

break; 

case 
"jul": var mt = 
"07"; 

break; 

case 
"aug": var mt = 
"08"; 

break; 

case 
"sep": var mt = 
"09"; 

break; 

case 
"oct": var mt = 
"10"; 

break; 

case 
"nov": var mt = 
"11"; 

break; 

case 
"dec": var mt = 
"12"; 

break; 
// default: var mt = "00"; 
} dt = date.substr(7,4)+mt+date.substr(0,2); 

return dt; 
} 

else 

if (date.length == 10) 
{ 

if (europeandate == 

false) 
{ dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2); 

return dt; 
} 

else 
{ dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2); 

return dt; 
} 
} 

else 

if (date.length == 8) 
{ yr = date.substr(6,2); 

if (parseInt(yr) < 50) 
{ yr = 
'20'+yr; 
} 

else 
{ yr = 
'19'+yr; 
} 

if (europeandate == 

true) 
{ dt = yr+date.substr(3,2)+date.substr(0,2); 

return dt; 
} 

else 
{ dt = yr+date.substr(0,2)+date.substr(3,2); 

return dt; 
} 
} 

return dt; 
}   function ts_sort_date(a,b) 
{ dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX])); dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 

if (dt1==dt2) 
{ 

return 0; 
} 

if (dt1<dt2) 
{ 

return -1; 
} 

return 1; 
} function ts_sort_numeric(a,b) 
{ var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]); aa = clean_num(aa); var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]); bb = clean_num(bb); 

return compare_numeric(aa,bb); 
} function compare_numeric(a,b) 
{ var a = parseFloat(a); a = (isNaN(a) ? 0 : a); var b = parseFloat(b); b = (isNaN(b) ? 0 : b); 

return a - b; 
} function ts_sort_caseinsensitive(a,b) 
{ aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase(); bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase(); 

if (aa==bb) 
{ 

return 0; 
} 

if (aa<bb) 
{ 

return -1; 
} 

return 1; 
} function ts_sort_default(a,b) 
{ aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]); bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]); 

if (aa==bb) 
{ 

return 0; 
} 

if (aa<bb) 
{ 

return -1; 
} 

return 1; 
} function addEvent(elm, evType, fn, useCapture) 
// addEvent and removeEvent 
// cross-browser event handling for IE5+, NS6 and Mozilla 
// By Scott Andrew 
{ 

if (elm.addEventListener)
{ elm.addEventListener(evType, fn, useCapture); 

return 

true; 
} 

else 

if (elm.attachEvent)
{ var r = elm.attachEvent(
"on"+evType, fn); 

return r; 
} 

else 
{ alert(
"Handler could not be removed"); 
} 
} function clean_num(str) 
{ str = str.replace(

new RegExp(/[^-?0-9.]/g),
""); 

return str; 
} function trim(s) 
{ 

return s.replace(/^\s+|\s+$/g, 
""); 
} function alternate(table) 
{ 
// Take object table and get all it's tbodies. var tableBodies = table.getElementsByTagName(
"tbody"); 
// Loop through these tbodies 

for (var i = 0; i < tableBodies.length; i++) 
{ 
// Take the tbody, and get all it's rows var tableRows = tableBodies+.getElementsByTagName(
"tr"); 
// Loop through these rows 
// Start at 1 because we want to leave the heading row untouched 

for (var j = 0; j < tableRows.length; j++) 
{ 
// Check if j is even, and apply classes for both possible results 

if ( (j % 2) == 0  ) 
{ 

if ( !(tableRows[j].className.indexOf(
'odd') == -1) ) 
{ tableRows[j].className = tableRows[j].className.replace(
'odd', 
'even'); 
} 

else 
{ 

if ( tableRows[j].className.indexOf(
'even') == -1 ) 
{ tableRows[j].className += 
" even"; 
} 
} 
} 

else 
{ 

if ( !(tableRows[j].className.indexOf(
'even') == -1) ) 
{ tableRows[j].className = tableRows[j].className.replace(
'even', 
'odd'); 
} 

else 
{ 

if ( tableRows[j].className.indexOf(
'odd') == -1 ) 
{ tableRows[j].className += 
" odd"; 
} 
} 
} 
} 
} 
} </script>