Object.extend(Position, {
  
  // Centers the given element in the viewport. Can center either vertically or horizontally; defaults to both.
  centerInViewport: function(el, options) {
    options = Object.extend({
      vertical: true,
      horizontal: true
    }, options || {});
    
    // Get original position
    el = $(el);
    Position.absolutize(el);
    var initial_position = Position.page(el);
    var viewport_dims = Position.viewportDimensions();
    var element_dims = el.getDimensions();
    if(element_dims.width == 0 && element_dims.height == 0) {
      element_dims = el.down().getDimensions();
    }
    
    // Calculate offsets
    var offset_x = 0;
    var correct_x = (viewport_dims[0] - element_dims.width) / 2;
    if(options.horizontal)
      offset_x = correct_x - initial_position[0];
    
    var offset_y = 0;
    var correct_y = (viewport_dims[1] - element_dims.height) / 2;
    if(options.vertical)
      offset_y = correct_y - initial_position[1];
    
    // Apply offsets
    var old_left = parseInt(el.style.left);
    var old_top = parseInt(el.style.top);
    el.style.left = old_left + offset_x + "px";
    el.style.top = old_top + offset_y + "px";
  },
  
  viewportDimensions: function() {
    return [
      self.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth),
      self.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight)
    ];
  }
  
});