/**
* @namespace HTML related.
*/
ovm.html = ovm.html || {};
/**
* @function Get an HTML table corresponding to an input javascript array.
* @param input The input can be either a 1D array,
* 2D array, an array of objects or an object.
*/
ovm.html.appendCell = function(row, text)
{
var cell = row.insertCell(-1);
cell.appendChild(document.createTextNode(text));
};
/**
* @function
*/
ovm.html.appendRowForArray = function(table, input, level, maxLevel, rowHeader)
{
var row = null;
// loop through
for(var i=0; i= maxLevel ) {
if( !row ) {
row = table.insertRow(-1);
}
ovm.html.appendCell(row, input[i]);
}
// last level
else {
ovm.html.appendRow(table, input[i], level+i, maxLevel, rowHeader);
}
}
};
/**
* @function
*/
ovm.html.appendRowForObject = function(table, input, level, maxLevel, rowHeader)
{
var keys = Object.keys(input);
var row = null;
for( var o=0; o= maxLevel ) {
if( !row ) {
row = table.insertRow(-1);
}
if( o === 0 && rowHeader) {
ovm.html.appendCell(row, rowHeader);
}
ovm.html.appendCell(row, input[keys[o]]);
}
// last level
else {
ovm.html.appendRow(table, input[keys[o]], level+o, maxLevel, keys[o]);
}
}
// header row
// warn: need to create the header after the rest
// otherwise the data will inserted in the thead...
if( level === 2 ) {
var header = table.createTHead();
var th = header.insertRow(-1);
if( rowHeader ) {
ovm.html.appendCell(th, "");
}
for( var k=0; k]+>/g, "").toLowerCase();
if (text.indexOf(terms[i]) < 0) {
display = 'none';
} else {
if (terms[i].length) {
ovm.html.highlight(terms[i], table.rows[r]);
}
}
table.rows[r].style.display = display;
}
}
};
/**
* @function Transform back each
* preText term postText
* into its original preText term postText
* @param container The container to de-highlight.
*/
ovm.html.dehighlight = function(container) {
for (var i = 0; i < container.childNodes.length; i++) {
var node = container.childNodes[i];
if (node.attributes
&& node.attributes['class']
&& node.attributes['class'].value === 'highlighted') {
node.parentNode.parentNode.replaceChild(
document.createTextNode(
node.parentNode.innerHTML.replace(/<[^>]+>/g, "")),
node.parentNode);
// Stop here and process next parent
return;
} else if (node.nodeType !== 3) {
// Keep going onto other elements
ovm.html.dehighlight(node);
}
}
};
/**
* @function Create a
* preText term postText
* around each search term
* @param term The term to highlight.
* @param container The container where to highlight the term.
*/
ovm.html.highlight = function(term, container) {
for (var i = 0; i < container.childNodes.length; i++) {
var node = container.childNodes[i];
if (node.nodeType === 3) {
// Text node
var data = node.data;
var data_low = data.toLowerCase();
if (data_low.indexOf(term) >= 0) {
//term found!
var new_node = document.createElement('span');
node.parentNode.replaceChild(new_node, node);
var result;
while ((result = data_low.indexOf(term)) !== -1) {
// before term
new_node.appendChild(document.createTextNode(
data.substr(0, result)));
// term
new_node.appendChild(ovm.html.createHighlightNode(
document.createTextNode(data.substr(
result, term.length))));
// reduce search string
data = data.substr(result + term.length);
data_low = data_low.substr(result + term.length);
}
new_node.appendChild(document.createTextNode(data));
}
} else {
// Keep going onto other elements
ovm.html.highlight(term, node);
}
}
};
/**
* @function
*/
ovm.html.createHighlightNode = function(child) {
var node = document.createElement('span');
node.setAttribute('class', 'highlighted');
node.attributes['class'].value = 'highlighted';
node.appendChild(child);
return node;
};