9 * @class Roo.bootstrap.TabGroup
10 * @extends Roo.bootstrap.Column
11 * Bootstrap Column class
12 * @cfg {String} navId the navigation id (for use with navbars) - will be auto generated if it does not exist..
13 * @cfg {Boolean} carousel true to make the group behave like a carousel
14 * @cfg {Number} bullets show the panel pointer.. default 0
15 * @cfg {Boolena} autoslide (true|false) auto slide .. default false
16 * @cfg {Number} timer auto slide timer .. default 0 millisecond
19 * Create a new TabGroup
20 * @param {Object} config The config object
23 Roo.bootstrap.TabGroup = function(config){
24 Roo.bootstrap.TabGroup.superclass.constructor.call(this, config);
26 this.navId = Roo.id();
29 Roo.bootstrap.TabGroup.register(this);
33 Roo.extend(Roo.bootstrap.TabGroup, Roo.bootstrap.Column, {
42 getAutoCreate : function()
44 var cfg = Roo.apply({}, Roo.bootstrap.TabGroup.superclass.getAutoCreate.call(this));
46 cfg.cls += ' tab-content';
48 Roo.log('get auto create...............');
51 cfg.cls += ' carousel slide';
54 cls : 'carousel-inner'
57 if(this.bullets > 0 && !Roo.isTouch){
60 cls : 'carousel-bullets',
65 bullets.cls = bullets.cls + ' ' + this.bullets_cls;
68 for (var i = 0; i < this.bullets; i++){
70 cls : 'bullet bullet-' + i
78 cfg.cn[0].cn = bullets;
85 initEvents: function()
87 Roo.log('-------- init events on tab group ---------');
89 if(this.bullets > 0 && !Roo.isTouch){
96 this.el.on("touchstart", this.onTouchStart, this);
102 this.slideFn = window.setInterval(function() {
103 _this.showPanelNext();
109 onTouchStart : function(e, el, o)
111 if(!Roo.isTouch || Roo.get(e.getTarget()).el.hasClass('roo-button-text')){
118 getChildContainer : function()
120 return this.carousel ? this.el.select('.carousel-inner', true).first() : this.el;
124 * register a Navigation item
125 * @param {Roo.bootstrap.NavItem} the navitem to add
127 register : function(item)
129 this.tabs.push( item);
130 item.navId = this.navId; // not really needed..
134 getActivePanel : function()
137 Roo.each(this.tabs, function(t) {
147 getPanelByName : function(n)
150 Roo.each(this.tabs, function(t) {
159 indexOfPanel : function(p)
162 Roo.each(this.tabs, function(t,i) {
163 if (t.tabId == p.tabId) {
172 * show a specific panel
173 * @param {Roo.bootstrap.TabPanel|number|string} panel to change to (use the tabId to specify a specific one)
174 * @return {boolean} false if panel was not shown (invalid entry or beforedeactivate fails.)
176 showPanel : function (pan)
179 Roo.log("waiting for the transitionend");
183 if (typeof(pan) == 'number') {
184 pan = this.tabs[pan];
186 if (typeof(pan) == 'string') {
187 pan = this.getPanelByName(pan);
189 if (pan.tabId == this.getActivePanel().tabId) {
192 var cur = this.getActivePanel();
194 if (false === cur.fireEvent('beforedeactivate')) {
198 if(this.bullets > 0 && !Roo.isTouch){
199 this.setActiveBullet(this.indexOfPanel(pan));
202 if (this.carousel && typeof(Roo.get(document.body).dom.style.transition) != 'undefined') {
204 this.transition = true;
205 var dir = this.indexOfPanel(pan) > this.indexOfPanel(cur) ? 'next' : 'prev';
206 var lr = dir == 'next' ? 'left' : 'right';
207 pan.el.addClass(dir); // or prev
208 pan.el.dom.offsetWidth; // find the offset with - causing a reflow?
209 cur.el.addClass(lr); // or right
213 cur.el.on('transitionend', function() {
214 Roo.log("trans end?");
216 pan.el.removeClass([lr,dir]);
219 cur.el.removeClass([lr]);
220 cur.setActive(false);
222 _this.transition = false;
224 }, this, { single: true } );
229 cur.setActive(false);
235 showPanelNext : function()
237 var i = this.indexOfPanel(this.getActivePanel());
239 if (i >= this.tabs.length - 1 && !this.autoslide) {
243 if (i >= this.tabs.length - 1 && this.autoslide) {
247 this.showPanel(this.tabs[i+1]);
250 showPanelPrev : function()
252 var i = this.indexOfPanel(this.getActivePanel());
254 if (i < 1 && !this.autoslide) {
258 if (i < 1 && this.autoslide) {
259 i = this.tabs.length;
262 this.showPanel(this.tabs[i-1]);
265 initBullet : function()
273 for (var i = 0; i < this.bullets; i++){
274 var bullet = this.el.select('.bullet-' + i, true).first();
280 bullet.on('click', (function(e, el, o, ii, t){
286 if(_this.autoslide && _this.slideFn){
287 clearInterval(_this.slideFn);
288 _this.slideFn = window.setInterval(function() {
289 _this.showPanelNext();
293 }).createDelegate(this, [i, bullet], true));
297 setActiveBullet : function(i)
303 Roo.each(this.el.select('.bullet', true).elements, function(el){
304 el.removeClass('selected');
307 var bullet = this.el.select('.bullet-' + i, true).first();
313 bullet.addClass('selected');
324 Roo.apply(Roo.bootstrap.TabGroup, {
328 * register a Navigation Group
329 * @param {Roo.bootstrap.NavGroup} the navgroup to add
331 register : function(navgrp)
333 this.groups[navgrp.navId] = navgrp;
337 * fetch a Navigation Group based on the navigation ID
338 * if one does not exist , it will get created.
339 * @param {string} the navgroup to add
340 * @returns {Roo.bootstrap.NavGroup} the navgroup
342 get: function(navId) {
343 if (typeof(this.groups[navId]) == 'undefined') {
344 this.register(new Roo.bootstrap.TabGroup({ navId : navId }));
346 return this.groups[navId] ;