/**
 * Namespace URI for SOAP requests.
 */
var _SOAP_namespace = "http://www.roadtowar.com/";
//var SOAP_URL = "http://127.0.0.1/~beej/fswh/soaphandler.cgi"; // test only
var SOAP_URL = "/roadtowarservice/rtwservice.asmx"; // FS production, apache local forward

/**
 * SOAP handler
 */
var _SOAP_URL = "soaphandler.cgi";

/**
 * Take an object and build a soap request XML string.
 */
function buildSOAPXMLStr(reqname, bodyXmlStr) {
	var header="";
	var body;
	//var fault="";

	body = '<soap:Body>\n';
	body += '  <' + reqname + ' xmlns="' + _SOAP_namespace + '">';

	body += bodyXmlStr;

	body += '  <\/' + reqname + '>\n';
	body += '<\/soap:Body>\n';

	var soap = 
		'<?xml version="1.0" encoding="utf-8"?>\n' +
		'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">\n' +
		header +
		body +
		'<\/soap:Envelope>';

	//beejjs.debug.write(soap);

	return soap;
}

function buildSOAPBodyPayload(root, content) {
	return '<' + root + ' xmlns="' + _SOAP_namespace + '">' +
		content +
		'<\/' + root + '>';
}

function getSOAPBodyElementFromXML(xml) {
	if (xml.getElementsByTagNameNS) { // most everything else
		return xml.getElementsByTagNameNS('http://schemas.xmlsoap.org/soap/envelope/', 'Body');
	} else { // ie6
		return xml.getElementsByTagName('soap:Body');
	}
}

function extractSOAPBody(xml) {
	var bodyNode = getSOAPBodyElementFromXML(xml);
	if (bodyNode.length == 0) {
		throw "Missing soap:Body element";
	}
	return beejjs.xml.xmlToObject(bodyNode[0]);
}

function parseLoginResult(xml) {
	var rv = {};

	var dom = extractSOAPBody(xml);

	return dom.AuthenticateUserResponse.AuthenticateUserResult;
}

function alertOnFault(root) {
	var s = getFaultString(root);
	if (s != null) {
		alert('SOAP Fault: ' + s);
		return true;
	}

	return false;
}

function getFaultString(root) {
	var body = extractSOAPBody(root);
	var faultcode = "";
	var faultstring = "";
	var detail = "";

	if (body.soap_Fault != undefined) {
		if (body.soap_Fault.faultcode != undefined) {
			faultcode = body.soap_Fault.faultcode;
		}
		if (body.soap_Fault.faultstring != undefined) {
			faultstring = body.soap_Fault.faultstring;
		}
		if (body.soap_Fault.detail != undefined) {
			detail = "(detail: '" + body.soap_Fault.detail + "')";
		}

		return '' + faultcode + ': ' + faultstring + detail;
	}

	return null;
}
