﻿/*** UTILITY $id FUNCTION ***/
$id = function(id)
{
    return document.getElementById(id);
}

/***********************************************************************/
// RESPONSE HANDLING - Compliments C# ResponseCollection Class

ResponseHandler = new Object();

ResponseHandler.response = function(messageCallback)
{
    this.messageCallback = messageCallback;
    this.debug = new Object();
}
ResponseHandler.response.prototype.handler = function(xml)
{
    // get all responses
    var responses = xml.getElementsByTagName("Response");

    // store debug info
    this.debug.responses = responses;

    // iterate through each response
    for (var i = 0; i < responses.length; i++)
    {
        var type = "";
        var value = "";
        var target = "";

        // get type
        try { type = responses[i].getElementsByTagName("Type")[0].childNodes[0].nodeValue; } catch (ex) { type = "" }

        // get value, may contain multiple elements if long enough
        try
        {
            for (var j = 0; j < responses[i].getElementsByTagName("Value")[0].childNodes.length; j++)
                value += responses[i].getElementsByTagName("Value")[0].childNodes[j].nodeValue;

        } catch (ex) { value = "" }

        // get the target element
        try { target = responses[i].getElementsByTagName("Target")[0].childNodes[0].nodeValue; } catch (ex) { target = "" }

        // perform necessary operation
        switch (type)
        {
            case "Element":     // handle element content replacement
                var element = document.getElementById(target);
                if (element == null)
                    throw "Render error: Element " + target + " does not exist";

                // IE does not like setting innerHTML on tr elements...
                // so if the replacing element's a tr element lets do some hacking so it works
                // this should eventually be extended to include the other elements in IE that don't support innerHTML
                //  refer to: http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx
                if ((navigator.appName == "Microsoft Internet Explorer") && element.tagName.toLowerCase() == "tr")
                {
                    try
                    {
                        // build a temporary element and place a temp table in it so we can access the cell elements
                        var tempdiv = document.createElement("div");
                        tempdiv.style.display = "none";
                        tempdiv.id = "tempdiv";
                        tempdiv.innerHTML = "<table><tr>" + value + "</tr></table>";
                        document.body.appendChild(tempdiv);
                        var temprow = tempdiv.getElementsByTagName("tr")[0];

                        // remove all cells in the element
                        while (element.childNodes.length > 0)
                            element.removeChild(element.childNodes[0]);

                        // add new cells
                        while (temprow.childNodes.length > 0)
                            element.appendChild(temprow.childNodes[0]);

                        // clean up
                        tempdiv.parentNode.removeChild(tempdiv);
                    }
                    catch (ex) { }
                }
                else // simply replace the element's content
                    element.innerHTML = value;
                break;

            case "Eval": // handles evaluation of a string for code execution
                if (window.execScript)
                {
                    window.execScript(value, "JavaScript");
                }
                else window.eval(value);
                break;

            case "Message": // displays a message
                if (this.messageCallback == null)
                    alert(value);
                else
                    this.messageCallback(target, value);
                break;
        };
    }
}

ResponseHandler.event = function()
{
    // place here so that it is an instance member
    this._delegates = new Array();
}
ResponseHandler.event.prototype.addDelegate = function(handler)
{
    var found = false;
    for (var i = 0; i < this._delegates.length; i++)
    {
        if (this._delegates[i] == handler)
        {
            this._delegates[i] = handler;
            found = true;
            break;
        }
    }
    if (!found)
        this._delegates.push(handler);
}
ResponseHandler.event.prototype.removeDelegate = function(handler)
{
    for (var i = 0; i < this._delegates.length; i++)
    {
        if (this._delegates[i] == handler)
        {
            this._delegates.splice(i, 1);
            break;
        }
    }
}
ResponseHandler.event.prototype.fire = function()
{
    for (var i = 0; i < this._delegates.length; i++)
    {
        this._delegates[i]();
    }
}

