2 * Interface Elements for jQuery
5 * http://interface.eyecon.ro
7 * Copyright (c) 2006 Stefan Petre
8 * Dual licensed under the MIT (MIT-LICENSE.txt)
9 * and GPL (GPL-LICENSE.txt) licenses.
13 * Created a 3D Carousel from a list of images, with reflections and animated by mouse position
15 * @example window.onload =
18 * $('#carousel').Carousel(
31 * <a href="" title=""><img src="" width="100%" /></a>
32 * <a href="" title=""><img src="" width="100%" /></a>
33 * <a href="" title=""><img src="" width="100%" /></a>
34 * <a href="" title=""><img src="" width="100%" /></a>
35 * <a href="" title=""><img src="" width="100%" /></a>
42 * background-color: #111;
53 * @desc Creates a 3D carousel from all images inside div tag with id 'carousel'
57 * @description Created a 3D Carousel from a list of images, with reflections and animated by mouse position
58 * @param Hash hash A hash of parameters
59 * @option String items items selection
60 * @option Integer itemWidth the max width for each item
61 * @option Integer itemHeight the max height for each item
62 * @option Integer itemMinWidth the minimum width for each item, the height is automaticaly calculated to keep proportions
63 * @option Float rotationSpeed the speed for rotation animation
64 * @option Float reflectionSize the reflection size a fraction from items' height
67 * @cat Plugins/Interface
68 * @author Stefan Petre
72 build : function(options)
78 var increment = 2*Math.PI/360;
79 var maxRotation = 2*Math.PI;
80 if(jQuery(el).css('position') != 'relative' && jQuery(el).css('position') != 'absolute') {
81 jQuery(el).css('position', 'relative');
84 items : jQuery(options.items, this),
85 itemWidth : options.itemWidth,
86 itemHeight : options.itemHeight,
87 itemMinWidth : options.itemMinWidth,
88 maxRotation : maxRotation,
89 size : jQuery.iUtil.getSize(this),
90 position : jQuery.iUtil.getPosition(this),
92 rotationSpeed : options.rotationSpeed,
93 reflectionSize : options.reflections,
95 protectRotation : false,
96 increment: 2*Math.PI/360
98 el.carouselCfg.radiusX = (el.carouselCfg.size.w - el.carouselCfg.itemWidth)/2;
99 el.carouselCfg.radiusY = (el.carouselCfg.size.h - el.carouselCfg.itemHeight - el.carouselCfg.itemHeight * el.carouselCfg.reflectionSize)/2;
100 el.carouselCfg.step = 2*Math.PI/el.carouselCfg.items.size();
101 el.carouselCfg.paddingX = el.carouselCfg.size.w/2;
102 el.carouselCfg.paddingY = el.carouselCfg.size.h/2 - el.carouselCfg.itemHeight * el.carouselCfg.reflectionSize;
103 var reflexions = document.createElement('div');
107 position: 'absolute',
113 jQuery(el).append(reflexions);
118 image = jQuery('img', this).get(0);
119 height = parseInt(el.carouselCfg.itemHeight*el.carouselCfg.reflectionSize);
120 if (jQuery.browser.msie) {
121 canvas = document.createElement('img');
122 jQuery(canvas).css('position', 'absolute');
123 canvas.src = image.src;
124 canvas.style.filter = 'flipv progid:DXImageTransform.Microsoft.Alpha(opacity=60, style=1, finishOpacity=0, startx=0, starty=0, finishx=0)';
127 canvas = document.createElement('canvas');
128 if (canvas.getContext) {
129 context = canvas.getContext("2d");
130 canvas.style.position = 'absolute';
131 canvas.style.height = height +'px';
132 canvas.style.width = el.carouselCfg.itemWidth+'px';
133 canvas.height = height;
134 canvas.width = el.carouselCfg.itemWidth;
137 context.translate(0,height);
144 el.carouselCfg.itemWidth,
150 context.globalCompositeOperation = "destination-out";
151 var gradient = context.createLinearGradient(
158 gradient.addColorStop(1, "rgba(255, 255, 255, 1)");
159 gradient.addColorStop(0, "rgba(255, 255, 255, 0.6)");
161 context.fillStyle = gradient;
162 if (navigator.appVersion.indexOf('WebKit') != -1) {
168 el.carouselCfg.itemWidth,
175 el.carouselCfg.reflections[nr] = canvas;
176 jQuery(reflexions).append(canvas);
183 el.carouselCfg.protectRotation = true;
184 el.carouselCfg.speed = el.carouselCfg.increment*0.1 * el.carouselCfg.speed / Math.abs(el.carouselCfg.speed);
192 el.carouselCfg.protectRotation = false;
196 jQuery.iCarousel.positionItems(el);
197 el.carouselCfg.speed = el.carouselCfg.increment*0.2;
198 el.carouselCfg.rotationTimer = window.setInterval(
201 el.carouselCfg.start += el.carouselCfg.speed;
202 if (el.carouselCfg.start > maxRotation)
203 el.carouselCfg.start = 0;
204 jQuery.iCarousel.positionItems(el);
213 el.carouselCfg.speed = el.carouselCfg.increment*0.2 * el.carouselCfg.speed / Math.abs(el.carouselCfg.speed);
220 if (el.carouselCfg.protectRotation == false) {
221 pointer = jQuery.iUtil.getPointer(e);
222 mousex = el.carouselCfg.size.w - pointer.x + el.carouselCfg.position.x;
223 el.carouselCfg.speed = el.carouselCfg.rotationSpeed * el.carouselCfg.increment * (el.carouselCfg.size.w/2 - mousex) / (el.carouselCfg.size.w/2);
231 positionItems : function(el)
233 el.carouselCfg.items.each(
236 angle = el.carouselCfg.start+nr*el.carouselCfg.step;
237 x = el.carouselCfg.radiusX*Math.cos(angle);
238 y = el.carouselCfg.radiusY*Math.sin(angle) ;
239 itemZIndex = parseInt(100*(el.carouselCfg.radiusY+y)/(2*el.carouselCfg.radiusY));
240 parte = (el.carouselCfg.radiusY+y)/(2*el.carouselCfg.radiusY);
242 width = parseInt((el.carouselCfg.itemWidth - el.carouselCfg.itemMinWidth) * parte + el.carouselCfg.itemMinWidth);
243 height = parseInt(width * el.carouselCfg.itemHeight / el.carouselCfg.itemWidth);
244 this.style.top = el.carouselCfg.paddingY + y - height/2 + "px";
245 this.style.left = el.carouselCfg.paddingX + x - width/2 + "px";
246 this.style.width = width + "px";
247 this.style.height = height + "px";
248 this.style.zIndex = itemZIndex;
249 el.carouselCfg.reflections[nr].style.top = parseInt(el.carouselCfg.paddingY + y + height - 1 - height/2) + "px";
250 el.carouselCfg.reflections[nr].style.left = parseInt(el.carouselCfg.paddingX + x - width/2) + "px";
251 el.carouselCfg.reflections[nr].style.width = width + "px";
252 el.carouselCfg.reflections[nr].style.height = parseInt(height * el.carouselCfg.reflectionSize) + "px";
257 jQuery.fn.Carousel = jQuery.iCarousel.build;