mirror of
https://github.com/Sarjuuk/aowow.git
synced 2025-11-29 15:58:16 +08:00
* 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
253 lines
5.2 KiB
JavaScript
253 lines
5.2 KiB
JavaScript
/*
|
|
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;
|
|
}
|