2 Copyright (c) 2010, Yahoo! Inc. All rights reserved.
3 Code licensed under the BSD License:
4 http://developer.yahoo.com/yui/license.html
8 YUI.add('tabview-base', function(Y) {
10 var getClassName = Y.ClassNameManager.getClassName,
15 SELECTED = 'selected',
20 tabview: getClassName(TABVIEW),
21 tabviewPanel: getClassName(TABVIEW, PANEL),
22 tabviewList: getClassName(TABVIEW, 'list'),
23 tab: getClassName(TAB),
24 tabLabel: getClassName(TAB, 'label'),
25 tabPanel: getClassName(TAB, PANEL),
26 selectedTab: getClassName(TAB, SELECTED),
27 selectedPanel: getClassName(TAB, PANEL, SELECTED)
31 tabview: DOT + _classNames.tabview,
34 tabLabel: '> ul > li > a ',
35 tabviewPanel: '> div',
36 tabPanel: '> div > div',
37 selectedTab: '> ul > ' + DOT + _classNames.selectedTab,
38 selectedPanel: '> div ' + DOT + _classNames.selectedPanel
41 TabviewBase = function(config) {
42 this.init.apply(this, arguments);
45 TabviewBase.NAME = 'tabviewBase';
46 TabviewBase._queries = _queries;
47 TabviewBase._classNames = _classNames;
49 Y.mix(TabviewBase.prototype, {
50 init: function(config) {
51 config = config || EMPTY_OBJ;
52 this._node = config.host || Y.one(config.node);
57 initClassNames: function(index) {
58 Y.Object.each(_queries, function(query, name) {
59 // this === tabview._node
60 if (_classNames[name]) {
61 var result = this.all(query);
63 if (index !== undefined) {
64 result = result.item(index);
68 result.addClass(_classNames[name]);
73 this._node.addClass(_classNames.tabview);
76 _select: function(index) {
77 var node = this._node,
78 oldItem = node.one(_queries.selectedTab),
79 oldContent = node.one(_queries.selectedPanel),
80 newItem = node.all(_queries.tab).item(index),
81 newContent = node.all(_queries.tabPanel).item(index);
84 oldItem.removeClass(_classNames.selectedTab);
88 oldContent.removeClass(_classNames.selectedPanel);
92 newItem.addClass(_classNames.selectedTab);
96 newContent.addClass(_classNames.selectedPanel);
100 initState: function() {
101 var node = this._node,
102 activeNode = node.one(_queries.selectedTab),
103 activeIndex = activeNode ?
104 node.all(_queries.tab).indexOf(activeNode) : 0;
106 this._select(activeIndex);
109 // collapse extra space between list-items
110 _scrubTextNodes: function() {
111 this._node.one(_queries.tabviewList).get('childNodes').each(function(node) {
112 if (node.get('nodeType') === 3) { // text node
118 // base renderer only enlivens existing markup
119 refresh: function() {
120 this._scrubTextNodes();
121 this.initClassNames();
126 tabEventName: 'click',
128 initEvents: function() {
129 // TODO: detach prefix for delegate?
130 // this._node.delegate('tabview|' + this.tabEventName),
131 this._node.delegate(this.tabEventName,
138 onTabEvent: function(e) {
140 this._select(this._node.all(_queries.tab).indexOf(e.currentTarget));
143 destroy: function() {
144 this._node.detach(this.tabEventName);
148 Y.TabviewBase = TabviewBase;
151 }, '3.3.0' ,{requires:['node-event-delegate', 'classnamemanager', 'skin-sam-tabview']});