whole_func_string: function (el, ordinal) {
              var $el = $(el);
              var options = $el.data('popupoptions');
              var $wrapper = $('#' + el.id + '_wrapper');
  
              ordinal = ordinal || 0;
  
              // Tooltip type
              if (options.type == 'tooltip') {
                  // TODO: this static assignments should probably be moved to init method
                  $wrapper.css({
                      'position': 'absolute'
                  });
  
                  var $tooltipanchor;
                  if (options.tooltipanchor) {
                      $tooltipanchor = $(options.tooltipanchor);
                  } else if (options.openelement) {
                      $tooltipanchor = $(options.openelement).filter('[data-popup-ordinal="' + ordinal + '"]');
                  } else {
                      $tooltipanchor = $('.' + el.id + opensuffix + '[data-popup-ordinal="' + ordinal + '"]');
                  }
  
                  var linkOffset = $tooltipanchor.offset() || { left: 0, top: 0 };
  
                  // Horizontal position for tooltip
                  if (options.horizontal == 'right') {
                      $wrapper.css('left', linkOffset.left + $tooltipanchor.outerWidth() + options.offsetleft);
                  } else if (options.horizontal == 'leftedge') {
                      $wrapper.css('left', linkOffset.left +  options.offsetleft);
                  } else if (options.horizontal == 'left') {
                      $wrapper.css('right', $window.width() - linkOffset.left  - options.offsetleft);
                  } else if (options.horizontal == 'rightedge') {
                      $wrapper.css('right', $window.width()  - linkOffset.left - $tooltipanchor.outerWidth() - options.offsetleft);
                  } else {
                      $wrapper.css('left', linkOffset.left + ($tooltipanchor.outerWidth() / 2) - ($el.outerWidth() / 2) - parseFloat($el.css('marginLeft')) + options.offsetleft);
                  }
  
                  // Vertical position for tooltip
                  if (options.vertical == 'bottom') {
                      $wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() + options.offsettop);
                  } else if (options.vertical == 'bottomedge') {
                      $wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() - $el.outerHeight() + options.offsettop);
                  } else if (options.vertical == 'top') {
                      $wrapper.css('bottom', $window.height() - linkOffset.top - options.offsettop);
                  } else if (options.vertical == 'topedge') {
                      $wrapper.css('bottom', $window.height() - linkOffset.top - $el.outerHeight() - options.offsettop);
                  } else {
                      $wrapper.css('top', linkOffset.top + ($tooltipanchor.outerHeight() / 2) - ($el.outerHeight() / 2) - parseFloat($el.css('marginTop')) + options.offsettop);
                  }
  
              // Overlay type
              } else if (options.type == 'overlay') {
                  // TODO all static assignments in this block should probably be moved to init method
  
                  // Horizontal position for overlay
                  if (options.horizontal) {
                      $wrapper.css('text-align', options.horizontal);
                  } else {
                      $wrapper.css('text-align', 'center');
                  }
  
                  // Vertical position for overlay
                  if (options.vertical) {
                      $el.css('vertical-align', options.vertical);
                  } else {
                      $el.css('vertical-align', 'middle');
                  }
  
                  if (options.absolute) {
                      $wrapper.css({
                          position: 'absolute',
                          top: window.scrollY
                      });
                  }
  
                  if (!options.background) {
                      $wrapper.css({ 'pointer-events': 'none' });
  
                      // If popup doesnt fit the viewport, and if background doesn't exist, add scrollbar to popup div instead of wrapper
                      if (!options.absolute && !isInViewport(el)) {
                          $el.css('overflow', 'auto');
                          $el[0].style.WebkitOverflowScrolling = 'touch'; // for smooth scrolling in overflow:auto divs in iOS
                          $el.css('max-height', 'calc(100% - ' + $el.css('margin-top') + ' - ' +  $el.css('margin-bottom') + ')');
                      }
                  }
              }
          }
func_code_string: function (el, ordinal) {
              var $el = $(el);
              var options = $el.data('popupoptions');
              var $wrapper = $('#' + el.id + '_wrapper');
  
              ordinal = ordinal || 0;
  
              // Tooltip type
              if (options.type == 'tooltip') {
                  // TODO: this static assignments should probably be moved to init method
                  $wrapper.css({
                      'position': 'absolute'
                  });
  
                  var $tooltipanchor;
                  if (options.tooltipanchor) {
                      $tooltipanchor = $(options.tooltipanchor);
                  } else if (options.openelement) {
                      $tooltipanchor = $(options.openelement).filter('[data-popup-ordinal="' + ordinal + '"]');
                  } else {
                      $tooltipanchor = $('.' + el.id + opensuffix + '[data-popup-ordinal="' + ordinal + '"]');
                  }
  
                  var linkOffset = $tooltipanchor.offset() || { left: 0, top: 0 };
  
                  // Horizontal position for tooltip
                  if (options.horizontal == 'right') {
                      $wrapper.css('left', linkOffset.left + $tooltipanchor.outerWidth() + options.offsetleft);
                  } else if (options.horizontal == 'leftedge') {
                      $wrapper.css('left', linkOffset.left +  options.offsetleft);
                  } else if (options.horizontal == 'left') {
                      $wrapper.css('right', $window.width() - linkOffset.left  - options.offsetleft);
                  } else if (options.horizontal == 'rightedge') {
                      $wrapper.css('right', $window.width()  - linkOffset.left - $tooltipanchor.outerWidth() - options.offsetleft);
                  } else {
                      $wrapper.css('left', linkOffset.left + ($tooltipanchor.outerWidth() / 2) - ($el.outerWidth() / 2) - parseFloat($el.css('marginLeft')) + options.offsetleft);
                  }
  
                  // Vertical position for tooltip
                  if (options.vertical == 'bottom') {
                      $wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() + options.offsettop);
                  } else if (options.vertical == 'bottomedge') {
                      $wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() - $el.outerHeight() + options.offsettop);
                  } else if (options.vertical == 'top') {
                      $wrapper.css('bottom', $window.height() - linkOffset.top - options.offsettop);
                  } else if (options.vertical == 'topedge') {
                      $wrapper.css('bottom', $window.height() - linkOffset.top - $el.outerHeight() - options.offsettop);
                  } else {
                      $wrapper.css('top', linkOffset.top + ($tooltipanchor.outerHeight() / 2) - ($el.outerHeight() / 2) - parseFloat($el.css('marginTop')) + options.offsettop);
                  }
  
              // Overlay type
              } else if (options.type == 'overlay') {
                  // TODO all static assignments in this block should probably be moved to init method
  
                  // Horizontal position for overlay
                  if (options.horizontal) {
                      $wrapper.css('text-align', options.horizontal);
                  } else {
                      $wrapper.css('text-align', 'center');
                  }
  
                  // Vertical position for overlay
                  if (options.vertical) {
                      $el.css('vertical-align', options.vertical);
                  } else {
                      $el.css('vertical-align', 'middle');
                  }
  
                  if (options.absolute) {
                      $wrapper.css({
                          position: 'absolute',
                          top: window.scrollY
                      });
                  }
  
                  if (!options.background) {
                      $wrapper.css({ 'pointer-events': 'none' });
  
                      // If popup doesnt fit the viewport, and if background doesn't exist, add scrollbar to popup div instead of wrapper
                      if (!options.absolute && !isInViewport(el)) {
                          $el.css('overflow', 'auto');
                          $el[0].style.WebkitOverflowScrolling = 'touch'; // for smooth scrolling in overflow:auto divs in iOS
                          $el.css('max-height', 'calc(100% - ' + $el.css('margin-top') + ' - ' +  $el.css('margin-bottom') + ')');
                      }
                  }
              }
          }
func_documentation_string: Reposition method
  
  @param {object} el - popup instance DOM node
  @param {number} ordinal - order number of an `open` element