-
Notifications
You must be signed in to change notification settings - Fork 208
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Incorporate PreTeXtBook "JS_lib" repository into "js_lib" directory
- Loading branch information
Showing
6 changed files
with
860 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,195 @@ | ||
|
||
(function(b, u, v) { | ||
function x(b, f, e) { | ||
b = (b + "").match(/^(-?[0-9]+)(%)?$/); | ||
if (!b) return !1; | ||
var c = parseInt(b[1], 10); | ||
b[2] && (c *= f / 100); | ||
return 0 > c ? f + c + (e || 0) : c | ||
} | ||
|
||
function y(k, f) { | ||
function e() { | ||
function b() { | ||
g = +new Date; | ||
f.apply(e, t); | ||
c && (c = clearTimeout(c)) | ||
} | ||
var e = this, | ||
q = +new Date - g, | ||
t = arguments; | ||
c && (c = clearTimeout(c)); | ||
q > k ? b() : c = setTimeout(b, k - q) | ||
} | ||
var c, g = 0; | ||
b.guid && (e.guid = f.guid = f.guid || b.guid++); | ||
return e | ||
} | ||
b.Espy = function(k, f, e) { | ||
function c(a, d) { | ||
b.isPlainObject(a) && (d = a, a = null); | ||
b.extend(t.prototype, d); | ||
null !== a && (w = a) | ||
} | ||
|
||
function g(a) { | ||
if (a = | ||
q(a)) { | ||
var d = a.$el.offset()[a.settings.horizontal ? "left" : "top"] - p.offset[a.settings.horizontal ? "left" : "top"], | ||
h = a.$el[a.settings.horizontal ? "outerWidth" : "outerHeight"](); | ||
b.extend(a, { | ||
start: d, | ||
elSize: h, | ||
end: d + h | ||
}) | ||
} | ||
} | ||
|
||
function r(a) { | ||
// console.log("r(a) with a = ", a); | ||
if (a === v) b.each(m, r); | ||
else if (a = q(a)) { | ||
var d = p[a.settings.horizontal ? "width" : "height"], | ||
h = x(a.settings.size, d), | ||
d = p[a.settings.horizontal ? "left" : "top"] + x(a.settings.offset, d, -h), | ||
c = d + h, | ||
h = a.settings.contain ? d <= a.start && c >= a.end ? "inside" : d + h / 2 > a.start + a.elSize / 2 ? a.settings.horizontal ? "left" : | ||
"up" : a.settings.horizontal ? "right" : "down" : d > a.start && d < a.end || c > a.start && c < a.end || d <= a.start && c >= a.start || d <= a.end && c >= a.end ? "inside" : d > a.end ? a.settings.horizontal ? "left" : "up" : a.settings.horizontal ? "right" : "down"; | ||
a.state !== h && (a.state = h, "function" === typeof w && w.call(a.el, "inside" === h, h), "function" === typeof a.callback && a.callback.call(a.el, "inside" === h, h)) | ||
} | ||
} | ||
|
||
function s(a) { | ||
if (m.hasOwnProperty(a)) return a; | ||
if (b.isPlainObject(a) && m.hasOwnProperty(a.id)) return a.id; | ||
a = b(a)[0]; | ||
var d = !1; | ||
b.each(m, function(b, | ||
c) { | ||
c.el === a && (d = b) | ||
}); | ||
return d | ||
} | ||
|
||
// console.log("nothing yet"); | ||
function q(a) { | ||
return (a = s(a)) ? m[a] : !1 | ||
} | ||
"function" !== typeof f && (e = f, f = 0); | ||
// console.log("k was", k); | ||
var t = function(a) { | ||
b.extend(this, a) | ||
}, | ||
u = function(a, d, c, e) { | ||
this.id = a; | ||
this.el = d; | ||
this.$el = b(d); | ||
this.callback = c; | ||
this.settings = new t(e); | ||
this.configure = function(a, d) { | ||
b.isPlainObject(a) && (d = a, a = null); | ||
b.extend(this.settings, d); | ||
null !== a && (this.callback = a) | ||
} | ||
}, | ||
n = this, | ||
l = b(k); | ||
// console.log("l", l, "l==window", l[0]==window); | ||
k = b.fn.espy.defaults; | ||
// console.log("k is", k); | ||
var w, m = {}, | ||
z = 0; | ||
// because window.offset() is not defined in jQuery 3 (why?!?!?!), | ||
// we have to treat that as a special case (DF 1/28/19) | ||
if (l[0]==window) { offSET = { top: 0, left: 0 } } | ||
else { offSET = l.offset() } | ||
var p = { | ||
top: l.scrollTop(), | ||
left: l.scrollLeft(), | ||
width: l.innerWidth(), | ||
height: l.innerHeight(), | ||
offset: offSET | ||
/* | ||
offset: l.offset() || { | ||
top: 0, | ||
left: 0 | ||
} | ||
*/ | ||
}; | ||
// console.log("p", p); | ||
c(f, b.extend({}, k, e)); | ||
n.add = function(a, d, c) { | ||
b.isPlainObject(d) && (c = d, d = 0); | ||
b(a).each(function(a, b) { | ||
var e = s(b) || "s" + z++; | ||
m[e] = new u(e, b, d, c); | ||
g(e); | ||
r(e) | ||
}) | ||
}; | ||
n.configure = function(a, d, e) { | ||
"function" === typeof a ? (d = a, a = null, b.isPlainObject(d) && (e = d, d = null)) : b.isPlainObject(a) ? (e = a, d = a = null) : b.isPlainObject(d) && (e = d, d = null); | ||
null === a ? (c(d, e), b.each(m, function(a, b) { | ||
g(b) | ||
})) : b(a).each(function(a, b) { | ||
var c = q(b); | ||
c && (c.configure(d, e), g(b)) | ||
}) | ||
}; | ||
n.reload = function(a) { | ||
a === v ? b.each(m, function() { | ||
g(this.id) | ||
}) : | ||
b(a).each(function(a, b) { | ||
var c = s(b); | ||
c && (g(c), r(c)) | ||
}) | ||
}; | ||
n.remove = function(a) { | ||
b(a).each(function(a, b) { | ||
var c = s(b); | ||
c && delete m[c] | ||
}) | ||
}; | ||
n.destroy = function() { | ||
l.off(".espy"); | ||
m = {}; | ||
n = v | ||
}; | ||
n.resize = function() { | ||
b.each(m, function() { | ||
this.reloadOnResize && g(this) | ||
}); | ||
p.width = l.innerWidth(); | ||
p.height = l.innerHeight(); | ||
r() | ||
}; | ||
l.on("scroll.espy", y(k.delay, function() { | ||
p.top = l.scrollTop(); | ||
p.left = l.scrollLeft(); | ||
r() | ||
})); | ||
l.on("resize.espy", y(k.delay, function() { | ||
n.resize() | ||
})) | ||
}; | ||
b.fn.espy = function(k, f) { | ||
var e, c; | ||
e = f && f.context || u; | ||
var g = b.data(e, | ||
"espy") || b.data(e, "espy", new b.Espy(e)); | ||
"string" !== typeof k ? g.add(this, k, f) : (e = k, c = Array.prototype.slice.call(arguments), c[0] = this, "function" === typeof g[e] && g[e].apply(g, c)); | ||
return this | ||
}; | ||
b.fn.espy.defaults = { | ||
delay: 100, | ||
context: window, | ||
horizontal: 0, | ||
offset: 0, | ||
size: "100%", | ||
contain: 0, | ||
reloadOnResize: !0 | ||
} | ||
})(jQuery, window); | ||
|
||
|
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
// Sticky Plugin v1.0.0 for jQuery | ||
// ============= | ||
// Author: Anthony Garand | ||
// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk) | ||
// Improvements by Leonardo C. Daronco (daronco) | ||
// Created: 2/14/2011 | ||
// Date: 2/12/2012 | ||
// Website: http://labs.anthonygarand.com/sticky | ||
// Description: Makes an element on the page stick on the screen as you scroll | ||
// It will only set the 'top' and 'position' of your element, you | ||
// might need to adjust the width in some cases. | ||
|
||
(function($) { | ||
var defaults = { | ||
topSpacing: 0, | ||
bottomSpacing: 0, | ||
className: 'is-sticky', | ||
wrapperClassName: 'sticky-wrapper', | ||
center: false, | ||
getWidthFrom: '' | ||
}, | ||
$window = $(window), | ||
$document = $(document), | ||
sticked = [], | ||
windowHeight = $window.height(), | ||
scroller = function() { | ||
var scrollTop = $window.scrollTop(), | ||
documentHeight = $document.height(), | ||
dwh = documentHeight - windowHeight, | ||
extra = (scrollTop > dwh) ? dwh - scrollTop : 0; | ||
|
||
for (var i = 0; i < sticked.length; i++) { | ||
var s = sticked[i], | ||
elementTop = s.stickyWrapper.offset().top, | ||
etse = elementTop - s.topSpacing - extra; | ||
|
||
if (scrollTop <= etse) { | ||
if (s.currentTop !== null) { | ||
s.stickyElement | ||
.css('position', '') | ||
.css('top', ''); | ||
s.stickyElement.parent().removeClass(s.className); | ||
s.currentTop = null; | ||
} | ||
} | ||
else { | ||
var newTop = documentHeight - s.stickyElement.outerHeight() | ||
- s.topSpacing - s.bottomSpacing - scrollTop - extra; | ||
if (newTop < 0) { | ||
newTop = newTop + s.topSpacing; | ||
} else { | ||
newTop = s.topSpacing; | ||
} | ||
if (s.currentTop != newTop) { | ||
s.stickyElement | ||
.css('position', 'fixed') | ||
.css('top', newTop); | ||
|
||
if (typeof s.getWidthFrom !== 'undefined') { | ||
s.stickyElement.css('width', $(s.getWidthFrom).width()); | ||
} | ||
|
||
s.stickyElement.parent().addClass(s.className); | ||
s.currentTop = newTop; | ||
} | ||
} | ||
} | ||
}, | ||
resizer = function() { | ||
windowHeight = $window.height(); | ||
}, | ||
methods = { | ||
init: function(options) { | ||
var o = $.extend({}, defaults, options); | ||
return this.each(function() { | ||
var stickyElement = $(this); | ||
|
||
var stickyId = stickyElement.attr('id'); | ||
var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName | ||
var wrapper = $('<div></div>') | ||
.attr('id', stickyId + '-sticky-wrapper') | ||
.addClass(o.wrapperClassName); | ||
stickyElement.wrapAll(wrapper); | ||
|
||
if (o.center) { | ||
stickyElement.parent().css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"}); | ||
} | ||
|
||
if (stickyElement.css("float") == "right") { | ||
stickyElement.css({"float":"none"}).parent().css({"float":"right"}); | ||
} | ||
|
||
var stickyWrapper = stickyElement.parent(); | ||
stickyWrapper.css('height', stickyElement.outerHeight()); | ||
sticked.push({ | ||
topSpacing: o.topSpacing, | ||
bottomSpacing: o.bottomSpacing, | ||
stickyElement: stickyElement, | ||
currentTop: null, | ||
stickyWrapper: stickyWrapper, | ||
className: o.className, | ||
getWidthFrom: o.getWidthFrom | ||
}); | ||
}); | ||
}, | ||
update: scroller, | ||
unstick: function(options) { | ||
return this.each(function() { | ||
var unstickyElement = $(this); | ||
|
||
var removeIdx = -1; | ||
for (var i = 0; i < sticked.length; i++) | ||
{ | ||
if (sticked[i].stickyElement.get(0) == unstickyElement.get(0)) | ||
{ | ||
removeIdx = i; | ||
} | ||
} | ||
if(removeIdx != -1) | ||
{ | ||
sticked.splice(removeIdx,1); | ||
unstickyElement.unwrap(); | ||
unstickyElement.removeAttr('style'); | ||
} | ||
}); | ||
} | ||
}; | ||
|
||
// should be more efficient than using $window.scroll(scroller) and $window.resize(resizer): | ||
if (window.addEventListener) { | ||
window.addEventListener('scroll', scroller, false); | ||
window.addEventListener('resize', resizer, false); | ||
} else if (window.attachEvent) { | ||
window.attachEvent('onscroll', scroller); | ||
window.attachEvent('onresize', resizer); | ||
} | ||
|
||
$.fn.sticky = function(method) { | ||
if (methods[method]) { | ||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); | ||
} else if (typeof method === 'object' || !method ) { | ||
return methods.init.apply( this, arguments ); | ||
} else { | ||
$.error('Method ' + method + ' does not exist on jQuery.sticky'); | ||
} | ||
}; | ||
|
||
$.fn.unstick = function(method) { | ||
if (methods[method]) { | ||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); | ||
} else if (typeof method === 'object' || !method ) { | ||
return methods.unstick.apply( this, arguments ); | ||
} else { | ||
$.error('Method ' + method + ' does not exist on jQuery.sticky'); | ||
} | ||
|
||
}; | ||
$(function() { | ||
setTimeout(scroller, 0); | ||
}); | ||
})(jQuery); |
Oops, something went wrong.