// FIXME: Need to figure out what to do about MAILER-DAEMON messages

var ClassifyGroup = Class.create({
    initialize: function (constraints, input) {
        // console.group ('initialize()');
        // console.log ('constraints are %o', constraints);
        this.constraints = $H(constraints);
        var rows = $A(input);
        // console.log ('rows are %o', rows);
        var data = new Hash;
        // console.log ('data is %o', data);
        var id = this.constraints.get ('id');
        // console.time ('Summing rows in hash');
        rows.each (function (r) {
                       // console.log ('row is %o', r);
                       var old = data.get (r[id]) || 0;
                       // console.log ('Old value is %o', old);
                       var sum = old + new Number (r.uncertain);
                       data.set (r[id], sum);
                   });
        // console.timeEnd ('Summing rows in hash');
        // console.log ('Resulting hash is %o', data);
        // console.log ('Getting reference to pages');
        this.container = $('pages');
        // console.log ('Retrieving groupdiv');
        var groupdiv = this.container.retrieve ('groupdiv');
        // console.log ('Evaluating groupdiv');
        var html = groupdiv.evaluate (this.constraints);
        // console.time ('Inserting groupdiv');
        this.container.insert (html);
        // console.timeEnd ('Inserting groupdiv');
        // console.log ('Get a reference to the div');
        var page = $(id);
        // console.log ('Adding observers to %o', page);
        page.observe ('click', this.click.bind (this));
        page.observe ('ClassifyGroup:search', this.search.bind (this));
        page.observe ('ClassifyGroup:count', this.count.bind (this));
        page.observe ('ClassifyGroup:cross', this.cross.bind (this));
        // console.log ('Retrieving grouprow');
        var grouprow = this.container.retrieve ('grouprow');
        // console.time ('Sorting and rendering data');
        var html = data.keys ().sort (function (a, b) {
                                          return data.get (b) - data.get (a);
                                      }).map (function (row) {
                                                  return grouprow.evaluate ({key: row, type: id, value: data.get (row)});
                                              }).join ('');
        // console.timeEnd ('Sorting and rendering data');
        // console.time ('Inserting table in page');
        page.down ('tbody').insert (html);
        // console.timeEnd ('Inserting table in page');
        // console.log ('Adding tab');
        // console.log ('Constructing our title');
        page.fire ('Classify:add', 'Grouped ' + id + 's with confidence < ' + this.constraints.get ('confidence'));
        // console.log ('Done adding tab');
        // console.groupEnd ();
    },

    click: function (event) {
        // console.group ('click()');
        var a = event.findElement ('a');
        if (a) {
            // console.log ('Got element %o', a);
            if (a.match ('a.count')) {
                // console.log ('Got count message');
                a.fire ('ClassifyGroup:count');
            } else if (a.match ('a.cross')) {
                // console.log ('Got search message');
                a.fire ('ClassifyGroup:cross');
            } else if (a.match ('a.search')) {
                // console.log ('Got search message');
                a.fire ('ClassifyGroup:search');
            }
            // console.log ('Stopping propagation');
            event.stop();
        }
        // console.groupEnd ();
    },

    count: function (event) {
        // console.group ('count()');
        this.container.fire ('Classify:count', {confidence: this.constraints.get ('confidence'),
                                                link: event.findElement ('a'),
                                                type: event.findElement ('div').identify (),
                                                value: event.findElement ('td').down ('a').innerHTML});
        // console.groupEnd ();
    },

    cross: function (event) {
        // console.group ('search()');
        this.container.fire ('Classify:cross', {confidence: this.constraints.get ('confidence'),
                                                type: event.findElement ('div').identify (),
                                                value: event.findElement ('tr').down ('a.search').innerHTML});
        // console.groupEnd ();
    },

    failure: function () {
        alert ("Failed to retrieve list");
    },

    search: function (event) {
        // console.group ('search()');
        this.container.fire ('Classify:search', {confidence: this.constraints.get ('confidence'),
                                                 type: event.findElement ('div').identify (),
                                                 value: event.findElement ('a').innerHTML});
        // console.groupEnd ();
    }
});

