t2hui.eventtable = {};

t2hui.eventtable.build_controls = function(run, job) {
    var filters = {
        seen: {},
        state: {},
        hide: {}
    };

    var controls = $('<div class="event_controls"></div>');
    var filter_dom = $('<ul class="event_filter"><li>Filter Tags:</li></ul>');
    controls.append(filter_dom);

    if (job && !(job.status == 'running' || job.status == 'pending')) {
        filters.hide = {
            'PASS': true,
            'PLAN': true,
            'HARNESS': true,
            'STDOUT': true,
        };
    }

    filters.dom = filter_dom;

    return {
        "filters":    filters,
        "dom":        controls,
        "filter_dom": filter_dom,
    };
};

t2hui.eventtable.build_table = function(run, job, controls) {
    var table;

    var columns = [
        { 'name': 'tools',   'label': 'tools',   'class': 'tools', 'builder': t2hui.eventtable.tool_builder },
        { 'name': 'tag',     'label': 'tag',     'class': 'tag' },
        {
            'name': 'message',
            'label': 'message',
            'class': 'message',
            'builder': function(item, dest, data) {
                t2hui.eventtable.message_builder(item, dest, data, table);
            },
        },
    ];

    table = new FieldTable({
        'class': 'job_table',
        'id': 'jobs_events',
        'updatable': false,

        'expand_item': t2hui.eventtable.expand_lines,

        'place_row': t2hui.eventtable.place_row,
        'modify_row_hook': function(row, item, table) { t2hui.eventtable.modify_row(row, item, table, controls) },

        'done': function() { $('.temp_orphan').detach() },

        'columns': columns,
    });

    return table;
};

t2hui.eventtable.expand_lines = function(item) {
    var out = [];

    var tools = true;
    var count = 0;
    item.lines.forEach(function(line) {
        out.push({
            'tools': tools ? item.lines.length : false,
            'tag': line[1],
            'message': line[2],
            'table': line[3],
            'facet': line[0],
            'item': item,
            'set_ord': count++,
            'set_total': item.lines.length,
            'id': item.event_id,
        });
        tools = false;
    });

    return out;
}

t2hui.eventtable.message_builder = function(item, dest, data, table) {
    t2hui.eventtable.message_inner_builder(item, dest, data);

    var indent = '' + ((item.item.nested + 1) * 2) + 'ch';
    dest.css('padding-left', indent);

    if (item.item.is_parent == false) { return }

    var events_uri = base_uri + 'event/' + item.item.event_id + '/events';

    var jumpto = window.location.hash.substr(1);
    var highlight = item.item.event_id === jumpto ? true : false;

    var expand = $('<div class="stoggle">+</div>');

    var load_subtest = function() {
        expand.text('~');
        expand.addClass('running');
        expand.addClass('expanded');
        expand.addClass('toggle_highlight');

        t2hui.fetch(
            events_uri,
            {
                done: function() {
                    var row = dest.parent();

                    expand.removeClass('running');
                    if (highlight) {
                        $('html, body').animate({
                              scrollTop: expand.offset().top - 120
                        });
                        row.addClass('highlight');
                    }

                    expand.click(function() {
                        highlight = !highlight;

                        if (highlight) {
                            row.addClass('highlight');
                            $('[data-parent-id="' + item.item.event_id + '"]').addClass('highlight');
                        }
                        else {
                            row.removeClass('highlight');
                            $('[data-parent-id="' + item.item.event_id + '"]').removeClass('highlight');
                        }
                    });
                }
            },
            function(e) {
                var params = {"data": {"parent-id": item.item.event_id}};
                if (highlight) {
                    params.class = "highlight";
                }
                table.render_item(e, null, params);
            }
        )
    }

    if (item.item.is_fail || highlight) {
        load_subtest();
    }
    else {
        expand = $('<div class="stoggle">+</div>');
        expand.one('click', load_subtest);
    }

    dest.prepend(expand);
}

t2hui.eventtable.place_row = function(row, item, table, state) {
    if (!item.item['loading_subtest']) {
        if (item.item.orphan) {
            row.addClass('temp_orphan');
            if (!state['orphan']) {
                state['orphan'] = row;
                row.addClass('first_orphan');
            }
            state['body'].append(row);
            return true;
        }
    }

    if (!item.item['parent_id']) {
        state['orphan'] = null;
        $('.temp_orphan').detach();
        state['body'].append(row);
        return true;
    }

    var pid = item.item['parent_id'];
    if (!state[pid]) {
        var got = table.table.find('tr[data-event-id="' + item.item.parent_id + '"]');
        state[pid] = got.last();
    }

    state[pid].after(row);
    state[pid] = row;

    return true;
}

t2hui.eventtable.message_inner_builder = function(item, dest, data) {
    if (!item.table) {
        var pre = $('<pre class="testout"></pre>');
        pre.text(item.message);
        dest.append(pre);
        return;
    }

    var data = item.table;

    var table = $('<table class="testtable"></table>');
    var header = $('<tr></tr>');
    table.append(header);

    for (var x = 0; x < data.header.length; x++) {
        var th = $('<th class="header"></th>');
        th.text(data.header[x]);
        header.append(th);
    }

    for (var x = 0; x < data.rows.length; x++) {
        var row_data = data.rows[x];
        var row = $('<tr></tr>');
        table.append(row);

        for (var y = 0; y < row_data.length; y++) {
            var col = $('<td class="' + data.header[y].toLowerCase() + '"></td>');
            col.text(row_data[y]);
            row.append(col);
        }
    }

    dest.append(table);
}

t2hui.eventtable.tool_builder = function(item, tools, data) {
    if (!item.tools) { tools.hide(); return }

    tools.attr('rowspan', item.tools);

    if (item.id) {
        var einter = $('<div class="tool etoggle" title="See possible test interactions"><a href="/interactions/' + item.id + '"><img src="/img/interactions.png" /></a></div>');
        tools.append(einter);
    }

    if (item.item.facets) {
        var efacet = $('<div class="tool etoggle" title="See Raw Facet Data"><img src="/img/data.png" /></div>');
        tools.append(efacet);
        efacet.click(function() {
            $('#modal_body').empty();
            $('#modal_body').text("loading...");
            $('#free_modal').slideDown();

            var uri = base_uri + 'event/' + item.item.event_id;

            $.ajax(uri, {
                'data': { 'content-type': 'application/json' },
                'success': function(event) {
                    $('#modal_body').empty();
                    var formatter = new JSONFormatter(event.facets, 2);
                    $('#modal_body').html(formatter.render());
                },
            });
        });
    }

    if (item.item.orphan) {
        var eorphan = $('<div class="tool etoggle" title="See Orphan Facet Data"><img src="/img/orphan.png" /></div>');
        tools.append(eorphan);
        eorphan.click(function() {
            $('#modal_body').empty();
            $('#modal_body').text("loading...");
            $('#free_modal').slideDown();

            var uri = base_uri + 'event/' + item.item.event_id;

            $.ajax(uri, {
                'data': { 'content-type': 'application/json' },
                'success': function(event) {
                    $('#modal_body').empty();
                    var formatter = new JSONFormatter(event.orphan, 2);
                    $('#modal_body').html(formatter.render());
                },
            });
        });
    }
}

t2hui.eventtable.clean_tag = function(tag) {
    var clean = tag.replace(/[\W]+/g, "_");
    return clean;
}

t2hui.eventtable.modify_row = function(row, item, table, controls) {
    var tag = item.tag;
    var ctag = t2hui.eventtable.clean_tag(tag);

    row.addClass('event_line');
    row.addClass('facet_' + item.facet);
    row.addClass('tag_' + ctag);

    row.attr('data-event-id', item.item.event_id);

    if (!controls.filters.seen[tag]) {
        controls.filters.state[tag] = !controls.filters.hide[tag];
        controls.filters.seen[tag] = 1;

        var filter = $('<li class="filter">' + tag + '</li>');
        var added = false;
        controls.filters.dom.children('.filter').each(function() {
            if (added) { return false };

            var it = $(this);
            if (tag < it.text()) {
                added = true;
                it.before(filter);
                return false;
            }
        });
        if (!added) { controls.filters.dom.append(filter) }

        if (!controls.filters.state[tag]) {
            filter.addClass('off');
        }

        filter.click(function() {
            if (controls.filters.state[tag]) {
                controls.filters.state[tag] = false;
                $(this).addClass('off');
                table.table.find('tr.tag_' + ctag).addClass('hidden_row');
            }
            else {
                controls.filters.state[tag] = true;
                $(this).removeClass('off');
                table.table.find('tr.tag_' + ctag).removeClass('hidden_row');
            }
        })
    }

    if (!controls.filters.state[tag]) {
        row.addClass('hidden_row');
    }
}