Files

1786 lines
56 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="theme-color" content="#2f6fa7">
<meta name="pinterest" content="nopin" />
<meta name="pinterest" content="nohover" />
<meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" />
<link rel="apple-touch-icon" sizes="57x57" href="https://groups.io/orgimg/org.1/favicons/apple-icon-57x57.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="60x60" href="https://groups.io/orgimg/org.1/favicons/apple-icon-60x60.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="72x72" href="https://groups.io/orgimg/org.1/favicons/apple-icon-72x72.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="76x76" href="https://groups.io/orgimg/org.1/favicons/apple-icon-76x76.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="114x114" href="https://groups.io/orgimg/org.1/favicons/apple-icon-114x114.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="120x120" href="https://groups.io/orgimg/org.1/favicons/apple-icon-120x120.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="144x144" href="https://groups.io/orgimg/org.1/favicons/apple-icon-144x144.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="152x152" href="https://groups.io/orgimg/org.1/favicons/apple-icon-152x152.png?v=1411358049715440694">
<link rel="apple-touch-icon" sizes="180x180" href="https://groups.io/orgimg/org.1/favicons/apple-icon-180x180.png?v=1411358049715440694">
<link rel="icon" type="image/png" sizes="192x192" href="../../../orgimg/org.1/favicons/android-icon-192x192.png%3Fv=1411358049715440694">
<link rel="icon" type="image/png" sizes="32x32" href="../../../orgimg/org.1/favicons/favicon-32x32.png%3Fv=1411358049715440694">
<link rel="icon" type="image/png" sizes="96x96" href="../../../orgimg/org.1/favicons/favicon-96x96.png%3Fv=1411358049715440694">
<link rel="icon" type="image/png" sizes="16x16" href="../../../orgimg/org.1/favicons/favicon-16x16.png%3Fv=1411358049715440694">
<link rel="manifest" href="../../../orgimg/org.1/favicons/manifest.json%3Fv=1411358049715440694">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
<script>
/* stubs */
const hapticsImpactHeavy = async () => {
};
const hapticsImpactMedium = async () => {
};
const hapticsImpactLight = async () => {
};
const hapticsVibrate = async () => {
};
const hapticsSelectionStart = async () => {
};
const hapticsSelectionChanged = async () => {
};
const hapticsSelectionEnd = async () => {
};
</script>
<script>
function setPullToRefresh() {}
function gotoURL(inurl) {
window.location.href = inurl;
return;
}
function contentLoaded(isHTMX, f, caller = "") {
console.log("contentLoaded: " + isHTMX + " " + caller);
if (isHTMX == true) {
document.body.addEventListener('htmx:afterSettle', f, {once: true});
} else {
if (document.readyState !== 'loading') {
console.log('document is already ready, just execute code here');
f();
} else {
console.log('document was not ready, place code here');
document.addEventListener('DOMContentLoaded', f, {once: true});
}
}
}
function HideAppSidebarOnKeyboard() {
console.log("In HideAppSidebarOnKeyboard");
}
// stub
function logError(data, url, linenumber) {
console.log(data)
return;
}
var pushSubToken;
var ignoreErrors = false;
var lastError = "";
// Auto-hide the fixed app top navbar on reading-heavy pages. The
// navbar tracks scroll delta 1:1 in both directions: scrolling down
// slides it off at the same pixel rate as the page; scrolling up —
// even one pixel — starts bringing it back at the same rate. When
// the user is at the very top, it's always fully visible. Opt-in
// per page; xs only. Bottom tab bar is untouched.
function EnableTopbarAutoHide() {
if (document.documentElement.clientWidth > 767) return;
var body = document.body;
body.classList.add('auto-hide-topbar');
// Measure the actual headerbar height so notched devices (iOS)
// hide the full bar including the safe-area-inset-top padding,
// not just the 50px content row. Fall back to 50 if the
// element isn't found for any reason.
var headerEl = document.getElementById('headerbar');
var navHeight = headerEl ? headerEl.offsetHeight : 50;
var offset = 0;
var lastY = window.scrollY;
function onScroll() {
var y = window.scrollY;
var dy = y - lastY;
lastY = y;
if (y <= 0) {
offset = 0;
} else {
offset -= dy;
if (offset > 0) offset = 0;
if (offset < -navHeight) offset = -navHeight;
}
body.style.setProperty('--topbar-offset', offset + 'px');
}
window.addEventListener('scroll', onScroll, { passive: true });
gioDestroy(function() {
window.removeEventListener('scroll', onScroll);
body.classList.remove('auto-hide-topbar');
body.style.removeProperty('--topbar-offset');
});
}
window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) {
let column;
let stack;
if (console && console.log) {
console.log("msg:", errorMessage);
console.log("url:", errorUrl);
console.log("line:", errorLine);
if (errorColumn !== undefined && errorObj != null) {
console.log("column:", errorColumn);
column = errorColumn;
}
if (errorObj !== undefined && errorObj != null) {
console.log("stack:", errorObj.stack);
stack = errorObj.stack;
}
console.log("client_id:", "web.app01-g2.814819.1787704275235031676");
console.log("last_error:", lastError);
console.log("stack:", stack);
}
if (errorUrl == "" || errorUrl === null) {
errorUrl = window.location.href;
}
if (errorMessage.includes("SecurityError:") == true) {
ignoreErrors = true;
}
if (ignoreErrors == true) {
console.log("cookies, disabled, ignoring");
lastError = errorMessage;
return;
}
var ignoreMessages = ["ResizeObserver loop limit exceeded",
"TypeError: can't redefine non-configurable property \"userAgent\"",
"TypeError: can't redefine non-configurable property \"getChannelData\"",
"ReferenceError: tinymce is not defined",
"Uncaught ReferenceError: timeoutId is not defined",
"ReferenceError: Can't find variable: tinymce"];
for (var i = 0; i < ignoreMessages.length; i++) {
if (errorMessage === ignoreMessages[i]) {
lastError = errorMessage;
return;
}
}
if (errorUrl.indexOf("safari-extension:") === 0 || errorUrl.indexOf("moz-extension:") === 0 || errorUrl.indexOf("chrome-extension:") === 0) {
lastError = errorMessage;
return;
}
if (errorUrl.indexOf("googletagmanager.com") !== -1 || errorUrl.indexOf("socialsearch.com") !== -1) {
lastError = errorMessage;
return;
}
if (errorLine === 0 || errorLine === 1) {
lastError = errorMessage;
return;
}
jQuery.ajax({
type: 'POST',
url: '/jsclienterror',
data: {
msg: errorMessage,
url: errorUrl,
line: errorLine,
column: column,
stack: stack,
last_error: lastError,
client_id: "web.app01-g2.814819.1787704275235031676"
},
success: function() {
if (console && console.log) {
console.log('JS error report successful.');
}
lastError = errorMessage;
},
error: function() {
if (console && console.error) {
console.error('JS error report submission failed!');
}
lastError = errorMessage;
}
});
return true;
}
</script>
<script src="../../../tinymce-5.10.9/tinymce.min.js"></script>
<script src="../../../js/browser-image-compression-2.0.2.min.js"></script>
<link href="../../../css/application-ca49cc20a2a910b847ccd0044ae58c3a.css" rel="stylesheet" id="groupsio-css">
<script src="../../../js/application-29b5bce21a876e9bab9c2d4773df5b7d.js" id="groupsio-js"></script>
<script src="../../../js/run_prettify.js"></script>
<title>MTFHRT@groups.io | Wiki</title>
<link rel="stylesheet" type="text/css" href="../../../css/cookieconsent-3.1.0.min.css" />
<script src="../../../js/cookieconsent-3.1.0.min.js"></script>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
"popup": {
"background": "#d9edf7",
"text": "#31708f"
},
"button": {
"background": "#56cbdb",
"text": "#ffffff"
}
},
"cookie": {
"domain": ".{{.Org.Domain}}"
},
"content": {
"message": "Our site uses cookies so that we can remember you and understand how you and other visitors use our site, to improve your browsing experience and help us improve our site. By continuing to use our website, you agree to our use of such cookies.",
"dismiss": "I Agree",
"href": "https://groups.io/static/cookie_policy"
}
})});
</script>
<script>
htmx.config.scrollBehavior = "instant";
htmx.config.historyCacheSize = 0;
htmx.config.defaultSettleDelay = 0;
console.log("FULL PAGE LOAD");
// Short fade-in on #maincontent-refresh after every HTMX swap — adds zero latency
// because it runs AFTER the new content has arrived. We listen to afterRequest
// (fires once per HTMX request) rather than afterSwap (fires once per swapped
// element, including every hx-swap-oob badge — which would cancel the animation).
// Listen on document because this script runs in <head> before <body> exists.
document.addEventListener('htmx:afterRequest', function(evt) {
if (!evt.detail || !evt.detail.successful) return;
var refresh = document.getElementById('maincontent-refresh');
if (!refresh) return;
refresh.classList.remove('gio-fade-in');
// force reflow so removing then adding re-starts the animation each time
void refresh.offsetWidth;
refresh.classList.add('gio-fade-in');
});
// Top-of-viewport progress bar shown while an HTMX request is in flight.
// Provides immediate visual feedback for taps even before content arrives.
document.addEventListener('htmx:beforeRequest', function() {
var bar = document.getElementById('gio-progress-bar');
if (bar) bar.classList.add('active');
});
document.addEventListener('htmx:afterRequest', function() {
var bar = document.getElementById('gio-progress-bar');
if (bar) bar.classList.remove('active');
});
// Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back
// chevron, and the navbar overflow action slot. Uses the shared helpers
// from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes,
// so this is safe on the plain web too.
document.addEventListener('click', function(ev) {
if (typeof hapticsSelectionChanged !== 'function') return;
var target = ev.target;
if (!target || !target.closest) return;
if (target.closest('.mobilesidebar-item') ||
target.closest('#logo a') ||
target.closest('#header-action-slot a')) {
hapticsSelectionChanged();
}
}, true);
</script>
</head>
<body id="body" class="" hx-headers='{"Accept-Version": "40e9dba3cfeb4556bfbe2fbfe2ba769573d97888"}' hx-ext="preload" hx-boost="false">
<div id="gio-progress-bar" aria-hidden="true"></div>
<script>
if (window.matchMedia) {
var darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
if (darkModeQuery.matches) {
document.body.classList.add('dark-mode');
}
var darkModeChanged = function(e) {
document.body.classList.toggle('dark-mode', e.matches);
};
if (darkModeQuery.addEventListener) {
darkModeQuery.addEventListener('change', darkModeChanged);
} else if (darkModeQuery.addListener) {
// Safari before 14 has no addEventListener on MediaQueryList
darkModeQuery.addListener(darkModeChanged);
}
}
</script>
<div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar">
<div class="container-fluid" style="padding-left:0px;">
<a href="https://groups.io" class="navbar-left" hx-boost="false" hx-disinherit="*">
<img src="../../../orgimg/org.1/mainlogo.png%3Fv=1411358049715440694" height="50" alt="Groups.io">
</a>
<ul class="nav navbar-nav hidden-xs hidden-sm">
<li>
<a href="https://groups.io/search">
Find or Create a Group
</a>
</li>
</ul>
<ul class="nav navbar-nav pull-right visible-xs" style="margin-top:5px;margin-bottom:5px;">
<li>
<a href="32288.html#" data-toggle="modal" data-target="#mobileAccount">
<i class="fa-fw fa fa-bars fa-lg"></i>
</a>
</li>
</ul>
<ul class="nav navbar-nav pull-right hidden-xs">
<li class="dropdown">
<a href="32288.html#" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa-fw fa-regular fa-globe"></i>
English
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li>
<a href="https://groups.io/setlang/ar">
العربية
</a>
</li>
<li>
<a href="https://groups.io/setlang/de">
Deutsch
</a>
</li>
<li>
<a href="https://groups.io/unsetlang">
English
</a>
</li>
<li>
<a href="https://groups.io/setlang/es">
Español
</a>
</li>
<li>
<a href="https://groups.io/setlang/fr">
Français
</a>
</li>
<li>
<a href="https://groups.io/setlang/it">
Italiano
</a>
</li>
<li>
<a href="https://groups.io/setlang/nl">
Nederlands
</a>
</li>
<li>
<a href="https://groups.io/setlang/pt-br">
Português do Brasil
</a>
</li>
<li>
<a href="https://groups.io/setlang/pt">
Português
</a>
</li>
<li>
<a href="https://groups.io/setlang/uk">
Українська
</a>
</li>
<li>
<a href="https://groups.io/setlang/zh-hans">
简体中文
</a>
</li>
</ul>
</li>
<li>
<a href="https://groups.io/helpcenter" target="_blank">
Help
</a>
</li>
<li>
<a id="login" href="https://groups.io/login" hx-boost="false" hx-disinherit="*">
<i class="fa fa-sign-in-alt"></i>
Log In
</a>
</li>
<li>
<a href="https://groups.io/register">
<i class="fa fa-user"></i>
Sign Up
</a>
</li>
</ul>
</div>
</div>
<div class="modal fade" id="mobileAccount" role="dialog">
<div class="modal-dialog" style="margin-top:50px;">
<div class="modal-content">
<div class="modal-body">
<ul class="list-group noborderlist">
<li class="noborderitem list-group-item">
<a href="https://groups.io/login" hx-boost="false" hx-disinherit="*">
<i class="fa fa-sign-in-alt"></i>
Log In
</a>
</li>
<li class="noborderitem list-group-item">
<a href="https://groups.io/register">
<i class="fa fa-user"></i>
Sign Up
</a>
</li>
<li class="noborderitem list-group-item">
<a href="https://groups.io/helpcenter" target="_blank">
<i class="fa-fw fa fa-question-circle"></i>
Help
</a>
</li>
<li class="dropdown noborderitem list-group-item">
<a href="32288.html#" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa-fw fa-regular fa-globe"></i>
English
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li>
<a href="https://groups.io/setlang/ar">
العربية
</a>
</li>
<li>
<a href="https://groups.io/setlang/de">
Deutsch
</a>
</li>
<li>
<a href="https://groups.io/unsetlang">
English
</a>
</li>
<li>
<a href="https://groups.io/setlang/es">
Español
</a>
</li>
<li>
<a href="https://groups.io/setlang/fr">
Français
</a>
</li>
<li>
<a href="https://groups.io/setlang/it">
Italiano
</a>
</li>
<li>
<a href="https://groups.io/setlang/nl">
Nederlands
</a>
</li>
<li>
<a href="https://groups.io/setlang/pt-br">
Português do Brasil
</a>
</li>
<li>
<a href="https://groups.io/setlang/pt">
Português
</a>
</li>
<li>
<a href="https://groups.io/setlang/uk">
Українська
</a>
</li>
<li>
<a href="https://groups.io/setlang/zh-hans">
简体中文
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
<script>
var groupnavigatorData = [
];
</script>
<!-- Modal Dialog for Autocomplete -->
<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px">
<div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div>
<div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate&nbsp;&nbsp;&nbsp;<i class="fa-sharp fa-arrow-turn-down-left"></i> to use&nbsp;&nbsp;&nbsp;<strong>esc</strong> to dismiss</div>
</div>
</div>
</div>
</div>
<script>
// Keep track of the currently selected index
var selectedIndex = -1;
// Function to highlight the matched substring
function highlightSubstring(str, substring) {
var index = str.toLowerCase().indexOf(substring.toLowerCase());
if (index !== -1) {
var before = str.substring(0, index);
var middle = str.substring(index, index + substring.length);
var after = str.substring(index + substring.length);
return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after;
}
return str;
}
// Function to highlight the selected item and ensure it is visible in the scrollable list
function highlightSelectedItem(modalName) {
var listContainer = document.getElementById(modalName + 'Container');
var items = document.getElementsByClassName(modalName + '-list-item');
Array.from(items).forEach(function(item, idx) {
item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item
});
if (items.length > 0 && selectedIndex >= 0) {
var selectedItem = items[selectedIndex];
var containerTop = listContainer.scrollTop;
var containerBottom = containerTop + listContainer.clientHeight;
var itemTop = selectedItem.offsetTop;
var itemBottom = itemTop + selectedItem.offsetHeight;
const fudge = 59;
if (selectedIndex > 0 && itemTop > containerBottom) {
// If there are items below the selected item and the selected item is not fully visible, scroll down
listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight;
} else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) {
// If there are items above the selected item and the selected item is not fully visible, scroll up
listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight;
}
}
}
// function to populate the list based on the input
function populateList(modalName, data) {
var input = document.getElementById(modalName+'Input').value;
var listContainer = document.getElementById(modalName+'Container');
listContainer.innerHTML = '';
data.forEach(function(item) {
if (item.name.toLowerCase().includes(input.toLowerCase())) {
var div = document.createElement('div');
div.innerHTML = highlightSubstring(item.name, input);
div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class
div.addEventListener('click', function() {
// Navigate to the specified URL when a list item is clicked
window.location.href = item.url;
});
div.addEventListener('mousemove', function() {
// Remove no-hover class from all items when the mouse is moved over any item
console.log("mouse move");
var items = document.getElementsByClassName(modalName+'-list-item');
Array.from(items).forEach(function(item) {
item.classList.remove('no-hover');
});
});
listContainer.appendChild(div);
}
});
highlightSelectedItem(modalName);
}
function InitAutocomplete(modalName, data) {
// Focus the input field when the modal is shown and populate the list
$('#' + modalName + 'Modal').on('shown.bs.modal', function () {
$('#' + modalName + 'Input').focus().val('');
populateList(modalName, data);
selectedIndex = 0;
highlightSelectedItem(modalName);
});
// Event listener for input field typing
document.getElementById(modalName + 'Input').addEventListener('input', function() {
populateList(modalName, data);
selectedIndex = 0;
});
// Event listener for arrow keys and enter key
document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) {
var items = document.getElementsByClassName(modalName + '-list-item');
if (event.key === 'ArrowDown') {
event.preventDefault();
if (selectedIndex < items.length - 1) selectedIndex++;
highlightSelectedItem(modalName);
} else if (event.key === 'ArrowUp') {
event.preventDefault();
if (selectedIndex > 0) selectedIndex--;
highlightSelectedItem(modalName);
} else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) {
event.preventDefault();
items[selectedIndex].click();
}
});
}
function showAutocompleteModal(modalName) {
$('#' + modalName + 'Modal').modal('show');
selectedIndex = -1;
}
</script>
<div id="content" class="container-fluid">
<script>
InitAutocomplete("groupnavigator", groupnavigatorData);
document.body.addEventListener("showReloadPageDialog", function(evt) {
console.log("Forced reload");
location.reload();
});
// ShowHeaderAction adds an icon button (e.g. settings cog) to the mobile navbar,
// to the left of the profile icon. modalTarget is optional — if given, clicking
// opens that Bootstrap modal. ariaLabel is for accessibility.
function ShowHeaderAction(iconClass, modalTarget, ariaLabel) {
var slot = document.getElementById("header-action-slot");
if (!slot) {
return;
}
slot.innerHTML = '';
var a = document.createElement('a');
a.href = '#';
a.className = 'navbar-action-xs';
if (ariaLabel) {
a.setAttribute('aria-label', ariaLabel);
}
if (modalTarget) {
a.setAttribute('data-toggle', 'modal');
a.setAttribute('data-target', modalTarget);
}
var icon = document.createElement('i');
icon.className = iconClass;
a.appendChild(icon);
slot.appendChild(a);
slot.style.display = '';
}
function HideHeaderAction() {
var slot = document.getElementById("header-action-slot");
if (slot) {
slot.innerHTML = '';
slot.style.display = 'none';
slot.style.float = 'left';
}
}
function goBack() {
history.back();
}
// --- Native date/time picker helpers -----------------------------------
// On touch devices we swap flatpickr-wrapped <input type="text"> fields
// for native <input type="date"> / type="time" so iOS / Android bring up
// their OS pickers (wheel, spinner, Material dialog). On pointer
// devices we leave the flatpickr popover in place, since Chrome's
// default date popover looks out of place. Both helpers are global so
// every page with a date/time input can call them the same way.
window.__isTouchPicker = function() {
return window.matchMedia && window.matchMedia('(any-pointer: coarse)').matches;
};
// Fallback formats if data.User is nil on this page (logged out, etc).
window.__userDateFmt = "M/D/YYYY";
window.__userTimeFmt = "h:mmA";
// Hybrid native picker: the field is shown to the user as a plain
// type=text input holding the date/time formatted per the user's
// Groups.io preference (e.g., "19/04/2026" for an International
// user). When the user taps the field, we briefly swap the input's
// type to 'date' or 'time' so the OS brings up its native picker
// (iOS wheel, Android calendar/spinner). When the user finishes
// picking and blurs the field, we swap back to text and reformat
// the value in the user's chosen format. The server sees the
// user-format value on submit, same as with flatpickr.
//
// `kind` is 'date' or 'time'. `onHumanChange(humanStr, momentObj)`
// fires whenever the user picks a new value, with the value already
// in the user's format.
window.useNativePicker = function(id, kind, onHumanChange) {
var input = document.getElementById(id);
if (!input) return null;
var userFmt = kind === 'time' ? window.__userTimeFmt : window.__userDateFmt;
var isoFmt = kind === 'time' ? 'HH:mm' : 'YYYY-MM-DD';
// Page loads with input type=text holding a user-format value —
// leave it as is until the user actually taps.
function toPicker() {
if (input.type !== kind) {
var m = moment(input.value, userFmt);
input.type = kind;
input.value = m.isValid() ? m.format(isoFmt) : '';
}
}
function toDisplay() {
if (input.type === kind) {
var m = moment(input.value, isoFmt);
input.type = 'text';
input.value = m.isValid() ? m.format(userFmt) : '';
}
}
// pointerdown fires before focus/click so we can swap the type
// in time for the browser's default tap-handling to open the
// correct native picker. Fall back to 'focus' for keyboard users.
input.addEventListener('pointerdown', toPicker);
input.addEventListener('focus', toPicker);
input.addEventListener('change', function() {
if (input.type === kind) {
var m = moment(input.value, isoFmt);
if (m.isValid() && onHumanChange) {
onHumanChange(m.format(userFmt), m);
}
}
});
input.addEventListener('blur', toDisplay);
// Make sure the server always sees the user-format value.
var form = input.closest('form');
if (form) form.addEventListener('submit', toDisplay);
return input;
};
// Set a field's value as a user-format string, whether the field is a
// flatpickr-wrapped text input (desktop) or a native type=date/time
// input (touch). Used by onChange handlers that update sibling fields.
window.setFieldHuman = function(id, humanStr, kind) {
var input = document.getElementById(id);
if (!input) return;
if (input._flatpickr) {
input._flatpickr.setDate(humanStr);
} else if (input.type === 'date' || input.type === 'time') {
var userFmt = kind === 'time' ? window.__userTimeFmt : window.__userDateFmt;
var isoFmt = kind === 'time' ? 'HH:mm' : 'YYYY-MM-DD';
var m = moment(humanStr, userFmt);
if (m.isValid()) input.value = m.format(isoFmt);
} else {
input.value = humanStr;
}
};
// submitEvent acts like .submit(), except it is compatible with the app, by using events instead.
function submitEvent(ele) {
console.log("in submitEvent");
if (ele.startsWith('#')) {
ele = ele.slice(1);
}
document.getElementById(ele).submit();
return;
/*
const theEvent = new CustomEvent('submit', {
bubbles: true,
cancelable: true
});
if (typeof ele === 'string' || ele instanceof String) {
if (ele.startsWith("#") == true) {
ele = ele.slice(1);
}
if (document.getElementById(ele).dispatchEvent(theEvent) == true) {
// if not cancelled, do normal submit
console.log("calling submit");
document.getElementById(ele).submit();
}
return;
}
// assume ele is the element
if (ele.dispatchEvent(theEvent) == true) {
// if not cancelled, do normal submit
console.log("calling submit");
ele.submit();
}
*/
}
// gioDestroy is a convenience function for destroy callbacks
function gioDestroy(eventCB) {
let internalGioDestroy = function(evt) {
// do not activate on infinite scroll events
if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") {
console.log("Ignoring infinite scroll event");
return;
}
console.log("Calling destroy callback");
eventCB(evt);
}
document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true});
document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true});
}
var drawerCloseFunc = function(evt) {
console.log("in drawerCloseFunc");
// Find all elements with the class 'drawer'
var drawers = document.querySelectorAll('.drawer');
// Iterate over each element and call closeDrawer() on each
drawers.forEach(function(obj) {
drawerObj.closeDrawer(obj);
});
$('.modal').modal('hide');
}
document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc);
document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc);
var keydownFunc = function(event) {
var tagName = event.target.tagName.toLowerCase();
if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) {
if (event.key === 'Escape') {
event.target.blur();
}
return;
}
// check if the viewimages viewer is up
let element = document.getElementById('overlay');
if (element && element.classList.contains('visible')) {
return;
}
console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey);
if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) {
event.preventDefault(); // Prevent the default action
// Show the modal dialog for keyboard shortcuts
$('#shortcutModal').modal('show');
return;
}
// Pressing the chord above delivers a keydown for each key in it:
// Control, then Shift, then '?'. Without this guard the first two fall
// through to the hide below, so re-pressing the chord while the modal is
// open starts a hide that the '?' a moment later interrupts with a show.
// Bootstrap 3 tracks only its most recent backdrop element, so each such
// overlap strands the previous one in the DOM as an undismissable mask.
if (event.key === 'Control' || event.key === 'Shift' || event.key === 'Alt' || event.key === 'Meta') {
return;
}
$('#shortcutModal').modal('hide');
if (event.key.toLowerCase() === 'g') {
// For Windows and Linux
if (event.ctrlKey) {
event.preventDefault();
showAutocompleteModal("groupnavigator");
return;
}
}
// Check if the pressed key is '/'
if ((event.key === 'f' || event.key === 'F') && event.shiftKey) {
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
if (event.metaKey) {
event.preventDefault(); // Prevent the default action
// Focus on the search box
let box = document.getElementById('searchbox')
if (box != null) {
document.getElementById('searchbox').focus();
}
}
} else {
// For Windows and Linux
if (event.ctrlKey) {
event.preventDefault(); // Prevent the default action
// Focus on the search box
let box = document.getElementById('searchbox')
if (box != null) {
document.getElementById('searchbox').focus();
}
}
}
}
}
document.addEventListener('keydown', keydownFunc);
var removeDrawerCloseFunc = function(evt) {
document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc);
document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc);
document.removeEventListener('keydown', keydownFunc);
}
document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true});
// Check for passkey enrollment prompt after cross-device authentication
$(function() {
if (sessionStorage.getItem('passkeyPromptAfterCDA') === 'true') {
console.log('Passkey CDA flag detected, showing enrollment modal');
// Show the modal
$('#passkeyEnrollmentModal').modal('show');
// Clear the flag when modal is dismissed
$('#passkeyEnrollmentModal').on('hidden.bs.modal', function() {
console.log('Modal dismissed, clearing flag');
sessionStorage.removeItem('passkeyPromptAfterCDA');
});
// Set up enrollment button handler
var enrollBtn = document.getElementById('enrollLocalPasskeyBtn');
if (enrollBtn) {
enrollBtn.addEventListener('click', function() {
console.log('Enrollment button clicked');
// Redirect to settings page where they can add a passkey
sessionStorage.removeItem('passkeyPromptAfterCDA');
window.location.href = 'https://groups.io/settings/security';
});
}
}
});
</script>
<!-- Passkey Enrollment Modal -->
<div class="modal fade webauthn-only" id="passkeyEnrollmentModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">
<i class="fa fa-fingerprint"></i>
Add a Passkey to This Device
</h4>
</div>
<div class="modal-body">
<p>
You logged in using a passkey from another device. For faster access next time, add a passkey to this device.
</p>
<p>
<strong>Benefits:</strong>
</p>
<ul>
<li>Faster login with just your fingerprint or face</li>
<li>No need to use your phone each time</li>
<li>Works even when offline</li>
</ul>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">
Maybe Later
</button>
<button type="button" class="btn btn-primary" id="enrollLocalPasskeyBtn">
<i class="fa fa-plus"></i>
Add Passkey Now
</button>
</div>
</div>
</div>
</div>
<!-- Modal Dialog for Keyboard Shortcuts -->
<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div>
</div>
<div class="row">
<div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>g</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div>
</div>
<div class="row">
<div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Find</div>
</div>
<div class="row">
<div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>&nbsp;&nbsp;:</div>
<div class="col-xs-9" style="margin-left: -23px;">Quick actions</div>
</div>
</div>
<div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div>
</div>
</div>
</div>
<div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" >
<div id="groupsidebar" class="scrollbar hidden-print">
<div class="scrollbar-content">
<div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;">
<div class="list-group noborderlist" style="border:0;margin-bottom:0px">
<a title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item">
<i class="fa-fw fa fa-home fa-lg"></i>
Home
</a>
<a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives">
<i class="fa-fw fa fa-comments fa-lg"></i>
Messages
<span id="sidebar-archives-badge" class="badge"></span>
</a>
<a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags">
<i class="fa-fw fa fa-hashtag fa-lg"></i>
Hashtags
<span id="sidebar-hashtags-badge" class="badge"></span>
</a>
<a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active">
<i class="fa-fw fa fa-book fa-lg"></i>
Wiki
<span id="sidebar-wiki-badge" class="badge"></span>
</a>
</div>
</div>
<div class="text-center" style="font-size:13px;margin-bottom:30px">
<div style="padding-bottom:10px;">
<strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts
</div>
<div style="padding-bottom:5px;">
<a href="https://groups.io/static/about">
About
</a>
&middot;
<a href="https://groups.io/static/features">
Features
</a> &middot;
<a href="https://groups.io/static/pricing">
Pricing
</a>
</div>
<div style="padding-bottom:5px;">
<a href="https://groups.io/home">
Home
</a> &middot;
<a rel="nofollow" href="https://groups.io/changelog">
Changelog
</a> &middot;
<a href="https://groups.io/static/tos">
Terms
</a>
</div>
<div style="padding-bottom:5px;">
<a href="https://groups.io/helpcenter" target="_blank">
Help
</a>
</div>
<div style="padding-bottom:5px;">
&copy; 2026 Groups.io
</div>
</div>
</div>
</div>
<div id="maincontent" class="groupmaincontent">
<div id="maincontent-refresh">
<div id="maincontent-column" class="col-xs-12 maincontent-column">
<div id="alertdiv"></div>
<div class="noticetemplate template">
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
&times;
</span>
</button>
<span class="flashmsg"></span>
</div>
</div>
<div class="alerttemplate template">
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
&times;
</span>
</button>
<span class="flashmsg"></span>
</div>
</div>
<div class="alertnoclosetemplate template">
<div class="alert alert-danger" role="alert">
<span class="flashmsg"></span>
</div>
</div>
<script>
function dismiss() {
console.log("dismiss");
$.get( "/dismissalert");
}
var $alerttemplate = $(".alerttemplate");
var $alertnoclosetemplate = $(".alertnoclosetemplate");
var $noticetemplate = $(".noticetemplate");
function createAlert(msg, isError, autoClose, noClose) {
if (isError == false) {
$newPanel = $noticetemplate.clone();
} else {
if (noClose) {
$newPanel = $alertnoclosetemplate.clone();
} else {
$newPanel = $alerttemplate.clone();
}
}
$newPanel.removeClass("template");
$newPanel.find(".flashmsg").html(msg);
if (autoClose == true) {
$("#alertdiv").append($newPanel.fadeTo(2000, 500).slideUp(500, function(){
$newPanel.slideUp(500);
$newPanel.remove();
}));
} else {
$("#alertdiv").append($newPanel.fadeIn());
}
return $newPanel;
}
</script>
<div class="wiki-breadcrumb-wrap">
<div class="row breadcrumb-row" style="margin-bottom: 10px">
<div class="col-xs-12 col-sm-9">
<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span>
<div class="breadcrumb-container">
<ol class="breadcrumb scroll-breadcrumb">
<li><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li>
<li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li>
<li class="active"><i class="fa fa-book"></i> How to measure melting point of most organic powders using typical household items.</li>
</ol>
</div>
</div>
<div class="col-sm-3 hidden-xs" style="padding-right:0px">
<form class="form-inline pull-right" method="get" action="https://groups.io/g/MTFHRT/wikisearch">
<div class="input-group">
<input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px">
<div class="input-group-btn">
<button class="btn btn-primary" type="submit" style="height:37px;" aria-label="Search">
<span class="fa fa-search"></span>
</button>
</div>
</div>
</form>
</div>
</div>
<div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">
&times;
</span>
<span class="sr-only">
Close
</span>
</button>
<h4 class="modal-title" id="searchModalLabel">
Search
</h4>
</div>
<form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch">
<div class="modal-body">
<div class="form-group">
<div class="col-sm-12">
<input type="text" class="form-control" placeholder="Search" title="Search" name="q">
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary btn-sm" aria-label="Search">
<i class="fa fa-search"></i>
Search
</button>
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">
<i class="fa fa-times"></i>
Cancel
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row" style="margin-bottom:20px;">
<div class="col-xs-12">
<span class="hidden-print">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Pages
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li>
<a href="37530.html">
Basic Estrogel Guide
</a>
</li>
<li>
<a href="30846.html">
Home
</a>
</li>
<li>
<a href="32288.html">
How to measure melting point of most organic powders using typical household items.
</a>
</li>
<li>
<a href="34293.html">
steam sterilization
</a>
</li>
<li>
<a href="29602.html">
Ultimate DIY
</a>
</li>
</ul>
</div>
</span>
<div class="pull-right">
<a href="32288/history.html">
<script id="timedispupdated230680">
$('#timedispupdated230680').replaceWith(DisplayShortTime(1763445330270347144, false
));
</script>
</a>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<span class="wikidisplay user-content">
<p>Tools</p>
<ul>
<li>Single-egg frying pan. You can use something bigger, but you&#39;ll need more oil.</li>
<li>Half a cup of cooking oil, more for larger pan.</li>
<li>Small metal cap, such as the cap of a beer bottle.</li>
<li>Digital meat/candy themometer. (example: Taylor&#39;s folding thermometer&#39;s range is -40°C to 230°C)</li>
</ul>
<p>Procedure</p>
<ol>
<li>Place oil in frying pan</li>
<li>Place cap like a little boat in the oil</li>
<li>Place tiny bit of powder on the boat</li>
<li>Suspend probe of thermometer into the oil, but not touching the sides</li>
<li>Double check it&#39;s not touching the sides, and is just in the oil</li>
<li>Heat slowly (low, low heat)</li>
<li>Note temp where it &#39;pauses&#39; briefly while the substance turns to liquid</li>
</ol>
<p> </p>
<p><img src="https://i.imgur.com/LOWBMtc.png" loading="lazy" class="myimg-responsive"/></p>
<p><br/>My test today, I was off by 0.2°C from expected value. Absolutely within tolerance. <br/><br/>The above setup can be had for around $10-20 US, if you don&#39;t have stuff laying around, and really is &#39;accurate enough&#39;.</p>
<p> </p>
<p><a href="https://groups.io/g/MTFHRT/topic/109493025#msg11498" rel="nofollow noopener" target="_blank"><span style="text-decoration: underline">If the cap sinks</span></a>.</p>
<p />
</span>
</div>
</div>
<div class="row">
<div class="col-sm-12">
</div>
</div>
<script>
contentLoaded( false , function() {
UpdateSidebar("wiki");
if (document.documentElement.clientWidth <= 992) {
ShowHeaderAction("fa fa-search fa-lg", "#searchModal", "Search");
}
EnableTopbarAutoHide();
});
</script>
</div>
</div>
</div>
</div>
<div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" >
<div id="mobileSidebarSub" class="col-xs-12 hidden-md hidden-lg">
<div class="navbar navbar-default navbar-fixed-bottom">
<div class="container" style="display: flex; justify-content: space-around;">
<a id="mobilesidebar-groups" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center; color: inherit; text-decoration: none;" href="https://groups.io/groups" hx-boost="false">
<div style="display: inline-block; position: relative;">
<div style="position: relative;display: inline-block;">
<i class="fa-fw fa-light fa-users fa-2x"></i>
</div><br>
<span style="font-size:12px;">Groups</span>
</div>
</a>
<div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" >
<div style="display: inline-block; position: relative;">
<div style="position: relative;display: inline-block;">
<i class="fa-fw fa-light fa-comments fa-2x"></i>
</div><br>
<span style="font-size:12px;">Messages</span>
</div>
</div>
<div style="flex: 1; text-align: center;margin-top:10px" data-drawer-trigger aria-controls="drawer-name" aria-expanded="false">
<i class="fa-fw fa-light fa-bars fa-2x"></i><br>
<span style="font-size:12px;">More</span>
</div>
</div>
</div>
<section class="drawer drawer-left" id="drawer-name" data-drawer-target>
<div class="drawer-overlay" data-drawer-close tabindex="-1"></div>
<div class="drawer-wrapper drawer-wrapper-top">
<div class="drawer-header">
<div class="drawer-title">
<i class="fa-fw fa-regular fa-bars fa-3x"></i>
<span class="sr-only">
More Options
</span>
More
</div>
<button class="drawer-close" data-drawer-close aria-label="Close Drawer"></button>
</div>
<div class="drawer-content">
<div class="list-group noborderlist">
<a title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item">
<i class="fa-fw fa fa-home fa-lg"></i>
Home
</a>
<a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives">
<i class="fa-fw fa fa-comments fa-lg"></i>
Messages
<span id="sidebar-archives-mobile-badge" class="badge"></span>
</a>
<a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags">
<i class="fa-fw fa fa-hashtag fa-lg"></i>
Hashtags
<span id="sidebar-hashtags-mobile-badge" class="badge"></span>
</a>
<a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active">
<i class="fa-fw fa fa-book fa-lg"></i>
Wiki
<span id="sidebar-wiki-mobile-badge" class="badge"></span>
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/about" style="border-top:5px solid #ddd;">
<i class="fa-fw fal fa-envelope fa-lg"></i>
About
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/features">
<i class="fa-fw far fa-tasks fa-lg"></i>
Features
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/pricing">
<i class="fa-fw fa fa-dollar-sign fa-lg"></i>
Pricing
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/changelog">
<i class="fa-fw fa fa-history fa-lg"></i>
Changelog
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos">
<i class="fa-fw fal fa-newspaper fa-lg"></i>
Terms
</a>
<a class="noborderitem list-group-item sidebar-item" href="https://groups.io/helpcenter">
<i class="fa-fw fa fa-info-circle fa-lg"></i>
Help
</a>
</div>
</div>
</div>
</section>
</div>
</div>
<!-- Modal Dialog for Autocomplete -->
<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px">
<div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div>
<div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate&nbsp;&nbsp;&nbsp;<i class="fa-sharp fa-arrow-turn-down-left"></i> to use&nbsp;&nbsp;&nbsp;<strong>esc</strong> to dismiss</div>
</div>
</div>
</div>
</div>
<script>
var quickActionsData = [
{name: "Group Home", url: "https://groups.io/g/MTFHRT"},
{name: "Topics", url: "https://groups.io/g/MTFHRT/topics"},
{name: "Messages", url: "https://groups.io/g/MTFHRT/messages"},
{name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"},
{name: "Polls", url: "https://groups.io/g/MTFHRT/polls"},
{name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"},
{name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"},
/* other pages */
{name: "Help", url: "/helpcenter"},
{name: "Feed", url: "/feed"},
{name: "Your Groups", url: "/groups"},
{name: "Your Calendar", url: "/calendar"},
{name: "Your Activity", url: "/activity"},
{name: "Your Pending Messages", url: "/pendingmsgs"},
{name: "Account Login", url: "/account"},
{name: "Account Preferences", url: "/account?page=prefs"},
{name: "Account Security", url: "/account?page=security"},
{name: "Account Identity", url: "/account?page=profile&member_info_id=0"},
{name: "Account Notifications", url: "/account?page=notifications"},
{name: "Account Other Services", url: "/account?page=oauth"},
{name: "Account Bounces", url: "/account?page=bounces"},
{name: "Account Billing", url: "/account?page=billing"},
{name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"},
];
InitAutocomplete("quickActions", quickActionsData);
document.addEventListener('keydown', function(event) {
var tagName = event.target.tagName.toLowerCase();
if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) {
return;
}
// check if the viewimages viewer is up
let element = document.getElementById('overlay');
if (element && element.classList.contains('visible')) {
return;
}
if (event.key.toLowerCase() === '/') {
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
// For Mac
// Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not
if (event.metaKey) {
event.preventDefault();
showAutocompleteModal("quickActions");
return;
}
} else {
// For Windows and Linux
if (event.ctrlKey) {
event.preventDefault();
showAutocompleteModal("quickActions");
return;
}
}
}
});
function UpdateSidebar(id) {
console.log(id + " was clicked");
if (typeof HideHeaderAction === 'function') {
HideHeaderAction();
}
// restore mobile bottom nav in case a previous page (e.g. /post) hid it
var mobSidebar = document.getElementById("mobileSidebar");
if (mobSidebar) mobSidebar.style.display = '';
var mainContent = document.getElementById("maincontent");
if (mainContent) mainContent.style.bottom = '';
var sidebarItems = document.querySelectorAll('.mobilesidebar-item');
sidebarItems.forEach(function(item) {
var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0];
if (item.id == "mobilesidebar-" + id) {
console.log("making solid " + id)
iElement.classList.add('fa-solid');
iElement.classList.remove('fa-light');
} else {
iElement.classList.remove('fa-solid');
iElement.classList.add('fa-light');
}
});
var sidebarItems = document.querySelectorAll('.sidebar-item');
// remove 'active' class from all 'sidebar-item' elements
sidebarItems.forEach(function(item) {
if (item.id == "sidebar-" + id) {
console.log("making active " + id)
item.classList.add('active');
} else {
item.classList.remove('active');
}
});
}
</script>
</div>
<div id="scroll-top-outer">
<div id="scroll-top" class="scroll-top-wrapper hidden-xs">
<span class="scroll-top-inner">
<i class="fa fa-arrow-circle-up fa-fw fa-2x"></i>
</span>
</div>
</div>
<script>
$(function() {
$(document).on('scroll', function() {
if ($(window).scrollTop() > 100) {
$('.scroll-top-wrapper').addClass('show');
} else {
$('.scroll-top-wrapper').removeClass('show');
}
});
$('.scroll-top-wrapper').on('click', scrollToTop);
});
function scrollToTop() {
verticalOffset = typeof(verticalOffset) != 'undefined' ? verticalOffset : 0;
element = $('body');
offset = element.offset();
offsetTop = offset.top;
$('html, body').animate({
scrollTop: offsetTop
}, 100, 'linear');
}
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {
let elements = document.querySelectorAll('strong.ctrlmeta');
elements.forEach((element) => {
// Check if the innerText is "ctrl"
if (element.innerText === 'ctrl') {
// Create a new "i" element
let newElement = document.createElement('i');
newElement.classList.add('fa-solid', 'fa-command');
// Replace the old "strong" element with the new "i" element
element.parentNode.replaceChild(newElement, element);
}
});
}
</script>
</body>
</html>