(function($) {

function saveCss() {
  $.data(this, "original_visibility", $(this).css("visibility"));
  $.data(this, "original_position", $(this).css("position"));
  $.data(this, "original_display", $(this).css("display"));
}

function restoreCss() {
  $(this).css({ display: $.data(this, "original_display"), position: $.data(this, "original_position"), visibility: $.data(this, "original_visibility") });
}

$.fn.invisishow = function() {
  return $(this).each(function() {
    saveCss.call(this);
    $(this).css({ display: "block", position: "absolute", visibility: "hidden" });
  });
}

$.fn.invisihide = function() {
  return $(this).each(function() {
    restoreCss.call(this);
  });
}

$.fn.invisifunc = function(callback, timeout) {
  var $this = $(this);
  $this.invisishow();
  callback.call(this);
  if(timeout) {
    setTimeout(function() { $this.invisihide(); }, timeout);
  }
  else {
    $this.invisihide();
  }
  return $this;
}

$.fn.invisiheight = function() {
  var result = null;
  $(this).invisifunc(function() {
    result = $(this).height();
  });
  return result;
}

$.fn.invisiwidth = function() {
  var result = null;
  $(this).invisifunc(function() {
    result = $(this).width();
  });
  return result;
}

})(jQuery);
