MediaWiki:Common.js: Διαφορά μεταξύ των αναθεωρήσεων

Από Trace Project
Χωρίς σύνοψη επεξεργασίας
Χωρίς σύνοψη επεξεργασίας
 
(6 ενδιάμεσες αναθεωρήσεις από τον ίδιο χρήστη δεν εμφανίζεται)
Γραμμή 1: Γραμμή 1:
(function (global,factory) {
"use strict";
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], function($) {
return factory($, global, global.document);
});
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = factory(require('jquery'), global, global.document);
} else {
// Browser globals
factory(jQuery, global, global.document);
}
}(typeof window !== 'undefined' ? window : this, function ($, window, document, undefined) {
"use strict";
var heights = [],
names = [],
elements = [],
overflow = [],
index = 0,
currentIndex = 0,
interstitialIndex = 1,
hasLocation = false,
timeoutId,
timeoutId2,
$window = $(window),
top = $window.scrollTop(),
scrollable = false,
locked = false,
scrolled = false,
manualScroll,
swipeScroll,
util,
disabled = false,
scrollSamples = [],
scrollTime = new Date().getTime(),
firstLoad = true,
initialised = false,
destination = 0,
wheelEvent = 'onwheel' in document ? 'wheel' : document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll',
settings = {
//section should be an identifier that is the same for each section
section: ".section",
sectionName: "section-name",
interstitialSection: "",
easing: "easeOutExpo",
scrollSpeed: 1100,
offset : 0,
scrollbars: true,
target:"html,body",
standardScrollElements: false,
setHeights: true,
overflowScroll:true,
updateHash: true,
touchScroll:true,
before:function() {},
after:function() {},
afterResize:function() {},
afterRender:function() {}
};
function animateScroll(index,instant,callbacks,toTop) {
if(currentIndex===index) {
callbacks = false;
}
if(disabled===true) {
return true;
}
if(names[index]) {
scrollable = false;
if(callbacks) {
settings.before(index,elements);
}
interstitialIndex = 1;
destination = heights[index];
if(firstLoad===false && currentIndex>index && toTop===false) {
//We're going backwards
if(overflow[index]) {


interstitialIndex = parseInt(elements[index].outerHeight()/$window.height());
$(document).ready(function () {


destination = parseInt(heights[index])+(elements[index].outerHeight()-$window.height());
$('.scroll-control .one').click(function () {
}
$.scrollify.move('#s-one');
}
});
 
$('.scroll-control .two').click(function () {
 
$.scrollify.move('#s-two');
if(settings.updateHash && settings.sectionName && !(firstLoad===true && index===0)) {
if(history.pushState) {
    try {
history.replaceState(null, null, names[index]);
    } catch (e) {
    if(window.console) {
    console.warn("Scrollify warning: Page must be hosted to manipulate the hash value.");
    }
    }
 
} else {
window.location.hash = names[index];
}
}
if(firstLoad) {
settings.afterRender();
firstLoad = false;
}
 
 
currentIndex = index;
if(instant) {
$(settings.target).stop().scrollTop(destination);
if(callbacks) {
settings.after(index,elements);
}
} else {
locked = true;
if( $().velocity ) {
$(settings.target).stop().velocity('scroll', {
  duration: settings.scrollSpeed,
  easing: settings.easing,
  offset: destination,
  mobileHA: false
  });
} else {
$(settings.target).stop().animate({
scrollTop: destination
}, settings.scrollSpeed,settings.easing);
}
 
if(window.location.hash.length && settings.sectionName && window.console) {
try {
if($(window.location.hash).length) {
console.warn("Scrollify warning: ID matches hash value - this will cause the page to anchor.");
}
} catch (e) {}
}
$(settings.target).promise().done(function(){
locked = false;
firstLoad = false;
if(callbacks) {
settings.after(index,elements);
}
});
});
}
$('.scroll-control .three').click(function () {
 
$.scrollify.move('#s-three');
}
}
 
function isAccelerating(samples) {
function average(num) {
var sum = 0;
 
var lastElements = samples.slice(Math.max(samples.length - num, 1));
 
          for(var i = 0; i < lastElements.length; i++){
              sum += lastElements[i];
          }
 
          return Math.ceil(sum/num);
}
 
var avEnd = average(10);
        var avMiddle = average(70);
 
        if(avEnd >= avMiddle) {
return true;
} else {
return false;
}
}
var scrollify = function(options) {
initialised = true;
$.easing['easeOutExpo'] = function(x, t, b, c, d) {
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
};
 
manualScroll = {
handleMousedown:function() {
if(disabled===true) {
return true;
}
scrollable = false;
scrolled = false;
},
handleMouseup:function() {
if(disabled===true) {
return true;
}
scrollable = true;
if(scrolled) {
//instant,callbacks
manualScroll.calculateNearest(false,true);
}
},
handleScroll:function() {
if(disabled===true) {
return true;
}
if(timeoutId){
clearTimeout(timeoutId);
}
 
timeoutId = setTimeout(function(){
scrolled = true;
if(scrollable===false) {
return false;
}
scrollable = false;
//instant,callbacks
manualScroll.calculateNearest(false,true);
}, 200);
},
calculateNearest:function(instant,callbacks) {
top = $window.scrollTop();
var i =1,
max = heights.length,
closest = 0,
prev = Math.abs(heights[0] - top),
diff;
for(;i<max;i++) {
diff = Math.abs(heights[i] - top);
 
if(diff < prev) {
prev = diff;
closest = i;
}
}
if((atBottom() && closest>index) || atTop()) {
index = closest;
//index, instant, callbacks, toTop
animateScroll(closest,instant,callbacks,false);
}
},
wheelHandler:function(e) {
if(disabled===true) {
return true;
} else if(settings.standardScrollElements) {
if($(e.target).is(settings.standardScrollElements) || $(e.target).closest(settings.standardScrollElements).length) {
return true;
}
}
if(!overflow[index]) {
e.preventDefault();
}
var currentScrollTime = new Date().getTime();
 
 
 
e = e || window.event;
var value = e.originalEvent.wheelDelta || -e.originalEvent.deltaY || -e.originalEvent.detail;
var delta = Math.max(-1, Math.min(1, value));
 
 
 
//delta = delta || -e.originalEvent.detail / 3 || e.originalEvent.wheelDelta / 120;
 
 
if(scrollSamples.length > 149){
scrollSamples.shift();
}
//scrollSamples.push(Math.abs(delta*10));
scrollSamples.push(Math.abs(value));
 
if((currentScrollTime-scrollTime) > 200){
scrollSamples = [];
}
scrollTime = currentScrollTime;
 
 
if(locked) {
return false;
}
if(delta<0) {
if(index<heights.length-1) {
if(atBottom()) {
if(isAccelerating(scrollSamples)) {
e.preventDefault();
index++;
locked = true;
//index, instant, callbacks, toTop
animateScroll(index,false,true, false);
} else {
return false;
}
}
}
} else if(delta>0) {
if(index>0) {
if(atTop()) {
if(isAccelerating(scrollSamples)) {
e.preventDefault();
index--;
locked = true;
//index, instant, callbacks, toTop
animateScroll(index,false,true, false);
} else {
return false
}
}
}
}
 
},
keyHandler:function(e) {
if(disabled===true) {
return true;
}
if(locked===true) {
return false;
}
if(e.keyCode==38 || e.keyCode==33) {
if(index>0) {
if(atTop()) {
e.preventDefault();
index--;
//index, instant, callbacks, toTop
animateScroll(index,false,true,false);
}
}
} else if(e.keyCode==40 || e.keyCode==34) {
if(index<heights.length-1) {
if(atBottom()) {
e.preventDefault();
index++;
//index, instant, callbacks, toTop
animateScroll(index,false,true,false);
}
}
}
},
init:function() {
if(settings.scrollbars) {
$window.on('mousedown', manualScroll.handleMousedown);
$window.on('mouseup', manualScroll.handleMouseup);
$window.on('scroll', manualScroll.handleScroll);
} else {
$("body").css({"overflow":"hidden"});
}
$window.on(wheelEvent,manualScroll.wheelHandler);
//$(document).bind(wheelEvent,manualScroll.wheelHandler);
$window.on('keydown', manualScroll.keyHandler);
}
};
 
swipeScroll = {
touches : {
"touchstart": {"y":-1,"x":-1},
"touchmove" : {"y":-1,"x":-1},
"touchend"  : false,
"direction" : "undetermined"
},
options:{
"distance" : 30,
"timeGap" : 800,
"timeStamp" : new Date().getTime()
},
touchHandler: function(event) {
if(disabled===true) {
return true;
} else if(settings.standardScrollElements) {
if($(event.target).is(settings.standardScrollElements) || $(event.target).closest(settings.standardScrollElements).length) {
return true;
}
}
var touch;
if (typeof event !== 'undefined'){
if (typeof event.touches !== 'undefined') {
touch = event.touches[0];
switch (event.type) {
case 'touchstart':
swipeScroll.touches.touchstart.y = touch.pageY;
swipeScroll.touches.touchmove.y = -1;
 
swipeScroll.touches.touchstart.x = touch.pageX;
swipeScroll.touches.touchmove.x = -1;
 
swipeScroll.options.timeStamp = new Date().getTime();
swipeScroll.touches.touchend = false;
case 'touchmove':
swipeScroll.touches.touchmove.y = touch.pageY;
swipeScroll.touches.touchmove.x = touch.pageX;
if(swipeScroll.touches.touchstart.y!==swipeScroll.touches.touchmove.y && (Math.abs(swipeScroll.touches.touchstart.y-swipeScroll.touches.touchmove.y)>Math.abs(swipeScroll.touches.touchstart.x-swipeScroll.touches.touchmove.x))) {
//if(!overflow[index]) {
event.preventDefault();
//}
swipeScroll.touches.direction = "y";
if((swipeScroll.options.timeStamp+swipeScroll.options.timeGap)<(new Date().getTime()) && swipeScroll.touches.touchend == false) {
 
swipeScroll.touches.touchend = true;
if (swipeScroll.touches.touchstart.y > -1) {
 
if(Math.abs(swipeScroll.touches.touchmove.y-swipeScroll.touches.touchstart.y)>swipeScroll.options.distance) {
if(swipeScroll.touches.touchstart.y < swipeScroll.touches.touchmove.y) {
 
swipeScroll.up();
 
} else {
swipeScroll.down();
 
}
}
}
}
}
break;
case 'touchend':
if(swipeScroll.touches[event.type]===false) {
swipeScroll.touches[event.type] = true;
if (swipeScroll.touches.touchstart.y > -1 && swipeScroll.touches.touchmove.y > -1 && swipeScroll.touches.direction==="y") {
 
if(Math.abs(swipeScroll.touches.touchmove.y-swipeScroll.touches.touchstart.y)>swipeScroll.options.distance) {
if(swipeScroll.touches.touchstart.y < swipeScroll.touches.touchmove.y) {
swipeScroll.up();
 
} else {
swipeScroll.down();
 
}
}
swipeScroll.touches.touchstart.y = -1;
swipeScroll.touches.touchstart.x = -1;
swipeScroll.touches.direction = "undetermined";
}
}
default:
break;
}
}
}
},
down: function() {
 
if(index<heights.length-1) {
 
if(atBottom() && index<heights.length-1) {
 
index++;
//index, instant, callbacks, toTop
animateScroll(index,false,true,false);
} else {
if(Math.floor(elements[index].height()/$window.height())>interstitialIndex) {
 
interstitialScroll(parseInt(heights[index])+($window.height()*interstitialIndex));
interstitialIndex += 1;
 
} else {
interstitialScroll(parseInt(heights[index])+(elements[index].outerHeight()-$window.height()));
}
 
}
}
},
up: function() {
if(index>=0) {
if(atTop() && index>0) {
 
index--;
//index, instant, callbacks, toTop
animateScroll(index,false,true,false);
} else {
 
if(interstitialIndex>2) {
 
interstitialIndex -= 1;
interstitialScroll(parseInt(heights[index])+($window.height()*interstitialIndex));
 
} else {
 
interstitialIndex = 1;
interstitialScroll(parseInt(heights[index]));
}
}
 
}
},
init: function() {
if (document.addEventListener && settings.touchScroll) {
document.addEventListener('touchstart', swipeScroll.touchHandler, false);
document.addEventListener('touchmove', swipeScroll.touchHandler, false);
document.addEventListener('touchend', swipeScroll.touchHandler, false);
}
}
};
 
 
util = {
refresh:function(withCallback,scroll) {
clearTimeout(timeoutId2);
timeoutId2 = setTimeout(function() {
//retain position
sizePanels(true);
//scroll, firstLoad
calculatePositions(scroll,false);
if(withCallback) {
settings.afterResize();
}
},400);
},
handleUpdate:function() {
//callbacks, scroll
//changed from false,true to false,false
util.refresh(false,false);
},
handleResize:function() {
//callbacks, scroll
util.refresh(true,false);
},
handleOrientation:function() {
//callbacks, scroll
util.refresh(true,true);
}
};
settings = $.extend(settings, options);
 
//retain position
sizePanels(false);
 
calculatePositions(false,true);
 
if(true===hasLocation) {
//index, instant, callbacks, toTop
animateScroll(index,false,true,true);
} else {
setTimeout(function() {
//instant,callbacks
manualScroll.calculateNearest(true,false);
},200);
}
if(heights.length) {
manualScroll.init();
swipeScroll.init();
 
$window.on("resize",util.handleResize);
if (document.addEventListener) {
window.addEventListener("orientationchange", util.handleOrientation, false);
}
}
function interstitialScroll(pos) {
if( $().velocity ) {
$(settings.target).stop().velocity('scroll', {
duration: settings.scrollSpeed,
easing: settings.easing,
offset: pos,
mobileHA: false
});
});
} else {
$(settings.target).stop().animate({
scrollTop: pos
}, settings.scrollSpeed,settings.easing);
}
}
function sizePanels(keepPosition) {
if(keepPosition) {
top = $window.scrollTop();
}
var selector = settings.section;
overflow = [];
if(settings.interstitialSection.length) {
selector += "," + settings.interstitialSection;
}
if(settings.scrollbars===false) {
settings.overflowScroll = false;
}
$(selector).each(function(i) {
var $this = $(this);
if(settings.setHeights) {
if($this.is(settings.interstitialSection)) {
overflow[i] = false;
} else {
if(($this.css("height","auto").outerHeight()<$window.height()) || $this.css("overflow")==="hidden") {
$this.css({"height":$window.height()});
overflow[i] = false;
} else {
$this.css({"height":$this.height()});
if(settings.overflowScroll) {
overflow[i] = true;
} else {
overflow[i] = false;
}
}
}
} else {
if(($this.outerHeight()<$window.height()) || (settings.overflowScroll===false)) {
overflow[i] = false;
} else {
overflow[i] = true;
}
}
});
});
if(keepPosition) {
$window.scrollTop(top);
}
}
function calculatePositions(scroll,firstLoad) {
var selector = settings.section;
if(settings.interstitialSection.length) {
selector += "," + settings.interstitialSection;
}
heights = [];
names = [];
elements = [];
$(selector).each(function(i){
var $this = $(this);
if(i>0) {
heights[i] = parseInt($this.offset().top) + settings.offset;
} else {
heights[i] = parseInt($this.offset().top);
}
if(settings.sectionName && $this.data(settings.sectionName)) {
names[i] = "#" + $this.data(settings.sectionName).toString().replace(/ /g,"-");
} else {
if($this.is(settings.interstitialSection)===false) {
names[i] = "#" + (i + 1);
} else {
names[i] = "#";
if(i===$(selector).length-1 && i>1) {


heights[i] = heights[i-1]+(parseInt($($(selector)[i-1]).outerHeight())-parseInt($(window).height()))+parseInt($this.outerHeight());
}
function applyScroll() {
}
$.scrollify({
}
section: '.scroll',
elements[i] = $this;
sectionName: 'section-name',
try {
//standardScrollElements: 'section',
if($(names[i]).length && window.console) {
easing: 'easeOutExpo',
console.warn("Scrollify warning: Section names can't match IDs - this will cause the browser to anchor.");
scrollSpeed: 1100,
}
offset: 0,
} catch (e) {}
scrollbars: true,
 
setHeights: true,
if(window.location.hash===names[i]) {
overflowScroll: true,
index = i;
updateHash: false,
hasLocation = true;
touchScroll: true,
}
});
 
});
 
if(true===scroll) {
//index, instant, callbacks, toTop
animateScroll(index,false,false,false);
}
}
 
function atTop() {
if(!overflow[index]) {
return true;
}
top = $window.scrollTop();
if(top>parseInt(heights[index])) {
return false;
} else {
return true;
}
}
function atBottom() {
if(!overflow[index]) {
return true;
}
top = $window.scrollTop();
 
if(top<parseInt(heights[index])+(elements[index].outerHeight()-$window.height())-28) {
 
return false;
 
} else {
return true;
}
}
}
}


function move(panel,instant) {
var z = names.length;
for(;z>=0;z--) {
if(typeof panel === 'string') {
if (names[z]===panel) {
index = z;
//index, instant, callbacks, toTop
animateScroll(z,instant,true,true);
}
} else {
if(z===panel) {
index = z;
//index, instant, callbacks, toTop
animateScroll(z,instant,true,true);
}
}
}
}
}
scrollify.move = function(panel) {
if(panel===undefined) {
return false;
}
if(panel.originalEvent) {
panel = $(this).attr("href");
}
move(panel,false);
};
scrollify.instantMove = function(panel) {
if(panel===undefined) {
return false;
}
move(panel,true);
};
scrollify.next = function() {
if(index<names.length) {
index += 1;
//index, instant, callbacks, toTop
animateScroll(index,false,true,true);
}
};
scrollify.previous = function() {
if(index>0) {
index -= 1;
//index, instant, callbacks, toTop
animateScroll(index,false,true,true);
}
};
scrollify.instantNext = function() {
if(index<names.length) {
index += 1;
//index, instant, callbacks, toTop
animateScroll(index,true,true,true);
}
};
scrollify.instantPrevious = function() {
if(index>0) {
index -= 1;
//index, instant, callbacks, toTop
animateScroll(index,true,true,true);
}
};
scrollify.destroy = function() {
if(!initialised) {
return false;
}
if(settings.setHeights) {
$(settings.section).each(function() {
$(this).css("height","auto");
});
}
$window.off("resize",util.handleResize);
if(settings.scrollbars) {
$window.off('mousedown', manualScroll.handleMousedown);
$window.off('mouseup', manualScroll.handleMouseup);
$window.off('scroll', manualScroll.handleScroll);
}
$window.off(wheelEvent,manualScroll.wheelHandler);
$window.off('keydown', manualScroll.keyHandler);
if (document.addEventListener && settings.touchScroll) {
document.removeEventListener('touchstart', swipeScroll.touchHandler, false);
document.removeEventListener('touchmove', swipeScroll.touchHandler, false);
document.removeEventListener('touchend', swipeScroll.touchHandler, false);
}
heights = [];
names = [];
elements = [];
overflow = [];
};
scrollify.update = function() {
if(!initialised) {
return false;
}
util.handleUpdate();
};
scrollify.current = function() {
return elements[index];
};
scrollify.disable = function() {
disabled = true;
};
scrollify.enable = function() {
disabled = false;
if (initialised) {
//instant,callbacks
manualScroll.calculateNearest(false,false);
}
};
scrollify.isDisabled = function() {
return disabled;
};
scrollify.setOptions = function(updatedOptions) {
if(!initialised) {
return false;
}
if(typeof updatedOptions === "object") {
settings = $.extend(settings, updatedOptions);
util.handleUpdate();
} else if(window.console) {
console.warn("Scrollify warning: setOptions expects an object.");
}
};
$.scrollify = scrollify;
return scrollify;
}));
$(document).ready(function () {
screenCheck();
$('.scroll-control .one').click(function () {
$.scrollify.move('#s-one');
});
$('.scroll-control .two').click(function () {
$.scrollify.move('#s-two');
});
$('.scroll-control .three').click(function () {
$.scrollify.move('#s-three');
});
});
$(window).on('resize', function () {
screenCheck();
});
function applyScroll() {
$.scrollify({
section: '.scroll',
sectionName: 'section-name',
//standardScrollElements: 'section',
easing: 'easeOutExpo',
scrollSpeed: 1100,
offset: 0,
scrollbars: true,
setHeights: true,
overflowScroll: true,
updateHash: false,
touchScroll: true,
});
}
function screenCheck() {
var deviceAgent = navigator.userAgent.toLowerCase();
var agentID = deviceAgent.match(/(iphone|ipod|ipad)/);
if (agentID || $(window).width() <= 1024) {
// its mobile screen
$.scrollify.destroy();
$('section').removeClass('scroll').removeAttr('style');
$.scrollify.disable();
} else {
// its desktop
$('section').addClass('scroll');
applyScroll();
$.scrollify.enable();
}
}

Τελευταία αναθεώρηση της 23:54, 15 Φεβρουαρίου 2023


$(document).ready(function () {
	

				$('.scroll-control .one').click(function () {
					$.scrollify.move('#s-one');
				});
				$('.scroll-control .two').click(function () {
					$.scrollify.move('#s-two');
				});
				$('.scroll-control .three').click(function () {
					$.scrollify.move('#s-three');
				});
			});

			
			function applyScroll() {
				$.scrollify({
					section: '.scroll',
					sectionName: 'section-name',
					//standardScrollElements: 'section',
					easing: 'easeOutExpo',
					scrollSpeed: 1100,
					offset: 0,
					scrollbars: true,
					setHeights: true,
					overflowScroll: true,
					updateHash: false,
					touchScroll: true,
				});
			}

			}