text: /**
   * Generate the node required for user display length changing
   *  @param {object} oSettings dataTables settings object
   *  @returns {node} Display length feature node
   *  @memberof DataTable#oApi
   */
  function _fnFeatureHtmlLength(oSettings) {
      if (oSettings.oScroll.bInfinite) {
          return null;
      }
  
      /* This can be overruled by not using the _MENU_ var/macro in the language variable */
      var sName = 'name="' + oSettings.sTableId + '_length"';
      var sStdMenu = '<select size="1" ' + sName + '>';
      var i, iLen;
      var aLengthMenu = oSettings.aLengthMenu;
  
      if (aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' &&
          typeof aLengthMenu[1] === 'object') {
          for (i = 0, iLen = aLengthMenu[0].length; i < iLen; i++) {
              sStdMenu += '<option value="' + aLengthMenu[0][i] + '">' + aLengthMenu[1][i] + '</option>';
          }
      }
      else {
          for (i = 0, iLen = aLengthMenu.length; i < iLen; i++) {
              sStdMenu += '<option value="' + aLengthMenu[i] + '">' + aLengthMenu[i] + '</option>';
          }
      }
      sStdMenu += '</select>';
  
      var nLength = document.createElement('div');
      if (!oSettings.aanFeatures.l) {
          nLength.id = oSettings.sTableId + '_length';
      }
      nLength.className = oSettings.oClasses.sLength;
      nLength.innerHTML = '<label>' + oSettings.oLanguage.sLengthMenu.replace('_MENU_', sStdMenu) + '</label>';
  
      /*
       * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
       * and Stefan Skopnik for fixing the fix!
       */
      $('select option[value="' + oSettings._iDisplayLength + '"]', nLength).attr("selected", true);
  
      $('select', nLength).bind('change.DT', function (e) {
          var iVal = $(this).val();
  
          /* Update all other length options for the new display */
          var n = oSettings.aanFeatures.l;
          for (i = 0, iLen = n.length; i < iLen; i++) {
              if (n[i] != this.parentNode) {
                  $('select', n[i]).val(iVal);
              }
          }
  
          /* Redraw the table */
          oSettings._iDisplayLength = parseInt(iVal, 10);
          _fnCalculateEnd(oSettings);
  
          /* If we have space to show extra rows (backing up from the end point - then do so */
          if (oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay()) {
              oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
              if (oSettings._iDisplayStart < 0) {
                  oSettings._iDisplayStart = 0;
              }
          }
  
          if (oSettings._iDisplayLength == -1) {
              oSettings._iDisplayStart = 0;
          }
  
          _fnDraw(oSettings);
      });
  
  
      $('select', nLength).attr('aria-controls', oSettings.sTableId);
  
      return nLength;
  }
  
  
  /**
   * Recalculate the end point based on the start point
   *  @param {object} oSettings dataTables settings object
   *  @memberof DataTable#oApi
   */
  function _fnCalculateEnd(oSettings) {
      if (oSettings.oFeatures.bPaginate === false) {
          oSettings._iDisplayEnd = oSettings.aiDisplay.length;
      }
      else {
          /* Set the end point of the display - based on how many elements there are
           * still to display
           */
          if (oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
              oSettings._iDisplayLength == -1) {
              oSettings._iDisplayEnd = oSettings.aiDisplay.length;
          }
          else {
              oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
          }
      }
  }
  
  