﻿function Highlighter(keywords) {
    // private
    this.cssClass = "a-hl";
    this.htmlMatch = "$!$!$";
    this.startMark = "<@@@>";
    this.endMark = "</@@@>";
    this.parsedKeywords = new Array();

    this.ParseKeywords = function(keywords) {
        var rx = new RegExp("\\W", "g");
        var words = keywords.split(rx);
        for (var i = 0; i < words.length; i++) {
            var word = words[i].toLowerCase();
            if (word.length > 2) {
                this.parsedKeywords.push(word);
            }
        }
        //B153653
        for (var i = 0; i < this.parsedKeywords.length; i++) {
            for (var j = i + 1; j < this.parsedKeywords.length; j++) {
                if (this.parsedKeywords[i].indexOf(this.parsedKeywords[j]) >= 0) {
                    this.parsedKeywords[i] = this.parsedKeywords[j];
                    ASPxClientUtils.ArrayRemoveAt(this.parsedKeywords, j);
                    continue;
                }
            }
        }
    }
    this.ParseKeywords(keywords);

    this.Highlight = function(controlID) {
        //Uncomment this code if you don't want highlighter to crash when something goes wrong
        //if ((typeof controlID == "undefined") || (controlID == null)) return;
        var control = document.getElementById(controlID);
        this.HighlightControl(control);
    }
    this.HighlightControl = function(control) {
        //Uncomment this code if you don't want highlighter to crash when something goes wrong
        //if ((typeof control == "undefined") || (control == null)) return;

        var controlHtml = control.innerHTML;
        // stripping html tags
        var htmlRx = new RegExp("<[^<>]*>","g");
        var htmlTags = controlHtml.match(htmlRx);
        controlHtml = controlHtml.replace(htmlRx, this.htmlMatch);
        // highlighting
        for (var i = 0; i < this.parsedKeywords.length; i++) {
            var hlRx = new RegExp("(" + this.parsedKeywords[i] + ")", "gi");
            controlHtml = controlHtml.replace(hlRx, this.startMark + "$1" + this.endMark);
        }
        // restoring html tags
        for(var i = 0; controlHtml.indexOf(this.htmlMatch) > -1; i++) {
            controlHtml = controlHtml.replace(this.htmlMatch, htmlTags[i]);
        }
        // applying highlighting
        var markRx = new RegExp(this.startMark + "(.+?)" + this.endMark, "g");
        control.innerHTML = controlHtml.replace(markRx, "<span class=\"" + this.cssClass + "\">$1</span>");
    }
}

function HighlightGrid(gridView) {
    var subjectColumnIndex = -1;
    for (var i = 0; i < gridView.GetColumnsCount(); i++) {
        var column = gridView.GetColumn(i);
        if (column.name.toLowerCase() == "subject") {
            subjectColumnIndex = i;
            break;
        }
    }
    if (subjectColumnIndex == -1) {
        return;
    }
    var visibleRowsCount = gridView.GetVisibleRowsOnPage();
    var visibleStartIndex = gridView.visibleStartIndex;
    for (var i = visibleStartIndex; i < visibleStartIndex + visibleRowsCount; i++) {
        if (gridView.IsGroupRow(i)) {
            continue;
        }
        var rowElement = gridView.GetDataRow(i);
        var cellElement = rowElement.getElementsByTagName("A")[0];
        var highlighter = new Highlighter(txtKeywords.GetText());
        highlighter.HighlightControl(cellElement);
    }
}

