ellisgl

Untitled

Nov 28th, 2011
370
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * idtabs - jQuery EasyUI
  3.  *
  4.  * Licensed under the GPL:
  5.  *   http://www.gnu.org/licenses/gpl.txt
  6.  *
  7.  * Copyright 2011 ellisgl
  8.  */
  9. (function($)
  10. {
  11.     // get the left position of the tab element
  12.     function getTabLeftPosition(container, tab)
  13.     {
  14.         var w = 0;
  15.         var b = true;
  16.  
  17.         $('>div.tabs-header ul.tabs li', container).each(function()
  18.         {
  19.             if(this == tab)
  20.             {
  21.                 b = false;
  22.             }
  23.  
  24.             if(b == true)
  25.             {
  26.                 w += $(this).outerWidth(true);
  27.             }
  28.         });
  29.  
  30.         return w;
  31.     }
  32.  
  33.     // get the max tabs scroll width(scope)
  34.     function getMaxScrollWidth(container)
  35.     {
  36.         var header    = $('>div.tabs-header', container);
  37.         var tabsWidth = 0;    // all tabs width
  38.  
  39.         $('ul.tabs li', header).each(function()
  40.         {
  41.             tabsWidth += $(this).outerWidth(true);
  42.         });
  43.  
  44.         var wrapWidth = $('.tabs-wrap', header).width();
  45.         var padding   = parseInt($('.tabs', header).css('padding-left'));
  46.  
  47.         return tabsWidth - wrapWidth + padding;
  48.     }
  49.  
  50.     // set the tabs scrollers to show or not,
  51.     // dependent on the tabs count and width
  52.     function setScrollers(container)
  53.     {
  54.         var header    = $('>div.tabs-header', container);
  55.         var tabsWidth = 0;
  56.  
  57.         $('ul.tabs li', header).each(function()
  58.         {
  59.             tabsWidth += $(this).outerWidth(true);
  60.         });
  61.  
  62.         if(tabsWidth > header.width())
  63.         {
  64.             $('.tabs-scroller-left', header).css('display', 'block');
  65.             $('.tabs-scroller-right', header).css('display', 'block');
  66.             $('.tabs-wrap', header).addClass('tabs-scrolling');
  67.  
  68.             if($.boxModel == true)
  69.             {
  70.                 $('.tabs-wrap', header).css('left',2);
  71.             }
  72.             else
  73.             {
  74.                 $('.tabs-wrap', header).css('left',0);
  75.             }
  76.  
  77.             var width = header.width()
  78.                       - $('.tabs-scroller-left', header).outerWidth()
  79.                       - $('.tabs-scroller-right', header).outerWidth();
  80.  
  81.             $('.tabs-wrap', header).width(width);
  82.          }
  83.          else
  84.          {
  85.             $('.tabs-scroller-left', header).css('display', 'none');
  86.             $('.tabs-scroller-right', header).css('display', 'none');
  87.             $('.tabs-wrap', header).removeClass('tabs-scrolling').scrollLeft(0);
  88.             $('.tabs-wrap', header).width(header.width());
  89.             $('.tabs-wrap', header).css('left',0);
  90.         }
  91.     }
  92.  
  93.     // set size of the tabs container
  94.     function setSize(container)
  95.     {
  96.         var opts   = $.data(container, 'tabs').options;
  97.         var cc     = $(container);
  98.  
  99.         if(opts.fit == true)
  100.         {
  101.             var p       = cc.parent();
  102.             opts.width  = p.width();
  103.             opts.height = p.height();
  104.         }
  105.  
  106.         cc.width(opts.width).height(opts.height);
  107.  
  108.         var header = $('>div.tabs-header', container);
  109.  
  110.         if($.boxModel == true)
  111.         {
  112.             var delta = header.outerWidth() - header.width();
  113.  
  114.             //header.width(cc.width() - delta);
  115.         }
  116.         else
  117.         {
  118.            // header.width(cc.width());
  119.         }
  120.  
  121.         setScrollers(container);
  122.  
  123.         var panels = $('>div.tabs-panels', container);
  124.         var height = opts.height;
  125.  
  126.         if(!isNaN(height))
  127.         {
  128.             if($.boxModel == true)
  129.             {
  130.                 var delta = panels.outerHeight() - panels.height();
  131.  
  132.                 panels.css('height', (height - header.outerHeight() - delta) || 'auto');
  133.             }
  134.             else
  135.             {
  136.                 panels.css('height', height - header.outerHeight());
  137.             }
  138.         }
  139.         else
  140.         {
  141.             panels.height('auto');
  142.         }
  143.  
  144.         var width = opts.width;
  145.  
  146.         if(!isNaN(width))
  147.         {
  148.             if($.boxModel == true)
  149.             {
  150.                 var delta = panels.outerWidth() - panels.width();
  151.  
  152.                 panels.width(width - delta);
  153.             }
  154.             else
  155.             {
  156.                 panels.width(width);
  157.             }
  158.         }
  159.         else
  160.         {
  161.             panels.width('auto');
  162.         }
  163.  
  164.         if($.parser)
  165.         {
  166.             $.parser.parse(container);
  167.         }
  168.     }
  169.  
  170.     /**
  171.      * make the selected tab panel fit layout
  172.      */
  173.     function fitContent(container)
  174.     {
  175.         var tab = $('>div.tabs-header ul.tabs li.tabs-selected', container);
  176.  
  177.         if(tab.length)
  178.         {
  179.             var panelId = $.data(tab[0], 'tabs.tab').id;
  180.             var panel   = $('#'+panelId);
  181.             var panels  = $('>div.tabs-panels', container);
  182.  
  183.             if(panels.css('height').toLowerCase() != 'auto')
  184.             {
  185.                 if($.boxModel == true)
  186.                 {
  187.                     panel.height(panels.height() - (panel.outerHeight()-panel.height()));
  188.                     panel.width(panels.width() - (panel.outerWidth()-panel.width()));
  189.                 }
  190.                 else
  191.                 {
  192.                     panel.height(panels.height());
  193.                     panel.width(panels.width());
  194.                 }
  195.             }
  196.  
  197.             $('>div', panel).triggerHandler('_resize');
  198.         }
  199.     }
  200.  
  201.     // wrap the tabs header and body
  202.     function wrapTabs(container)
  203.     {
  204.         $(container).addClass('tabs-container');
  205.         $(container).wrapInner('<div class="tabs-panels"/>');
  206.         $('<div class="tabs-header">'
  207.                 + '<div class="tabs-scroller-left"></div>'
  208.                 + '<div class="tabs-scroller-right"></div>'
  209.                 + '<div class="tabs-wrap">'
  210.                 + '<ul class="tabs"></ul>'
  211.                 + '</div>'
  212.                 + '</div>').prependTo(container);
  213.  
  214.         var header = $('>div.tabs-header', container);
  215.  
  216.         $('>div.tabs-panels>div', container).each(function()
  217.         {
  218.             if(!$(this).attr('id'))
  219.             {
  220.                 $(this).attr('id', 'gen-tabs-panel' + $.fn.idtabs.defaults.idSeed++);
  221.             }
  222.  
  223.             var options =
  224.             {
  225.                 id       : $(this).attr('id'),
  226.                 title    : $(this).attr('title'),
  227.                 content  : null,
  228.                 href     : $(this).attr('href'),
  229.                 closable : $(this).attr('closable') == 'true',
  230.                 icon     : $(this).attr('icon'),
  231.                 selected : $(this).attr('selected') == 'true',
  232.                 cache    : $(this).attr('cache') == 'false' ? false : true
  233.             };
  234.  
  235.             $(this).attr('title', '');
  236.             createTab(container, options);
  237.         });
  238.  
  239.         $('>div.tabs-panels>div', container).each(function()
  240.         {
  241.            if(!$(this).attr('id').match('tab_'))
  242.            {
  243.                //var y = $(this).attr('id').replace('tab_', '');
  244.                $(this).attr('id', 'content_'+$(this).attr('id'));
  245.            }
  246.         });
  247.  
  248.         $('.tabs-scroller-left, .tabs-scroller-right', header).hover(
  249.             function(){$(this).addClass('tabs-scroller-over');},
  250.             function(){$(this).removeClass('tabs-scroller-over');}
  251.         );
  252.         $(container).bind('_resize', function(){
  253.             var opts = $.data(container, 'tabs').options;
  254.             if(opts.fit == true){
  255.                 setSize(container);
  256.                 fitContent(container);
  257.             }
  258.             return false;
  259.         });
  260.     }
  261.  
  262.     function setProperties(container)
  263.     {
  264.         var opts   = $.data(container, 'tabs').options;
  265.         var header = $('>div.tabs-header', container);
  266.         var panels = $('>div.tabs-panels', container);
  267.         var tabs   = $('ul.tabs', header);
  268.  
  269.         if(opts.plain == true)
  270.         {
  271.             header.addClass('tabs-header-plain');
  272.         }
  273.         else
  274.         {
  275.             header.removeClass('tabs-header-plain');
  276.         }
  277.  
  278.         if(opts.border == true)
  279.         {
  280.             header.removeClass('tabs-header-noborder');
  281.             panels.removeClass('tabs-panels-noborder');
  282.         }
  283.         else
  284.         {
  285.             header.addClass('tabs-header-noborder');
  286.             panels.addClass('tabs-panels-noborder');
  287.         }
  288.  
  289.         $('li', tabs).unbind('.tabs').bind('click.tabs', function()
  290.         {
  291.             $('.tabs-selected', tabs).removeClass('tabs-selected');
  292.             $(this).addClass('tabs-selected');
  293.             $(this).blur();
  294.             $('>div.tabs-panels>div', container).css('display', 'none');
  295.  
  296.             var wrap    = $('.tabs-wrap', header);
  297.             var leftPos = getTabLeftPosition(container, this);
  298.             var left    = leftPos - wrap.scrollLeft();
  299.             var right   = left + $(this).outerWidth();
  300.  
  301.             if(left < 0 || right > wrap.innerWidth())
  302.             {
  303.                 var pos = Math.min(leftPos - (wrap.width()-$(this).width()) / 2,
  304.                                    getMaxScrollWidth(container));
  305.  
  306.                 wrap.animate({scrollLeft:pos}, opts.scrollDuration);
  307.             }
  308.  
  309.             var tabAttr = $.data(this, 'tabs.tab');
  310.             var panel   = $('#content_' + tabAttr.id);
  311.  
  312.             panel.css('display', 'inline-block');
  313.  
  314.             if(tabAttr.href && (!tabAttr.loaded || !tabAttr.cache))
  315.             {
  316.                 panel.load(tabAttr.href, null, function()
  317.                 {
  318.                     if($.parser)
  319.                     {
  320.                         $.parser.parse(panel);
  321.                     }
  322.  
  323.                     opts.onLoad.apply(this, arguments);
  324.  
  325.                     tabAttr.loaded = true;
  326.                 });
  327.             }
  328.  
  329.             fitContent(container);
  330.             opts.onSelect.call(panel, tabAttr.id);
  331.         });
  332.  
  333.         $('a.tabs-close', tabs).unbind('.tabs').bind('click.tabs', function()
  334.         {
  335.             var elem    = $(this).parent()[0];
  336.             var tabAttr = $.data(elem, 'tabs.tab');
  337.             closeTab(container, tabAttr.id);
  338.         });
  339.  
  340.         $('.tabs-scroller-left', header).unbind('.tabs').bind('click.tabs', function()
  341.         {
  342.             var wrap = $('.tabs-wrap', header);
  343.             var pos  = wrap.scrollLeft() - opts.scrollIncrement;
  344.  
  345.             wrap.animate({scrollLeft:pos}, opts.scrollDuration);
  346.         });
  347.  
  348.         $('.tabs-scroller-right', header).unbind('.tabs').bind('click.tabs', function()
  349.         {
  350.             var wrap = $('.tabs-wrap', header);
  351.             var pos  = Math.min(wrap.scrollLeft() + opts.scrollIncrement,
  352.                                 getMaxScrollWidth(container));
  353.  
  354.             wrap.animate({scrollLeft:pos}, opts.scrollDuration);
  355.         });
  356.     }
  357.  
  358.     function createTab(container, options)
  359.     {
  360.         var header   = $('>div.tabs-header', container);
  361.         var tabs     = $('ul.tabs', header);
  362.         var tab      = $('<li></li>').attr({id : 'tab_'+options.id});
  363.         var tab_span = $('<span></span>').html(options.title);
  364.         var tab_a    = $('<a class="tabs-inner"></a>').attr('href', 'javascript:void(0)')
  365.                                                       .append(tab_span);
  366.  
  367.         tab.append(tab_a).appendTo(tabs);
  368.  
  369.         if(options.closable)
  370.         {
  371.             tab_span.addClass('tabs-closable');
  372.             tab_a.after('<a href="javascript:void(0)" class="tabs-close"></a>');
  373.         }
  374.  
  375.         if(options.icon)
  376.         {
  377.             tab_span.addClass('tabs-with-icon');
  378.             tab_span.after($('<span/>').addClass('tabs-icon').addClass(options.icon));
  379.         }
  380.  
  381.         if(options.selected)
  382.         {
  383.             tab.addClass('tabs-selected');
  384.         }
  385.  
  386.         if(options.content)
  387.         {
  388.             $("#content_" + options.id).html(options.content);
  389.         }
  390.  
  391.         $('#content_' + options.id).removeAttr('title');
  392.  
  393.         $.data(tab[0], 'tabs.tab',
  394.         {
  395.             id     : options.id,
  396.             title  : options.title,
  397.             href   : options.href,
  398.             loaded : false,
  399.             cache  : options.cache
  400.         });
  401.     }
  402.  
  403.     function addTab(container, options)
  404.     {
  405.         options    = $.extend(
  406.         {
  407.             id       : null,
  408.             title    : '',
  409.             content  : '',
  410.             href     : null,
  411.             cache    : true,
  412.             icon     : null,
  413.             closable : false,
  414.             selected : true,
  415.             height   : 'auto',
  416.             width    : 'auto'
  417.         }, options || {});
  418.  
  419.         if(options.selected)
  420.         {
  421.             $('.tabs-header .tabs-wrap .tabs li', container).removeClass('tabs-selected');
  422.         }
  423.  
  424.         options.id = options.id || 'gen-tabs-panel' + $.fn.idtabs.defaults.idSeed++;
  425.  
  426.         $('<div></div>').attr({'id'    : 'content_'+options.id,
  427.                                'title' : options.title})
  428.                         .height(options.height)
  429.                         //.width(options.width)
  430.                         .width('100%')
  431.                         .appendTo($('>div.tabs-panels', container));
  432.  
  433.         createTab(container, options);
  434.     }
  435.  
  436.     // close a tab with specified title
  437.     function closeTab(container, id)
  438.     {
  439.         var opts     = $.data(container, 'tabs').options;
  440.         var elem     = $('>div.tabs-header #tab_'+id, container)[0];
  441.  
  442.         if(!elem)
  443.         {
  444.             return;
  445.         }
  446.  
  447.         var tabAttr  = $.data(elem, 'tabs.tab');
  448.         var panel    = $('#content_' + id);
  449.  
  450.         if(opts.onClose.call(panel, tabAttr.title) == false)
  451.         {
  452.             return;
  453.         }
  454.  
  455.         var selected = $(elem).hasClass('tabs-selected');
  456.  
  457.         $.removeData(elem, 'tabs.tab');
  458.         $(elem).remove();
  459.         panel.remove();
  460.         setSize(container);
  461.  
  462.         if(selected)
  463.         {
  464.             selectTab(container);
  465.         }
  466.         else
  467.         {
  468.             var wrap = $('>div.tabs-header .tabs-wrap', container);
  469.             var pos  = Math.min(wrap.scrollLeft(),
  470.                                 getMaxScrollWidth(container));
  471.  
  472.             wrap.animate({scrollLeft:pos}, opts.scrollDuration);
  473.         }
  474.     }
  475.  
  476.     // active the selected tab item, if no selected item then active the first item
  477.     function selectTab(container, id)
  478.     {
  479.         if(id)
  480.         {
  481.             var elem = $('>div.tabs-header #tab_'+id, container)[0];
  482.  
  483.             if(elem)
  484.             {
  485.                 $(elem).trigger('click');
  486.             }
  487.         }
  488.         else
  489.         {
  490.             var tabs = $('>div.tabs-header ul.tabs', container);
  491.  
  492.             if($('.tabs-selected', tabs).length == 0)
  493.             {
  494.                 $('li:first', tabs).trigger('click');
  495.             }
  496.             else
  497.             {
  498.                 $('.tabs-selected', tabs).trigger('click');
  499.             }
  500.         }
  501.     }
  502.  
  503.     function exists(container, id)
  504.     {
  505.         return $('>div.tabs-header #tab_'+id, container).length > 0;
  506.     }
  507.  
  508.     $.fn.idtabs          = function(options, param)
  509.     {
  510.         if(typeof options == 'string')
  511.         {
  512.             switch(options)
  513.             {
  514.                 case 'resize':
  515.                     return this.each(function()
  516.                     {
  517.                         setSize(this);
  518.                     });
  519.  
  520.                 case 'add':
  521.                     return this.each(function()
  522.                     {
  523.                         addTab(this, param);
  524.                         $(this).idtabs();
  525.                     });
  526.  
  527.                 case 'close':
  528.                     return this.each(function()
  529.                     {
  530.                         closeTab(this, param);
  531.                     });
  532.  
  533.                 case 'select':
  534.                     return this.each(function()
  535.                     {
  536.                         selectTab(this, param);
  537.                     });
  538.  
  539.                 case 'exists':
  540.                     return exists(this[0], param);
  541.             }
  542.         }
  543.  
  544.         options = options || {};
  545.  
  546.         return this.each(function()
  547.         {
  548.             var state = $.data(this, 'tabs');
  549.             var opts;
  550.  
  551.             if(state)
  552.             {
  553.                 opts          = $.extend(state.options, options);
  554.                 state.options = opts;
  555.             }
  556.             else
  557.             {
  558.                 var t = $(this);
  559.                 opts  = $.extend({}, $.fn.idtabs.defaults,
  560.                 {
  561.                     //width  : (parseInt(t.css('width')) || undefined),
  562.                     //height : (parseInt(t.css('height')) || undefined),
  563.                     fit    : (t.attr('fit') ? t.attr('fit') == 'true' : undefined),
  564.                     border : (t.attr('border') ? t.attr('border') == 'true' : undefined),
  565.                     plain  : (t.attr('plain') ? t.attr('plain') == 'true' : undefined)
  566.                 }, options);
  567.  
  568.                 wrapTabs(this);
  569.                 $.data(this, 'tabs',
  570.                 {
  571.                     options: opts
  572.                 });
  573.             }
  574.  
  575.             setProperties(this);
  576.             setSize(this);
  577.             selectTab(this);
  578.         });
  579.     };
  580.  
  581.     $.fn.idtabs.defaults =
  582.     {
  583.         width           : 'auto',
  584.         height          : 'auto',
  585.         idSeed          : 0,
  586.         plain           : false,
  587.         fit             : false,
  588.         border          : true,
  589.         scrollIncrement : 100,
  590.         scrollDuration  : 400,
  591.         onLoad          : function(){},
  592.         onSelect        : function(id){},
  593.         onClose         : function(id){}
  594.     };
  595. })(jQuery);
  596.  
Advertisement
Add Comment
Please, Sign In to add comment