Dell DFO Search

Easily search dells DFO listings by filtering information.

// ==UserScript==
// @name         Dell DFO Search
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Easily search dells DFO listings by filtering information.
// @author       Lauchlan Irwin
// @match        http://www1.ap.dell.com/content/topics/segtopic.aspx/products/quickship/*
// @grant        none
// ==/UserScript==

GLOBAL_DEBUG = false;
GLOBAL_SEARCH_TERMS = undefined;
GLOBAL_ROWS = undefined;

//Custom debug function to allow toggling of console logs from
debug = {

    log: GLOBAL_DEBUG == true ? function (string) {
        console.log(string);
    } : function () { },

    error: GLOBAL_DEBUG == true ? function (string) {
        console.error(string);
    } : function () { },

    assert: GLOBAL_DEBUG == true ? function (string) {
        console.assert(string);
    } : function () { }

};

(function () {
    GLOBAL_SEARCH_TERMS = [];
    GLOBAL_ROWS = getRows();

    //Add search bar
    var firstRow = GLOBAL_ROWS[0];
    if (!firstRow) return;

    var searchBar = firstRow.cloneNode(true);
    searchBar.id = "searchBar";


    for (var i = 0; i < searchBar.children.length; i++) {
        var column = searchBar.children[i];
        column.innerHTML = "";

        var input = document.createElement("input");
        input.id = "input" + i;
        input.columnNumber = i;
        input.onchange = function (e) {
            search(e.target.columnNumber);
        };

        GLOBAL_SEARCH_TERMS.push([]);

        column.appendChild(input);
    }

    firstRow.parentElement.insertBefore(searchBar, firstRow);
    console.log(firstRow.parentElement);
    console.log(firstRow);
    return;
}());

function getRows(numberOfRows) {

    var temp = [];
    var tableRows = document.getElementsByTagName("tr");

    for (var el in tableRows) {
        el = tableRows[el];

        if (el.children) {

            if (el.children.length > 1) {

                if (el.children[0].classList.contains("gridCell") ||
                    el.children[0].classList.contains("gridCellAlt")) {

                    temp.push(el);

                    if (numberOfRows == temp.length) {
                        return temp;
                    }

                }

            }

        }

    }

    return temp;
}

function getSearchTerms(colNumber) {

    var input = document.getElementById("input" + colNumber);
    GLOBAL_SEARCH_TERMS[colNumber] = [];

    var individualTerms = input.value.match(/\w(\s?(?:\w))*/g);

    if (individualTerms) {
        for (var singleTerm in individualTerms) {
            GLOBAL_SEARCH_TERMS[colNumber].push(individualTerms[singleTerm]);
        }
    } else {
        GLOBAL_SEARCH_TERMS[colNumber] = [];
    }

    debug.log(GLOBAL_SEARCH_TERMS);

}

function search(columnUpdated) {

    getSearchTerms(columnUpdated);

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

        debug.log("");

        var row = GLOBAL_ROWS[i];

        if (row.id == "searchBar") continue; //Skip if row is searchBar
        if (!row.children) continue; //Skip if no children property

        var rowPassed = true;
        var columns = row.children;

        for (var j = 0; j < columns.length; j++) {

            var column = columns[j];
            var columnPassed = true;

            var text = column.innerHTML;
            text = text ? text.toLowerCase() : "";
            var searchTerms = GLOBAL_SEARCH_TERMS[j];

            //if nothing to search => search passes automatically
            if (!searchTerms) {
                debug.log("Column PASSED: (no searchTerms) -> " + text);
                columnPassed = true;
                continue;
            } else if (searchTerms.length == 0) {
                debug.log("Column PASSED: (no searchTerms) -> " + text);
                columnPassed = true;
                continue;
            }

            var singleTerm = "";

            for (var n = 0; n < searchTerms.length; n++) {
                singleTerm = searchTerms[n];

                if (!text.includes(singleTerm.toLowerCase())) {
                    debug.log("Column FAILED: (" + singleTerm + ") -> " + text);
                    columnPassed = false;
                    break;
                }

            }

            if (!columnPassed) {
                rowPassed = false;
                break;
            }else{
                debug.log("Column PASSED: (" + document.getElementById("input"+columnUpdated).value + ") -> " + text);
            }

        }

        row.style.display = rowPassed ? "table-row" : "none";

        debug.log(rowPassed ? "    <<Row passed!>>    " : "    ##Row failed##    ");
        debug.log("");
        debug.log("");

    }
}