/** * @class: JVTabs * @description: Display contents in tabs * @version: 1.0 */ var JVTabs = new Class({ options: { width: '100%', tabsHandler: 'jv-tabs-handler', tabsContainer: 'jv-tabs-container', currentTabsHandlerClass: 'jv-tabs-handler-selected', currentTabsContentClass: 'jv-tabs-content-selected', currentIndex: 0, autoRun: 0, ajax: 0, ajaxMethod: 'get', ajaxUrl: '', direction: 1, forceWaiting: 0, fx: 'showHide', transition: Fx.Transitions.Expo.easeInOut, duration: 1000, timer: null, tabTimer: 5000, container: null, handlers: null, contents: null }, initialize: function(selector, options){ this.setOptions(options); this.initTabs(selector); }, initTabs: function(selector){ var that = this; var selector = $(selector); if(!selector) return; selector.setStyles({ 'width': that.options.width }); that.options.handlers = selector.getElement('.' + that.options.tabsHandler).getChildren(); if(!that.options.handlers.length) return; that.options.currentIndex = Math.min(that.options.currentIndex, that.options.handlers.length - 1); that.options.container = selector.getElement('.' + that.options.tabsContainer); that.fx = new Fx.Styles(that.options.container, { duration: that.options.duration, transition: that.options.transition, link: 'ignore' }); that.options.contents = that.options.container.getChildren(); if(that.options.fx == 'slideWidth'){ that.options.contents.each(function(content, index){ content.setStyle('position', 'absolute'); content.setStyle('left', -1 * content.getSize().size.x); }); } else if(that.options.fx == 'slideHeight'){ that.options.contents.each(function(content, index){ content.setStyle('position', 'absolute'); content.setStyle('top', -1 * content.getSize().size.y); }); } else if(that.options.fx == 'fade'){ that.options.contents.each(function(content, index){ content.setStyles({ 'position': 'absolute', 'top': 0, 'opacity': 0 }); }); } else{ that.options.fx = 'showHide'; that.options.contents.each(function(content, index){ content.setStyles({ 'position': 'absolute', 'top': 0, 'display': 'none' }); }); } that.options.handlers.each(function(handler, index){ if(handler.hasClass(that.options.currentTabsHandlerClass)){ that.options.currentIndex = index; } handler.removeEvents('click').addEvent('click', function(e){ if(e) new Event(e).stop(); if(!that.options.forceWaiting){ if(that.options.ajax == 1 && !this.ajaxcalled){ if(this.req) this.req.cancel(); this.req = new Ajax(that.options.ajaxUrl + this.getElement('a').className, { method: that.options.ajaxMethod, onRequest: function(){ if(!handler.getElement('.loader')){ new Element('img', {'class': 'loader', src: 'plugins/system/jvtabs/images/loader.gif'}).inject(handler.getElement('a')); } handler.getElement('.loader').removeClass('hidden'); }, onComplete: function(response){ handler.getElement('.loader').addClass('hidden'); that.options.contents[index].setHTML(response); handler.ajaxcalled = true; handler.fireEvent('click'); } }).request(); return; } if(that.options.autoRun == 1){ $clear(that.options.timer); that.options.timer = that[that.options.fx].periodical(that.options.tabTimer, that, null); } that[that.options.fx](index); } }); }); if(that.options.ajax == 1){ that.options.autoRun = 0; that.options.handlers[that.options.currentIndex].fireEvent('click'); } else{ that[that.options.fx](that.options.currentIndex); } if(that.options.autoRun == 1){ that.options.timer = that[that.options.fx].periodical(that.options.tabTimer, that, null); } }, slideWidth: function(index){ var that = this; var currentContent = that.options.contents[that.options.currentIndex]; var currentHandler = that.options.handlers[that.options.currentIndex]; if($defined(index)){ if(that.options.currentIndex != index){ if(that.options.currentIndex > index){ that.options.direction = 0; } else{ that.options.direction = 1; } that.options.currentIndex = index; } } else{ that.findTab(); } var newContent = that.options.contents[that.options.currentIndex]; if(that.options.direction == 0){ var currentX = that.options.container.getSize().size.x; var newX = (-1 * newContent.getSize().size.x); } else{ var currentX = (-1 * that.options.container.getSize().size.x); var newX = newContent.getSize().size.x; } var newHandler = that.options.handlers[that.options.currentIndex]; newHandler.addClass(that.options.currentTabsHandlerClass); var contentShow = new Fx.Styles(newContent, { duration: that.options.duration, transition: that.options.transition, link: 'ignore', onStart: function(){ that.options.forceWaiting = true; }, onComplete: function(){ that.options.forceWaiting = false; } }); contentShow.start({ 'left': [0], 'opacity': [0, 1] }); that.fx.start({ 'height': [currentContent.getCoordinates().height, newContent.getCoordinates().height] }); newContent.addClass(that.options.currentTabsContentClass); if(currentContent != newContent){ var contentHide = new Fx.Styles(currentContent, { duration: that.options.duration, transition: that.options.transition, link: 'ignore' }); currentHandler.removeClass(that.options.currentTabsHandlerClass); contentHide.start({ 'left': [currentX], 'opacity': [1, 0] }); currentContent.removeClass(that.options.currentTabsContentClass); } }, slideHeight: function(index){ var that = this; var currentContent = that.options.contents[that.options.currentIndex]; var currentHandler = that.options.handlers[that.options.currentIndex]; if($defined(index)){ if(that.options.currentIndex != index){ if(that.options.currentIndex > index){ that.options.direction = 0; } else{ that.options.direction = 1; } that.options.currentIndex = index; } } else{ that.findTab(); } var newContent = that.options.contents[that.options.currentIndex]; if(that.options.direction == 0){ var currentY = that.options.container.getSize().size.y; var newY = (-1 * newContent.getSize().size.y); } else{ var currentY = (-1 * that.options.container.getSize().size.y); var newY = newContent.getSize().size.y; } var newHandler = that.options.handlers[that.options.currentIndex]; newHandler.addClass(that.options.currentTabsHandlerClass); var contentShow = new Fx.Styles(newContent, { duration: that.options.duration, transition: that.options.transition, link: 'ignore', onStart: function(){ that.options.forceWaiting = true; }, onComplete: function(){ that.options.forceWaiting = false; } }); contentShow.start({ 'top': [0], 'opacity': [0, 1] }); that.fx.start({ 'height': [currentContent.getCoordinates().height, newContent.getCoordinates().height] }); newContent.addClass(that.options.currentTabsContentClass); if(currentContent != newContent){ var contentHide = new Fx.Styles(currentContent, { duration: that.options.duration, transition: that.options.transition, link: 'ignore' }); currentHandler.removeClass(that.options.currentTabsHandlerClass); contentHide.start({ 'top': [0, -currentY], 'opacity': [1, 0] }); currentContent.removeClass(that.options.currentTabsContentClass); } }, fade: function(index){ var that = this; var currentContent = that.options.contents[that.options.currentIndex]; var currentHandler = that.options.handlers[that.options.currentIndex]; if($defined(index)){ if(that.options.currentIndex != index){ that.options.currentIndex = index; } } else{ that.findTab(); } var newContent = that.options.contents[that.options.currentIndex]; var newHandler = that.options.handlers[that.options.currentIndex]; newHandler.addClass(that.options.currentTabsHandlerClass); var contentShow = new Fx.Styles(newContent, { duration: that.options.duration, transition: that.options.transition, link: 'ignore', onStart: function(){ that.options.forceWaiting = true; }, onComplete: function(){ that.options.forceWaiting = false; } }); contentShow.start({ 'opacity': [0, 1] }); that.fx.start({ 'height': [currentContent.getCoordinates().height, newContent.getCoordinates().height] }); newContent.addClass(that.options.currentTabsContentClass); if(currentContent != newContent){ var contentHide = new Fx.Styles(currentContent, { duration: that.options.duration, transition: that.options.transition, link: 'ignore' }); currentHandler.removeClass(that.options.currentTabsHandlerClass); contentHide.start({ 'opacity': [1, 0] }); currentContent.removeClass(that.options.currentTabsContentClass); } }, showHide: function(index){ var that = this; var currentContent = that.options.contents[that.options.currentIndex]; var currentHandler = that.options.handlers[that.options.currentIndex]; if($defined(index)){ if(that.options.currentIndex != index){ that.options.currentIndex = index; } } else{ that.findTab(); } var newContent = that.options.contents[that.options.currentIndex]; var newHandler = that.options.handlers[that.options.currentIndex]; newHandler.addClass(that.options.currentTabsHandlerClass); newContent.setStyle('display', ''); that.fx.start({ 'height': [currentContent.getCoordinates().height, newContent.getCoordinates().height] }); newContent.addClass(that.options.currentTabsContentClass); if(currentContent != newContent){ currentHandler.removeClass(that.options.currentTabsHandlerClass); currentContent.setStyle('display', 'none'); currentContent.removeClass(that.options.currentTabsContentClass); } }, findTab: function(){ var that = this; var len = that.options.contents.length; if(that.options.direction == 1){ if(that.options.currentIndex < len - 1){ that.options.currentIndex++; } else{ that.options.currentIndex = 0; } } else{ if(that.options.currentIndex > 0){ that.options.currentIndex--; } else{ that.options.currentIndex = len - 1; } } } }); JVTabs.implement(new Events, new Options);