/*************************************************************
 *
 * $Id: SOAP.js,v 1.4 2005/03/14 08:05:15 zkessin Exp $ 
 *
 * Soap utility functions
 *
 * Copyright 2005 Zachary Kessin
 *
 ************************************************************/



//

function startResponse(r)
{
    var params  = r.getParameters(true,{});
   
    if(r.fault != null)
	{
	    msg(r.fault.element.faultString);
	    return false;
	}

    var values = params[0].element.childNodes[0];
    return buildResponse(values,"*");
}
function buildResponse(tree,j)
{
    var   obj = {};
    // get each item
    while(tree)
	{
	    var type  = tree.getAttribute("xsi:type");	   
	    // msg (j+ " - " +tree.nodeName);
	    
	    // array of items here
	    if (type == "SOAP-ENC:Array")
		{
		    var z = 0;
		    //recursive functions are often useful
		    var values = new Array();
		    subTree = tree.firstChild;
		    while(subTree)
			{
			    //			    msg (j + " Array");
			    values[z++] = buildResponse(subTree,j + "+");
			    subTree = subTree.nextSibling;
			}
		    obj['array']  = values;
		}
	    // Name value pairs
	    else if (type == "ns2:Map")
		{
		    //		    msg (j + " Map");
		    return buildResponse(tree.firstChild,j+ "*");
		}   
	    else
		// All scallar types here
		{
		    
		    var key   = tree.childNodes[0].textContent;
		    var value = tree.childNodes[1].textContent;
		    //		    msg (j + " " + key + " = " + value);
		    obj[key] = value;
		   
		}
	    tree  = tree.nextSibling;
	}
    return obj;
}






function runSoapRequest(soapObj)
{
    try
	{ 
	    var soapCall = new SOAPCall();
	    var uri      = getSoapURI();
	    //	    msg("***");
	    //      msg(soapObj.method);
	    var p        = new Array();
	    for (var i = 0; i < soapObj.params.length ;i++)
		{
		    // msg (i + ":" +soapObj.params[i].name + ":" +soapObj.params[i].value);
		p[i]     = new SOAPParameter(soapObj.params[i].value,
					     soapObj.params[i].name);
		}
	    // Tell SOAP where to find the service
	    soapCall.transportURI = uri + soapObj.uri;
	    // Encode everything.
	    soapCall.encode(0,soapObj.method,"urn:xmethods-price",0,null,p.length,p);
	    // Call SOAP asynchronously, it will call the callback method when done.
	    
	    if(soapObj.callback)
		{
		    // generic callback function, check response and
		    // then call the real callback function with the
		    // simpified object.

		    var $resp = function(response,soapcall,error)
			{
			    var r;
			    if(r = checkResponse(response,soapcall,error))
			    {
				soapObj.callback(startResponse(r));
			    }
			}
		    soapCall.asyncInvoke($resp);
		    return 1;
		}
	    else
		// Call soap, return the response object as generated above.
		{
		    var r = soapCall.invoke();
		    var resp = startResponse(r);
		    return resp;
		}
	}
    catch(e)
	{
	    msg (e);
	    return 0;
	}
}


function getVal(element)
{
    var eType = element.type;
    switch (eType)
	{
	case 'select-one':
	    return element.options[element.options.selectedIndex].value;
	    break;
	}
    return element.value;
}

function setVal(element,value)
{
    var eType = element.type;   
    if (eType =='select-one')
	{
	    for (var i = 0; i < element.options.length; i++)
		if (element.options[i].value == value)
		    {
			element.options.selectedIndex = i;
			return true;
		    }

	    return false;
	}
    element.value = value;
    return true;
}
