BufferControl = function (newId, newMapObject, newMapId, newResultTarget)
{
  if (arguments.length > 0)
    this.init(newId, newMapObject, newMapId, newResultTarget);
};

BufferControl.prototype = new Object();
BufferControl.constructor = BufferControl;
BufferControl.superclass = Object.prototype;
 
BufferControl.prototype.init = function (newId, newMapObject, newMapId, newResultTarget)
{
  this.id = newId;
  if (newMapId!=null)
  {
    this.mapObject = OBJECT_MANAGER.getControl(newMapId);
    this.mapId = newMapId;
  }
  else
  {
    this.mapObject = newMapObject;
    this.mapId = newMapObject.id;
  }
  
  this.mapObject.bufferControl = this;
  this.resultTarget = newResultTarget;
  this.activeTheme = '';
  this.activeSelection = '';
  this.buffers = new Object;

  this.bufferConfig = new Object;
  this.activeQuery = null;          //currently active buffer query (if any)
  this.bufferRadioButtonGroup = null;
  this.enabled = false;
  
  this.lastThemeBuffered = '';
  this.currentBufferCount = 0;
};

BufferControl.prototype.initialize = function(bufferableThemes)
{
  //argument is an array of all bufferable theme ids in the map
  this.enabled = (bufferableThemes.length > 0);
  for (var i = 0; i < bufferableThemes.length; i++)
    this.buffers[bufferableThemes[i]] = null;
};

BufferControl.prototype.getSQLParams = function()
{
  return null;
  //check to see if a query panel is active.
  if (this.activeQuery != null)
  {
    var queryIndex = this.activeQuery.queryId;
    var dataPairs = this.activeQuery.getDataPairs();
    var sqlParams = new Array(this.activeQuery.queryConfig.request.pdqIdentifier,dataPairs);
  }
  else
    var sqlParams = null;
  return (sqlParams);
};

BufferControl.prototype.convertUnits = function(dist, srcUnits, destUnits)
{
  return convertDistance(dist,srcUnits,destUnits);
};

BufferControl.prototype.hasBufferedResults = function()
{
  // switch to this.buffers[...] loop check?
  return(this.currentBufferCount > 0);
};

BufferControl.prototype.clearAllBuffers = function()
{
  if (!this.hasBufferedResults())  // one buffer at a time
    return;  // nothing to do
  //clear the buffer form and local data.
  for (var currentBufferTheme in this.buffers){
    if(currentBufferTheme=='toJSONString')continue;
    this.buffers[currentBufferTheme] = null;
  }
  this.resultTarget.innerHTML = '';
  this.currentBufferCount = 0;
  if (this.onBufferClear)
    this.onBufferClear();
};

BufferControl.prototype.callback = function(serverReplyDoc, pendingOperation)
{
  this.mapObject.setWaiting(false);
  if (!validateXMLDoc(serverReplyDoc))
    return null;
  var clientReply = new XMLRPCResponse();
  clientReply.setResponseByDoc(serverReplyDoc);
  if(clientReply.isFault())
  {
    switch (parseInt(clientReply.getFaultCode()))
    {
      case 1018:  //no results found
        this.mapObject.callback(serverReplyDoc,pendingOperation[0]); //no elements found...
        this.mapObject.redraw();
        var templateName = this.mapObject.config.themes[pendingOperation[1]].bufferOptions.invalidTemplate;
        var templateData = new Array();
        templateData[0] = new Array();
        var source = document.getTemplate(templateName);
        this.buffers[pendingOperation[1]] = null;  //remove buffer handle...
        this.resultTarget.innerHTML = source.run(templateData);
        this.currentBufferCount = 0;
        if (this.onBufferDisplay)
          this.onBufferDisplay();
        break;
      default:
        alert(this.id+'.callback:  clientReply fault:\n\n'+clientReply.getFaultCode()+'\n'+clientReply.getFaultString());
        this.mapObject.callback(serverReplyDoc,pendingOperation[0]); //no elements found...
        break;
    };
  }
  else
    var data = clientReply.getObject();
  if (data != null)
  {
    switch (pendingOperation[0])
    {
      case 'BufferXY':
      case 'BufferOnSelection':
        this.lastThemeBuffered = pendingOperation[1];
        var templateName = this.mapObject.config.themes[pendingOperation[1]].bufferOptions.resultTemplate;
        this.buffers[pendingOperation[1]] = Array(data[1],data[2]);  //handle, queryData
        this.currentBufferCount = data[2].length;
        var templateData = data[2];
        var templateSpecialRequests = Array();
        /* Check to see if this theme wants to export the buffer data to CSV */
        if (this.mapObject.config.themes[pendingOperation[1]].bufferOptions['export'].csv.enabled==true)
          templateSpecialRequests["includeExportBufferToCSV"] = true;

        var source = document.getTemplate(templateName,false,templateSpecialRequests);
        this.resultTarget.innerHTML = source.run(templateData);
        this.mapObject.callback(serverReplyDoc,'BufferXY');
        if (this.onBufferDisplay)
          this.onBufferDisplay();
        break;
      case 'clearThemeBuffer':
        this.buffers[pendingOperation[1]] = null;
        this.currentBufferCount = 0;
        this.mapObject.callback(serverReplyDoc,'clearThemeBuffer');
        if (this.onBufferClear)
          this.onBufferClear();
        break;
      case 'Exporter.toCSV':
      case 'Exporter.toXML':
        this.mapObject.setWaiting(false);
        var url = data;
        downloadFile(url);
        break;
    };
  }
};

