// ************************************************************************************
//	Operation
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.MiEmpresa");

// constructor
Competir.MiEmpresa.Operation = function(command)
{
	Competir.MiEmpresa.Operation.initializeBase(this);
	this._Command = command;
	this._Request = null;
	this._Result = null;
	this._LastError = null;
	this._Parameters = new Array();
};

// prototype
Competir.MiEmpresa.Operation.prototype =
{
	// methods
	execute: function()
	{
		var proxy = new Competir.MiEmpresa.Web.ws.operaciones();
		proxy.set_defaultSucceededCallback(Function.createDelegate(this, this.onSucceeded));
		proxy.set_defaultFailedCallback(Function.createDelegate(this, this.onFailed));
		this.set_Request(proxy.ExecuteMultipleOperations("<Operations>" + this.toXml() + "</Operations>"));
	},
	toXml: function()
	{
		var rv = "<Operation>";
		rv += "<Command><![CDATA[" + this.get_Command() + "]]></Command>";
		var parameters = this.get_Parameters();
		if (parameters.length)
		{
			rv += "<Parameters>";
			for (var i = 0; i < parameters.length; i ++)
			{
				rv += "<Parameter>";
				rv += "<Name><![CDATA[" + parameters[i].name + "]]></Name>";
				if (parameters[i].cdata == false)
				{
					rv += "<Value isxml=\"true\">" + parameters[i].value + "</Value>";
				}
				else
				{
					rv += "<Value isxml=\"false\"><![CDATA[" + parameters[i].value + "]]></Value>";
				}
				rv += "</Parameter>";
			}
			rv += "</Parameters>";
		}
		rv += "</Operation>";
		return rv;
	},
	addParameter: function(name, value, cdata)
	{
		Array.add(this.get_Parameters(), {name: name, value: value, cdata: cdata});
	},
	getParameter: function(name)
	{
		var rv = null;
		var parameters = this.get_Parameters();
		for (var i = 0; i < parameters.length; i++)
		{
			if (parameters[i].name == name)
			{
				rv = parameters[i];
				break;
			}
		}
		return rv;
	},
	addListener: function(obj)
	{
		if (obj._onOperationStarted)
		{
			this.add_onStarted(Function.createDelegate(obj, obj._onOperationStarted));
		}
		if (obj._onOperationSucceeded)
		{
			this.add_onSucceeded(Function.createDelegate(obj, obj._onOperationSucceeded));
		}
		if (obj._onOperationFailed)
		{
			this.add_onFailed(Function.createDelegate(obj, obj._onOperationFailed));
		}
	},
	raiseEvent: function(id, args)
	{
		var events = this.get_events();
		if (events)
		{
			var f = events.getHandler(id);
			if (f)
			{
				f(this, args);
			}
		}
	},

	// properties
	get_Command: function()
	{
		return this._Command;
	},
	set_Command: function(value)
	{
		if (this._Command !== value)
		{
			this._Command = value;
			this.raisePropertyChanged("Command");
		}
	},
	get_Request: function()
	{
		return this._Request;
	},
	set_Request: function(value)
	{
		if (this._Request !== value)
		{
			this._Request = value;
			this.raisePropertyChanged("Request");
		}
	},
	get_Result: function()
	{
		return this._Result;
	},
	set_Result: function(value)
	{
		if (this._Result !== value)
		{
			this._Result = value;
			this.raisePropertyChanged("Result");
		}
	},
	get_LastError: function()
	{
		return this._LastError;
	},
	set_LastError: function(value)
	{
		if (this._LastError !== value)
		{
			this._LastError = value;
			this.raisePropertyChanged("LastError");
		}
	},
	get_Parameters: function()
	{
		return this._Parameters;
	},
	set_Parameters: function(value)
	{
		if (this._Parameters !== value)
		{
			this._Parameters = value;
			this.raisePropertyChanged("Parameters");
		}
	},

	// events
	add_onStarted: function(handler)
	{
		this.get_events().addHandler("onStarted", handler);
	},
	remove_onStarted: function(handler)
	{
		this.get_events().removeHandler("onStarted", handler);
	},
	add_onSucceeded: function(handler)
	{
		this.get_events().addHandler("onSucceeded", handler);
	},
	remove_onSucceeded: function(handler)
	{
		this.get_events().removeHandler("onSucceeded", handler);
	},
	add_onFailed: function(handler)
	{
		this.get_events().addHandler("onFailed", handler);
	},
	remove_onFailed: function(handler)
	{
		this.get_events().removeHandler("onFailed", handler);
	},

	// event delegates
	onStarted: function()
	{
		this.raiseEvent("onStarted", Sys.EventArgs.Empty);
	},
	onSucceeded: function(result, eventArgs)
	{
		this.set_Result(result);
		this.raiseEvent("onSucceeded", eventArgs);
	},
	onFailed: function(error)
	{
		this.set_LastError(error);
		this.raiseEvent("onFailed", Sys.EventArgs.Empty);
	}
};

// registration
Competir.MiEmpresa.Operation.registerClass("Competir.MiEmpresa.Operation", Sys.Component);