
var NAME_SORT    = 1;
var TYPE_SORT    = 0;
var TYPE_SELECT  = 0;
var LEVEL_SELECT = 7;
var IMPORTANT    = 1;
var SHOW_ALIASES = 0;

var TYPE_MAP = [
    [ "Monocot", 1 ],
    [ "Dicot",   2 ],
    [ "Conifer", 3 ],
    [ "Fern",    4 ],
    [ "Moss",    5 ],
    [ "Fungus",  6 ],
    [ "Animal",  7 ],
    [ "Bird",    8 ],
    [ "Top",     9 ],
];
var NUM_TYPES = 8;

// ----------------------------
//  Cookie stuff.
// ----------------------------

function get_cookie() {
    var cookie = find_cookie("families");
    if (cookie != null) {
        NAME_SORT    = parseInt(parse_cookie(cookie, "NAME_SORT"));
        TYPE_SORT    = parseInt(parse_cookie(cookie, "TYPE_SORT"));
        TYPE_SELECT  = parseInt(parse_cookie(cookie, "TYPE_SELECT"));
        LEVEL_SELECT = parseInt(parse_cookie(cookie, "LEVEL_SELECT"));
        IMPORTANT    = parseInt(parse_cookie(cookie, "IMPORTANT"));
        SHOW_ALIASES = parseInt(parse_cookie(cookie, "SHOW_ALIASES"));
    }
}

function set_cookie() {
    var data =
        "NAME_SORT:"    + NAME_SORT    + "|" +
        "TYPE_SORT:"    + TYPE_SORT    + "|" +
        "TYPE_SELECT:"  + TYPE_SELECT  + "|" +
        "LEVEL_SELECT:" + LEVEL_SELECT + "|" +
        "IMPORTANT:"    + IMPORTANT    + "|" +
        "SHOW_ALIASES:" + (SHOW_ALIASES ? 1 : 0);
    document.cookie = "families=" + escape(data);
}

// ----------------------------
//  Write table.
// ----------------------------

var inited_wait = 0;
function write_table() {

    // Create the "please wait" popup.
    if (!inited_wait++) {
        write_popup("wait",
            '<table onfocus="alert(666)" bgcolor="#808080" cellspacing=1 cellpadding=0><tr><td>' +
            '  <table bgcolor="#101010" cellspacing=0 cellpadding=5><tr><td>' +
            '    Please wait a moment.  This can take a really long time<br>' +
            '    on some browsers (like Internet Explorer).  I developed<br>' +
            '    it for Netscape / Mozilla.  Other browsers beware.<br>' +
            '  </table>' +
            '</table>'
        );
    }

    // Display "please wait" popup in the center of the window.
    var win = get_window_size();
    var pos = get_position("wait");
    var xoff = get_window_x_offset();
    var yoff = get_window_y_offset();
    show_popup("wait", Math.floor(xoff + win.w/2 - pos.w/2),
                       Math.floor(yoff + win.h/2 - pos.h/2));

    // Give browser time to display it.
    window.setTimeout(write_table_2, 100);
}
function write_table_2() {
    var html = "";

    function fmt(label, callback, active) {
        return "<a onclick=\"" + callback + "\"><b class=" +
            (active ? "active" : "button") + "><u>" + label + "</u></b></a>";
    }

    html += "<p>Sort by: " +
        fmt("latin",      "set_name_sort(1)", NAME_SORT == 1) + " or " +
        fmt("common",     "set_name_sort(2)", NAME_SORT == 2) + " name, number of " +
        fmt("genera",     "set_name_sort(3)", NAME_SORT == 3) + " or " +
        fmt("species",    "set_name_sort(4)", NAME_SORT == 4) + ", or " +
        fmt("plant type", "set_type_sort()",  TYPE_SORT)      + ".<br>\n";

    html += "Select: " +
        fmt("all",      "set_type_select(0)", TYPE_SELECT == 0) + ", " +
        fmt("monocots", "set_type_select(1)", TYPE_SELECT == 1) + ", " +
        fmt("dicots",   "set_type_select(2)", TYPE_SELECT == 2) + ", " +
        fmt("conifers", "set_type_select(3)", TYPE_SELECT == 3) + ", or " +
        fmt("ferns",    "set_type_select(4)", TYPE_SELECT == 4) + ".<br>\n";
        //fmt("mosses",   "set_type_select(5)", TYPE_SELECT == 5) +
        //fmt("fungi",    "set_type_select(6)", TYPE_SELECT == 6) +
        //fmt("animals",  "set_type_select(7)", TYPE_SELECT == 7) +
        //fmt("birds",    "set_type_select(8)", TYPE_SELECT == 8) +

    function is_any_level(level) {
        for (var i=0; i<NUM_DATA; i++)
            if (TABLE_DATA[i][0] && TABLE_DATA[i][2] == level)
                return 1;
        return 0;
    }

    if (LEVEL_SELECT != 0 && !is_any_level(LEVEL_SELECT))
        LEVEL_SELECT = 0;

    html += "Select:\n";
    html += fmt("all", "set_level_select(0)", LEVEL_SELECT == 0);
    if (is_any_level(1))  html += ", " + fmt("divisions",    "set_level_select(1 )", LEVEL_SELECT == 1 );
    if (is_any_level(2))  html += ", " + fmt("subdivisions", "set_level_select(2 )", LEVEL_SELECT == 2 );
    if (is_any_level(3))  html += ", " + fmt("classes",      "set_level_select(3 )", LEVEL_SELECT == 3 );
    if (is_any_level(4))  html += ", " + fmt("subclasses",   "set_level_select(4 )", LEVEL_SELECT == 4 );
    if (is_any_level(5))  html += ", " + fmt("superorders",  "set_level_select(5 )", LEVEL_SELECT == 5 );
    if (is_any_level(6))  html += ", " + fmt("orders",       "set_level_select(6 )", LEVEL_SELECT == 6 );
    if (is_any_level(7))  html += ", " + fmt("families",     "set_level_select(7 )", LEVEL_SELECT == 7 );
    if (is_any_level(8))  html += ", " + fmt("subfamilies",  "set_level_select(8 )", LEVEL_SELECT == 8 );
    if (is_any_level(9))  html += ", " + fmt("tribes",       "set_level_select(9 )", LEVEL_SELECT == 9 );
    if (is_any_level(10)) html += ", " + fmt("subtribes",    "set_level_select(10)", LEVEL_SELECT == 10);
    html += ".<br>\n";

    html += "Show:\n" +
        fmt("everything", "set_important(0)", !IMPORTANT) + " or only " +
        fmt("important",  "set_important(1)", IMPORTANT)  + " stuff, show " +
        fmt("aliases", "set_aliases()", SHOW_ALIASES) + ".<br>\n";

    html += '<p><table cols=6 border=0 cellspacing=1 cellpadding=1>';
    html += '  <tr bgcolor="#804020">';
    html += '    <th width=75 ><font color="#FFEEC0">Type</font>';
    html += '    <th width=125><font color="#FFEEC0">Family</font>';
    html += '    <th width=300><font color="#FFEEC0">Common Members</font>';
    html += '    <th width=75 ><font color="#FFEEC0">Genera</font>';
    html += '    <th width=75 ><font color="#FFEEC0">Species</font>';
    html += '    <th width=300><font color="#FFEEC0">Notes</font>';

    // How many lines are we going to show?
    var len = 0;
    for (var i=0; i<NUM_DATA; i++) {
        var row = TABLE_DATA[i];
        if (row[0] && (LEVEL_SELECT == 0 || row[2] == LEVEL_SELECT)) {
            if (NAME_SORT == 2)
                len += row[5][0];
            else
                len++;
        }
    }

    // Format lines and figure out what sort keys to use.
    var j = 0;
    var lines = new Array(len);
    for (var i=0; i<NUM_DATA; i++) {
        var row = TABLE_DATA[i];
        if (
            row[0]                            &&
            (NAME_SORT != 2 || row[5][0] > 0) &&
            (LEVEL_SELECT == 0 || row[2] == LEVEL_SELECT)
        ) {

            function map_type(type) {
                for (var i=0; i<NUM_TYPES; i++)
                    if (type == TYPE_MAP[i][0])
                        return TYPE_MAP[i][1];
                return type;
            }

            // Create sort keys.
            var keys;
            var num_keys;
            if (NAME_SORT == 2) {
                keys = new Array(row[5][0]);
                for (var k=0; k<row[5][0]; k++)
                    keys[k] = (TYPE_SORT ? map_type(row[3]) + " " : "") +
                        row[5][k+1] + " " + row[4];
                num_keys = row[5][0];
            } else {
                var key = "";
                if (TYPE_SORT)
                    key += map_type(row[3]) + " ";
                if (NAME_SORT == 1) {
                    key += row[4];
                } else if (NAME_SORT == 3) {
                    key += 1000000 - parseInt(row[6].replace(/^[^0-9]*/, ""));
                    key += " " + row[4];
                } else if (NAME_SORT == 4) {
                    key += 1000000 - parseInt(row[7].replace(/^[^0-9]*/, ""));
                    key += " " + row[4];
                }
                keys = [ key ];
                num_keys = 1;
            }

            // Format line.
            for (var k=0; k<num_keys; k++) {
                var line = "<tr bgcolor=\"#XXXXXX\">";
                line += "<td width=75>" + TYPE_MAP[row[3]-1][0];
                line += "<td width=125>";
                if (row[9] < 0) {
                    line += debar(row[4]);
                } else {
                    var first_popup_col = POPUP_DATA[row[9]][3][0];
                    line += "<a onMouseOver=\"enter(" + i + "," + row[9] +
                        ")\" name=x" + i + " id=x" + i + " href=\"../systematics/" +
                        FILE_STRINGS[ first_popup_col[1] ] + ".html?node=" +
                        LATIN_STRINGS[ first_popup_col[ first_popup_col[2] + 2 ] ] +
                        "\" class=" + (row[10] ? "alias" : "nonalias") +
                        ">" + debar(row[4]) + "</a>";
                }
                line += "<td width=300>";
                if (NAME_SORT == 2) {
                    line += row[5][k+1];
                } else {
                    var commons = row[5];
                    for (var l=0; l<commons[0]; l++) {
                        if (l>0) line += ", "
                        line += commons[l+1];
                    }
                }
                line += "<td width=75>"  + row[6];
                line += "<td width=75>"  + row[7];
                line += "<td width=300>" + row[8] + "\n";

                // Save keys and lines in temporary array.
                lines[j++] = [ keys[k], line, row[3] ];
            }
        }
    }

    // Sort by the keys created above.
    lines.sort( function by_key(a,b) {
        return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
    } );

    // Now finally draw table.
    var last = "";
    for (var i=0; i<len; i++) {
        var line = lines[i][1];
        if (TYPE_SORT && lines[i][2] != last) {
            if (last != "")
                html += "<tr height=5>\n";
            last = lines[i][2];
        }
        if ((i & 1) == 0) {
            html += line.replace(/XXXXXX/, "403000");
        } else {
            html += line.replace(/XXXXXX/, "504000");
        }
    }

    html += "</table>";

    write_popup("table", html);
    set_cookie();
    hide_popup("wait");
}

// ----------------------------
//  Perform selections.
// ----------------------------

// DATA row:
//  0  select
//  1  important
//  2  level
//  3  type
//  4  latin
//  5  [commons]
//  6  genera
//  7  species
//  8  comments
//  9  popup_num
//  10 alias?

function do_select() {
    for (var i=0; i<NUM_DATA; i++) {
        var row = TABLE_DATA[i];
        if (TYPE_SELECT  != 0 && row[3] != TYPE_SELECT  ||
            IMPORTANT && !row[1]                         ||
            !SHOW_ALIASES  && row[10]                    ||
            NAME_SORT == 2 && row[5][0] == 0             ||
            NAME_SORT == 3 && row[6] == ""               ||
            NAME_SORT == 4 && row[7] == ""
            )
             TABLE_DATA[i][0] = 0;
        else TABLE_DATA[i][0] = 1;
    }
    write_table();
}

// ----------------------------
//  Callbacks.
// ----------------------------

function set_name_sort(num) {
    NAME_SORT = num;
    do_select();
}

function set_type_sort() {
    TYPE_SORT = TYPE_SORT ? 0 : 1;
    do_select();
}

function set_type_select(type) {
    TYPE_SELECT = type;
    do_select();
}

function set_level_select(level) {
    LEVEL_SELECT = level;
    do_select();
}

function set_important(state) {
    IMPORTANT = state;
    do_select();
}

function set_aliases() {
    SHOW_ALIASES = !SHOW_ALIASES;
    do_select();
}


