AJAX_PRICING_PKG.PricingServiceClient = {

  /**
   * Display pricing data for elements specified by the renderer.
   * @method displayPricing
   * @param {Object} rendereringOptions
   * @param {Int} batchsize Tells us to break the requests into batches of batchsize size.
   */   
  displayPricing: function(renderingOptions, batchsize) {
    if (batchsize && batchsize < 0) throw new Error('Batchsize must be greater than or equal to zero.');

    var containers = this._getDisplayContainers(renderingOptions.containerName);
    this._displayLoadingImage(containers);

    if(batchsize) {
      // Process in batches
      var batchList = new Array();

      DWREngine.beginBatch();
      for (var i = 0; i < containers.length; i++) {
        batchList.push(containers[i]);

        if (i > 0 && i % batchsize == 0) {
          this._fetchAndDisplayPricing(renderingOptions, batchList);
          DWREngine.endBatch();
          DWREngine.beginBatch();
          batchList = new Array();
        }
      }
      this._fetchAndDisplayPricing(renderingOptions, batchList);
      DWREngine.endBatch();
    } else {
      this._fetchAndDisplayPricing(renderingOptions, containers);
    }
  },

  /**
   * Returns the list of containers (DOM elements) that will contain each widget rendered.
   * These containers have an ISBN to pass on to the server when the data is fetched.
   * @method _getDisplayContainers
   * @param {Object} containerName
   * @private
   * @return {Array} pricingDivs that contains the elements into which the pricing will be displayed.
   */
  _getDisplayContainers: function(containerName) {
    var documentDivs = document.getElementsByTagName("div");
    var pricingDivs = new Array();
    for(var i = 0, arrayIndex = 0; i < documentDivs.length; i++) {
      var elname = documentDivs[i].getAttribute("name");
      if (containerName) {
        if (containerName == elname) {
          pricingDivs[arrayIndex] = documentDivs[i];
          arrayIndex++;
        }
      } else {
        if(elname == "pricingService") {
          pricingDivs[arrayIndex] = documentDivs[i];
          arrayIndex++;
        }
      }
    }
    return pricingDivs;
  },

  /**
   * Fetches pricing data from the server and renders the widget according to renderer.displayPricing.
   * @method _fetchAndDisplayPricing
   * @param {Object} rendereringOptions
   * @param {Array} containers An array of the DOM objects into which the pricing will be rendered
   * @private
   */
  _fetchAndDisplayPricing: function(renderingOptions, containers) {
    for (var i = 0; i < containers.length; i++) {
      PricingService.getPricingDataByISBN(containers[i].getAttribute("isbn"), {
        callback:function(response) {
          var renderer = AJAX_PRICING_PKG.PricingRendererFactory.createRenderer(renderingOptions);
          renderer.displayPricing(response);
        },
        errorHandler:function(errorString, exception) {
          AJAX_PRICING_PKG.PricingServiceClient._handleError(errorString, exception);
        }
      });
    }
  },

  _displayLoadingImage: function(containers) {
    for (var i = 0; i < containers.length; i++) {
      var img = new Image();
      img.id = 'image-' + containers[i].id;
      img.src = '/images/Ajax/loading.gif';
      containers[i].appendChild(img);
    }
  },

  _handleError: function(errorString, exception) {}
}