//<![CDATA[
/* Script Copyright (C) 2006, Christopher S. Swingley <cswingle@gmail.com>
   and licensed under the terms of the GNU General Public License Version 2.
   The license is available at: http://www.frontier.iarc.uaf.edu/~cswingle/gpl.txt
   or from the Free Software Foundation (http:/www.fsf.org/)

   This program updates my local_weather page by processing the XML 
   temperature data for the Fairbanks area and formatting it as an
   HTML table object.

    NOTES:
        IE uses tbody, the rest seem not to, which is why I have a bunch of
        if else lines looking for mainTableObject.firstChild.nodeType = 1
*/
var request = null;

function createRequest() {
    try {
        request = new XMLHttpRequest(); 
    } catch (trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                request = null;
            }
        }
    }
    if (request == null)
        alert("Error creating request object!");
}

function getData() {
    createRequest();
    var url = "get_weather_xml.php";
    url = url + "?ie_is_stupid=" + new Date().getTime();
    request.open("GET", url, true);
    request.onreadystatechange = updatePage;
    request.send(null);
}

function updatePage() {
    if (request.readyState == 4) {
        if (request.status == 200) {
            // Get the XML data file
            var newXML = request.responseXML;
            // Work up the table objects
            var mainTableObject = document.getElementById("temptable"); // Get the main table object
            var mainHeaderObject = document.getElementById("main_header");
            var olderDataHeaderObject = document.getElementById("older_data");
            var obsInsertBeforeObject = document.getElementById("hourly_statistics");
            var hourlyStatisticsHeaderObject = document.getElementById("hourly_statistics");
            var dailyStatisticsHeaderObject = document.getElementById("daily_statistics");
            var hourlyStatisticsNode = newXML.getElementsByTagName("hourly_statistics");
            var statisticsNodes = hourlyStatisticsNode[0].getElementsByTagName("statistic");
            // Hourly stats
            for (var i = 0; i < statisticsNodes.length; i++) {
                var type = statisticsNodes[i].getElementsByTagName("type")[0].firstChild.nodeValue;
                var temp_f = document.createTextNode(statisticsNodes[i].getElementsByTagName("temp_f")[0].firstChild.nodeValue);
                var temp_c = document.createTextNode(statisticsNodes[i].getElementsByTagName("temp_c")[0].firstChild.nodeValue);
                if (type == "minimum") {
                    var temp_fCellObject = document.getElementById("hourly_minimum_f");
                    temp_fCellObject.replaceChild(temp_f, temp_fCellObject.firstChild);
                    var temp_cCellObject = document.getElementById("hourly_minimum_c");
                    temp_cCellObject.replaceChild(temp_c, temp_cCellObject.firstChild);
                }
                if (type == "mean") {
                    var temp_fCellObject = document.getElementById("hourly_mean_f");
                    temp_fCellObject.replaceChild(temp_f, temp_fCellObject.firstChild);
                    var temp_cCellObject = document.getElementById("hourly_mean_c");
                    temp_cCellObject.replaceChild(temp_c, temp_cCellObject.firstChild);
                }
                if (type == "maximum") {
                    var temp_fCellObject = document.getElementById("hourly_maximum_f");
                    temp_fCellObject.replaceChild(temp_f, temp_fCellObject.firstChild);
                    var temp_cCellObject = document.getElementById("hourly_maximum_c");
                    temp_cCellObject.replaceChild(temp_c, temp_cCellObject.firstChild);
                }
            }
            // Get rid of old tr Nodes
            if (mainTableObject.firstChild.nodeType == 1) {
                trNodes = mainTableObject.firstChild.getElementsByTagName("tr");
            } else {
                trNodes = mainTableObject.getElementsByTagName("tr");
            }
            for (var i = 0; i < trNodes.length; i++) {
                // alert(trNodes[i].id);
                if (!trNodes[i].id) {
                    trNodes[i].parentNode.removeChild(trNodes[i]);
                    i--;  // We deleted one, remember?
                }
            }
            // Get the recent observations
            var observationElements = newXML.getElementsByTagName("observation");
            var old_flag = false;
            for (var i = 0; i < observationElements.length; i++) {
                // Build a row
                var trObject = document.createElement("tr");
                // Location and station_id (plus URL to station_plot.php page)
                var loc = observationElements[i].getElementsByTagName("location")[0].firstChild.nodeValue + " (" + observationElements[i].getElementsByTagName("id")[0].firstChild.nodeValue + ")";
                var locationCellObject = document.createElement("td");
                var locationHrefObject = document.createElement("a");
                locationHrefObject.href = "station_plot.php?id=" + observationElements[i].getElementsByTagName("id")[0].firstChild.nodeValue;
                locationCellObject.appendChild(locationHrefObject);
                locationHrefObject.appendChild(document.createTextNode(loc));
                trObject.appendChild(locationCellObject); // tr -> td
                // Date
                var daate = observationElements[i].getElementsByTagName("date")[0].firstChild.nodeValue;
                var dateCellObject = document.createElement("td");
                dateCellObject.appendChild(document.createTextNode(daate));
                trObject.appendChild(dateCellObject); // tr -> td
                // Time
                var time = observationElements[i].getElementsByTagName("time")[0].firstChild.nodeValue.substr(0, 5);
                var timeCellObject = document.createElement("td");
                timeCellObject.appendChild(document.createTextNode(time));
                trObject.appendChild(timeCellObject); // tr -> td
                // Temp F
                var temp_f = observationElements[i].getElementsByTagName("temp_f")[0].firstChild.nodeValue;
                var temp_fCellObject = document.createElement("td");
                temp_fCellObject.align = "right";
                temp_fCellObject.appendChild(document.createTextNode(temp_f));
                trObject.appendChild(temp_fCellObject); // tr -> td
                // Temp C
                var temp_c = observationElements[i].getElementsByTagName("temp_c")[0].firstChild.nodeValue;
                var temp_cCellObject = document.createElement("td");
                temp_cCellObject.align = "right";
                temp_cCellObject.appendChild(document.createTextNode(temp_c));
                trObject.appendChild(temp_cCellObject); // tr -> td
                // Check for data more than an hour old and dump the hourly 
                // stats and Older Data header before continuing
                if (old_flag == false && observationElements[i].getElementsByTagName("current_hour").length == 0) {
                    old_flag = true;
                    obsInsertBeforeObject = document.getElementById("daily_statistics");
                }
                // MAKE SURE THIS IS IE COMPATIBLE (before I had a nodeType == 1 on the mainTableObject.firstChild)
                obsInsertBeforeObject.parentNode.insertBefore(trObject, obsInsertBeforeObject); // table -> tr
            }
            // Get the 24-hour observations
            var dailyStatisticsNode = newXML.getElementsByTagName("daily_statistics");
            var statisticsNodes = dailyStatisticsNode[0].getElementsByTagName("statistic");
            for (var i = 0; i < statisticsNodes.length; i++) {
                var type = statisticsNodes[i].getElementsByTagName("type")[0].firstChild.nodeValue;
                if (type == "minimum") {
                    var minDailyObject = document.createElement("tr");
                    var loc = statisticsNodes[i].getElementsByTagName("location")[0].firstChild.nodeValue + " (" + statisticsNodes[i].getElementsByTagName("id")[0].firstChild.nodeValue + ")";
                    var locationCellObject = document.createElement("td");
                    locationCellObject.appendChild(document.createTextNode(loc));
                    minDailyObject.appendChild(locationCellObject); // tr -> td
                    var daate = statisticsNodes[i].getElementsByTagName("date")[0].firstChild.nodeValue;
                    var dateCellObject = document.createElement("td");
                    dateCellObject.appendChild(document.createTextNode(daate));
                    minDailyObject.appendChild(dateCellObject); // tr -> td
                    var time = statisticsNodes[i].getElementsByTagName("time")[0].firstChild.nodeValue.substr(0, 5);
                    var timeCellObject = document.createElement("td");
                    timeCellObject.appendChild(document.createTextNode(time));
                    minDailyObject.appendChild(timeCellObject); // tr -> td
                    var temp_f = statisticsNodes[i].getElementsByTagName("temp_f")[0].firstChild.nodeValue;
                    var temp_fCellObject = document.createElement("td");
                    temp_fCellObject.align = "right";
                    temp_fCellObject.appendChild(document.createTextNode(temp_f));
                    minDailyObject.appendChild(temp_fCellObject); // tr -> td
                    var temp_c = statisticsNodes[i].getElementsByTagName("temp_c")[0].firstChild.nodeValue;
                    var temp_cCellObject = document.createElement("td");
                    temp_cCellObject.align = "right";
                    temp_cCellObject.appendChild(document.createTextNode(temp_c));
                    minDailyObject.appendChild(temp_cCellObject); // tr -> td
                    if (mainTableObject.firstChild.nodeType == 1) {
                        mainTableObject.firstChild.appendChild(minDailyObject);
                    } else {
                        mainTableObject.appendChild(minDailyObject);
                    }
                }
                if (type == "maximum") {
                    var maxDailyObject = document.createElement("tr");
                    var loc = statisticsNodes[i].getElementsByTagName("location")[0].firstChild.nodeValue + " (" + statisticsNodes[i].getElementsByTagName("id")[0].firstChild.nodeValue + ")";
                    var locationCellObject = document.createElement("td");
                    locationCellObject.appendChild(document.createTextNode(loc));
                    maxDailyObject.appendChild(locationCellObject); // tr -> td
                    var daate = statisticsNodes[i].getElementsByTagName("date")[0].firstChild.nodeValue;
                    var dateCellObject = document.createElement("td");
                    dateCellObject.appendChild(document.createTextNode(daate));
                    maxDailyObject.appendChild(dateCellObject); // tr -> td
                    var time = statisticsNodes[i].getElementsByTagName("time")[0].firstChild.nodeValue.substr(0, 5);
                    var timeCellObject = document.createElement("td");
                    timeCellObject.appendChild(document.createTextNode(time));
                    maxDailyObject.appendChild(timeCellObject); // tr -> td
                    var temp_f = statisticsNodes[i].getElementsByTagName("temp_f")[0].firstChild.nodeValue;
                    var temp_fCellObject = document.createElement("td");
                    temp_fCellObject.align = "right";
                    temp_fCellObject.appendChild(document.createTextNode(temp_f));
                    maxDailyObject.appendChild(temp_fCellObject); // tr -> td
                    var temp_c = statisticsNodes[i].getElementsByTagName("temp_c")[0].firstChild.nodeValue;
                    var temp_cCellObject = document.createElement("td");
                    temp_cCellObject.appendChild(document.createTextNode(temp_c));
                    temp_cCellObject.align = "right";
                    maxDailyObject.appendChild(temp_cCellObject); // tr -> td
                    if (mainTableObject.firstChild.nodeType == 1) {
                        mainTableObject.firstChild.appendChild(maxDailyObject);
                    } else {
                        mainTableObject.appendChild(maxDailyObject);
                    }
                }
            }
            // Last updated footer
            var now = new Date();
            var hours = now.getHours();
            var minutes = now.getMinutes();
            var seconds = now.getSeconds();
            if (hours < 10) { hours = '0' + hours; }
            if (minutes < 10) { minutes = '0' + minutes; }
            if (seconds < 10) { seconds = '0' + seconds; }
            var localDate = "Table last updated at " + hours + ":" + minutes + ":" + seconds + " local time";
            var updatedObject = document.getElementById("updated");
            if (updatedObject != null) {
                if (updatedObject.childNodes) {
                    for (var i = 0; i < updatedObject.childNodes.length; i++) {
                        var childNode = updatedObject.childNodes[i];
                        updatedObject.removeChild(childNode);
                    }
                }
            }
            updatedObject.appendChild(document.createTextNode(localDate));
        } else {
            // alert("Error! Request status is " + request.status);
        }
    }
}
//]]>
