|
1
|
|
|
/*! |
|
2
|
|
|
* @package ElkArte Forum |
|
3
|
|
|
* @copyright ElkArte Forum contributors |
|
4
|
|
|
* @license BSD http://opensource.org/licenses/BSD-3-Clause (see accompanying LICENSE.txt file) |
|
5
|
|
|
* |
|
6
|
|
|
* @version 2.0 dev |
|
7
|
|
|
*/ |
|
8
|
|
|
|
|
9
|
|
|
/** |
|
10
|
|
|
* This file contains javascript associated with the current theme |
|
11
|
|
|
*/ |
|
12
|
|
|
|
|
13
|
|
|
// Normal JS document ready event |
|
14
|
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
15
|
|
|
|
|
16
|
|
|
// If they touch the screen, then we switch to click menus |
|
17
|
|
|
window.addEventListener('touchstart', onFirstTouch, false); |
|
18
|
|
|
|
|
19
|
|
|
// Or if they specifically only want click menus |
|
20
|
|
|
if (use_click_menu) |
|
|
|
|
|
|
21
|
|
|
{ |
|
22
|
|
|
useClickMenu(); |
|
23
|
|
|
} |
|
24
|
|
|
|
|
25
|
|
|
// Fix code blocks so they are as compact as possible |
|
26
|
|
|
if (typeof elk_codefix === 'function') |
|
|
|
|
|
|
27
|
|
|
{ |
|
28
|
|
|
elk_codefix(); |
|
29
|
|
|
} |
|
30
|
|
|
|
|
31
|
|
|
if (typeof elk_quotefix === 'function') |
|
|
|
|
|
|
32
|
|
|
{ |
|
33
|
|
|
elk_quotefix(); |
|
34
|
|
|
} |
|
35
|
|
|
|
|
36
|
|
|
// If you want a sticky menu on scroll, add an appropriate .sticky css class to your theme |
|
37
|
|
|
stickyMenu(); |
|
38
|
|
|
|
|
39
|
|
|
// Smooth scroll to top. |
|
40
|
|
|
document.getElementById('gotop').addEventListener('click', function(e) { |
|
41
|
|
|
e.preventDefault(); |
|
42
|
|
|
window.scrollTo({top: 0, behavior: 'smooth'}); |
|
43
|
|
|
}); |
|
44
|
|
|
|
|
45
|
|
|
// Smooth scroll to bottom. |
|
46
|
|
|
document.getElementById('gobottom').addEventListener('click', function(e) { |
|
47
|
|
|
e.preventDefault(); |
|
48
|
|
|
|
|
49
|
|
|
// Don't scroll all the way down to the footer, just the content bottom |
|
50
|
|
|
let link = document.querySelector('#footer_section'), |
|
51
|
|
|
linkY = link.offsetHeight, |
|
52
|
|
|
heightDiff = link.getBoundingClientRect().top + linkY - window.innerHeight; |
|
53
|
|
|
|
|
54
|
|
|
window.scrollBy({top: heightDiff, behavior: 'smooth'}); |
|
55
|
|
|
}); |
|
56
|
|
|
|
|
57
|
|
|
// Find all nested linked images and turn off the border |
|
58
|
|
|
let elements = document.querySelectorAll('a.bbc_link img.bbc_img'); |
|
59
|
|
|
for (let i = 0; i < elements.length; i++) |
|
60
|
|
|
{ |
|
61
|
|
|
let parentElement = elements[i].parentNode; |
|
62
|
|
|
parentElement.style.border = '0'; |
|
63
|
|
|
} |
|
64
|
|
|
|
|
65
|
|
|
// Expand the moderation hamburger icon/button view for mobile devices |
|
66
|
|
|
let hamburger = document.querySelector('.hamburger_30'); |
|
67
|
|
|
if (hamburger) |
|
68
|
|
|
{ |
|
69
|
|
|
hamburger.addEventListener('click', function(e) { |
|
70
|
|
|
let id = this.getAttribute('data-id'); |
|
71
|
|
|
e.preventDefault(); |
|
72
|
|
|
document.getElementById(id).classList.add('visible'); |
|
73
|
|
|
this.classList.add('visible'); |
|
74
|
|
|
}); |
|
75
|
|
|
} |
|
76
|
|
|
|
|
77
|
|
|
// Collapsible fieldsets, pure candy |
|
78
|
|
|
document.querySelector('body').addEventListener('click', function(event) { |
|
79
|
|
|
if (event.target.matches('legend')) |
|
80
|
|
|
{ |
|
81
|
|
|
let siblings = elkGetSiblings(event.target); |
|
82
|
|
|
siblings.forEach(sib => sib.slideToggle()); |
|
83
|
|
|
event.target.parentNode.classList.toggle('collapsed'); |
|
84
|
|
|
} |
|
85
|
|
|
}); |
|
86
|
|
|
|
|
87
|
|
|
// For any legends with data-collapsed="true", start them collapsed |
|
88
|
|
|
document.querySelectorAll('legend').forEach(function(el) { |
|
89
|
|
|
if (el.getAttribute('data-collapsed') !== null) |
|
90
|
|
|
{ |
|
91
|
|
|
el.click(); |
|
92
|
|
|
} |
|
93
|
|
|
}); |
|
94
|
|
|
|
|
95
|
|
|
// Spoiler |
|
96
|
|
|
document.querySelectorAll('.spoilerheader').forEach(element => { |
|
97
|
|
|
element.addEventListener('click', function() { |
|
98
|
|
|
element.nextElementSibling.children[0].slideToggle(250); |
|
99
|
|
|
}); |
|
100
|
|
|
}); |
|
101
|
|
|
}); |
|
102
|
|
|
|
|
103
|
|
|
// Jquery document ready |
|
104
|
|
|
$(function() { |
|
105
|
|
|
// Enable the ... page expansion |
|
106
|
|
|
$('.expand_pages').expand_pages(); |
|
107
|
|
|
|
|
108
|
|
|
// Attachment thumbnail expand on click, you can turn off this namespaced click |
|
109
|
|
|
// event with $('[data-lightboximage]').off('click.elk_lb'); |
|
110
|
|
|
$('[data-lightboximage]').on('click.elk_lb', function(e) { |
|
111
|
|
|
e.preventDefault(); |
|
112
|
|
|
expandThumbLB($(this).data('lightboximage'), $(this).data('lightboxmessage')); |
|
113
|
|
|
}); |
|
114
|
|
|
|
|
115
|
|
|
// BBC [img] element toggle for height and width styles of an image. |
|
116
|
|
|
$('img').each(function() { |
|
117
|
|
|
// Not a resized image? Skip it. |
|
118
|
|
|
if ($(this).hasClass('bbc_img resized') === false) |
|
119
|
|
|
{ |
|
120
|
|
|
return true; |
|
121
|
|
|
} |
|
122
|
|
|
|
|
123
|
|
|
$(this).css({'cursor': 'pointer'}); |
|
124
|
|
|
|
|
125
|
|
|
// Note to addon authors, if you want to enable your own click events to bbc images |
|
126
|
|
|
// you can turn off this namespaced click event with $("img").off("click.elk_bbc") |
|
127
|
|
|
$(this).on('click.elk_bbc', function() { |
|
128
|
|
|
var $this = $(this); |
|
129
|
|
|
|
|
130
|
|
|
// No saved data, then lets set it to auto |
|
131
|
|
|
if ($.isEmptyObject($this.data('bbc_img'))) |
|
132
|
|
|
{ |
|
133
|
|
|
$this.data('bbc_img', { |
|
134
|
|
|
width: $this.css('width'), |
|
135
|
|
|
height: $this.css('height'), |
|
136
|
|
|
'max-width': $this.css('max-width'), |
|
137
|
|
|
'max-height': $this.css('max-height') |
|
138
|
|
|
}); |
|
139
|
|
|
$this.css({'width': $this.css('width') === 'auto' ? null : 'auto'}); |
|
140
|
|
|
$this.css({'height': $this.css('height') === 'auto' ? null : 'auto'}); |
|
141
|
|
|
|
|
142
|
|
|
// Override default css to allow the image to expand fully, add a div to expand in |
|
143
|
|
|
$this.css({'max-height': 'none'}); |
|
144
|
|
|
$this.css({'max-width': '100%'}); |
|
145
|
|
|
$this.wrap('<div style="overflow:auto;display:inline-block;"></div>'); |
|
146
|
|
|
} |
|
147
|
|
|
else |
|
148
|
|
|
{ |
|
149
|
|
|
// Was clicked and saved, so set it back |
|
150
|
|
|
$this.css({'width': $this.data('bbc_img').width}); |
|
151
|
|
|
$this.css({'height': $this.data('bbc_img').height}); |
|
152
|
|
|
$this.css({'max-width': $this.data('bbc_img')['max-width']}); |
|
153
|
|
|
$this.css({'max-height': $this.data('bbc_img')['max-height']}); |
|
154
|
|
|
|
|
155
|
|
|
// Remove the data |
|
156
|
|
|
$this.removeData('bbc_img'); |
|
157
|
|
|
|
|
158
|
|
|
// Remove the div we added to allow the image to overflow expand in |
|
159
|
|
|
$this.unwrap(); |
|
160
|
|
|
$this.css({'max-width': '100%'}); |
|
161
|
|
|
} |
|
162
|
|
|
}); |
|
|
|
|
|
|
163
|
|
|
}); |
|
164
|
|
|
}); |
|
165
|
|
|
|
|
166
|
|
|
/** |
|
167
|
|
|
* Adds a button to the quick topic moderation after a checkbox is selected |
|
168
|
|
|
* |
|
169
|
|
|
* @param {string} sButtonStripId |
|
170
|
|
|
* @param {boolean} bUseImage |
|
171
|
|
|
* @param {object} oOptions |
|
172
|
|
|
*/ |
|
173
|
|
|
function elk_addButton (sButtonStripId, bUseImage, oOptions) |
|
174
|
|
|
{ |
|
175
|
|
|
let oButtonStrip = document.getElementById(sButtonStripId), |
|
176
|
|
|
aItems = oButtonStrip.getElementsByTagName('span'); |
|
177
|
|
|
|
|
178
|
|
|
// Remove the 'last' class from the last item. |
|
179
|
|
|
if (aItems.length > 0) |
|
180
|
|
|
{ |
|
181
|
|
|
let oLastSpan = aItems[aItems.length - 1]; |
|
182
|
|
|
oLastSpan.className = oLastSpan.className.replace(/\s*last/, 'position_holder'); |
|
183
|
|
|
} |
|
184
|
|
|
|
|
185
|
|
|
// Add the button. |
|
186
|
|
|
let oButtonStripList = oButtonStrip.getElementsByTagName('ul')[0], |
|
187
|
|
|
oNewButton = document.createElement('li'), |
|
188
|
|
|
oRole = document.createAttribute('role'); |
|
189
|
|
|
|
|
190
|
|
|
oRole.value = 'menuitem'; |
|
191
|
|
|
oNewButton.setAttributeNode(oRole); |
|
192
|
|
|
|
|
193
|
|
|
if ('sId' in oOptions) |
|
194
|
|
|
{ |
|
195
|
|
|
oNewButton.id = oOptions.sId; |
|
196
|
|
|
} |
|
197
|
|
|
|
|
198
|
|
|
oNewButton.innerHTML = '' + |
|
199
|
|
|
'<a class="linklevel1" href="' + oOptions.sUrl + '" ' + ('sCustom' in oOptions ? oOptions.sCustom : '') + '>' + |
|
200
|
|
|
('sImage' in oOptions && bUseImage ? '<i class="icon ' + oOptions.sImage + '"></i>' : '') + |
|
201
|
|
|
' <span class="last"' + ('sId' in oOptions ? ' id="' + oOptions.sId + '_text"' : '') + '>' + |
|
202
|
|
|
oOptions.sText + |
|
203
|
|
|
' </span>' + |
|
204
|
|
|
'</a>'; |
|
205
|
|
|
|
|
206
|
|
|
if (oOptions.aEvents) |
|
207
|
|
|
{ |
|
208
|
|
|
oOptions.aEvents.forEach(function(e) { |
|
209
|
|
|
oNewButton.addEventListener(e[0], e[1]); |
|
210
|
|
|
}); |
|
211
|
|
|
} |
|
212
|
|
|
|
|
213
|
|
|
oButtonStripList.appendChild(oNewButton); |
|
214
|
|
|
} |
|
215
|
|
|
|
|
216
|
|
|
function onFirstTouch () |
|
217
|
|
|
{ |
|
218
|
|
|
useClickMenu(); |
|
219
|
|
|
} |
|
220
|
|
|
|
|
221
|
|
|
function useClickMenu () |
|
222
|
|
|
{ |
|
223
|
|
|
// Click Menu drop downs |
|
224
|
|
|
let menus = ['#main_menu', '#sort_by', 'ul.poster', 'ul.quickbuttons', 'ul.admin_menu', 'ul.sidebar_menu']; |
|
225
|
|
|
|
|
226
|
|
|
menus.forEach((area) => new elkMenu(area)); |
|
|
|
|
|
|
227
|
|
|
|
|
228
|
|
|
window.removeEventListener('touchstart', onFirstTouch, false); |
|
229
|
|
|
} |
|
230
|
|
|
|
|
231
|
|
|
function stickyMenu () |
|
232
|
|
|
{ |
|
233
|
|
|
let menu = document.getElementById('menu_nav'); |
|
234
|
|
|
|
|
235
|
|
|
if (menu) |
|
236
|
|
|
{ |
|
237
|
|
|
let offset = menu.offsetHeight; |
|
238
|
|
|
|
|
239
|
|
|
window.onscroll = function() { |
|
240
|
|
|
if (window.scrollY > offset - 5) |
|
241
|
|
|
{ |
|
242
|
|
|
menu.classList.add('sticky'); |
|
243
|
|
|
} |
|
244
|
|
|
else if (window.scrollY < offset - 20) |
|
245
|
|
|
{ |
|
246
|
|
|
menu.classList.remove('sticky'); |
|
247
|
|
|
} |
|
248
|
|
|
}; |
|
249
|
|
|
} |
|
250
|
|
|
} |
|
251
|
|
|
|