// Licensed to Cloudera, Inc. under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. Cloudera, Inc. licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/*
* jHue scroll to top plugin
* Can be used globally with
* $.jHueScrollUp()
* or with a target for the scroll up
* $(element).jHueScrollUp()
*
* options:
* - threshold: (default 100) value in pixels, scroll amount before the link appears
*/
(function ($, window, document, undefined) {
var pluginName = "jHueScrollUp",
defaults = {
threshold: 100 // it displays it after 100 px of scroll
};
function Plugin(element, options) {
this.element = element;
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype.setOptions = function (options) {
this.options = $.extend({}, defaults, options);
};
Plugin.prototype.init = function () {
var _this = this;
var link = $("").attr("id", "jHueScrollUpAnchor").attr("href", "javascript:void(0)").html("").appendTo("body");
if ($("#jHueScrollUpAnchor").length > 0) { // just one scroll up per page
link = $("#jHueScrollUpAnchor");
$(document).off("click", "#jHueScrollUpAnchor");
}
$(_this.element).attr("jHueScrollified", "true");
if ($(_this.element).is("body")) {
setScrollBehavior($(window), $("body, html"));
}
else {
setScrollBehavior($(_this.element), $(_this.element));
}
function setScrollBehavior(scrolled, scrollable) {
scrolled.scroll(function () {
if (scrolled.scrollTop() > _this.options.threshold) {
if (link.is(":hidden")) {
link.fadeIn(200);
}
if ($(_this.element).data("lastScrollTop") == null || $(_this.element).data("lastScrollTop") < scrolled.scrollTop()) {
$("#jHueScrollUpAnchor").data("caller", scrollable);
}
$(_this.element).data("lastScrollTop", scrolled.scrollTop());
}
else {
checkForAllScrolls();
}
});
}
function checkForAllScrolls() {
var _allOk = true;
$(document).find("[jHueScrollified='true']").each(function (cnt, item) {
if ($(item).is("body")) {
if ($(window).scrollTop() > _this.options.threshold) {
_allOk = false;
$("#jHueScrollUpAnchor").data("caller", $("body, html"));
}
}
else {
if ($(item).scrollTop() > _this.options.threshold) {
_allOk = false;
$("#jHueScrollUpAnchor").data("caller", $(item));
}
}
});
if (_allOk) {
link.fadeOut(200);
$("#jHueScrollUpAnchor").data("caller", null);
}
}
$(document).on("click", "#jHueScrollUpAnchor", function (event) {
if ($("#jHueScrollUpAnchor").data("caller") != null) {
$("#jHueScrollUpAnchor").data("caller").animate({scrollTop: 0}, 300, function () {
if ($(document).find("[jHueScrollified='true']").not($("#jHueScrollUpAnchor").data("caller")).is("body") && $(window).scrollTop() > _this.options.threshold) {
$("#jHueScrollUpAnchor").data("caller", $("body, html"));
}
else {
checkForAllScrolls();
}
});
}
return false;
});
};
$.fn[pluginName] = function (options) {
return this.each(function () {
$.data(this, 'plugin_' + pluginName, new Plugin(this, options));
});
}
$[pluginName] = function (options) {
new Plugin($("body"), options);
};
})(jQuery, window, document);