// Verb functions are actions taken driven by the returned JSON.

var replaceBlock = function (block, content) {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'replaceBlock',page:document.location} );
  $(block).innerHTML = content;
  Behavior.apply();
}

var addMessage = function (type, content) {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'addMessage',page:document.location} );
  message = DIV({'class': 'message ' + type});
  message.innerHTML = content;
  replaceChildNodes($('feedbackMessages'), message);
}

var refreshPage = function (page) {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'refreshPage',page:document.location} );
  var d = MochiKit.Async.wait(1, page);
  d.addCallback(function (page) {
    window.location = page;
  });
}

// END verb functions


var callbackCount = 0; // This is the counter to see how many callbacks are still open.

var makeCallback = function (url, params) {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'makeCallback',page:document.location} );
  var req = MochiKit.Async.getXMLHttpRequest();
  req.open("POST", url, true);
  req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  req.setRequestHeader('Accept', 'application/json');

  var d = MochiKit.Async.sendXMLHttpRequest(req, params);
  d.addCallbacks(processControl, processError);


  callbackCount += 1;
  setStatusIndicator();
}

var processControl = function (transport) {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'processControl',page:document.location} );
  message = evalJSON(transport.responseText);
  if (!Array.prototype.isPrototypeOf(message)) {
    message = new Array(message);
  }
  forEach (message, function (message) {
    processControlMsg(message);
  });

  callbackCount -= 1;
  setStatusIndicator();
}

var processError = function (transport) {

  if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'processError',page:document.location} );
  message = {}
  message.command = 'error';
  message.content = '<p>There was an error connecting to the server. Please refresh your browser.</p>';
  processControlMsg(message);

  callbackCount -= 1;
  setStatusIndicator();
}

var processControlMsg = function (message) {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'processControlMsg',page:document.location} );
  switch(message.command) {
    case 'replace':
      // replace block
      replaceBlock(message.block, message.content);
      break;
    case 'refresh':
      // send to a new page
      refreshPage(message.content);
      break;
    case 'success':
    case 'information':
    case 'error':
      // add message to message block
      addMessage(message.command, message.content);
      break;
    default:
      // error
      addMessage('error', message.content);
      break;
  }
}

var setStatusIndicator = function () {
    if (typeof $L != 'undefined') $L.trace( 'deprecatedJsFunctionCall', {file:'module_framework.js',func:'setStatusIndicator',page:document.location} );
  var indicator = $('statusIndicator');

  if (indicator != null) {

    if (callbackCount > 0) {
      if (hasElementClass(indicator, "invisible")) {
        removeElementClass(indicator, "invisible");
        document.getElementsByTagName('body')[0].style.cursor = 'progress';
      }
    } else {
      if (!hasElementClass(indicator, "invisible")) {
        addElementClass(indicator, "invisible");
        document.getElementsByTagName('body')[0].style.cursor = 'auto';
      }
    }

  }
}
