/** 
 * @class AbstractStub
 * @package xmlrpc
 * @version 1.0
 * @author Frédéric LECOINTRE<frederic.lecointre@burnweb.net>
 * 
 */
AbstractStub = new Object();
AbstractStub.hasFault = false;
AbstractStub.faultCode = 0;
AbstractStub.faultMessage = '';
AbstractStub.threaded = false;
AbstractStub.config = null;
AbstractStub.response = null;

/**
 * 
 * @param string sListenner 
 * @param string sPath
 * @param array aParameters
 * @return Object
 * @since 1.0
 */
AbstractStub.execute = function(sMethod, sRpcUrl, aParameters, bThreaded){
	AbstractStub.config = AbstractStub.createConfig(sMethod, sRpcUrl, aParameters);

	AbstractStub.response = null;
	
	if(bThreaded){
		AbstractStub.threaded = true;
	}//end if
	
	if(AbstractStub.threaded){
		ModalFrame.waitAndCallback(Array(this, 'executeThreaded'), 'Traitement en cours ...', 100);
	}//end if
	else{
		AbstractStub.executeThreaded();
		return AbstractStub.response;
	}//end else
	
};//end function

/**
 * 
 * @param boolean bThread 
 * @return Object
 * @since 1.0
 */
AbstractStub.executeThreaded = function(bThreaded){
	
	var oResponse = AbstractStub.call(AbstractStub.config); 
		
	if(oResponse){
	
		if(oResponse.isFault){
			alert("Une erreur innattendue s'est produite :\n" + oResponse.faultString);
			AbstractStub.response = null;
		}//eznd if
		else{
			AbstractStub.response = oResponse.response;
		}//end else
	}//end if
	else{
		AbstractStub.response = null;
	}//end else
	
	if(bThreaded){
		ModalFrame.wait();
	}//end if
	
};//end function

/**
 * 
 * @param object oXmlRpcConfig
 * @param boolean bAsynchronous
 * @param string sListenner
 * @return boolean
 * @since 1.0
 */
AbstractStub.call = function(oXmlRpcConfig, bAsynchronous, sListenner){

	AbstractStub.hasFault = false;
	AbstractStub.faultCode = 0;
	AbstractStub.faultMessage = '';
	
	(bAsynchronous) ? true: false
	var oReturn = null;
	
	/*
	if(window.browser.isFirefox()){
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	}//end if
	*/

	var oRpc = new jtkXMLRPCRequest(oXmlRpcConfig.method, XmlRpcConfig.host, XmlRpcConfig.path, XmlRpcConfig.port);
	oRpc.setUserAgent(XmlRpcConfig.agent);

	if(typeof oXmlRpcConfig.parameters == 'array' || typeof oXmlRpcConfig.parameters == 'object'){
	
		for(var i = 0; i < oXmlRpcConfig.parameters.length; i++){
			oRpc.setParameter(oXmlRpcConfig.parameters[i]);
		}//end for	
	}//end if
	
	AbstractStub.config = null;
	
	oReturn = null;
	
	if(bAsynchronous){
		oRpc.addListener((sListenner) ? sListenner: 'AbstractStub.handler');
		oRpc.execute(bAsynchronous);
	}//end if
	else{
		oRpc.execute();
		oReturn =  AbstractStub.handler(oRpc);
	}//end else

	/*
	if(window.browser.isFirefox()){
		netscape.security.PrivilegeManager.disablePrivilege("UniversalBrowserRead");
	}//end if
	*/
	
	return oReturn;
	
};//end function

/**
 * 
 * @param jtkXMLRPCRequest oRpc
 * @return boolean
 * @since 1.0
 */
AbstractStub.handler = function(oRpc){
		
	switch(oRpc.getState()){
	
		case oRpc.COMPLETED:
		case oRpc.ERROR:
			
			var oResponse = {
						'isFault' : oRpc.isFault(),
						'faultCode' : oRpc.faultCode,
						'faultString' : oRpc.faultString,
						'response' : oRpc.response
			};
			
			return oResponse;
			
		break;
	}//end swicth
	
};//end function

/**
 * 
 * @param string sListenner 
 * @param string sPath
 * @param array aParameters
 * @return Object
 * @since 1.0
 */
AbstractStub.createConfig = function(sMethod, sPath, aParameters){
		
	var oXmlRpcConfig = XmlRpcConfig;
	oXmlRpcConfig.method = sMethod;
	oXmlRpcConfig.path = sPath;
	oXmlRpcConfig.parameters = aParameters;
	
	return oXmlRpcConfig;
	
};//end function