(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="↓"/></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="↓"/>'; newRows.reverse(); span.setAttribute(
'sortdir',
'up');
}
else
{ ARROW =
' <img src="'+ image_path + image_up +
'" alt="↑"/>'; 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="↓"/>';
}
}
} 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>