
function HashTable() {
    let size = 0;
    let entry = new Object();
    this.add = function (key, value) {
        if (!this.containsKey(key)) {
            size++;
        }
        entry[key] = value;
    };
    this.getValue = function (key) {
        return this.containsKey(key) ? entry[key] : null;
    };
    this.remove = function (key) {
        if (this.containsKey(key) && (delete entry[key])) {
            size--;
        }
    };
    this.containsKey = function (key) {
        return (key in entry);
    };
    this.containsValue = function (value) {
        for (var prop in entry) {
            if (entry[prop] == value) {
                return true;
            }
        }
        return false;
    };
    this.getValues = function () {
        var values = new Array();
        for (var prop in entry) {
            values.push(entry[prop]);
        }
        return values;
    };
    this.getKeys = function () {
        var keys = new Array();
        for (var prop in entry) {
            keys.push(prop);
        }
        return keys;
    };
    this.getSize = function () {
        return size;
    };
    this.clear = function () {
        size = 0;
        entry = new Object();
    }
}

let      myuser;
let      lines;
let      routineTab     = new HashTable();
let      vulTypeCount   = new HashTable();
let      fileCount      = new HashTable();

$(document).ready(function () {
    let outhtml;
    try {
        outhtml = $(window.frames["opencc_vul"].document).html();
    }catch (e) {
        outhtml = $(window.frames["opencc_vul"].document)[0].body.innerHTML
    }
    if(outhtml  ===  "" || outhtml == undefined || outhtml == null || outhtml.length == 0){
        $.ajax({url: "opencc_vul.txt"}).done(display_content);
    } else {
        display_content(outhtml);
    }
});

function display_content(s){
    let    answer         = s;
    let    i              = 0;
    let    count          = 0;
    let    one_obj        = {};
    let    obj_list       = [];
    let    all_lines      = "";

    lines     = answer.split("\n");

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

        let n = lines[i].match(/[a-zA-Z\._:0-9]+/g);

        if(n != null) {

            let res        = {};                        // One line of result
            res.filename   = n[0];
            res.vultype    = n[4];
            res.variate    = n[8];
            res.subroutine = n[9];
            res.lineno     = n[1];

            if(!routineTab.containsKey
            (res.subroutine+"+"+res.variate+"+"+res.filename))
            {
                //  Repetition Check Passes
                routineTab.add(res.subroutine+"+"+res.variate+"+"+res.filename, res.vultype);
                obj_list.push(res);
                all_lines += "L" + res.lineno + " - <span> " + res.filename + "</span>  <br>";
                count ++;
                if(vulTypeCount.containsKey(res.vultype)){
                    let vul_list  =  vulTypeCount.getValue(res.vultype);
                    vul_list.push(res);
                }else{
                    let vul_list  =  new Array();
                    vul_list.push(res);
                    vulTypeCount.add(res.vultype, vul_list);
                }

                if(fileCount.containsKey(res.filename)){
                    let vul_list  =  fileCount.getValue(res.filename);
                    vul_list.push(res);
                }else{
                    let vul_list  =  new Array();
                    vul_list.push(res);
                    fileCount.add(res.filename, vul_list);
                }
            }
        }
    }
}