//rsClient.js -	yl

var sBrowserType = document.all ? "IE" : document.getElementById ? "MOZ" : document.layers ? "NS" : "OTHER";
var oRemoteScriting = null;  
var oRSCDF = null; 

function getService(sServerURL, sMethod, sCallBack, parameters)
{
	if (oRemoteScriting == null) oRemoteScriting = new RSObject(); 
	if (!oRemoteScriting.ready) return;	

	oRemoteScriting.callback = eval(sCallBack);  
	oRemoteScriting.ready = false;
	oRemoteScriting.param = new Array();
	var aTypes = new Array();			
 
	for (var i = 3; i < arguments.length; i++)
	{
		var j = aTypes.length;
		aTypes[j] = typeof arguments[i] == "number" ? "n" : "s";
		oRemoteScriting.param[j] = aTypes[j] == "s" ? escapeReqStr(arguments[i]) : arguments[i];  		
	}

	oRemoteScriting.server = sServerURL + "?method=" + sMethod + (aTypes.length ? ("&p=" + aTypes) : "");	
 	oRemoteScriting.send();
}

function parseRplMsg()
{
	var sBrowser = sBrowserType; 

	try
	{   
		var sRpl = escapeRplStr(window.frames[oRemoteScriting.frame].document.forms['formRSRpl']['Msg'].value); 
		oRemoteScriting.ready = true;
		oRemoteScriting.param = null; 

		if (sBrowser == 'MOZ') oRemoteScriting.callback(sRpl);

		var iSteps = oRemoteScriting.history - window.frames[oRemoteScriting.frame].history.length;   
	
		if (sBrowser == 'IE') iSteps = iSteps < 0 ? iSteps : -1;
		else if (sBrowser == 'MOZ' && oRSCDF == null) iSteps = iSteps < -2 ? -2 : iSteps; 
		else iSteps = 0;	 
		
		if (iSteps < 0) window.frames[oRemoteScriting.frame].history.go(iSteps);
		if (sBrowser == 'IE') oRemoteScriting.callback(sRpl);	
	}
	catch (e) 
	{
//		alert("<parseRplMsg>\n" + e.description);	
	} 
} 

function reportErr(sMsg)
{   
	oRemoteScriting.callback(sMsg);		
	oRemoteScriting.ready = true;
	oRemoteScriting.callback = null;	
	oRemoteScriting.param = null;	
}

function getCDF(sCDFFileURL, oCallBack)
{ 
	if (oRSCDF == null) oRSCDF = new RSObject(); 
	if (!oRSCDF.ready) return;   

	oRSCDF.callback = oCallBack; 
	oRSCDF.ready = false;

	try
	{
	  	switch(sBrowserType) 
	  	{
	    	case 'IE':  
		      	window.frames[oRSCDF.frame].document.location.replace(sCDFFileURL);
		      	break; 
	      	
	    	case 'MOZ':  
				oRSCDF.replace(sCDFFileURL); 
		      	break;
		}  
	}
	catch (e)
	{
//		oRSCDF.error("<getCDF> " + sCDFFileURL + "\n" + e.description); 
	} 
} 

function cdfLoaded()
{   
	try
	{   
		oRSCDF.ready = true;  
		var sRpl = escapeRplStr(window.frames[oRSCDF.frame].document.forms['jsrs_Form']['jsrs_Payload'].value);
		oRSCDF.callback(sRpl); 	 
	}
	catch (e)
	{	
//		alert("<cdfLoaded>\n" + e.description);
	}
} 

function RSObject() 
{  
	RSObject.iIndex++;

	this.span = RSObject.sName + "Span" + RSObject.iIndex;
	this.frame = RSObject.sName + "Frame" + RSObject.iIndex;	
	this.history = history.length;  
	this.ready = true;	
	this.callback = null;
	this.param = null;
	this.server = "";
	this.index = 0; 

	switch (sBrowserType) 
	{
		case 'IE':
			document.body.insertAdjacentHTML("afterBegin", "<span id=" + this.span + " style=display:none></span>");
			this.replace("");
			break;

		case 'MOZ':  
			var span = document.createElement("span"); 
			span.id = this.span;
			span.style.visibility = "hidden"; 
			document.body.appendChild(span); 
			break;
	}	
}

RSObject.sName = "RSObjectName"; //unique id in global scope
RSObject.iIndex = 0;

function RSObject_replace(sURL)
{   
	if (sBrowserType == 'MOZ' && this.index)
	{
		document.getElementById(this.span).innerHTML = "";
		this.frame = RSObject.sName + "Frame" + RSObject.iIndex + "s" + this.index;				
	}
	
	document.getElementById(this.span).innerHTML = "<iframe name=" + this.frame + " width=60 height=10 src='" + sURL + "'></iframe>";  

	if (sBrowserType == 'MOZ') this.index++;
}

RSObject.prototype.replace = RSObject_replace;

function RSObject_send()
{
	switch (sBrowserType) 
	{
		case 'IE':
			var sHTML = '<html><head></head><body><form name=formRS action=' + this.server + ' method=post>';
			for (var i = 0; i < this.param.length; i++) sHTML += '<input type=hidden name=param' + i + '>';
			sHTML += '</form></body></html>';
	
			window.frames[this.frame].document.write(sHTML);
	
			for (i = 0; i < this.param.length; i++)
				eval('window.frames[this.frame].document.formRS.param' + i + '.value = this.param[i];');			
	
			window.frames[this.frame].document.formRS.submit();	
			break;
		
		case 'MOZ':
            this.replace(this.server + "&post=1");
			break;
	}  	
}

RSObject.prototype.send = RSObject_send;

function RSObject_post()
{
 	for (var i = 0; i < this.param.length; i++)
		eval('window.frames[this.frame].document.formRS.param' + i + '.value = this.param[i];');			

	var d = new Date();	
	window.frames[this.frame].document.formRS.action = this.server + "&ts=" + d.getTime();				
	window.frames[this.frame].document.formRS.submit();
}

RSObject.prototype.post = RSObject_post;     

function RSObject_error(sMsg)
{
	this.ready = true;
	this.callback = null;	
	this.param = null;	
	if (sMsg != "") alert(sMsg);
	return sMsg;	
} 

RSObject.prototype.error = RSObject_error;     

function escapeReqStr(s)
{
	return s.replace(/\\/g, "\\\\");
}

function escapeRplStr(s)
{
	var v = s.replace(/\x0D\x0A/g, "\n");	
	return v.replace(/\\\//g, "/");
} 


