﻿// callback pool needs global scope
var msrsContextPoolSize = 0;
var msrsContextMaxPool = 10;
var msrsContextPool = new Array();
var msrsBrowser = check_browser();
var msrsPOST = false;
var msrsVisibility = false;

// constructor for context object
function msrsContextObj( contextID ){
  // properties
  this.id = contextID;
  this.busy = true;
  this.callback = null;
  this.errorcallback = null;
  this.context = null;
  this.container = contextCreateContainer( contextID );
  this.request = null;  
  // methods
  this.GET = contextGET;
  this.POST = contextPOST;
  this.setVisibility = contextSetVisibility;
}

//  method functions are not privately scoped 
//  because Netscape's debugger chokes on private functions
function contextCreateContainer( containerName ){
  // creates hidden container to receive server data 
  var container;
  switch( msrsBrowser ) {
    case 'NS':
      container = new Layer(100);
      container.id = containerName;
      container.name = containerName;
      container.visibility = 'hidden';
      container.clip.width = 100;
      container.clip.height = 100;
      break;
    
    case 'IE':
      document.body.insertAdjacentHTML( "afterBegin", '<span id="SPAN' + containerName + '"></span>' );
      var span = document.all( "SPAN" + containerName );
      var html = '<iframe id="' + containerName + '" onload="contextLoaded(this,this.contentWindow.document)" name="' + containerName + '" src=""></iframe>';
      span.style.display = 'none';
      span.innerHTML = html;
      container = window.frames[ containerName ];
      break;
      
    case 'MOZ':  
      var span = document.createElement('SPAN');
      span.id = "SPAN" + containerName;
      document.body.appendChild( span );
      var iframe = document.createElement('IFRAME');
      iframe.id = containerName;
      iframe.onload = function() { contextLoaded(this,this.contentWindow.document); };
      iframe.name = containerName;
      span.appendChild( iframe );
      container = iframe;
      break;
  }
  return container;
}

function contextPOST( rsPage, func, parms ){
  var d = new Date();
  var unique = d.getTime() + '' + Math.floor(1000 * Math.random());
  
  var doc = (msrsBrowser == "IE" ) ? this.container.document : this.container.contentDocument;
  this.container.inrequest = true;
  doc.open();
  doc.write('<html><body>');
  doc.write('<form name="msrsForm" method="post" target=""');
  doc.write(' action="' + rsPage + '?U=' + unique + '">');
  doc.write('<input type="hidden" name="C" value="' + this.id + '">');

  // write the method to call and parameters as hidden form inputs
  if (func != null){
    doc.write('<input type="hidden" name="_method" value="' + func + '">');
    if (parms != null || parms.length == 0){
		// assume parms is array of strings
		for( var i=0; i < parms.length; i++ ){
			doc.write( '<input type="hidden" name="p' + i + '" '
                   + 'value="' + rsEscape(parms[i]+'') + '">');
		}
		doc.write( '<input type="hidden" name="pcount" '
                   + 'value="' + parms.length + '">');
    } else {
		doc.write( '<input type="hidden" name="pcount" '
                   + 'value="0">');
    } // parms
  } // func

  doc.write('</form></body></html>');
  doc.close();
  doc.forms['msrsForm'].submit();
}

function contextGET( rsPage, func, parms ){
  // build URL to call
  var URL = rsPage;
  // always send context
  URL += "?C=" + this.id;
  if (func != null){
	URL += "&_method=" + escape(func);
	if (parms != null || parms.length == 0){
		// assume parms is array of strings
		for( var i=0; i < parms.length; i++ ){
			URL += "&p" + i + "=" + rsEscape(parms[i]+'') + "";
		}
		URL += "&pcount=" + parms.length;
    } else {
		URL += "&pcount=0";
    } // parms
  } // func

  // unique string to defeat cache
  var d = new Date();
  URL += "&U=" + d.getTime();
  // make the call
  switch( msrsBrowser ) {
    case 'NS':
      this.container.src = URL;
      break;
    case 'IE':
      this.container.document.location.replace(URL);
      break;
    case 'MOZ':
      this.container.src = '';
      this.container.src = URL;
      break;
  }  
  
}

function contextSetVisibility( vis ){
  switch( msrsBrowser ) {
    case 'NS':
      this.container.visibility = (vis)? 'show' : 'hidden';
      break;
    case 'IE':
      document.all("SPAN" + this.id ).style.display = (vis)? '' : 'none';
      break;
    case 'MOZ':
      document.getElementById("SPAN" + this.id).style.visibility = (vis)? '' : 'hidden';
      this.container.width = (vis)? 250 : 0;
      this.container.height = (vis)? 100 : 0;
      break;
  }  
}

// end of context constructor

function msrsGetContextID(){
  var contextObj;
  for (var i = 1; i <= msrsContextPoolSize; i++){
    contextObj = msrsContextPool[ 'msrs' + i ];
    if ( !contextObj.busy ){
      contextObj.busy = true;      
      return contextObj.id;
    }
  }
  // if we got here, there are no existing free contexts
  if ( msrsContextPoolSize <= msrsContextMaxPool ){
    // create new context
    var contextID = "msrs" + (msrsContextPoolSize + 1);
    msrsContextPool[ contextID ] = new msrsContextObj( contextID );
    msrsContextPoolSize++;
    return contextID;
  } else {
    alert( "msrs Error:  context pool full" );
    return null;
  }
}
function RSpostExecute( rspage, method ) {
  var contextObj = msrsContextPool[ msrsGetContextID() ];
  // get parameters
  var parameters = new Array();	
  var callback = null;
  var errorcallback = null;
  var context = null;
  var asynchronous = false;  // this is still being tested
  var finishedParameters = false;
  var length = RSpostExecute.arguments.length;
  var arg;
  for (var n=2; n < length; n++) {
    arg = RSpostExecute.arguments[n];
	if (typeof(arg) == 'function') {
	  asynchronous = true;
	  finishedParameters = true;
	  if (callback == null) {
	    callback = arg; 
	  } else {
	    errorcallback = arg; 
	    break;
	  }
	} else if (!finishedParameters) {
		parameters[parameters.length] = arg;
	} else {
		context = arg;
	}
  }
  
  // assign callbacks and context
  contextObj.callback = callback;
  contextObj.errorcallback = errorcallback;
  contextObj.context = context;

  // set visible if set
  contextObj.setVisibility( msrsVisibility );
  
  contextObj.POST( rspage, method, parameters );
  
  return contextObj.id;
}
function RSExecute( rspage, method ) {
  // get pooling context
  var contextObj = msrsContextPool[ msrsGetContextID() ];
  // get parameters
  var parameters = new Array();	
  var callback = null;
  var errorcallback = null;
  var context = null;
  var asynchronous = false;  // this is still being tested
  var finishedParameters = false;
  var length = RSExecute.arguments.length;
  var arg;
  for (var n=2; n < length; n++) {
    arg = RSExecute.arguments[n];
	if (typeof(arg) == 'function') {
	  asynchronous = true;
	  finishedParameters = true;
	  if (callback == null) {
	    callback = arg; 
	  } else {
	    errorcallback = arg; 
	    break;
	  }
	} else if (!finishedParameters) {
		parameters[parameters.length] = arg;
	} else {
		context = arg;
	}
  }
  
  // assign callbacks and context
  contextObj.callback = callback;
  contextObj.errorcallback = errorcallback;
  contextObj.context = context;

  // set visible if set
  contextObj.setVisibility( msrsVisibility );

  if (msrsPOST && ((msrsBrowser == 'IE') || (msrsBrowser == 'MOZ'))){
    contextObj.POST( rspage, method, parameters );
  } else {
    contextObj.GET( rspage, method, parameters );
  }  
  
  return contextObj.id;
}

function rsEscape(t){
  t=t.replace(/\+/g,"%C2%2B").replace(/\"/g,"%C2%22").replace(/\«/g,"%C2%AB").replace(/\»/g,"%C2%BB");
  return escape(t);
}

function contextLoaded(container,d) {
	
	if(d.forms['msrsForm'])
	    return false;
	var contextObj = msrsContextPool[ container.id ];
	var request = new RSCallObject();
	request.d = d;
	request.context = contextObj.context;
	evalRequest(request);
	contextObj.request = request;
	if (request.status != MSRS_INVALID) {
		if (request.status == MSRS_FAIL)
		{	
			if (typeof(contextObj.error_callback) == 'function')
			{
				contextObj.error_callback(request);
			}
			else 
			{
				alert(request.message);
			}
		}
		else
		{
			if (typeof(contextObj.callback) == 'function')
			{
				contextObj.callback(request);
			}
		}	
		// clean up and return context to pool
		contextObj.callback = null;
		contextObj.busy = false;
	}
}


//*****************************************************************
// Constants from rs.htm for MSRS
//*****************************************************************
var MSRS_FAIL = -1;
var MSRS_COMPLETED = 0;
var MSRS_PENDING = 1;
var MSRS_PARTIAL = 2;
var MSRS_INVALID = 3;

function evalRequest(request)
{
    var me = request.d.getElementById('MESSAGE');
    var er = request.d.getElementById('ERROR');
    var rf = request.d.getElementById('REFRESH');
    var fc = request.d.getElementById('FOCUS');
    if(me){alert(me.innerHTML);}
    if(rf)
    {
        location=rf.innerHTML.replace("&amp;","&");
    }else if(er){
        request.f = true; 
        request.status = MSRS_FAIL;
        request.message = unescape(er.innerHTML);
    }else{
        var dv = request.d.getElementById('CONTENT');
        if(dv){
            request.a = dv.title.split('|');
        }
    }
    if(fc){request.f = true;}
}	

function RSCallObject()
{
	this.status = MSRS_PENDING;
	this.message = '';
//	this.data = '';
	this.return_value = '';
	this.context = null;
	this.d = null;
	this.a = new Array;
	this.f = false;
}
