/*
* Create a 3D carousel similar to the popular Flash carousel
*
* @name carousel3d
* @author Kevin Crossman
* @contact kevincrossman@gmail.com
* @version 1.1
* @date Oct 29 2008
* @type jQuery
* @example
*
* * Place icon images inside
*
*
*

*

*

*

*
* * to make image a page link, add class 'link' and set the longdesc attr to a web address
*

*
*
*
* * If using text box, place spans inside and add to house the info when displayed
* * spans should contain content that will be displayed when the icon is clicked
*
*
*
* customize this space for icon 1
* customize this space for icon 2
* customize this space for icon 3
* customize this space for icon 4
*
*
*
*
*
*/
(function($) {
$.fn.extend({
carousel3d: function(options) {
opt = $.extend({},$.carouselSetup.defaults, options); // extend options
$this = $(this);
opt.speed = parseInt(6 - opt.speed);
btnSpeed = Math.round(10 - opt.speed) * $.browser.msie ? 0.01 : 0.2; // original button speed
contSpeed = btnSpeed * $.browser.msie ? 0.01 : 0.01; // original continuous speed
opt.speed = opt.speed * $.browser.msie ? 4500 : 3500; // original mouse speed
$imgs = $('img', $this).hide(); // set variable with carousel images; hide for now
$texts = $('span', $('#carouselText')).hide(); // set variable with carousel text boxes; hide for now
if (opt.textBox && !$texts.size()) alert(' + \'s. . . do not exist. either add them or set textBox option to 0');
items = $imgs.size(); // number of icons in carousel
numSlots = items * opt.padding; // in order for the movement to flow smoothly, there are additional 'slots' in the carousel which the images will pace through
if (opt.padding == 0) opt.padding = 1; // padding must be at least 1
$imgs.each(function(i) { new $.imageSetUp(this, i) }); // setup images
new $.carouselSetup(); // setup carousel
}
});
$.imageSetUp = function(im, _index) {
im.orig_w = $(im).width(), im.orig_h = $(im).height(); // save the original dimensions; used when image is clicked
var w_h = resize( im.orig_w, 128, im.orig_h, 108).split('|'); // calculate w/h of images in carousel
im.h = w_h[1], im.w = w_h[0];
im.slot = _index * opt.padding; // position of the image in the carousel
im.angle = parseInt(( _index * opt.padding ) * (( Math.PI * 2 ) / numSlots )*1000)/1000; // original angle of the image
im.clicked = { // css to animate when image is clicked
top: parseInt(opt.centerY - im.orig_h/3) + 'px',
left: parseInt(opt.centerX - im.orig_w/3) + 'px',
width: im.orig_w + 'px',
height: im.orig_h + 'px'
};
im.animateOn = function(el) { $imgs.fadeOut(700); el.animate( im.clicked, 500 ) }; // hide the carousel
new $.TextBoxSetUp(im, _index); // setup text box
$(im).attr('id', 'pix'+_index).css({position: 'absolute'}); // id will be referenced when moving the image
if ($(im).hasClass('link')) $(im).click( function(){ window.open($(this).attr('longdesc')) } );
else $(im).one('click', clickOn); // bind clickOn to image
};
$.TextBoxSetUp = function(im, _index) {
im.textClicked = { // css to animate when image is clicked
left: opt.centerX - opt.radiusX - im.w + 'px',
top: opt.centerY + 'px',
width: im.w + 'px',
height: im.h + 'px'
};
im.textBoxCss = { // textBox positioning css
top: opt.centerY *0.7 + 'px',
left: opt.centerX - opt.radiusX * 0.9 + 'px'
};
im.textAnimateOn = function(el) {
var msg = '';
if ( !$texts.size() ) msg += ' + \'s. . . do not exist';
else if ( !$('#text').size() ) msg += ' does not exist';
else {
$imgs.fadeOut(700);
el.animate( im.textClicked, 500 );
$('#text')
.css( im.textBoxCss )
.html( $texts.eq(_index).html() )
.fadeIn(700);
}
if (msg) alert( 'Cannot setup text box; ' + msg );
};
};
$.carouselSetup = function() {
var im, _t, _s;
if (opt.control=='buttons') controls();
else if (opt.control=='continuous') rate = btnSpeed *.3;
else $().mousemove(function(e) { rate = (e.pageX - opt.centerX) / opt.speed; });
// javascript Motion Tween by PHILIPPE MAEGERMAN; very similar to tweening in Flash.
// check out the full details at his site: http://jstween.blogspot.com/
t1 = new Tween(new Object(), 'xyz', Tween.regularEaseInOut, 0, 10000, 10000);
t1.onMotionChanged = function(event) {
for (var j=0; j').css({ left: opt.centerX+'px', top: opt.centerY*0.5+'px'}),
left_btn = $('').hover(function(){rate=btnSpeed}, function(){rate=0}),
right_btn = $('').hover(function(){rate=-btnSpeed}, function(){rate=0});
$this.prepend( btns.append( left_btn, right_btn ));
};
function resize(w, max_w, h, max_h) { // resize the images
if (w>max_w || h>max_h) {
var x_ratio = max_w / w;
var y_ratio = max_h / h;
if ((x_ratio * h) < max_h) return max_w + '|' + Math.ceil(x_ratio * h);
else return Math.ceil(y_ratio * w) + '|' + max_h;
}
else return w + '|' + h;
};
function resetAnimations() { // clicked images and text boxes must be repositioned after resizing screen
$imgs.each(function(i) {
this.clicked.left = parseInt(opt.centerX*1 - this.orig_w/2) + 'px';
this.textClicked.left = parseInt(opt.centerX*1 - opt.radiusX*1 - this.w*1) + 'px';
this.textBoxCss.left = parseInt(opt.centerX*1 - opt.radiusX*1) + 'px';
});
};
$(window).resize(function() {
opt.centerX = $this.offset().left+$this.width()/2;
resetAnimations();
});
$.carouselSetup.defaults = {
control: 'continuous', // 'button', 'mouse', or 'continuous' control
//control: 'buttons', // 'button', 'mouse', or 'continuous' control
speed: 2, // speed of mouse or button. use scale of 1-5
radiusX: 310, // x radius of the carousel
radiusY: 58, // y radius of the carousel
centerX: 0, // x position on the screen
// centerY: 405 - normal position
// centerY: 545 - position with coupon banner
centerY: 545, // y position on the screen
perspective: 250, // perspective of the image as it travels around the carousel
padding: 3, // the number of padded items in between each icon.
// the more padding, the more precise the incremental movement,
// however this also create a lot more calculations
// to keep icons evenly spaced, the num of icons should be a multiple of the padding
fadeEffect: 0, // fade icons as cycle to the back of the carousel
textBox: 0 // 1 = display text area for each icon, 0 = no display
};
})(jQuery);