mirror of https://github.com/friendica/friendica
108 lines
3.7 KiB
JavaScript
108 lines
3.7 KiB
JavaScript
'use strict';
|
|
|
|
var _ = require('../lib/helper');
|
|
var cls = require('../lib/class');
|
|
var defaultSettings = require('./default-setting');
|
|
var dom = require('../lib/dom');
|
|
var EventManager = require('../lib/event-manager');
|
|
var guid = require('../lib/guid');
|
|
|
|
var instances = {};
|
|
|
|
function Instance(element) {
|
|
var i = this;
|
|
|
|
i.settings = _.clone(defaultSettings);
|
|
i.containerWidth = null;
|
|
i.containerHeight = null;
|
|
i.contentWidth = null;
|
|
i.contentHeight = null;
|
|
|
|
i.isRtl = dom.css(element, 'direction') === "rtl";
|
|
i.isNegativeScroll = (function () {
|
|
var originalScrollLeft = element.scrollLeft;
|
|
var result = null;
|
|
element.scrollLeft = -1;
|
|
result = element.scrollLeft < 0;
|
|
element.scrollLeft = originalScrollLeft;
|
|
return result;
|
|
})();
|
|
i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;
|
|
i.event = new EventManager();
|
|
i.ownerDocument = element.ownerDocument || document;
|
|
|
|
function focus() {
|
|
cls.add(element, 'ps-focus');
|
|
}
|
|
|
|
function blur() {
|
|
cls.remove(element, 'ps-focus');
|
|
}
|
|
|
|
i.scrollbarXRail = dom.appendTo(dom.e('div', 'ps-scrollbar-x-rail'), element);
|
|
i.scrollbarX = dom.appendTo(dom.e('div', 'ps-scrollbar-x'), i.scrollbarXRail);
|
|
i.scrollbarX.setAttribute('tabindex', 0);
|
|
i.event.bind(i.scrollbarX, 'focus', focus);
|
|
i.event.bind(i.scrollbarX, 'blur', blur);
|
|
i.scrollbarXActive = null;
|
|
i.scrollbarXWidth = null;
|
|
i.scrollbarXLeft = null;
|
|
i.scrollbarXBottom = _.toInt(dom.css(i.scrollbarXRail, 'bottom'));
|
|
i.isScrollbarXUsingBottom = i.scrollbarXBottom === i.scrollbarXBottom; // !isNaN
|
|
i.scrollbarXTop = i.isScrollbarXUsingBottom ? null : _.toInt(dom.css(i.scrollbarXRail, 'top'));
|
|
i.railBorderXWidth = _.toInt(dom.css(i.scrollbarXRail, 'borderLeftWidth')) + _.toInt(dom.css(i.scrollbarXRail, 'borderRightWidth'));
|
|
// Set rail to display:block to calculate margins
|
|
dom.css(i.scrollbarXRail, 'display', 'block');
|
|
i.railXMarginWidth = _.toInt(dom.css(i.scrollbarXRail, 'marginLeft')) + _.toInt(dom.css(i.scrollbarXRail, 'marginRight'));
|
|
dom.css(i.scrollbarXRail, 'display', '');
|
|
i.railXWidth = null;
|
|
i.railXRatio = null;
|
|
|
|
i.scrollbarYRail = dom.appendTo(dom.e('div', 'ps-scrollbar-y-rail'), element);
|
|
i.scrollbarY = dom.appendTo(dom.e('div', 'ps-scrollbar-y'), i.scrollbarYRail);
|
|
i.scrollbarY.setAttribute('tabindex', 0);
|
|
i.event.bind(i.scrollbarY, 'focus', focus);
|
|
i.event.bind(i.scrollbarY, 'blur', blur);
|
|
i.scrollbarYActive = null;
|
|
i.scrollbarYHeight = null;
|
|
i.scrollbarYTop = null;
|
|
i.scrollbarYRight = _.toInt(dom.css(i.scrollbarYRail, 'right'));
|
|
i.isScrollbarYUsingRight = i.scrollbarYRight === i.scrollbarYRight; // !isNaN
|
|
i.scrollbarYLeft = i.isScrollbarYUsingRight ? null : _.toInt(dom.css(i.scrollbarYRail, 'left'));
|
|
i.scrollbarYOuterWidth = i.isRtl ? _.outerWidth(i.scrollbarY) : null;
|
|
i.railBorderYWidth = _.toInt(dom.css(i.scrollbarYRail, 'borderTopWidth')) + _.toInt(dom.css(i.scrollbarYRail, 'borderBottomWidth'));
|
|
dom.css(i.scrollbarYRail, 'display', 'block');
|
|
i.railYMarginHeight = _.toInt(dom.css(i.scrollbarYRail, 'marginTop')) + _.toInt(dom.css(i.scrollbarYRail, 'marginBottom'));
|
|
dom.css(i.scrollbarYRail, 'display', '');
|
|
i.railYHeight = null;
|
|
i.railYRatio = null;
|
|
}
|
|
|
|
function getId(element) {
|
|
return element.getAttribute('data-ps-id');
|
|
}
|
|
|
|
function setId(element, id) {
|
|
element.setAttribute('data-ps-id', id);
|
|
}
|
|
|
|
function removeId(element) {
|
|
element.removeAttribute('data-ps-id');
|
|
}
|
|
|
|
exports.add = function (element) {
|
|
var newId = guid();
|
|
setId(element, newId);
|
|
instances[newId] = new Instance(element);
|
|
return instances[newId];
|
|
};
|
|
|
|
exports.remove = function (element) {
|
|
delete instances[getId(element)];
|
|
removeId(element);
|
|
};
|
|
|
|
exports.get = function (element) {
|
|
return instances[getId(element)];
|
|
};
|