Template/Update (Part 47)

* split global.js into its components, so it can be reasonably processed by setup
 * make reputation requirements configurable
 * move Markup and Locale back into global.js (removed associated build scripts)
 * extend Icon to display iconId in lightbox popup
This commit is contained in:
Sarjuuk
2025-08-11 16:00:18 +02:00
parent a48e94cd8b
commit 6557e70d5c
73 changed files with 26256 additions and 25699 deletions

View File

@@ -0,0 +1,252 @@
/*
Global functions related to DOM manipulation, events & forms that jQuery doesn't already provide
*/
function g_addCss(css)
{
var style = $WH.ce('style');
style.type = 'text/css';
if (style.styleSheet) // ie
style.styleSheet.cssText = css;
else
$WH.ae(style, $WH.ct(css));
var head = $WH.gE(document, 'head')[0];
$WH.ae(head, style);
}
function g_setTextNodes(n, text)
{
if (n.nodeType == 3)
n.nodeValue = text;
else
{
for (var i = 0; i < n.childNodes.length; ++i)
g_setTextNodes(n.childNodes[i], text);
}
}
function g_setInnerHtml(n, text, nodeType)
{
if (n.nodeName.toLowerCase() == nodeType)
n.innerHTML = text;
else
{
for (var i = 0; i < n.childNodes.length; ++i)
g_setInnerHtml(n.childNodes[i], text, nodeType);
}
}
function g_getFirstTextContent(node)
{
for (var i = 0; i < node.childNodes.length; ++i)
{
if (node.childNodes[i].nodeName == '#text')
return node.childNodes[i].nodeValue;
var ret = g_getFirstTextContent(node.childNodes[i]);
if (ret)
return ret;
}
return false;
}
function g_getTextContent(el)
{
var txt = '';
for (var i = 0; i < el.childNodes.length; ++i)
{
if (el.childNodes[i].nodeValue)
txt += el.childNodes[i].nodeValue;
else if (el.childNodes[i].nodeName == 'BR')
txt += '\n';
txt += g_getTextContent(el.childNodes[i]);
}
return txt;
}
function g_toggleDisplay(el)
{
el = $(el);
el.toggle();
if (el.is(':visible'))
return true;
return false;
}
function g_enableScroll(enabled)
{
if (!enabled)
{
$WH.aE(document, 'mousewheel', g_enableScroll.F);
$WH.aE(window, 'DOMMouseScroll', g_enableScroll.F);
}
else
{
$WH.dE(document, 'mousewheel', g_enableScroll.F);
$WH.dE(window, 'DOMMouseScroll', g_enableScroll.F);
}
}
g_enableScroll.F = function(e)
{
if (e.stopPropagation)
e.stopPropagation();
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
e.cancelBubble = true;
return false;
};
// from http://blog.josh420.com/archives/2007/10/setting-cursor-position-in-a-textbox-or-textarea-with-javascript.aspx
function g_setCaretPosition(elem, caretPos)
{
if (!elem)
return;
if (elem.createTextRange)
{
var range = elem.createTextRange();
range.move('character', caretPos);
range.select();
}
else if (elem.selectionStart != undefined)
{
elem.focus();
elem.setSelectionRange(caretPos, caretPos);
}
else
elem.focus();
}
function g_insertTag(where, tagOpen, tagClose, repFunc)
{
var n = $WH.ge(where);
n.focus();
if (n.selectionStart != null)
{
var s = n.selectionStart,
e = n.selectionEnd,
sL = n.scrollLeft,
sT = n.scrollTop;
var selectedText = n.value.substring(s, e);
if (typeof repFunc == 'function')
selectedText = repFunc(selectedText);
n.value = n.value.substr(0, s) + tagOpen + selectedText + tagClose + n.value.substr(e);
n.selectionStart = n.selectionEnd = e + tagOpen.length;
n.scrollLeft = sL;
n.scrollTop = sT;
}
else if (document.selection && document.selection.createRange)
{
var range = document.selection.createRange();
if (range.parentElement() != n)
return;
var selectedText = range.text;
if (typeof repFunc == 'function')
selectedText = repFunc(selectedText);
range.text = tagOpen + selectedText + tagClose;
/*
range.moveEnd("character", -tagClose.length);
range.moveStart("character", range.text.length);
range.select();
*/
}
if (n.onkeyup)
n.onkeyup();
}
function g_onAfterTyping(input, func, delay)
{
var timerId;
var ldsgksdgnlk623 = function()
{
if (timerId)
{
clearTimeout(timerId);
timerId = null;
}
timerId = setTimeout(func, delay);
};
input.onkeyup = ldsgksdgnlk623;
}
function g_onClick(el, func)
{
var firstEvent = 0;
function rightClk(n)
{
if (firstEvent)
{
if (firstEvent != n)
return;
}
else
firstEvent = n;
func(true);
}
el.onclick = function(e)
{
e = $WH.$E(e);
if (e._button == 2) // middle click
return true;
return false;
}
el.oncontextmenu = function()
{
rightClk(1);
return false;
}
el.onmouseup = function(e)
{
e = $WH.$E(e);
if (e._button == 3 || e.shiftKey || e.ctrlKey) // Right/Shift/Ctrl
{
rightClk(2);
}
else if (e._button == 1) // Left
{
func(false);
}
return false;
}
}
function g_isLeftClick(e)
{
e = $WH.$E(e);
return (e && e._button == 1);
}
function g_preventEmptyFormSubmission() // Used on the homepage and in the top bar
{
if (!$.trim(this.elements[0].value))
return false;
}