function TremoteCommand(cmd) {
	this.cmd = cmd;
	this.reload = true;
	this.parameters = new Array()
	this.addParam = _addParam;
	this.send = _send;
	this.returnXML = null;
	
	this.getReturnValue = _getReturnValue;
	
	function _addParam(name,value) {
		this.parameters.push(new _Tcommand(name,value));
	}
	
	function _Tcommand(name,value) {
		this.name = name;
		this.value = value;
	}
	
	function _send(path) {
		var _Dom = new ActiveXObject('MSXML2.DOMDocument.4.0');
		_Dom.appendChild(_Dom.createElement('command'));
		_Dom.documentElement.appendChild(_Dom.createElement('cmdid')).text = this.cmd;

		for (var _i = 0;_i < this.parameters.length; _i++) {
			_Dom.documentElement.appendChild(_Dom.createElement(this.parameters[_i].name)).text = this.parameters[_i].value;
		}
		this.returnXML = sendCommand(_Dom.xml,path, false, !this.reload);
	}
	
	function _getReturnValue(xpath) {
		return this.returnXML.selectSingleNode(xpath).text
	}
}

function TsoapCommand(method,uri) {
	this.method = method;
	this.uri = uri;
	if (!this.uri)
		this.uri = 'http://tempuri.org/';
	this.reload = false;
	this.parameters = new Array()
	this.items = new Array()
	this.addParam = _addParam;
	this.send = _send;
	this.addItemList = _addItemList;
	this.clearItemList = _clearItemList;
	this.getItemList = _getItemList;
	
	this.getReturnValue = _getReturnValue;
	
	function _addParam(name,value,type) {
		this.parameters.push(new _Tcommand(name,value,type));
	}
	
	function _Tcommand(name,value,type) {
		this.name = name;
		this.value = value;
		this.type = type;
	}
	
	function _addItemList(value) {
		this.items.push(value);
	}
	
	function _clearItemList() {
		this.items = new Array();
	}
	
	function _getItemList() {
		var _DomItems = new ActiveXObject('MSXML2.DOMDocument.4.0');
		_DomItems.appendChild(_DomItems.createElement('root')).appendChild(_DomItems.createElement('items'));
		
		for (var _i = 0;_i < this.items.length; _i++) {
			_DomItems.documentElement.firstChild.appendChild(_DomItems.createElement('item')).text = this.items[_i];
		}
		
		return _DomItems;
	}
	
	function _send(path, isXml, debug) {
		var _Dom = new ActiveXObject('MSXML2.DOMDocument.4.0');
		var enc = 'UTF-8';
		_Dom.loadXML('<?xml version="1.0" encoding="' + enc + '" ?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" />');
		_Dom.documentElement.setAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
		_Dom.documentElement.setAttribute('xmlns:xsd','http://www.w3.org/2001/XMLSchema');
		var _root = _Dom.documentElement.appendChild(_Dom.createElement('soap:Body'));
		var _method = _Dom.createNode(1,this.method,this.uri);
		_root.appendChild(_method);

		for (var _i = 0;_i < this.parameters.length; _i++) {
			var _item = _Dom.createNode(1,this.parameters[_i].name,this.uri);
			
			if (this.parameters[_i].type == 'xml') {
				_item.appendChild(this.parameters[_i].value.documentElement);
			} else {
				_item.text = this.parameters[_i].value;
			}
			
			_method.appendChild(_item);
		}
		
		if (debug)
			alert(_Dom.xml);
		
		var _returnXML = sendXML(_Dom.xml,path, false, this.uri + this.method, enc);
		
		if (debug)
			alert(_returnXML.xml);
		
		try {
		if (_returnXML == false)
			return false;
		} catch(e) {}

		if (_returnXML.documentElement.firstChild.firstChild.nodeName.toLowerCase() == 'soap:fault') {
			var _errElement = _returnXML.documentElement.firstChild.firstChild;
			var _error = _errElement.selectSingleNode("faultstring").text;
			alert(_error);
			//throw (_error);
		}

		_returnXML.setProperty("SelectionNamespaces", "xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'");
		//_returnXML.setProperty("SelectionNamespaces", "xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'"); 
		var _response = _returnXML.selectSingleNode('//soapenv:Body').firstChild.firstChild;

	
		if (!_response) return null;
		var _result = _response.firstChild
		if (!_result) return true;
		
		if (isXml) {
			_result = _result.xml;
		} else {
			_result = _result.text;
		}

		if (debug)
			alert('Return:' + _result);

		return _result;
	}
	
	function _getReturnValue(xpath) {
		return this.returnXML.selectSingleNode(xpath).text
	}
}

function sendXML(sXML,sURL,Async, soapAction) {
		try {	
			//# Send xml to server
			
			var oXMLHTTP = new ActiveXObject('MSXML2.XMLHTTP');
			
			if (Async == true)
				Async = true;
			else
				Async = false;
			
			oXMLHTTP.Open('POST', sURL, Async);
			if (soapAction) {
				oXMLHTTP.setRequestHeader('SOAPAction', soapAction);
				oXMLHTTP.setRequestHeader('Content-Type', 'text/xml; charset=UTF-8');
			}
			
			oXMLHTTP.Send(sXML);
			if (Async == true) return;		
			var sXML = oXMLHTTP.responsetext;
			//alert(sXML);
			
			if (!soapAction) {
				sXML = sXML.replace(/encoding="(.*)"/mig,'');
				sXML = sXML.replace(/\r\n/mig,'');
			}
			
			//# Load the result
			var oDom = new ActiveXObject('MSXML2.DOMDocument.4.0');
			oDom.async = false;
			oDom.loadXML(sXML);
			
			// #Check the results
			if (oDom.parseError == '0') {	// response was parced successfully
				// Check for success/error results
				var oErrorNode = oDom.selectSingleNode("//reply/type")
				if (oErrorNode) {  // FOUND ERROR NODE
					if (oErrorNode.text != 'success') {
						var oDescriptionNode = oDom.selectSingleNode("//reply/description"); // DESCRIPTION POPUP
						if (oDescriptionNode) {
							if (oDescriptionNode.text != '') {
								alert(oDescriptionNode.text);
							} else {
								alert('Error executing command!');
							}
						} else { // UNSPECIFIED ERROR
							alert('An unspecified error has occurred on the server');
						}
						return false;
					} else {
						return oDom;
					}
				} else {
					return oDom;
				}
			} else { // Error parcing the response
				alert('Error parsing xml input from the url:' + sURL + '\nParce error:' + oDom.parseError.reason + '\nReturn Value:\n' + oXMLHTTP.responsetext);
				return false;
			}
		} catch(e) {
			alert('Error in sendXML:\nURL:' + sURL + '\nDescription' + e.description);
			return false;
		}
		// Should never get here
		return false;
	}
	
	function sendCommand(XMLFields,path, Async, noreload) {
		var oDom = sendXML(XMLFields,path, Async);
		if (Async == true) return;
		if (oDom) {
			var oReply = oDom.selectSingleNode('/reply/type');
			if (oReply) {
				if (oReply.text == 'success') {
					try { // Try to ececute externally defined function 
						onCommandFinished();
					} catch(e) { // Default action if function is not defined
						if (noreload) {
							return oDom;
						} else {
							document.location.reload();
						}
					}
				} else  {
					// the error has been handled and alerted by sendXML 
				}
			} else {
				alert('Error executing command!');
			}
		}
	}
	