I am creating a tab plugin. I want to know if there is a better way of doing this or if what I have is good. It works just fine, but there may be some shortcuts or a more optimized way of accomplishing this. I plan to replace the startTab variable with an options set, but I am not quite there yet. Thanks! [View the current updated version here][1] Here is what I have so far: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <style> ul.tabNavigation { list-style: none; margin: 0; padding: 0; } ul.tabNavigation li { display: inline; } ul.tabNavigation li a { text-decoration: none; color:#000; } .tabViews { width: 100%; border: #8db2e3 solid 1px; clear:both; height:18px; margin-top: -12px; background: url(css/tabs/images/tabs_Lower_Header_Background.png) repeat-x; } .tab { height: 25px; font-family:'Trebuchet MS', Arial, Helvetica, sans-serif; font-size:14px; float:left; padding-left: 4px; position: relative; top: 1px } .tab .right { float:left; background:url(css/tabs/images/tab_Selected_Right.png) no-repeat; height:25px; width: 8px; } .tab .content { float:left; background:url(css/tabs/images/tab_Selected_Content.png) repeat-x; height:25px; text-align: center; padding-left: 5px; padding-right: 5px; padding-top: 4px; } .tab .left { float:left; background:url(css/tabs/images/tab_Selected_Left.png) no-repeat; height:25px; width: 6px; } .tabHover { height: 25px; font-family:'Trebuchet MS', Arial, Helvetica, sans-serif; font-size:14px; float:left; padding-left: 4px; position: relative; top: 1px; cursor: pointer; } .h1 { float:left; height:25px; width: 14px; } .h2 { float:left; height:25px; text-align: center; padding-left: 7px; padding-right: 5px; padding-top: 4px; } .h3 { float:left; height:25px; width: 10px; } .tabHover:hover .h1 { background:url(css/tabs/images/tab_Hover_Right.png) no-repeat; } .tabHover:hover .h2 { background:url(css/tabs/images/tab_Hover_Content.png) repeat-x; } .tabHover:hover .h3 { background:url(css/tabs/images/tab_Hover_Left.png) no-repeat; } </style> <script type="text/javascript" src="javascript/jquery/jquery.js"></script> <script> $.fn.tabs = function(startTab){ //Set currentIndex var currentIndex = 0; //Get all tab views var tabViews = $('.tabViews > div',$(this)); //Current tab container var tabsContainer = $(this); //Hide all tabView containers tabViews.hide(); //Get all tabs var $tabs = $('ul > li', tabsContainer); $tabs.each(function(index){ $('a',$(this)).click(function(){ changeTab(index); }); }); //call the changeTab method for the first time and selected the starting tab. changeTab(startTab); function changeTab(selectedIndex){ if(selectedIndex != currentIndex){ switchClass(selectedIndex); var previousSelectedTab = $('a',$tabs[currentIndex]); var currentSelectedTab = $('a',$tabs[selectedIndex]); $(previousSelectedTab.attr('href')).hide(); $(currentSelectedTab.attr('href')).show(); currentIndex = selectedIndex; } } //Method to switch the calles for selected and non selected tabs. function switchClass(selectedIndex){ $tabs.each(function(index){ //Get Child Left, Content, right divs var classBuilder = $('div > div',$(this)) //Current Selected Tab if(index == selectedIndex){ var tabContainer = $('a > div',$(this)) tabContainer.removeClass('tabHover'); tabContainer.addClass('tab'); $(classBuilder[0]).removeClass('h3'); $(classBuilder[0]).addClass('left'); $(classBuilder[1]).removeClass('h2'); $(classBuilder[1]).addClass('content'); $(classBuilder[2]).removeClass('h1'); $(classBuilder[2]).addClass('right'); } //Previously selected tab if(index == currentIndex){ var tabContainer = $('a > div',$(this)) tabContainer.removeClass('tab'); tabContainer.addClass('tabHover'); $(classBuilder[0]).removeClass('left'); $(classBuilder[0]).addClass('h3'); $(classBuilder[1]).removeClass('content'); $(classBuilder[1]).addClass('h2'); $(classBuilder[2]).removeClass('right'); $(classBuilder[2]).addClass('h1'); } }); } } $(function() { $('#rfiTabs').tabs(0); }); </script> </head> <body> <div id="rfiTabs"> <ul class="tabNavigation"> <li><a href="#rfiBasic"> <div class="tab"> <div class="left"></div> <div class="content">Basic</div> <div class="right"></div> </div> </a></li> <li><a href="#rfiHome"> <div class="tabHover"> <div style="" class="h3"></div> <div style="" class="h2">Home</div> <div class="h1"></div> </div> </a></li> </ul> <div class="tabViews" style=""> <div id="rfiBasic">Test</div> <div id="rfiHome">test this</div> </div> </div> </body> </html> Update: I realized I can optimize the left, content, and center part of the tabs by updating the CSS and Jquery for the hover section: .tabHover .right { float:left; height:25px; width: 14px; } .tabHover .content { float:left; height:25px; text-align: center; padding-left: 7px; padding-right: 5px; padding-top: 4px; } .tabHover .left { float:left; height:25px; width: 10px; } .tabHover:hover .right { background:url(css/tabs/images/tab_Hover_Right.png) no-repeat; } .tabHover:hover .content { background:url(css/tabs/images/tab_Hover_Content.png) repeat-x; } .tabHover:hover .left { background:url(css/tabs/images/tab_Hover_Left.png) no-repeat; } function switchClass(selectedIndex){ $tabs.each(function(index){ //Get Child Lef, Content, right divs var classBuilder = $('div > div',$(this)) if(index == selectedIndex){ var tabContainer = $('a > div',$(this)) tabContainer.removeClass('tabHover'); tabContainer.addClass('tab'); //$(classBuilder[0]).removeClass('h3'); // $(classBuilder[0]).addClass('left'); // $(classBuilder[1]).removeClass('h2'); // $(classBuilder[1]).addClass('content'); // $(classBuilder[2]).removeClass('h1'); // $(classBuilder[2]).addClass('right'); } if(index == currentIndex){ var tabContainer = $('a > div',$(this)) tabContainer.removeClass('tab'); tabContainer.addClass('tabHover'); //$(classBuilder[0]).removeClass('left'); // $(classBuilder[0]).addClass('h3'); // $(classBuilder[1]).removeClass('content'); // $(classBuilder[1]).addClass('h2'); // $(classBuilder[2]).removeClass('right'); // $(classBuilder[2]).addClass('h1'); } }); } Update 2: Here is further optimized code as suggessted by jcubic: <script> $.fn.tabs = function (startTab) { //Set currentIndex var currentIndex = 0; //Get all tab views var tabViews = $('.tabViews > div', $(this)); //Hide all tabView containers tabViews.hide(); //Get all tabs var $tabs = $('ul > li', $(this)); $tabs.each(function (index) { $('a', $(this)).click(function () { changeTab(index); }); }); changeTab(startTab); function changeTab(selectedIndex) { if (selectedIndex != currentIndex) { switchClass(selectedIndex); var previousSelectedTab = $('a', $tabs[currentIndex]); var currentSelectedTab = $('a', $tabs[selectedIndex]); $(previousSelectedTab.attr('href')).hide(); $(currentSelectedTab.attr('href')).show(); currentIndex = selectedIndex; } } function switchClass(selectedIndex) { $tabs.eq(selectedIndex).find('a > div').removeClass('tabHover').addClass('tab'); $tabs.eq(currentIndex).find('a > div').removeClass('tab').addClass('tabHover'); } return this; } $(function () { $('#rfiTabs').tabs(1); }); </script> </head> <body> <div id="rfiTabs"> <ul class="tabNavigation"> <li><a href="#rfiBasic" title="Basic"> <div class="tab"> <div class="left"></div> <div class="content">Basic</div> <div class="right"></div> </div> </a></li> <li><a href="#rfiHome" title="Home"> <div class="tabHover"> <div style="" class="left"></div> <div style="" class="content">Home</div> <div class="right"></div> </div> </a></li> </ul> <div class="tabViews" style=""> <div id="rfiBasic" class="tabView">This is the Basic Tab View</div> <div id="rfiHome" class="tabView">This is the Home Tab View</div> </div> </div> </body> [1]: http://www.mail-apps.com/tabplugin/TabPluginWorkFile.html