// Parsing responseText to js object

/*--- BEGIN: RESPONSE PARSING FUNCTIONS ---*/
function parseResponse (req)
{
    //FIRST TRY IT AS XML
    if(req.getResponseHeader("Content-Type").split(';')[0] == 'text/xml')
    {
        return req.responseXML;
    }

    var str = req.responseText;

    var i = str.indexOf("HTTP/1");
    if (i > -1)
    {
        str = str.substring(i, str.length);
        i = str.indexOf(String.fromCharCode(13, 10, 13, 10));
        if (i > -1)
        {
            str = str.substring(i + 2, str.length);
        }
    }

    //NEXT TRY IT AS WDDX
    if(str.indexOf("<wddxPacket") > -1)
      {
        return parseWDDX(str);
    }

    try{                //try JSON eval();
        return parseJSON(str);
    }catch(e){            //then try Classic eval();
        return parseJS(str);
    }
}

function parseJS (str)
{
    eval(str);
    var r = eval(str.split('=')[0].replace(/\s/g,''));
    return r;
}

function parseJSON (str)
{
    return  eval('('+str+')');
}

//BEGIN: WDDX deserializer functions
function parseWDDX (str)
{
    var wddx = xmlStr2Doc(str);
    var data = wddx.getElementsByTagName("data");
    return __parseWDDXnode(data[0].firstChild);
}

function xmlStr2Doc(str)
{
    var xml;
    if(typeof(DOMParser) == 'undefined')
    {
        xml=new ActiveXObject("Microsoft.XMLDOM");
        xml.async="false";
        xml.loadXML(str);
    } else
    {
        var domParser = new DOMParser();
        xml = domParser.parseFromString(str, 'application/xml');
    }
    return xml;
}

function __parseWDDXnode(n)
{
    var val;
    switch(n.tagName)
    {
        case 'string': val = __parseWDDXstring(n); break;
        case 'number': val = parseInt(n.firstChild.data); break;
        case 'boolean': val = n.getAttribute('value'); break;
        case 'dateTime': val = Date(n.firstChild.data); break;
        case 'array': val = __parseWDDXarray(n); break;
        case 'struct': val = __parseWDDXstruct(n); break;
        case 'recordset': val = __parseWDDXrecordset(n); break;
        case 'binary': val = n.firstChild.data; break;
        case 'char': val = __parseWDDXchar(n); break;
        case 'null': val = ''; break;
        default: val = n.tagName; break;
    }
    return val;
}

function __parseWDDXstring(node)
{
    var items = node.childNodes;
    var str = '';
    for(var x=0;x < items.length;x++)
    {
        if(typeof(items[x].data) != 'undefined') str += items[x].data; else str += __parseWDDXnode(items[x]);
    }
    return str;
}

function __parseWDDXchar(node)
{
    switch(node.getAttribute('code'))
    {
        case '0d': return '\r';
        case '0c': return '\f';
        case '0a': return '\n';
        case '09': return '\t';
    }
}

function __parseWDDXarray(node)
{
    var items = node.childNodes;
    var arr = new Array();
    for(var i=0;i < items.length;i++)
    {
        arr[i] = __parseWDDXnode(items[i]);
    }
    return arr;
}

function __parseWDDXstruct(node)
{
    var items = node.childNodes;
    var obj = new Object();
    for(var i=0;i < items.length;i++)
    {
        obj[items[i].getAttribute('name').toLowerCase()] = __parseWDDXnode(items[i].childNodes[0]);
    }
    return obj;
}

function __parseWDDXrecordset(node)
{
    var qry = new Object();
    var fields = node.getElementsByTagName("field");
    var items;
    var dataType;
    var values;
    for(var x = 0; x < fields.length; x++)
    {
        items = fields[x].childNodes;
        values = new Array();
        for(var i = 0; i < items.length; i++)
        {
            values[values.length] = __parseWDDXnode(items[i]);
        }
        qry[fields[x].getAttribute('name').toLowerCase()] = values;
    }
    return qry;
}

//END: WDDX deserializer functions

/*--- END: RESPONSE PARSING FUNCTIONS ---*/


