Файл: Luxe-Shop v6.0/templates/premium/js/baron.full.js
Строк: 1226
<?php
(function(window, undefined) {
'use strict';
if (!window) return; // Server side
var
_baron = baron, // Stored baron value for noConflict usage
pos = ['left', 'top', 'right', 'bottom', 'width', 'height'],
origin = {
v: { // Vertical
x: 'Y', pos: pos[1], oppos: pos[3], crossPos: pos[0], crossOpPos: pos[2], size: pos[5], crossSize: pos[4],
client: 'clientHeight', crossClient: 'clientWidth', crossScroll: 'scrollWidth', offset: 'offsetHeight', crossOffset: 'offsetWidth', offsetPos: 'offsetTop',
scroll: 'scrollTop', scrollSize: 'scrollHeight'
},
h: { // Horizontal
x: 'X', pos: pos[0], oppos: pos[2], crossPos: pos[1], crossOpPos: pos[3], size: pos[4], crossSize: pos[5],
client: 'clientWidth', crossClient: 'clientHeight', crossScroll: 'scrollHeight', offset: 'offsetWidth', crossOffset: 'offsetHeight', offsetPos: 'offsetLeft',
scroll: 'scrollLeft', scrollSize: 'scrollWidth'
}
},
each = function(obj, iterator) {
var i = 0;
if (obj.length === undefined || obj === window) obj = [obj];
while (obj[i]) {
iterator.call(this, obj[i], i);
i++;
}
},
baron = function(params) {
var jQueryMode,
roots,
$;
params = params || {};
$ = params.$ || window.jQuery;
jQueryMode = this instanceof $; // this - window or jQuery instance
if (jQueryMode) {
params.root = roots = this;
} else {
roots = $(params.root || params.scroller);
}
return new baron.fn.constructor(roots, params, $);
};
baron.fn = {
constructor: function(roots, input, $) {
var params = validate(input);
params.$ = $;
each.call(this, roots, function(root, i) {
var localParams = clone(params);
if (params.root && params.scroller) {
localParams.scroller = params.$(params.scroller, root);
if (!localParams.scroller.length) {
localParams.scroller = root;
}
} else {
localParams.scroller = root;
}
localParams.root = root;
this[i] = init(localParams);
this.length = i + 1;
});
this.params = params;
},
dispose: function() {
var params = this.params;
if (this[0]) { /* Если есть хотя бы 1 рабочий инстанс */
each(this, function(item) {
item.dispose(params);
});
}
this.params = null;
},
update: function() {
var i = 0;
while (this[i]) {
this[i].update.apply(this[i], arguments);
i++;
}
},
baron: function(params) {
params.root = [];
params.scroller = this.params.scroller;
each.call(this, this, function(elem) {
params.root.push(elem.root);
});
params.direction = (this.params.direction == 'v') ? 'h' : 'v';
params._chain = true;
return baron(params);
}
};
function manageEvents(item, eventManager, mode) {
item._eventHandlers = item._eventHandlers || [ // Creating new functions for one baron item only one time
{
// onScroll:
element: item.scroller,
handler: function(e) {
item.scroll(e);
},
type: 'scroll'
}, {
// onKeyup (textarea):
element: item.scroller,
handler: function() {
item.update();
},
type: 'keyup'
}, {
// onMouseDown:
element: item.bar,
handler: function(e) {
e.preventDefault(); // Text selection disabling in Opera... and all other browsers?
item.selection(); // Disable text selection in ie8
item.drag.now = 1; // Save private byte
},
type: 'touchstart mousedown'
}, {
// onMouseUp:
element: document,
handler: function() {
item.selection(1); // Enable text selection
item.drag.now = 0;
},
type: 'mouseup blur touchend'
}, {
// onCoordinateReset:
element: document,
handler: function(e) {
if (e.button != 2) { // Not RM
item._pos0(e);
}
},
type: 'touchstart mousedown'
}, {
// onMouseMove:
element: document,
handler: function(e) {
if (item.drag.now) {
item.drag(e);
}
},
type: 'mousemove touchmove'
}, {
// onResize:
element: window,
handler: function() {
item.update();
},
type: 'resize'
}, {
// sizeChange:
element: item.root,
handler: function() {
item.update();
},
type: 'sizeChange'
}
];
each(item._eventHandlers, function(event) {
if (event.element) {
eventManager(event.element, event.type, event.handler, mode);
}
});
// if (item.scroller) {
// event(item.scroller, 'scroll', item._eventHandlers.onScroll, mode);
// }
// if (item.bar) {
// event(item.bar, 'touchstart mousedown', item._eventHandlers.onMouseDown, mode);
// }
// event(document, 'mouseup blur touchend', item._eventHandlers.onMouseUp, mode);
// event(document, 'touchstart mousedown', item._eventHandlers.onCoordinateReset, mode);
// event(document, 'mousemove touchmove', item._eventHandlers.onMouseMove, mode);
// event(window, 'resize', item._eventHandlers.onResize, mode);
// if (item.root) {
// event(item.root, 'sizeChange', item._eventHandlers.onResize, mode); // Custon event for alternate baron update mechanism
// }
}
function manageAttr(node, direction, mode) {
var attrName = 'data-baron-' + direction;
if (mode == 'on') {
node.setAttribute(attrName, 'inited');
} else if (mode == 'off') {
node.removeAttribute(attrName);
} else {
return node.getAttribute(attrName);
}
}
function init(params) {
if (manageAttr(params.root, params.direction)) throw new Error('Second baron initialization');
var out = new item.prototype.constructor(params); // __proto__ of returning object is baron.prototype
manageEvents(out, params.event, 'on');
manageAttr(out.root, params.direction, 'on');
out.update({
initMode: true
});
return out;
}
function clone(input) {
var output = {};
input = input || {};
for (var key in input) {
if (input.hasOwnProperty(key)) {
output[key] = input[key];
}
}
return output;
}
function validate(input) {
var output = clone(input);
output.direction = output.direction || 'v';
var event = input.event || function(elem, event, func, mode) {
output.$(elem)[mode || 'on'](event, func);
};
output.event = function(elems, e, func, mode) {
each(elems, function(elem) {
event(elem, e, func, mode);
});
};
return output;
}
function fire(eventName) {
/* jshint validthis:true */
if (this.events && this.events[eventName]) {
for (var i = 0 ; i < this.events[eventName].length ; i++) {
var args = Array.prototype.slice.call( arguments, 1 );
this.events[eventName][i].apply(this, args);
}
}
}
var item = {};
item.prototype = {
constructor: function(params) {
var $,
barPos,
scrollerPos0,
track,
resizePauseTimer,
scrollPauseTimer,
scrollingTimer,
pause,
scrollLastFire,
resizeLastFire,
oldBarSize;
resizeLastFire = scrollLastFire = new Date().getTime();
$ = this.$ = params.$;
this.event = params.event;
this.events = {};
function getNode(sel, context) {
return $(sel, context)[0]; // Can be undefined
}
// DOM elements
this.root = params.root; // Always html node, not just selector
this.scroller = getNode(params.scroller); // (params.scroller) ? getNode(params.scroller, this.root) : this.root;
this.bar = getNode(params.bar, this.root);
track = this.track = getNode(params.track, this.root);
if (!this.track && this.bar) {
track = this.bar.parentNode;
}
this.clipper = this.scroller.parentNode;
// Parameters
this.direction = params.direction;
this.origin = origin[this.direction];
this.barOnCls = params.barOnCls;
this.scrollingCls = params.scrollingCls;
this.barTopLimit = 0;
pause = params.pause * 1000 || 0;
// Updating height or width of bar
function setBarSize(size) {
/* jshint validthis:true */
var barMinSize = this.barMinSize || 20;
if (size > 0 && size < barMinSize) {
size = barMinSize;
}
if (this.bar) {
$(this.bar).css(this.origin.size, parseInt(size, 10) + 'px');
}
}
// Updating top or left bar position
function posBar(pos) {
/* jshint validthis:true */
if (this.bar) {
$(this.bar).css(this.origin.pos, +pos + 'px');
}
}
// Free path for bar
function k() {
/* jshint validthis:true */
return track[this.origin.client] - this.barTopLimit - this.bar[this.origin.offset];
}
// Relative content top position to bar top position
function relToPos(r) {
/* jshint validthis:true */
return r * k.call(this) + this.barTopLimit;
}
// Bar position to relative content position
function posToRel(t) {
/* jshint validthis:true */
return (t - this.barTopLimit) / k.call(this);
}
// Cursor position in main direction in px // Now with iOs support
this.cursor = function(e) {
return e['client' + this.origin.x] || (((e.originalEvent || e).touches || {})[0] || {})['page' + this.origin.x];
};
// Text selection pos preventing
function dontPosSelect() {
return false;
}
this.pos = function(x) { // Absolute scroller position in px
var ie = 'page' + this.origin.x + 'Offset',
key = (this.scroller[ie]) ? ie : this.origin.scroll;
if (x !== undefined) this.scroller[key] = x;
return this.scroller[key];
};
this.rpos = function(r) { // Relative scroller position (0..1)
var free = this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client],
x;
if (r) {
x = this.pos(r * free);
} else {
x = this.pos();
}
return x / (free || 1);
};
// Switch on the bar by adding user-defined CSS classname to scroller
this.barOn = function(dispose) {
if (this.barOnCls) {
if (dispose || this.scroller[this.origin.client] >= this.scroller[this.origin.scrollSize]) {
$(this.root).removeClass(this.barOnCls);
} else {
$(this.root).addClass(this.barOnCls);
}
}
};
this._pos0 = function(e) {
scrollerPos0 = this.cursor(e) - barPos;
};
this.drag = function(e) {
this.scroller[this.origin.scroll] = posToRel.call(this, this.cursor(e) - scrollerPos0) * (this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client]);
};
// Text selection preventing on drag
this.selection = function(enable) {
this.event(document, 'selectpos selectstart', dontPosSelect, enable ? 'off' : 'on');
};
// onResize & DOM modified handler
this.resize = function() {
var self = this,
delay = 0;
if (new Date().getTime() - resizeLastFire < pause) {
clearTimeout(resizePauseTimer);
delay = pause;
}
function upd() {
var delta,
client;
self.barOn();
client = self.scroller[self.origin.crossClient];
delta = self.scroller[self.origin.crossOffset] - client;
if (params.freeze && !self.clipper.style[self.origin.crossSize]) { // Sould fire only once
$(self.clipper).css(self.origin.crossSize, self.clipper[self.origin.crossClient] - delta + 'px');
}
$(self.scroller).css(self.origin.crossSize, self.clipper[self.origin.crossClient] + delta + 'px');
Array.prototype.unshift.call(arguments, 'resize');
fire.apply(self, arguments);
resizeLastFire = new Date().getTime();
}
if (delay) {
resizePauseTimer = setTimeout(upd, delay);
} else {
upd();
}
};
this.updatePositions = function() {
var newBarSize,
self = this;
if (self.bar) {
newBarSize = (track[self.origin.client] - self.barTopLimit) * self.scroller[self.origin.client] / self.scroller[self.origin.scrollSize];
// Positioning bar
if (parseInt(oldBarSize, 10) != parseInt(newBarSize, 10)) {
setBarSize.call(self, newBarSize);
oldBarSize = newBarSize;
}
barPos = relToPos.call(self, self.rpos());
posBar.call(self, barPos);
}
Array.prototype.unshift.call( arguments, 'scroll' );
fire.apply(self, arguments);
scrollLastFire = new Date().getTime();
};
// onScroll handler
this.scroll = function() {
var delay = 0,
self = this;
if (new Date().getTime() - scrollLastFire < pause) {
clearTimeout(scrollPauseTimer);
delay = pause;
}
if (new Date().getTime() - scrollLastFire < pause) {
clearTimeout(scrollPauseTimer);
delay = pause;
}
if (delay) {
scrollPauseTimer = setTimeout(function() {
self.updatePositions();
}, delay);
} else {
self.updatePositions();
}
if (self.scrollingCls) {
if (!scrollingTimer) {
this.$(this.scroller).addClass(this.scrollingCls);
}
clearTimeout(scrollingTimer);
scrollingTimer = setTimeout(function() {
self.$(self.scroller).removeClass(self.scrollingCls);
scrollingTimer = undefined;
}, 300);
}
};
return this;
},
update: function(params) {
fire.call(this, 'upd', params); // Update all plugins' params
this.resize(1);
this.updatePositions();
return this;
},
dispose: function(params) {
manageEvents(this, this.event, 'off');
manageAttr(this.root, params.direction, 'off');
$(this.scroller).css(this.origin.crossSize, '');
this.barOn(true);
fire.call(this, 'dispose');
},
on: function(eventName, func, arg) {
var names = eventName.split(' ');
for (var i = 0 ; i < names.length ; i++) {
if (names[i] == 'init') {
func.call(this, arg);
} else {
this.events[names[i]] = this.events[names[i]] || [];
this.events[names[i]].push(function(userArg) {
func.call(this, userArg || arg);
});
}
}
}
};
baron.fn.constructor.prototype = baron.fn;
item.prototype.constructor.prototype = item.prototype;
// Use when you need "baron" global var for another purposes
baron.noConflict = function() {
window.baron = _baron; // Restoring original value of "baron" global var
return baron;
};
baron.version = '0.7.7';
if ($ && $.fn) { // Adding baron to jQuery as plugin
$.fn.baron = baron;
}
window.baron = baron; // Use noConflict method if you need window.baron var for another purposes
if (window['module'] && module.exports) {
module.exports = baron.noConflict();
}
})(window);
/* Fixable elements plugin for baron 0.6+ */
(function(window, undefined) {
var fix = function(userParams) {
var elements, viewPortSize,
params = { // Default params
outside: '',
inside: '',
before: '',
after: '',
past: '',
future: '',
radius: 0,
minView: 0
},
topFixHeights = [], // inline style for element
topRealHeights = [], // ? something related to negative margins for fixable elements
headerTops = [], // offset positions when not fixed
scroller = this.scroller,
eventManager = this.event,
$ = this.$,
self = this;
// i - number of fixing element, pos - fix-position in px, flag - 1: top, 2: bottom
// Invocation only in case when fix-state changed
function fixElement(i, pos, flag) {
var ori = flag == 1 ? 'pos' : 'oppos';
if (viewPortSize < (params.minView || 0)) { // No headers fixing when no enought space for viewport
pos = undefined;
}
// Removing all fixing stuff - we can do this because fixElement triggers only when fixState really changed
this.$(elements[i]).css(this.origin.pos, '').css(this.origin.oppos, '').removeClass(params.outside);
// Fixing if needed
if (pos !== undefined) {
pos += 'px';
this.$(elements[i]).css(this.origin[ori], pos).addClass(params.outside);
}
}
function bubbleWheel(e) {
try {
i = document.createEvent('WheelEvent'); // i - for extra byte
// evt.initWebKitWheelEvent(deltaX, deltaY, window, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
i.initWebKitWheelEvent(e.originalEvent.wheelDeltaX, e.originalEvent.wheelDeltaY);
scroller.dispatchEvent(i);
e.preventDefault();
} catch (e) {}
}
function init(_params) {
var pos;
for (var key in _params) {
params[key] = _params[key];
}
elements = this.$(params.elements, this.scroller);
if (elements) {
viewPortSize = this.scroller[this.origin.client];
for (var i = 0 ; i < elements.length ; i++) {
// Variable header heights
pos = {};
pos[this.origin.size] = elements[i][this.origin.offset];
if (elements[i].parentNode !== this.scroller) {
this.$(elements[i].parentNode).css(pos);
}
pos = {};
pos[this.origin.crossSize] = elements[i].parentNode[this.origin.crossClient];
this.$(elements[i]).css(pos);
// Between fixed headers
viewPortSize -= elements[i][this.origin.offset];
headerTops[i] = elements[i].parentNode[this.origin.offsetPos]; // No paddings for parentNode
// Summary elements height above current
topFixHeights[i] = (topFixHeights[i - 1] || 0); // Not zero because of negative margins
topRealHeights[i] = (topRealHeights[i - 1] || Math.min(headerTops[i], 0));
if (elements[i - 1]) {
topFixHeights[i] += elements[i - 1][this.origin.offset];
topRealHeights[i] += elements[i - 1][this.origin.offset];
}
if ( !(i == 0 && headerTops[i] == 0)/* && force */) {
this.event(elements[i], 'mousewheel', bubbleWheel, 'off');
this.event(elements[i], 'mousewheel', bubbleWheel);
}
}
if (params.limiter && elements[0]) { // Bottom edge of first header as top limit for track
if (this.track && this.track != this.scroller) {
pos = {};
pos[this.origin.pos] = elements[0].parentNode[this.origin.offset];
this.$(this.track).css(pos);
} else {
this.barTopLimit = elements[0].parentNode[this.origin.offset];
}
// this.barTopLimit = elements[0].parentNode[this.origin.offset];
this.scroll();
}
if (params.limiter === false) { // undefined (in second fix instance) should have no influence on bar limit
this.barTopLimit = 0;
}
}
var event = {
element: elements,
handler: function() {
var parent = $(this)[0].parentNode,
top = parent.offsetTop,
num;
// finding num -> elements[num] === this
for (var i = 0 ; i < elements.length ; i++ ) {
if (elements[i] === this) num = i;
}
var pos = top - topFixHeights[num];
if (params.scroll) { // User defined callback
params.scroll({
x1: self.scroller.scrollTop,
x2: pos
});
} else {
self.scroller.scrollTop = pos;
}
},
type: 'click'
};
if (params.clickable) {
this._eventHandlers.push(event); // For auto-dispose
// eventManager(event.element, event.type, event.handler, 'off');
eventManager(event.element, event.type, event.handler, 'on');
}
}
this.on('init', init, userParams);
var fixFlag = [], // 1 - past, 2 - future, 3 - current (not fixed)
gradFlag = [];
this.on('init scroll', function() {
var fixState, hTop, gradState;
if (elements) {
var change;
// fixFlag update
for (var i = 0 ; i < elements.length ; i++) {
fixState = 0;
if (headerTops[i] - this.pos() < topRealHeights[i] + params.radius) {
// Header trying to go up
fixState = 1;
hTop = topFixHeights[i];
} else if (headerTops[i] - this.pos() > topRealHeights[i] + viewPortSize - params.radius) {
// Header trying to go down
fixState = 2;
// console.log('topFixHeights[i] + viewPortSize + topRealHeights[i]', topFixHeights[i], this.scroller[this.origin.client], topRealHeights[i]);
hTop = this.scroller[this.origin.client] - elements[i][this.origin.offset] - topFixHeights[i] - viewPortSize;
// console.log('hTop', hTop, viewPortSize, elements[this.origin.offset], topFixHeights[i]);
//(topFixHeights[i] + viewPortSize + elements[this.origin.offset]) - this.scroller[this.origin.client];
} else {
// Header in viewport
fixState = 3;
hTop = undefined;
}
gradState = false;
if (headerTops[i] - this.pos() < topRealHeights[i] || headerTops[i] - this.pos() > topRealHeights[i] + viewPortSize) {
gradState = true;
}
if (fixState != fixFlag[i] || gradState != gradFlag[i]) {
fixElement.call(this, i, hTop, fixState);
fixFlag[i] = fixState;
gradFlag[i] = gradState;
change = true;
}
}
// Adding positioning classes (on last top and first bottom header)
if (change) { // At leats one change in elements flag structure occured
for (i = 0 ; i < elements.length ; i++) {
if (fixFlag[i] == 1 && params.past) {
this.$(elements[i]).addClass(params.past).removeClass(params.future);
}
if (fixFlag[i] == 2 && params.future) {
this.$(elements[i]).addClass(params.future).removeClass(params.past);
}
if (fixFlag[i] == 3) {
if (params.future || params.past) this.$(elements[i]).removeClass(params.past).removeClass(params.future);
if (params.inside) this.$(elements[i]).addClass(params.inside);
} else if (params.inside) {
this.$(elements[i]).removeClass(params.inside);
}
if (fixFlag[i] != fixFlag[i + 1] && fixFlag[i] == 1 && params.before) {
this.$(elements[i]).addClass(params.before).removeClass(params.after); // Last top fixed header
} else if (fixFlag[i] != fixFlag[i - 1] && fixFlag[i] == 2 && params.after) {
this.$(elements[i]).addClass(params.after).removeClass(params.before); // First bottom fixed header
} else {
this.$(elements[i]).removeClass(params.before).removeClass(params.after);
}
if (params.grad) {
if (gradFlag[i]) {
this.$(elements[i]).addClass(params.grad);
} else {
this.$(elements[i]).removeClass(params.grad);
}
}
}
}
}
});
this.on('resize upd', function(updParams) {
init.call(this, updParams && updParams.fix);
});
};
baron.fn.fix = function(params) {
var i = 0;
while (this[i]) {
fix.call(this[i], params);
i++;
}
return this;
};
})(window);
/* Controls plugin for baron 0.6+ */
(function(window, undefined) {
var controls = function(params) {
var forward, backward, track, screen,
self = this, // AAAAAA!!!!!11
event;
screen = params.screen || 0.9;
if (params.forward) {
forward = this.$(params.forward, this.clipper);
event = {
element: forward,
handler: function() {
var y = self.pos() - params.delta || 30;
self.pos(y);
},
type: 'click'
};
this._eventHandlers.push(event); // For auto-dispose
this.event(event.element, event.type, event.handler, 'on');
}
if (params.backward) {
backward = this.$(params.backward, this.clipper);
event = {
element: backward,
handler: function() {
var y = self.pos() + params.delta || 30;
self.pos(y);
},
type: 'click'
};
this._eventHandlers.push(event); // For auto-dispose
this.event(event.element, event.type, event.handler, 'on');
}
if (params.track) {
if (params.track === true) {
track = this.track;
} else {
track = this.$(params.track, this.clipper)[0];
}
if (track) {
event = {
element: track,
handler: function(e) {
var x = e['offset' + self.origin.x],
xBar = self.bar[self.origin.offsetPos],
sign = 0;
if (x < xBar) {
sign = -1;
} else if (x > xBar + self.bar[self.origin.offset]) {
sign = 1;
}
var y = self.pos() + sign * screen * self.scroller[self.origin.client];
self.pos(y);
},
type: 'mousedown'
};
this._eventHandlers.push(event); // For auto-dispose
this.event(event.element, event.type, event.handler, 'on');
}
}
};
baron.fn.controls = function(params) {
var i = 0;
while (this[i]) {
controls.call(this[i], params);
i++;
}
return this;
};
})(window);
/* Autotests plugin for baron 0.6+ (for developers) */
(function(window, undefined) {
var test = function(params) {
var errCount = 0,
totalCount = 0;
var log = function(type, msg, obj) {
var text = type + ': ' + msg;
switch (type) {
case 'log': css = 'color: #0b0'; break;
case 'warn': css = 'color: #fc9'; break;
case 'error': css = 'color: #f00'; break;
}
totalCount++;
if (type == 'log') {
errCount++;
}
console.log('%c ' + totalCount + '. ' + text, css);
if (obj !== undefined) {
console.log(obj);
}
};
if (this.scroller && this.scroller.nodeType === 1) {
log('log', 'Scroller defined and has proper nodeType value', this.scroller);
} else {
log('error', 'Scroller not defined or has wrong type (should be html node).', this.scroller);
}
if (this.$ && typeof this.$ == 'function') {
log('log', 'Local $ defined and it is a function');
} else {
log('error', 'Local $ has wrong value or is not defined, or custom params.dom and params.selector not defined', params.$);
}
if (this.scroller.getAttribute('data-baron-v')) {
log('log', 'Baron initialized in vertical direction', this.scroller.getAttribute('data-baron-v'));
if (this.scroller.clientHeight < this.scroller.scrollHeight && this.scroller.getAttribute('data-baron-v')) {
log('log', 'There are enought space for scrolling in vertical direction right now', this.scroller.scrollHeight - this.scroller.clientHeight + 'px');
} else {
log('log', 'There are not enought space for scrolling in vertical direction right now');
}
}
if (this.scroller.getAttribute('data-baron-h')) {
log('log', 'Baron initialized in horizontal direction', this.scroller.getAttribute('data-baron-h'));
if (this.scroller.clientWidth < this.scroller.scrollWidth) {
log('log', 'There are enought space for scrolling in horizontal direction right now', this.scroller.scrollWidth - this.scroller.clientWidth + 'px');
} else {
log('log', 'There are not enought space for scrolling in horizontal direction right now');
}
}
if (this.bar && this.bar.nodeType === 1) {
log('log', 'Bar defined and has proper nodeType value', this.bar);
} else {
log('warn', 'Bar not defined or has wrong type (should be html node).', this.bar);
}
if (this.barOnCls) {
log('log', 'CSS classname barOnCls defined', this.barOnCls);
} else {
log('warn', 'barOnCls not defined - bar will be visible or not visible all the time', this.barOnCls);
}
// Preformance test
var t1 = new Date().getTime(),
x;
for (var i = 0 ; i < 1000 ; i += 10) {
x = i % (this.scroller[this.origin.scrollSize] - this.scroller[this.origin.client]);
this.pos(x);
this.event(this.scroller, 'scroll', undefined, 'trigger');
}
var t2 = new Date().getTime();
log('log', 'Preformance test: ' + (t2 - t1) / 1000 + ' milliseconds per scroll event');
log('log', 'Result is ' + errCount + ' / ' + totalCount + 'n');
};
baron.fn.test = function(params) {
var i = 0;
while (this[i]) {
test.call(this[i], params);
i++;
}
return this;
};
})(window);
/* Pull to load plugin for baron 0.6+ */
(function(window, undefined) {
var pull = function(params) {
var block = this.$(params.block),
size = params.size || this.origin.size,
limit = params.limit || 80,
onExpand = params.onExpand,
elements = params.elements || [],
inProgress = params.inProgress || '',
self = this,
_insistence = 0,
_zeroXCount = 0,
_interval,
_timer,
_x = 0,
_onExpandCalled,
_waiting = params.waiting || 500,
_on;
function getSize() {
return self.scroller[self.origin.scroll] + self.scroller[self.origin.offset];
}
// Scroller content height
function getContentSize() {
return self.scroller[self.origin.scrollSize];
}
// Scroller height
function getScrollerSize() {
return self.scroller[self.origin.client];
}
function step(x, force) {
var k = x * 0.0005;
return Math.floor(force - k * (x + 550));
}
function toggle(on) {
_on = on;
if (on) {
update(); // First time with no delay
_interval = setInterval(update, 200);
} else {
clearInterval(_interval);
}
}
function update() {
var pos = {},
height = getSize(),
scrollHeight = getContentSize(),
dx,
op4,
scrollInProgress = _insistence == 1;
op4 = 0; // Возвращающая сила
if (_insistence > 0) {
op4 = 40;
}
//if (_insistence > -1) {
dx = step(_x, op4);
if (height >= scrollHeight - _x && _insistence > -1) {
if (scrollInProgress) {
_x += dx;
}
} else {
_x = 0;
}
if (_x < 0) _x = 0;
pos[size] = _x + 'px';
if (getScrollerSize() <= getContentSize()) {
self.$(block).css(pos);
for (var i = 0 ; i < elements.length ; i++) {
self.$(elements[i].self).css(elements[i].property, Math.min(_x / limit * 100, 100) + '%');
}
}
if (inProgress && _x) {
self.$(self.root).addClass(inProgress);
}
if (_x == 0) {
if (params.onCollapse) {
params.onCollapse();
}
}
_insistence = 0;
_timer = setTimeout(function() {
_insistence = -1;
}, _waiting);
//}
if (onExpand && _x > limit && !_onExpandCalled) {
onExpand();
_onExpandCalled = true;
}
if (_x == 0) {
_zeroXCount++;
} else {
_zeroXCount = 0;
}
if (_zeroXCount > 1) {
toggle(false);
_onExpandCalled = false;
if (inProgress) {
self.$(self.root).removeClass(inProgress);
}
}
}
this.on('init', function() {
toggle(true);
});
this.on('dispose', function() {
toggle(false);
});
this.event(this.scroller, 'mousewheel DOMMouseScroll', function(e) {
var down = e.wheelDelta < 0 || (e.originalEvent && e.originalEvent.wheelDelta < 0) || e.detail > 0;
if (down) {
_insistence = 1;
clearTimeout(_timer);
if (!_on && getSize() >= getContentSize()) {
toggle(true);
}
}
// else {
// toggle(false);
// }
});
};
baron.fn.pull = function(params) {
var i = 0;
while (this[i]) {
pull.call(this[i], params);
i++;
}
return this;
};
})(window);
/* Autoupdate plugin for baron 0.6+ */
(function(window, undefined) {
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver || null;
var autoUpdate = function() {
var self = this;
this._observer = new MutationObserver(function() {
self.update();
});
this.on('init', function() {
self._observer.observe(self.root, {childList: true, subtree: true, characterData: true});
});
this.on('dispose', function() {
self._observer.disconnect();
delete self._observer;
});
};
baron.fn.autoUpdate = function(params) {
if (!MutationObserver) return this;
var i = 0;
while (this[i]) {
autoUpdate.call(this[i], params);
i++;
}
return this;
};
})(window);
?>