Ext.define('Ext.ux.InfiniteCarousel', { extend: 'Ext.Carousel', xtype: 'infinitecarousel', config: { indicator: false }, initConfig: function(){ var me = this; me.callParent(arguments); me.delay = me.config.delay; delete me.config; }, initialize: function(){ var me = this; me.callParent(); var isEven = function(nb){ return (nb%2 == 0) ? true : false; }; me.nbItems = me.getItems().length; me.interval = (isEven(me.nbItems) ? me.nbItems/2 : (me.nbItems-1)/2); me.setActiveItem(me.interval); me.on('activeitemchange', me.onActiveItemChange, me); if(me.delay > 0) me.timeout = Ext.defer(me.rotate, me.delay, me); }, onActiveItemChange: function(c,v,ov){ var me = this; if (me.timeout){ clearTimeout(me.timeout); me.timeout = Ext.defer(me.rotate, me.delay, me); } var active = c.getActiveIndex(), direction = (c.getItems().indexOf(v) > c.getItems().indexOf(ov)) ? 'forward' : 'backward', container = (direction=='forward') ? c.getAt(active-me.interval-1) : c.getAt(active+me.interval+1); c.remove(container, false); (direction=='forward') ? c.add(container) : c.insert(0,container); }, rotate: function(){ this.next(); } });