forked from ajaxorg/ace
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjquery.collapse.js
More file actions
151 lines (139 loc) · 5.45 KB
/
Copy pathjquery.collapse.js
File metadata and controls
151 lines (139 loc) · 5.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*!
* Collapse plugin for jQuery
* http://github.com/danielstocks/jQuery-Collapse/
*
* @author Daniel Stocks (http://webcloud.se)
* @version 0.9.1
* @updated 17-AUG-2010
*
* Copyright 2010, Daniel Stocks
* Released under the MIT, BSD, and GPL Licenses.
*/
(function($) {
// Use a cookie counter to allow multiple instances of the plugin
var cookieCounter = 0;
$.fn.extend({
collapse: function(options) {
var defaults = {
head : "h3",
group : "div, ul",
cookieName : "collapse",
// Default function for showing content
show: function() {
this.show();
},
// Default function for hiding content
hide: function() {
this.hide();
}
};
var op = $.extend(defaults, options);
// Default CSS classes
var active = "active",
inactive = "inactive";
return this.each(function() {
// Increment coookie counter to ensure cookie name integrity
cookieCounter++;
var obj = $(this),
// Find all headers and wrap them in <a> for accessibility.
sections = obj.find(op.head).wrapInner('<a href="#"></a>'),
l = sections.length,
cookie = op.cookieName + "_" + cookieCounter;
// Locate all panels directly following a header
var panel = obj.find(op.head).map(function() {
var head = $(this)
if(!head.hasClass(active)) {
return head.next(op.group).hide()[0];
}
return head.next(op.group)[0];
});
// Bind event for showing content
obj.bind("show", function(e, bypass) {
var obj = $(e.target);
// ARIA attribute
obj.attr('aria-hidden', false)
.prev()
.removeClass(inactive)
.addClass(active);
// Bypass method for instant display
if(bypass) {
obj.show();
} else {
op.show.call(obj);
}
});
// Bind event for hiding content
obj.bind("hide", function(e, bypass) {
var obj = $(e.target);
obj.attr('aria-hidden', true)
.prev()
.removeClass(active)
.addClass(inactive);
if(bypass) {
obj.hide();
} else {
op.hide.call(obj);
}
});
// Look for existing cookies
if(cookieSupport) {
for (var c=0;c<=l;c++) {
var val = $.cookie(cookie + c);
// Show content if associating cookie is found
if ( val == c + "open" ) {
panel.eq(c).trigger('show', [true]);
// Hide content
} else if ( val == c + "closed") {
panel.eq(c).trigger('hide', [true]);
}
}
}
// Delegate click event to show/hide content.
obj.bind("click", function(e) {
var t = $(e.target);
// Check if header was clicked
if(!t.is(op.head)) {
// What about link inside header.
if ( t.parent().is(op.head) ) {
t = t.parent();
} else {
return;
}
e.preventDefault();
}
// Figure out what position the clicked header has.
var num = sections.index(t),
cookieName = cookie + num,
cookieVal = num,
content = t.next(op.group);
// If content is already active, hide it.
if(t.hasClass(active)) {
content.trigger('hide');
cookieVal += 'closed';
if(cookieSupport) {
$.cookie(cookieName, cookieVal, { path: '/', expires: 10 });
}
return;
}
// Otherwise show it.
content.trigger('show');
cookieVal += 'open';
if(cookieSupport) {
$.cookie(cookieName, cookieVal, { path: '/', expires: 10 });
}
});
});
}
});
// Make sure can we eat cookies without getting into trouble.
var cookieSupport = (function() {
try {
$.cookie('x', 'x', { path: '/', expires: 10 });
$.cookie('x', null);
}
catch(e) {
return false;
}
return true;
})();
})(jQuery);