// JBo 20081217: created

// JBo 20081229: added compatibility for IE < 5
var TEXT_NODE = 3;
if (!Array.prototype.push)
    Array.prototype.push = function() {
        var thisLength = this.length;
        for(var i=0, argLen=arguments.length; i<argLen; i++)
            this[thisLength+i] = arguments[i];
        return this.length;
    };

var haveAjax = false;
var fieldIds = Array();

function initializeLandTravel()
{
    initialize( ["edDistanceID", "measurementID", "vehicletypeID"] );
}

function initializeHome()
{
    initialize( ["edElectricityID", "edRenewableID", "edGasID", "edParaffinID", "gasmeasurementID", "edCoalID", "edHeatingOilID", "edLPGID", "lpgmeasurementID"] );
}

function initializeOther()
{
    initialize( ["edCOID"] );
}

function initialize(fields)
{
    createXmlHttp();
    var haveAjax = (xmlhttp != null);
    var btnCalculate = document.getElementById("actionCalculateID");

    if (haveAjax && btnCalculate.style.display != 'none')
    {
        btnCalculate.style.display  = 'none';
    }

    fieldIds = fields;

    for(var i=0; i<fieldIds.length; i++)
    {
        var elem = document.getElementById(fieldIds[i]);
        if (elem != null)
        {
            // JBo 20081229: Added check for IE
            if (elem.attachEvent)
            { // IE style
                if (elem.nodeName == "INPUT")
                    elem.attachEvent('onkeyup',  tryCalculate);
                else if (elem.nodeName == "SELECT")
                    elem.attachEvent('onchange', tryCalculate);
            }
            else
            {
                if (elem.nodeName == "INPUT")
                    elem.onkeyup = tryCalculate;
                else if (elem.nodeName == "SELECT")
                    elem.onchange = tryCalculate;
            }
        }
    }
}

function tryCalculate(event, element)
{
    if (fieldIds.length > 0)
    {
        var params = [];
        params.push("action=Calculate");
        params.push("method=xml");
        for (var i=0; i<fieldIds.length; i++)
        {
            var elem = document.getElementById(fieldIds[i]);
            if (elem != null)
            {
                if (elem.nodeName == "INPUT")
                    params.push(elem.name + "=" + elem.value);
                else if (elem.nodeName == "SELECT")
                {
                    var opt = elem.options[elem.selectedIndex];
                    if (opt.getAttribute('value'))
                        params.push(elem.name + "=" + opt.getAttribute('value'))
                    else
                        params.push(elem.name + "=" + getElementText(opt));
                }
            }
        }

        onXMLComplete = parseFormPost;
        var base = document.baseURI;
        if (base.lastIndexOf("?") > 0)
            base = base.substr(0, base.lastIndexOf("?"));
        loadXMLDoc(base + "?"+ params.join("&"));
    }
}

function parseFormPost(xml)
{
    if (!xml) return;
    var doc = xml.documentElement;

    var basketItems = xml.getElementsByTagName("table");
    if (basketItems.length > 0)
    {
        var item = basketItems[0];
        var table = document.getElementById("basket");
        if (table==null)
        {
            table = document.createElement("TABLE");
            table.setAttribute("id", "basket");
            document.forms[0].appendChild(table);
        }
        table.setAttribute("class", item.getAttribute("class"));
        removeAllChilds(table);
        copyXmlToHtml(item, table);
    }

    var hidden = document.getElementById("kgco2ID");
    if (hidden == null)
    {
        hidden = document.createElement("INPUT");
        hidden.setAttribute("name",  "kgco2");
        hidden.setAttribute("id",    "kgco2ID");
        hidden.setAttribute("type",  "hidden");
        document.forms[0].appendChild(hidden);
    }
    hidden.value = getElementText(doc.getElementsByTagName("kgco2")[0]);

    hidden = document.getElementById("offsetID");
    if (hidden == null)
    {
        hidden = document.createElement("INPUT");
        hidden.setAttribute("name",  "offset");
        hidden.setAttribute("id",    "offsetID");
        hidden.setAttribute("type",  "hidden");
        document.forms[0].appendChild(hidden);
    }
    hidden.value = getElementText(doc.getElementsByTagName("offset")[0]);
}

function removeAllChilds(element)
{
    while (element.childNodes.length > 0)
        element.removeChild(element.firstChild);
}

function copyXmlToHtml(xml, html)
{
    for (var elem=0; elem<xml.childNodes.length; elem++)
    {
        if (xml.childNodes[elem].nodeType == 1) //xml element
        {
            var child = document.createElement(xml.childNodes[elem].nodeName);
            for (var attr=0; attr<xml.childNodes[elem].attributes.length; attr++)
            {
                var at = xml.childNodes[elem].attributes[attr];
                child.setAttribute(at.name, at.value);
            }
            html.appendChild(child);
            copyXmlToHtml(xml.childNodes[elem], child);
        }
        else if (xml.childNodes[elem].nodeType == 3) //text element
        {
            child = document.createTextNode( xml.childNodes[elem].nodeValue );
            html.appendChild(child);
        }
        else if(xml.childNodes[elem].nodeType == 4) //CDATA element
        {
            var data = xml.childNodes[elem].nodeValue;
            if (data.substr(0, 1) == "&" && data.substr(-1, 1) == ";") // EntityReference
            {
                child = document.createElement("SPAN");
                child.innerHTML = data;
                html.appendChild(child);
            }
        }
    }
}

function getElementText(elem)
{
    var res = "";
    for (var i=0; i<elem.childNodes.length; i++)
    {
        var child = elem.childNodes[i];
        res += (child.nodeType == TEXT_NODE) ? child.nodeValue : getElementText(child) ;
    }
    return res;
}


