<!--
	function WSDL() {}
	
	WSDL.Types = new Object();
	WSDL.ComplexTypes = new Array();
	//WSDL.Types['SOAP-ENC:Array'] = 'xsd:array';
	
	WSDL.getType = function(name)
	{
		var type = WSDL.Types[name] + '';
		
		return ( type == 'undefined' ? '' : type );
	}
	
	WSDL.parseTypes = function(xmlDoc, method)
	{
		/*var ports = XML.getElementsByTagName(xmlDoc, 'portType');
		var operations = XML.getElementsByTagName(ports[0], 'operation');
		var input, output;
		for ( var i = 0; i < operations.length; i++ )
		{
			alert(XML.getAttribute(operations[i], 'name'));
			input = XML.getElementsByTagName(operations[i], 'input');
			if ( input.length > 0 )
				input = XML.getAttribute(input[0], 'message').stripNamespace();
			output = XML.getElementsByTagName(operations[i], 'output');
			if ( output.length > 0 )
				output = XML.getAttribute(output[0], 'message').stripNamespace();
			
			alert(input);
			alert(output);
			
			var messages = XML.getElementsByTagName(xmlDoc, 'message');
			for ( var j = 0; j < messages.length; j++ )
			{
			
			}
		}*/
		
		/*var complexTypes = XML.getElementsByTagName(xmlDoc, 'complexType');
		for ( var i = 0; i < complexTypes.length; i++ )
		{
			if ( XML.getElementsByTagName(complexTypes[i], 'restriction').length > 0 )
				WSDL.ComplexTypes[XML.getAttribute(complexTypes[i], 'name')] = XML.getAttribute(XML.getElementsByTagName(complexTypes[i], 'restriction')[0], 'base');
			else
				WSDL.ComplexTypes[XML.getAttribute(complexTypes[i], 'name')] = 'xsd:sequence';
		}
		
		var messages = XML.getElementsByTagName(xmlDoc, 'message');
		for ( var i = 0; i < messages.length; i++ )
		{
			WSDL.Types[XML.getAttribute(messages[i], 'name').stripNamespace()] = new Object();

			var parts = XML.getElementsByTagName(messages[i], 'part');
			for ( var j = 0; j < parts.length; j++ )
				WSDL.Types[XML.getAttribute(messages[i], 'name').stripNamespace()][XML.getAttribute(parts[j], 'name')] = XML.getAttribute(parts[j], 'type').stripNamespace();
		}
		
		alert(WSDL.Types.toSource());
			
		var elements = XML.getElementsByTagName(xmlDoc, 'element');
		for ( var i = 0; i < elements.length; i++ )
			WSDL.Types[XML.getAttribute(elements[i], 'name')] = XML.getAttribute(elements[i], 'type');*/
	}
	
	function SOAP() {}
	
	SOAP.WSDL = '';
	SOAP.WSDLCache = new Array();
	SOAP.fault = function fault() {}
	SOAP.request = XML.HttpRequest();
	SOAP.xslt = null;
	
	SOAP.invoke = function(wsdl, method, parameters)
	{
		alert(method);
		parameters = Array.prototype.slice.call(parameters);
		alert(parameters[0]);
		
		// Use cached WSDL
		SOAP.WSDL = SOAP.WSDLCache[wsdl];
		if ( SOAP.WSDL + "" != "" && SOAP.WSDL + "" != "undefined" )
			return;
		
		// Fetch WSDL
		SOAP.request.open("GET", wsdl, false);
		if ( XMLHttpRequest ) // Native XMLHttpRequest object
		{
			if ( SOAP.request.overrideMimeType )
				SOAP.request.overrideMimeType('text/xml');
			SOAP.request.send(null);
		}
		else if ( window.ActiveXObject ) // IE/Windows ActiveX version
			SOAP.request.send();
		
		// Store WSDL in Cache
		SOAP.WSDL = SOAP.request.responseXML;
		SOAP.WSDLCache[wsdl] = SOAP.WSDL;
		
		// Get URL
		var url = XML.getElementsByTagName(SOAP.WSDL, 'soap:address')[0].getAttribute('location');
		
		// Get NS
		var namespace = (SOAP.WSDL.documentElement.attributes["targetNamespace"] + "" == "undefined") ? SOAP.WSDL.documentElement.attributes.getNamedItem("targetNamespace").nodeValue : SOAP.WSDL.documentElement.attributes["targetNamespace"].value;
		
		alert(url);
		alert(namespace);
		
		// Build SOAP Request
		var SOAPRequest =
			"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
			"<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/\">" +
			"<soap:Body>" +
			"<" + method + " xmlns=\"" + namespace + "\">" +
			XML.serialize(parameters) + 
			"</" + method + "></soap:Body></soap:Envelope>";
			
		var SOAPAction = ((namespace.lastIndexOf("/") != namespace.length - 1) ? namespace + "/" : namespace) + method;
		
		alert("SOAP Action: " + SOAPAction);
		
		SOAP.request.open("POST", url, false);
		SOAP.request.setRequestHeader("SOAPAction", SOAPAction);
		SOAP.request.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
		SOAP.request.setRequestHeader("Content-length", SOAPRequest.length);
		SOAP.request.setRequestHeader("Connection", "close");
		SOAP.request.send(SOAPRequest);
		
		//alert(SOAP.request.responseText);
		
		if ( SOAP.request.responseXML.getElementsByTagName('faultcode').length > 0 )
		{
			SOAP.fault.faultCode = SOAP.request.responseXML.getElementsByTagName('faultcode')[0].childNodes[0].nodeValue;
			SOAP.fault.faultActor = SOAP.request.responseXML.getElementsByTagName('faultactor')[0].childNodes[0].nodeValue;
			SOAP.fault.faultString = SOAP.request.responseXML.getElementsByTagName('faultstring')[0].childNodes[0].nodeValue;
			SOAP.fault.faultDetail = SOAP.request.responseXML.getElementsByTagName('detail')[0].childNodes.length ? SOAP.request.responseXML.getElementsByTagName('detail')[0].childNodes[0].nodeValue : '';
		
			return false;
		}
		
		return true;
		// Supposed to parse result and return that
		//return SOAP.request.responseText;
	}
	
	SOAP.loadWSDL = function(url)
	{
		// Load the XSLT file
		SOAP.xslt = new XSLT();
		SOAP.xslt.importStylesheet(window.location.protocol + '//www.floralambiance.com/xsl/wsdl/wsdl-js.xsl');
		
		// Load the XML file
		var xmlDoc = XML.load(url);
		SOAP.xslt.loadXML(xmlDoc);
		
		// Create WSDL Types
		//WSDL.parseTypes(xmlDoc);
		// Perform the transformation
		var xml = SOAP.xslt.transform();
		
		// Create object from JSON
		if ( typeof(xml) == 'string' ) // IE
		{
			if ( window.execScript )
				window.execScript(xml);
		} else
			eval(xml.documentElement.firstChild.nodeValue);		
	}
	
	SOAP.call = function(method, obj, parameters)
	{
		parameters = Array.prototype.slice.call(parameters);
		
		var url = obj.url;
		var namespace = obj.ns;
		
		// Build SOAP Request
		var SOAPRequest =
			"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
			"<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/\">" +
			"<soap:Body>" +
			"<" + method + " xmlns=\"" + namespace + "\">" +
			XML.serialize(parameters) + 
			"</" + method + "></soap:Body></soap:Envelope>";

		var SOAPAction = ((namespace.lastIndexOf("/") != namespace.length - 1) ? namespace + "/" : namespace) + method;
		
		SOAP.request.open("POST", url, false);
		SOAP.request.setRequestHeader("SOAPAction", SOAPAction);
		SOAP.request.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
		SOAP.request.setRequestHeader("Content-length", SOAPRequest.length);
		SOAP.request.setRequestHeader("Connection", "close");
		SOAP.request.send(SOAPRequest);
		
		if ( SOAP.request.responseXML == undefined )
			alert("Undefined" + SOAP.request.responseText);
			
		//alert(SOAP.request.responseText);
		
		if ( SOAP.request.responseXML.getElementsByTagName('faultcode').length > 0 )
		{
			SOAP.fault.faultCode = SOAP.request.responseXML.getElementsByTagName('faultcode')[0].childNodes[0].nodeValue;
			SOAP.fault.faultActor = SOAP.request.responseXML.getElementsByTagName('faultactor')[0].childNodes[0].nodeValue;
			SOAP.fault.faultString = SOAP.request.responseXML.getElementsByTagName('faultstring')[0].childNodes[0].nodeValue;
			SOAP.fault.faultDetail = SOAP.request.responseXML.getElementsByTagName('detail')[0].childNodes.length ? SOAP.request.responseXML.getElementsByTagName('detail')[0].childNodes[0].nodeValue : '';
		
			return false;
		}
		
		return SOAP.parseResponse(XML.getElementsByTagName(SOAP.request.responseXML, 'return')[0]);
	}
	
	SOAP.parseResponse = function(node)
	{
		// Null Node
		if ( node == null )
			return null;
		
		// Text Node
		if ( node.nodeType == 3 || node.nodeType == 4 )
		{
			switch ( XML.getAttribute(node.parentNode, 'xsi:type').toLowerCase() )
			{
				default: case 'xsd:string':
					return node.nodeValue != null ? node.nodeValue + '' : '';
				case 'xsd:boolean':
					return node.nodeValue + '' == 'true';
				case 'xsd:int': case 'xsd:long':
					return node.nodeValue != null ? parseInt(node.nodeValue + '', 10) : 0;
				case 'xsd:double': case 'xsd:float':
					return node.nodeValue != null ? parseFloat(node.nodeValue + '') : 0;
				case 'xsd:datetime':
					if ( node.nodeValue )
						return null;
						
					var value = node.nodeValue + '';
					value = value.substring(0, value.lastIndexOf('.') == -1 ? value.length : value.lastIndexOf('.'));
					value = value.replace(/T/gi, ' ');
					value = value.replace(/-/gi, '/');
					
					var d = new Date();
					d.setTime(Date.parse(value));
				
					return d;
			}
		}
		
		// Leaf Node
		if ( node.childNodes.length == 1 && (node.childNodes[0].nodeType == 3 || node.childNodes[0].nodeType == 4) )
			return SOAP.parseResponse(node.childNodes[0]);

		if ( (XML.getAttribute(node, 'xsi:type').stripNamespace().toLowerCase() == 'x') )
			return XML.serializeToString(node);
		
		// List Node
		if ( XML.getAttribute(node, 'xsi:type').stripNamespace().toLowerCase().indexOf('array') != -1 )
		{
			var list = new Array();
			for ( var i = 0; i < node.childNodes.length; i++ )
				list[list.length] = SOAP.parseResponse(node.childNodes[i]);
				
			return list;
		} else { // Object
			var obj = node.hasChildNodes() ? new Object : null;
			
			for ( var i = 0; i < node.childNodes.length; i++ )
				obj[node.childNodes[i].nodeName] = SOAP.parseResponse(node.childNodes[i]);
				
			return obj;
		}
		
		return null;
	}
//-->
