topical media & game development 
  
 
 
 
 
  
    
    
  
 lib-jquery-plugin-captify-captify.js / js
  /* jQuery Captify Plugin
  * 
  * Copyright (C) 2008 Brian Reavis
  * Licenced under the MIT license
  *
  * 
  */
  jQuery.fn.extend({
          captify: function(o) {
                  var o = this = img;
                                  if (this.hasInit) {
                                          return false;
                                  }
                                  this.hasInit = true;
                                  var over_caption = false;
                                  var over_img = false;
  
                                  //pull the label from another element if there is a 
                                  //valid element id inside the rel="..." attribute, otherwise,
                                  //just use the text in the alt="..." attribute.
                                  var captionLabelSrc = $('#' + this.attr('rel'));
                                  var captionLabelHTML = !captionLabelSrc.length ? this.attr('alt') : captionLabelSrc.html();
                                  captionLabelSrc.remove();
                                  var toWrap = this.parent && this.parent.tagName == 'a' ? this.parent : this;
                                  var wrapper = toWrap.wrap('<div></div>').parent();
                                  wrapper.css({
                                          overflow: 'hidden',
                                          padding: 0,
                                          fontSize: 0.1
                                  })
                                  wrapper.addClass('caption-wrapper');
                                  wrapper.width(this.width());
                                  wrapper.height(this.height());
  
                                  //transfer the margin and border properties from the image to the wrapper
                                  .map(['style', 'width', 'color'], function(j) {
                                                  var key = 'border-' + i + '-' + j;
                                                  wrapper.css(key, img.css(key));
                                          });
                                  });
                                  img.css({ border: '0 none' });
  
                                  //create two consecutive divs, one for the semi-transparent background,
                                  //and other other for the fully-opaque label
                                  var caption = $('div:last', wrapper.append('<div></div>')).addClass(o.className);
                                  var captionContent = $('div:last', wrapper.append('<div></div>')).addClass(o.className).append(o.prefix).append(captionLabelHTML);
  
                                  //override hiding from CSS, and reset all margins (which could have been inherited)
                                  $('*', wrapper).css({ margin: 0 }).show();
  
                                  //ensure the background is on bottom
                                  var captionPositioning = jQuery.browser.msie ? 'static' : 'relative';
                                  caption.css({
                                          zIndex: 1,
                                          position: captionPositioning,
                                          opacity: o.animation == 'fade' ? 0 : o.opacity,
                                          width: o.spanWidth
                                  });
  
                                  if (o.position == 'bottom'){
                                          var vLabelOffset = parseInt(caption.css('border-top-width').replace('px', '')) + parseInt(captionContent.css('padding-top').replace('px', '')) - 1;
                                          captionContent.css('paddingTop', vLabelOffset);
                                  }
                                  //clear the backgrounds/borders from the label, and make it fully-opaque
                                  captionContent.css({
                                          position: captionPositioning,
                                          zIndex: 2,
                                          background: 'none',
                                          border: '0 none',
                                          opacity: o.animation == 'fade' ? 0 : 1,
                                          width: o.spanWidth
                                  });
                                  caption.width(captionContent.outerWidth());
                                  caption.height(captionContent.height());
  
                                  // represents caption margin positioning for hide and show states
                                  var topBorderAdj = (o.position == 'bottom' && jQuery.browser.msie) ? -4 : 0;
                                  var captionPosition = (o.position == 'top')
                                     ? { hide: -img.height() - caption.outerHeight() - 1, show: -img.height() }
                                     : { hide: 0, show: -caption.outerHeight() + topBorderAdj };
                                  
                                  //pull the label up on top of the background
                                  captionContent.css('marginTop', -caption.outerHeight());
                                  caption.css('marginTop', captionPosition[o.animation == 'fade' || o.animation == 'always-on' ? 'show' : 'hide']);
                                  
                                  //function to push the caption out of view
                                  var cHide = function() {
                                          if (!over_caption && !over_img){
                                                  var props = o.animation == 'fade'
                                                          ? { opacity: 0 }
                                                          : { marginTop: captionPosition.hide };
                                                  caption.animate(props, o.speedOut);
                                                  if (o.animation == 'fade'){
                                                          captionContent.animate({opacity: 0}, o.speedOver);
                                                  }
                                          }
                                  };
  
                                  if (o.animation != 'always-on'){
                                          //when the mouse is over the image
                                          this.hover(
                                                  function() {
                                                          over_img = true;
                                                          if (!over_caption) {
                                                                  var props = o.animation == 'fade'
                                                                          ? { opacity: o.opacity }
                                                                          : { marginTop: captionPosition.show };
                                                                  caption.animate(props, o.speedOver);
                                                                  if (o.animation == 'fade'){
                                                                          captionContent.animate({opacity: 1}, o.speedOver/2);
                                                                  }
                                                          }
                                                  },
                                                  function() {
                                                          over_img = false;
                                                          window.setTimeout(cHide, o.hideDelay);
                                                  }
                                          );
                                          //when the mouse is over the caption on top of the image (the caption is a sibling of the image)
                                          $('div', wrapper).hover(
                                                  function() { over_caption = true; },
                                                  function() { over_caption = false; window.setTimeout(cHide, o.hideDelay); }
                                          );
                                  }
                          });
                          //if the image has already loaded (due to being cached), force the load function to be called
                          if (this.complete || this.naturalWidth > 0) {
                                  img.trigger('load');
                          }
                  });
          }
  });
  
  
(C) Æliens 
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher. 
In case of other copyright issues, contact the author.