//<SCRIPT language="JavaScript">
/**
 * This module is for use by the remote scripting architecture developed by Erik Hatcher.
 * Please refer to http://www.ehatchersolutions.com/rs for more information on its use.
 *
 * Author: Erik Hatcher
 */

// "Private" variables (use the set methods defined below to assign values to these variables)
var _rsmsg_method = "";
var _rsmsg_params = "";
var _rsmsg_usingJavaScript = true;
var _rsmsg_usingJSRS = true;
var _rsmsg_url = "";
var _rsmsg_timeout = 10;
var _rsmsg_timerOn = false;

// Used internally
var _rsmsg_timer = null;

// "Public" methods
function rsmsg_setURL (url)
{
  _rsmsg_url = url;
}

function rsmsg_setMethod (method)
{
  _rsmsg_method = method;
}

function rsmsg_setParams(rsmsg_params) {
	_rsmsg_params = rsmsg_params;
}

function rsmsg_getParams() {
	return _rsmsg_params;
}

function rsmsg_stop()
{
  _rsmsg_timerOn = false;
  window.clearTimeout(_rsmsg_timer);
}

function rsmsg_start()
{
  _rsmsg_timerOn = true;
  _getMessages();
}

function rsmsg_start_after_interval()
{
  _rsmsg_timerOn = true;
  _setTimer();
}

function rsmsg_useJSRS (b)
{
  _rsmsg_usingJSRS = b;
}

function rsmsg_useJavaScriptFormat (b)
{
  _rsmsg_usingJavaScript = b;
}

function rsmsg_setInterval (seconds)
{
  _rsmsg_timeout = seconds;
}

/*
 * Method overloading to allow a Message object to respond to the same method that an XML element does.
 * @param name The attribute name to retrieve a value for
 */
function getAttribute(name)
{
  return this.attributes[name];
}

/**
 * Client-side encapsulation of message data
 */
function Message(name, text, attrs)
{
  this.nodeName = name;
  this.text = text;
  this.attributes = attrs;
  this.getAttribute = getAttribute;
  
  var txml = "<" + name + " ";
  for (var i in attrs) {
    txml += i + "=\"" + attrs[i] + "\" ";
  }
  txml += ">";
  txml += text;
  txml += "</" + name + ">";
  
  this.xml = txml;
}

/**
 * Method overloading to allow the Messages object to behave like IE5's XML DOM
 */
function nextNode()
{
  var retNode = null;
  if (this.curNode < this.messages.length)
    retNode = this.messages[this.curNode++];
    
  return retNode;
}

/**
 * Encapsulation of a collection of messages
 * @param messages An array of Message objects
 */
function Messages(messages)
{
  this.curNode = 0;
  this.messages = messages;
  this.nextNode = nextNode;
}

/**
 * Invokes processMessage for each message in the collection of messages.
 *
 * @param str The set of returned messages, either in evaluatable JavaScript or XML
 */
function _processMessages(str) {
  var msgs = null;
  if (_rsmsg_usingJavaScript) {
    msgs = eval(str);
  } else {
    if (!rsxml.XMLDocument.loadXML(str)) {
      alert ("Data load failed");
      return;
    }
      
    msgs = rsxml.XMLDocument.documentElement.childNodes;
  }

  if (msgs == null) return;
  
  for (var msg=msgs.nextNode(); msg; msg=msgs.nextNode()) {
    rsmsg_processMessage(msg);
  }
}

/**
 * Wrapper to pull the actual messages from MSRS's call object
 * @param co call object containing returned messages
 */
function _processMessagesMSRS (co)
{
  _processMessages(co.return_value);
}

/**
 * Resets the getMessages timer.  This method relies on the implementation of the getTimeout method to return
 * the number of seconds interval.
 */
function _setTimer()
{
  // this is in case a stop was done while messages were being retrieved
  if (!_rsmsg_timerOn) return;
  
  // don't set the timer if we don't have a number
  if (isNaN(_rsmsg_timeout)) return;

  // _rsmsg_timeout is in seconds, timers use milliseconds
  rsmsg_timer = window.setTimeout(_getMessages, _rsmsg_timeout * 1000);
}

/**
 * Invokes the remote scripting method.
 */
function _getMessages(){ 
  var params = rsmsg_getParams();
  var method = _rsmsg_method + ((_rsmsg_usingJavaScript) ? "_JavaScript" : "_XML");
  if (_rsmsg_usingJSRS) {
    // JSRS
    jsrsExecute(_rsmsg_url, _processMessages, method, params);
  } else {
    // MSRS
    var e = "RSExecute(_rsmsg_url, method";
    if (params != null) {
      for (var i=0; i < params.length; i++) {
        e += ", '" + params[i] + "'";
      }
    }
    e += ", _processMessagesMSRS);";
    eval(e);
  }
  
  //reset timer
  _setTimer();
}

//</SCRIPT>

