1
0
mirror of https://github.com/php/web-php.git synced 2026-03-23 23:02:13 +01:00
Files
archived-web-php/js/common.js
Kamil Tekiela 6dcd848697 Move jquery.scrollTo.min.js to a new file
Update footer.inc
2022-07-13 17:31:07 +01:00

690 lines
21 KiB
JavaScript

/* Plugins, etc, are on top. */
String.prototype.escapeSelector = function() {
return this.replace(/(.|#)([ #;&,.+*~\':"!^$\[\]\(\)=>|\/])/g, '$1' + '\\\\$2');
};
String.prototype.toInt = function() {
return parseInt(this);
};
var PHP_NET = {};
PHP_NET.HEADER_HEIGHT = 52;
Mousetrap.bind('up up down down left right left right b a enter', function() {
$(".brand img").attr("src", "/images/php_konami.gif");
});
Mousetrap.bind("?", function() {
$("#trick").slideToggle();
});
Mousetrap.bind("esc", function() {
$("#trick").slideUp();
$("#goto").slideUp();
$("html").off("keydown");
$("html").off("keypress");
});
/*
Mousetrap.bind("j", function() {
var n = window.pageYOffset + 20;
$.scrollTo(n, 10);
});
Mousetrap.bind("k", function() {
var n = window.pageYOffset - 20;
$.scrollTo(n, 10);
});
*/
Mousetrap.bind("G", function() {
var n = $(document).height();
$.scrollTo(n, 10);
});
Mousetrap.bind("g h", function() {
window.location.href = "/";
});
Mousetrap.bind("g g", function() {
$.scrollTo(0, 10);
});
Mousetrap.bind("g p", function() {
var link = $("link[rel=prev]").attr("href");
if (link) {
window.location.href = link;
}
});
Mousetrap.bind("g n", function() {
var link = $("link[rel=next]").attr("href");
if (link) {
window.location.href = link;
}
});
Mousetrap.bind("b o r k", function() {
var bork = function(text) {
var subs = [[/a([nu])/g, 'u$1'], [/A([nu])/g, 'U$1'], [/a\B/g, 'e'], [/A\B/g, 'E'], [/en\b/g, 'ee'], [/\Bew/g, 'oo'], [/\Be\b/g, 'e-a'], [/\be/g, 'i'], [/\bE/g, 'I'], [/\Bf/g, 'ff'], [/\Bir/g, 'ur'], [/(\w*?)i(\w*?)$/g, '$1ee$2'], [/\bow/g, 'oo'], [/\bo/g, 'oo'], [/\bO/g, 'Oo'], [/the/g, 'zee'], [/The/g, 'Zee'], [/th\b/g, 't'], [/\Btion/g, 'shun'], [/\Bu/g, 'oo'], [/\BU/g, 'Oo'], [/v/g, 'f'], [/V/g, 'F'], [/w/g, 'w'], [/W/g, 'W'], [/([a-z])[.]/g, '$1. Bork Bork Bork!']];
for (var i = 0; i < subs.length; i++) {
text = text.replace(subs[i][0], subs[i][1]);
}
return text;
};
$('*:not(iframe)').contents().filter(function() {
return this.nodeType === 3 && /[^\t\n\r ]/.test(this.textContent);
}).each(function(_, el) {
el.textContent = bork(el.textContent);
});
Mousetrap.unbind("b o r k");
});
var FIXED_HEADER_HEIGHT = 50;
function cycle(to, from) {
from.removeClass("current");
to.addClass("current");
$.scrollTo(to.offset().top-FIXED_HEADER_HEIGHT);
}
function getNextOrPreviousSibling(node, forward) {
if (forward) {
return node.next();
}
return node.prev();
}
function cycleMenuItems(current, forward) {
if (getNextOrPreviousSibling(current, forward).length) {
cycle(getNextOrPreviousSibling(current, forward), current);
curr.children("a").first().focus().css({outline: "none"});
}
}
function cycleHeaders(matches, forward) {
/* forward=1 next match
* forward=0 previous match
*/
var gotmatch = 0;
matches.each(function(k, item) {
if ($(item).hasClass("current")) {
if ($(matches[forward ? k+1 : k-1]).length) {
cycle($(matches[forward ? k+1 : k-1]), $(item));
gotmatch = 1;
return false;
}
}
});
if (!gotmatch) {
cycle($(matches[forward ? 0 : matches.length-1]), $(matches[forward ? matches.length-1 : 0]));
}
}
Mousetrap.bind("j", function() {
/* Doc page */
var node = $(".layout-menu .current");
if (node.length) {
cycleMenuItems(node, 1);
}
else {
/* Cycle through headers on normal pages */
var matches = $("#layout-content h1, #layout-content h2, #layout-content h3");
cycleHeaders(matches, 1);
}
});
Mousetrap.bind("k", function() {
var node = $(".layout-menu .current");
if (node.length) {
cycleMenuItems(node, 0);
}
else {
/* Cycle through headers on normal pages */
var matches = $("#layout-content h1, #layout-content h2, #layout-content h3");
cycleHeaders(matches, 0);
}
});
$.expr[":"].icontains = $.expr.createPseudo(function(arg) {
return function( elem ) {
return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
function lookfor(txt) {
var retval = $("#layout a:icontains('" + txt + "')");
$(retval).each(function(k, val) {
$("#goto .results ul").append("<li><a href='" + $(val).attr("href") + "'>" + $(val).text() +"</a></li>");
});
}
function localpage(text) {
lookfor(text);
}
Mousetrap.bind("g s", function(e) {
boogie(e, localpage);
});
function boogie(e, cb) {
cb($("#goto .text").text());
$("#goto .results a:first").focus();
$("#goto").slideToggle();
$("html").on("keydown", function(e) {
switch(e.which || e.keyCode) {
/* Backspace */
case 8:
var txt = $("#goto .text").text();
txt = txt.substring(0, txt.length - 1);
$("#goto .text").text(txt);
$("#goto .results ul").empty();
cb(txt);
$("#goto .results a:first").focus();
e.preventDefault();
break;
/* Enter */
case 13:
Mousetrap.unpause();
Mousetrap.trigger('esc');
return true;
/* Tab */
case 9:
$(document.activeElement).parent().next().first().focus();
break;
case 27:
Mousetrap.unpause();
Mousetrap.trigger('esc');
}
});
$("html").on("keypress", function(e) {
if (e.which == 13) {
return true;
}
e.preventDefault();
var letter = String.fromCharCode(e.which || e.keyCode);
$("#goto .text").append(letter);
var txt = $("#goto .text").text().trim();
$("#goto .results ul").empty();
cb(txt);
$("#goto .results a:first").focus();
});
Mousetrap.pause();
}
if (!('contains' in String.prototype)) {
String.prototype.contains = function(str, startIndex) {
return -1 !== String.prototype.indexOf.call(this, str, startIndex);
};
}
Mousetrap.bind("g a", function(e) {
boogie(e, globalsearch);
});
function globalsearch(txt) {
var key = "search-en";
var cache = window.localStorage.getItem(key);
cache = JSON.parse(cache);
var term = txt.toLowerCase();
if (term.length < 3) {
return;
}
if (cache) {
for (var type in cache.data) {
console.log(type);
var elms = cache.data[type].elements;
for (var node in elms) {
if (elms[node].description.toLowerCase().contains(term) || elms[node].name.toLowerCase().contains(term)) {
$("#goto .results ul").append("<li><a href='/manual/en/" + elms[node].id + ".php'>" + elms[node].name + ": " + elms[node].description +"</a></li>");
if ($("#goto .results ul li") > 30) {
return;
}
}
}
}
}
}
Mousetrap.bind("/", function(e) {
if (e.preventDefault) {
e.preventDefault();
} else {
// internet explorer
e.returnValue = false;
}
$("input[type=search]").focus()
});
var rotate = 0;
Mousetrap.bind("r o t a t e enter", function(e) {
rotate += 90;
if (rotate > 360) {
rotate = 0;
}
$("html").css("-webkit-transform", "rotate(" + rotate + "deg)");
$("html").css("-moz-transform", "rotate(" + rotate + "deg)");
$("html").css("-o-transform", "rotate(" + rotate + "deg)");
$("html").css("-ms-transform", "rotate(" + rotate + "deg)");
$("html").css("transform", "rotate(" + rotate + "deg)");
});
var scale = 1;
Mousetrap.bind("m i r r o r enter", function(e) {
scale *= -1;
$("html").css("-webkit-transform", "scaleX(" + scale + ")");
$("html").css("-moz-transform", "scaleX(" + scale + ")");
$("html").css("-o-transform", "scaleX(" + scale + ")");
$("html").css("-ms-transform", "scaleX(" + scale + ")");
$("html").css("transform", "scaleX(" + scale + ")");
});
Mousetrap.bind("I space h a t e space P H P enter", function(e) {
window.location = "http://python.org";
});
Mousetrap.bind("I space l o v e space P H P enter", function(e) {
flashMessage({text: 'Live long and prosper !'});
});
Mousetrap.bind("l o g o enter", function(e) {
var time = new Date().getTime();
$(".brand img").attr("src", "/images/logo.php?refresh&time=" + time);
});
Mousetrap.bind("u n r e a d a b l e enter", function(e) {
document.cookie = 'MD=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT';
location.reload(true);
});
Mousetrap.bind("r e a d a b l e enter", function(e) {
document.cookie = 'MD=1; path=/';
location.reload(true);
});
function fixTimeout() {
Mousetrap.trigger("m i r r o r enter");
setTimeout(function() {
Mousetrap.trigger("m i r r o r enter");
}, 200);
setTimeout(function() { fixTimeout(); }, 30000);
}
function fixEdges(rotate) {
if (rotate > 360) {
rotate = 0;
$("html").css("zoom", 1);
$("html").css("-moz-transform", "scale(1)");
$("html").css("-webkit-transform", "scale(1)");
setTimeout(function(){fixEdges(36)}, 30000);
} else {
$("html").css("zoom", 0.5);
$("html").css("-moz-transform", "scale(0.5)");
$("html").css("-webkit-transform", "scale(0.5)");
setTimeout(function(){fixEdges(rotate+36)}, 100);
}
$("html").css("-webkit-transform", "rotate(" + rotate + "deg)");
$("html").css("-moz-transform", "rotate(" + rotate + "deg)");
$("html").css("-o-transform", "rotate(" + rotate + "deg)");
$("html").css("-ms-transform", "rotate(" + rotate + "deg)");
$("html").css("transform", "rotate(" + rotate + "deg)");
}
$(document).ready(function() {
/*
if (Math.floor(Math.random()*10) % 2) {
fixTimeout();
} else {
fixEdges(36);
}
*/
var $docs = $('.docs');
var $refsect1 = $docs.find('.refentry .refsect1');
var $docsDivWithId = $docs.find('div[id]');
$docsDivWithId.children("h1, h2, h3, h4").each(function(){
$(this).append("<a class='genanchor' href='#" + $(this).parent().attr("id") + "'> ¶</a>");
});
$('.refentry code.parameter').click(function(event)
{
var id = $(this).text().replace(/^&?(\.\.\.)?\$?/g, '');
var offsetTop = $('.parameters, .options').find('.parameter').filter(function() {
return $(this).text().trim() === id; // https://bugs.php.net/bug.php?id=74493
}).offset().top - 52;
$.scrollTo({top: offsetTop, left: 0}, 400);
});
$('h1[id], h2[id], h3[id], h4[id]').each(function() {
var $this = $(this);
$this.append("<a class='genanchor' href='#" + $this.attr('id') + "'> ¶</a>");
});
(function () {
var $elephpants = $(".elephpants");
var $elephpantsImages = $elephpants.find('.images');
// load the elephpant images if elephpants div is in the dom.
$elephpantsImages.first().each(function (idx, node) {
// function to fetch and insert images.
var fetchImages = function() {
// determine how many elephpants are required to fill the
// viewport and subtract for any images we already have.
var count = Math.ceil($(document).width() / 75)
- $elephpantsImages.find("img").length;
// early exit if we don't need any images.
if (count < 1) {
return;
}
// do the fetch.
$.ajax({
url: '/images/elephpants.php?count=' + count,
dataType: 'json',
success: function(data) {
var photo, image;
for (photo in data) {
photo = data[photo];
link = $('<a>');
link.attr('href', photo.url);
link.attr('title', photo.title);
image = $('<img>');
image.attr('src', 'data:image/jpeg;base64,' + photo.data);
$(node).append(link.append(image));
}
},
error: function() {
$elephpants.hide();
}
});
}
// begin by fetching the images we need now.
fetchImages();
// fetch more if viewport gets larger.
var deferred = null;
$(window).resize(function() {
window.clearTimeout(deferred);
deferred = window.setTimeout(function(){
fetchImages();
}, 250);
});
});
})();
// We have <p> tags generated with nothing in them and it requires a PHD change, meanwhile this fixes it.
$refsect1.find('p').each(function() {
var $this = $(this), html = $this.html();
if(html !== null && html.replace(/\s|&nbsp;/g, '').length == 0) {
$this.remove();
}
});
/*{{{ Scroll to top */
(function() {
var settings = {
text: 'To Top',
min: 200,
inDelay: 600,
outDelay: 400,
containerID: 'toTop',
containerHoverID: 'toTopHover',
scrollSpeed: 400,
easingType: 'linear'
};
var toTopHidden = true;
var toTop = $('#' + settings.containerID);
toTop.click(function(e) {
e.preventDefault();
$.scrollTo(0, settings.scrollSpeed, {easing: settings.easingType});
});
$(window).scroll(function() {
var sd = $(this).scrollTop();
if (sd > settings.min && toTopHidden)
{
toTop.fadeIn(settings.inDelay);
toTopHidden = false;
}
else if(sd <= settings.min && ! toTopHidden)
{
toTop.fadeOut(settings.outDelay);
toTopHidden = true;
}
});
})();
/*}}}*/
/*{{{User Notes*/
$("#usernotes a.usernotes-voteu, #usernotes a.usernotes-voted").each(
function () {
$(this).click(
function (event) {
event.preventDefault();
var url = $(this).attr("href");
var id = url.match(/\?id=(\d+)/)[1];
var request = $.ajax({
type: "POST",
url: url,
dataType: "json",
headers: {"X-Json": "On" },
beforeSend: function() {
$("#Vu"+id).hide();
$("#Vd"+id).hide();
$("#V"+id).html("<img src=\"/images/working.gif\" alt=\"Working...\" border=\"0\" title=\"Working...\">");
}
});
request.done(function(data) {
if(data.success != null && data.success == true) {
$("#V"+id).html("<div style=\"float: left; width: 16px; height: 16px; background-image: url(/images/notes-features.png); background-position:-32px 16px; margin-right: 8px; overflow: hidden;\" border=\"0\" alt=\"success\" title=\"Thank you for voting!\"></div>" + data.update);
flashMessage({text: 'Thank you for voting!'});
}
else {
var responsedata = "Error :(";
if (data.msg != null) {
responsedata = data.msg;
}
$("#V"+id).html("<div style=\"float: left; width: 16px; height: 16px; background-image: url(/images/notes-features.png); background-position:-32px 0px; margin-right: 8px; overflow: hidden;\" border=\"0\" alt=\"fail\" title=\"" + responsedata + "\"></div>");
flashMessage({text: 'Unexpected error occured, please try again later!', type: 'error'});
}
});
request.fail(function(jqXHR, textStatus) {
$("#Vu"+id).show();
$("#Vd"+id).show();
$("#V"+id).html("<div style=\"float: left; width: 16px; height: 16px; background-image: url(/images/notes-features.png); background-position:-32px 0px; margin-right: 8px; overflow: hidden;\" border=\"0\" alt=\"fail\" title=\"Error :(\"></div>");
flashMessage({text: 'Something went wrong :(', type: 'error'});
});
request.always(function(data) {
$("#V"+id).fadeIn(500, "linear");
});
}
);
}
);
/*}}}*/
// Search box autocomplete (for browsers that aren't IE <= 8, anyway).
if (typeof window.brokenIE === "undefined") {
jQuery("#topsearch .search-query").search({
language: getLanguage(),
limit: 30
});
}
/* {{{ Negative user notes fade-out */
var usernotes = document.getElementById('usernotes');
if (usernotes != null) {
var mapper = new function() {
this.domain = {
"max": -1,
"min": -5
};
this.range = {
"max": 0.75,
"min": 0.35
};
// This is a generic normalizaion algorithm:
// range.min + (value - domain.min)(range.max - range.min)/(domain.max-domain.min)
// Note that some of this computation is not dependent on the input value, so we
// compute it at object creation time.
var multiplier = (this.range.max - this.range.min)/(this.domain.max - this.domain.min);
this.normalize = function(value) {
value = Math.max(value, this.domain.min);
return (value - this.domain.min) * multiplier + this.range.min;
};
};
$(usernotes).on('mouseenter mouseleave', '.note', function(event) {
var opacity = 1;
var $note = $(this).find('.text');
if (event.type === 'mouseleave' && $note.data('opacity') !== undefined) {
opacity = $note.data('opacity');
}
$note.css('opacity', opacity);
}).find('.note').each(function() {
$(this).find('.tally:contains("-")').each(function(){
var id = this.id.replace('V', 'Hcom');
var v = mapper.normalize(this.innerHTML.toInt());
$('#' + id).css('opacity', v).data("opacity", v);
});
});
}
/* }}} */
/* {{{ Remove "inline code" style from .parameter */
// CSS3 can't traverse up the DOM tree
$('code.parameter').closest('em').addClass('reset');
/* }}} */
/* {{{ Init template generated flash messages */
$('#flash-message .message').each(function()
{
flashMessage($(this));
});
/* }}} */
});
/* {{{ add-user.php animations */
$(function() {
if ( ! document.getElementById('add-note-usernotes')) {
return;
}
$('#usernotes').animate({marginLeft: 0}, 1000);
$('#usernotes .note').removeAttr('style');
var times = [3, 7, 10];
for (i in times) {
times[i] = times[i] * 1000;
}
var notes = [];
notes[0] = $('#usernotes .bad');
notes[1] = $('#usernotes .good');
notes[2] = $('#usernotes .spam');
setTimeout(function()
{
notes[0].find('.usernotes-voted').css('border-top-color', '#001155');
notes[1].find('.usernotes-voteu').css('border-bottom-color', '#001155');
var t = 1000;
var i = 1;
var timer = setInterval(function()
{
if (i * t > times[1] - times[0])
{
clearTimeout(timer);
return;
}
notes[0].find('.tally').html( notes[0].find('.tally').html().toInt() - 1);
notes[1].find('.tally').html( notes[1].find('.tally').html().toInt() + 1);
i++;
}, t);
notes[0].find('.text').animate({opacity: 0.3}, (times[1] - times[0]));
}, times[0]);
setTimeout(function()
{
notes[2].find('.text').html("@BJORI DOESN'T LIKE SPAM").css('background-color', '#F9ECF2');
}, times[1]);
setTimeout(function()
{
notes[0].fadeOut();
notes[2].fadeOut();
$('#usernotes .count').html('1 note');
}, times[2]);
});
/* }}} */
/* {{{ Flash Messenger */
function flashMessage(o)
{
var defaults = {
timeout: 6000,
type: 'success',
text: '',
parent: '#flash-message'
};
// Options are passed, set defaults and generate message
if ( ! o.jquery)
{
var options = $.extend(defaults, o);
var id = 'id_' + Math.random().toString().replace('0.', '');
var message = $('<div>')
.addClass('message ' + options.type)
.data('type', options.type)
.attr('id', id)
.html(options.text);
$(options.parent).append(message);
var o = $('#' + id);
}
// jQuery object is passed, that means the message is pre-generated
// Only timeout is adjustable via data-timeout=""
else
{
options = {timeout: o.data('timeout')};
}
var remove = function(o) {
o.slideUp(400, function() {
$(this).remove();
});
};
if (options.timeout)
{
setTimeout(function()
{
if ( ! o.length) {
return;
}
remove(o);
}, options.timeout);
}
o.on('click', function() {
remove($(this));
});
return true;
}
/* }}} */
/**
* Determine what language to present to the user.
*/
function getLanguage()
{
return document.documentElement.lang;
}
(function ($) {
$('#legacy-links a').each(function () {
let $link = $(this);
$link.attr('href', $link.attr('href') + window.location.hash)
});
})(jQuery);
// vim: set ts=4 sw=4 et: