var DWRHandler = function ()
{
  var viewUpdateBeanLookup = {};

  var appDataAttributes = {};

  var startWait = function()
  {

  };

  var endWait = function()
  {

  };

  var isFunction = function(checkFunction)
  {
    return checkFunction != null && typeof(checkFunction) == 'function';
  };

  var process = function(dwrResult)
  {
    if(dwrResult.success)
    {
      var updateBeans = dwrResult.updateBeans;
      for(var i = 0; i < updateBeans.length; i++)
      {
        var updateBean = updateBeans[i];
        var beanName = updateBean.beanName;
        var updateFunction = viewUpdateBeanLookup[beanName];

        if(updateFunction == null)
        {
          alert('DWRHandler: Missing update function for bean with name "' + beanName + '"');
        }
        else
        {
          updateFunction(updateBean);
        }
      }
    }
    else
    {
      var message = dwrResult.message;
      if(message == null)
      {
        message = 'DWRHandler: AJAX Operation failed';
      }
      alert('Error: ' + message);
    }

    endWait();
  };

  var copyArguments = function (array)
  {
    var copy = [];
    for(var i = 1; i < array.length; i++)
    {
      copy.push(array[i]);
    }
    if (appDataAttributes)
    {
      copy.push({
                callback:process,
                parameters:appDataAttributes
               });
    }
    else
    {
       copy.push({
                 callback:process
                });
    }
    return copy;
  };

  return {
    registerAppData: function (appData)
    {
      appDataAttributes = appData;
    },
    registerUpdateFunction: function (beanName, updateFunction)
    {
      if(beanName == null || beanName.length == 0)
      {
        alert('DWRHandler: Illegal or missing view update bean name: "' + beanName + '"');
      }
      else if(isFunction(updateFunction))
      {
        viewUpdateBeanLookup[beanName] = updateFunction;
      }
      else
      {
        alert('DWRHandler: Illegal view update function argument: "' + updateFunction + '"');
      }
    },
    executeDWRService: function(service)
    {
      startWait();

      service.apply(this, copyArguments(arguments));
    },
    setStartWait: function(startWaitFunction)
    {
      if(isFunction(startWaitFunction))
      {
        startWait = startWaitFunction;
      }
      else
      {
        alert('DWRHandler: Illegal start function argument: "' + startWaitFunction + '"');
      }
    },
    setEndWait: function(endWaitFunction)
    {
      if(isFunction(endWaitFunction))
      {
        startWait = endWaitFunction;
      }
      else
      {
        alert('DWRHandler: Illegal end function argument: "' + endWaitFunction + '"');
      }
    }
  };
}();
