function enableRace(race, date, status)
{
    race.options[0] = new Option(race.fullDefault, '');
    race.selectedIndex = 0;
    race.disabled = 0;

    date.options[0] = new Option(date.emptyDefault, '');
    date.selectedIndex = 0;
    date.disabled = 1;

    status.value = status.emptyDefault;
}

function enableDate(date, status)
{
    date.options[0] = new Option(date.fullDefault, '');
    date.selectedIndex = 0;
    date.disabled = 0;

    status.value = status.emptyDefaultDate;
}

function loadingRace(race, date, status)
{
    race.options.length = 0;
    race.options[0] = new Option(race.loadingText);
    race.disabled = 1;

    date.options.length = 0;
    date.disabled = 1;

    status.value = race.loadingText;
}

function loadingDate(date, status)
{
    date.options.length = 0;
    date.options[0] = new Option(date.loadingText);
    date.disabled = 1;

    status.value = date.loadingText;
}

function loadingResults(status)
{
    status.value = status.loadingText;
}

function loadedResults(status)
{
    status.value = status.fullDefault;
}

function deleteResults()
{
    var table = document.getElementById("results-table");
    // Have to delete TR elements from the end as the number of childNodes in
    // table will decrease as we delete them
    var rows = table.tBodies[0].rows.length;
    for (var i = rows - 1; i >=0; i--) {
        try {
            if (table.tBodies[0].rows[i].className != "result-row-template") {
                table.tBodies[0].removeChild(table.tBodies[0].rows[i]);
            }
        } catch (DOMException) {
            alert("Error. DOMException code: " + DOMException.code);
        }
    }
}

function populateResults(data)
{
    // Hide the results table and delete any exitsing results
    hide(document.getElementById("event-results"));
    deleteResults();

    var table = document.getElementById("results-table");
    var rows = table.rows.length;

    // For each entrant returned add a row to the table
    for (var i = 0; i < data.length; i++) {                                
        // Create a copy of the template row
        var template = document.getElementById("result-row-template");
        var row = template.cloneNode(true);
        // highlight alternate rows
        if (i % 2 == 0) {
            row.className = 'highlighted';
        } else {
            row.className = 'unhighlighted';
        }
        // Attach row to table
        // Note: We have to do this before setting the data otherwise row.cells.length 
        // will be zero in IE.
        table.tBodies[0].appendChild(row);

        // For each table cell set the content of the text
        for (var j = 0; j < row.cells.length; j++) {
            var tableCell = row.cells[j];
            // Have to add check for existing childNodes otherwise FireFox concatenates the new
            // text value to any previous value.
            try {
                for (var k=0; k < tableCell.childNodes.length; k++) {
                    tableCell.removeChild(tableCell.childNodes[k]);
                }
            } catch (DOMException) {
                // Do nothing
            }
            //tableCell.textContent = data[i][j]; // Introduced in DOM Level 3
            var textNode = document.createTextNode(data[i][j]);
            tableCell.appendChild(textNode);
        }
    }

    // Show the new results
    show(document.getElementById('event-results'));
}

__race.onload = function()
                            {
                                this.emptyDefault = '';
                                this.fullDefault = 'Please select an event';
                                this.loadingText = 'Loading ...';

                                loadingRace(this, __date, __status);

                                try {
                                    __r1 = ajaxac_createXMLHttp();

__r1.open('post', '/raceresults.php/getraces');

__r1_xmlhttpsuccess = function()
                            {
                                _data = ajaxac_receivejsarray(__r1.responseText);
                                populateSelect(__race, _data);

                                enableRace(__race, __date, __status);
                            }

__r1_onreadystatechange = function()
                                {
                                    if (__r1.readyState == 4) {
                                        switch (__r1.status) {
                                            case 200: if (__r1_xmlhttpsuccess) __r1_xmlhttpsuccess(); break;
                                        }
                                    }
                                }

__r1.onreadystatechange = __r1_onreadystatechange;

__r1.send(null);
                                }
                                catch (e) {alert('event_raceinit exception:'+e);}

                                return false;
                            }

__race.onload();

__race.onchange = function()
                            {
                                try {
                                    // Hide the results table
                                    hide(document.getElementById('event-results'));

                                    if (this.selectedIndex == 0) {
                                        enableRace(this, __date, __status);
                                    } else {
                                        loadingDate(__date, __status);
                                        __r2 = ajaxac_createXMLHttp();

__r2.open('post', '/raceresults.php/getdates' + '?' + 'race=' + encodeURIComponent(__race.value));

__r2_xmlhttpsuccess = function()
                            {
                                _data = ajaxac_receivejsarray(__r2.responseText);
                                populateSelect(__date, _data);
                                enableDate(__date, __status);
                            }

__r2_onreadystatechange = function()
                                {
                                    if (__r2.readyState == 4) {
                                        switch (__r2.status) {
                                            case 200: if (__r2_xmlhttpsuccess) __r2_xmlhttpsuccess(); break;
                                        }
                                    }
                                }

__r2.onreadystatechange = __r2_onreadystatechange;

__r2.send(null);
                                    }

                                }
                                catch (e) { alert('event_racechange exception:'+e);}

                                return false;
                            }
__date.onload = function()
                            {
                                this.emptyDefault = 'Please select an event';
                                this.fullDefault = 'Please select a date';
                                this.loadingText = 'Loading ...';

                                __status.emptyDefault = 'Please select an event';
                                __status.emptyDefaultDate = 'Please select a date';
                                __status.fullDefault = 'Click a table column header to sort the data';
                                __status.loadingText = 'Loading results ...';

                            }

__date.onload();

__date.onchange = function()
                            {
                                try {
                                    // Hide the results table
                                    hide(document.getElementById('event-results'));

                                    if (this.selectedIndex == 0) {
                                        enableDate(this, __status);
                                    } else {
                                        loadingResults(__status);
                                        __r3 = ajaxac_createXMLHttp();

__r3.open('post', '/raceresults.php/getresults' + '?' + 'race=' + encodeURIComponent(__race.value) + '&' + 'date=' + encodeURIComponent(__date.value));

__r3_xmlhttpsuccess = function()
                            {
                                _data = ajaxac_receivejsarray(__r3.responseText);
                                populateResults(_data);
                                loadedResults(__status);
                            }

__r3_onreadystatechange = function()
                                {
                                    if (__r3.readyState == 4) {
                                        switch (__r3.status) {
                                            case 200: if (__r3_xmlhttpsuccess) __r3_xmlhttpsuccess(); break;
                                        }
                                    }
                                }

__r3.onreadystatechange = __r3_onreadystatechange;

__r3.send(null);
                                    }

                                }
                                catch (e) { alert('event_datechange exception:'+e); }


                                return false;
                            }

__download.onclick = function()
                            {
                                try {
                                    __r4 = ajaxac_createXMLHttp();

__r4.open('post', '/raceresults.php/exportresults' + '?' + 'race=' + encodeURIComponent(__race.value) + '&' + 'date=' + encodeURIComponent(__date.value));

__r4_xmlhttpsuccess = function()
                            {
                                filename = __r4.responseText;
                                var props = 'scrollBars=yes,resizable=yes,toolbar=no,menubar=yes,location=yes,directories=no';
                                window.open(filename, 'Results', props);
                            }

__r4_onreadystatechange = function()
                                {
                                    if (__r4.readyState == 4) {
                                        switch (__r4.status) {
                                            case 200: if (__r4_xmlhttpsuccess) __r4_xmlhttpsuccess(); break;
                                        }
                                    }
                                }

__r4.onreadystatechange = __r4_onreadystatechange;

__r4.send(null);
                                }
                                catch (e) { alert(e.message); }

                                return false;
                            }