/*
Help floater thingy
*/
var helpCell = null;
var helpDiv = null;
var helpTextDiv = null;
var helpEditDiv = null;
var helpMoreDiv = null;
var helpReq = null;
var helpFetchDelay = null;
var helpDisplayDelay = null;
var hideDisplayDelay = null;
var helpDivWaitingText = "Loading help, please wait...";
var serverSuffix = 'http://agambiae..vectorbase.org';
var helpURLTemplate = serverSuffix + "/Help/vb_get_summary.php?page=";
var helpState = "hidden";
var helpCurrentCoords = {x: 0, y: 0};
function initHelpDiv() {
helpDiv = document.createElement('div');
helpDiv.style.position = 'absolute';
helpDiv.style.width = '200px';
helpDiv.style.height = '100px';
helpDiv.style.border = 'thin solid black';
helpDiv.style.backgroundColor = '#FFFFCC';
helpDiv.style.left = '50px';
helpDiv.style.top = '300px';
helpDiv.style.display = 'none';
helpDiv.style.padding = "2px";
helpDiv.style.paddingRight = "6px";
helpDiv.onmouseover = function() { clearTimeout(hideDisplayDelay); }
helpDiv.onmouseout = function() { hideDisplayDelay = setTimeout(function() { helpState = 'hidden'; helpDiv.style.display = 'none'; }, 500); };
helpTextDiv = document.createElement('div');
helpDiv.appendChild(helpTextDiv);
var helpCloseDiv = document.createElement('div');
helpCloseDiv.innerHTML = "Disable help popups.";
helpCloseDiv.style.position = 'absolute';
helpCloseDiv.style.height = '14px';
helpCloseDiv.style.left = (findPosX(helpDiv) + 3) + "px";
helpCloseDiv.style.top = (findPosY(helpDiv) + parseInt(helpDiv.style.height) - parseInt(helpCloseDiv.style.height)) + "px";
helpDiv.appendChild(helpCloseDiv);
helpMoreDiv = document.createElement('div');
helpMoreDiv.innerHTML = "More info.";
helpMoreDiv.style.position = 'absolute';
helpMoreDiv.style.height = '14px';
helpMoreDiv.style.left = (findPosX(helpDiv) + 3) + "px";
helpMoreDiv.style.top = (findPosY(helpDiv) + parseInt(helpDiv.style.height) - parseInt(helpMoreDiv.style.height) - parseInt(helpCloseDiv.style.height)) + "px";
helpDiv.appendChild(helpMoreDiv);
if (prefs.putative_logged_in.value == true && prefs.putative_domain.value == 'VectorBaseDocumentors') {
// These are merely putative; they could be pretty easily changed with a bookmarklet.
// This is okay though; it just provides a link to the edit page, and if you're not logged in for real, you can't edit.
// Anyone can get to the edit page just by clicking the edit link on the wiki; worst case here is that they'll see a link in the help_floater
// when they shouldn't. DO NOT use these two pref values for anything secure.
helpEditDiv = document.createElement('div');
helpEditDiv.innerHTML = "Edit.";
helpEditDiv.style.position = 'absolute';
helpEditDiv.style.height = '14px';
helpEditDiv.style.left = (findPosX(helpDiv) + parseInt(helpDiv.style.width) - 15) + "px";
helpEditDiv.style.top = (findPosY(helpDiv) + parseInt(helpDiv.style.height) - parseInt(helpEditDiv.style.height)) + "px";
helpDiv.appendChild(helpEditDiv);
}
helpCell = document.getElementById('help_cell');
document.body.appendChild(helpDiv);
if (helpCell && !isHelpEnabled()) {
helpCell.innerHTML = "(enable tooltips)";
}
}
function newHelpOn(event, element) {
// Safari spurious mouseout avoidance
if (event.target && event.relatedTarget && event.target == event.relatedTarget) { return; }
if (event.target && event.relatedTarget && event.relatedTarget.parentElement && event.relatedTarget.parentElement == event.target) { return; }
// If we're just returning to the element we just left for the helpDiv, ignore it
var eventX = 0;
var eventY = 0;
if (event.target) {
// IE
eventX = (event.pageX + 1) + 'px';
eventY = (event.pageY + 1) + 'px';
} else if (event.srcElement) {
eventX = (event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft + 1) + 'px';
eventY = (event.clientY + document.documentElement.scrollTop + document.body.scrollTop + 1) + 'px';
}
var elementName = element.id;
if (!elementName) { elementName = element.name; }
if (helpMoreDiv) {
var help_more = helpMoreDiv.firstChild;
help_more.href = "/Help/" + elementName;
}
if (helpEditDiv) {
var help_edit = helpEditDiv.firstChild;
help_edit.title = "Edit " + elementName;
help_edit.href = "/Help/index.php?title=" + elementName + "&action=edit";
}
helpFetchDelay = setTimeout(function() { fetchAndDisplayHelp(eventX, eventY, elementName); }, 500);
}
function newHelpOff(event, element) {
// Safari spurious mouseout avoidance
if (event.target && event.relatedTarget && event.target == event.relatedTarget) { return; }
if (event.target && event.target.parentElement && event.relatedTarget && event.target.parentElement == event.relatedTarget) { return; }
// Three possible cases: hidden, loading, loaded
if (helpState == "hidden") {
// Haven't started fetching yet, just cancel that timer
clearTimeout(helpFetchDelay);
// And just in case:
helpDiv.style.display = 'none';
clearTimeout(helpDisplayDelay);
} else if (helpState == "loading") {
// Have started fetching, abort the fetch and cancel the display timer
clearTimeout(helpDisplayDelay);
helpReq.abort();
helpState = "hidden";
// And just in case:
helpDiv.style.display = 'none';
clearTimeout(helpFetchDelay);
} else if (helpState == "loaded") {
// Already loaded; so give it a fraction of a second and then hide
hideDisplayDelay = setTimeout(function() { helpState = 'hidden'; helpDiv.style.display = 'none'; }, 200);
}
}
function newHelpUpdate(event, element) {
if (event.target) {
// IE
eventX = (event.pageX + 1) + 'px';
eventY = (event.pageY + 1) + 'px';
} else if (event.srcElement) {
eventX = (event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft + 1) + 'px';
eventY = (event.clientY + document.documentElement.scrollTop + document.body.scrollTop + 1) + 'px';
}
helpCurrentCoords = {x: eventX, y: eventY};
}
function fetchAndDisplayHelp(xPx, yPx, helpName) {
helpName = helpName.replace("#", "§ion=");
// AJAX request (well, technically, it's just some JavaScript remoting
helpState = "loading";
startDataRequest(helpName);
// Now that we've got that request fired off, start the timer for display
helpDiv.style.left = xPx;
helpDiv.style.top = yPx;
helpTextDiv.innerHTML = helpDivWaitingText;
if (isHelpEnabled()) {
helpDisplayDelay = setTimeout(function() {
helpDiv.style.left = helpCurrentCoords.x;
helpDiv.style.top = helpCurrentCoords.y;
helpState = 'loaded';
helpDiv.style.display = 'block';
}, 1500);
}
}
function getBrowserXMLHTTP() {
if (helpReq) { helpReq.abort(); return helpReq; }
if (window.XMLHttpRequest) {
try { helpReq = new XMLHttpRequest(); } catch(e) { helpReq = false; }
} else if (window.ActiveXObject) {
try { helpReq = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { helpReq = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { helpReq = false; } }
}
return helpReq;
}
function startDataRequest(helpName) {
var url = helpURLTemplate + helpName;
var req = getBrowserXMLHTTP();
req.onreadystatechange = function() { if (handleStateChange) { handleStateChange(req, helpName); } }
req.open("GET", url, true);
try { req.send(""); } catch (e) {
// Whoops, must've canceled; just ignore it.
req.abort();
}
}
function handleStateChange(req, helpName) {
if (req.readyState == 4) {
// Supposedly complete
var reqStatus = 0;
try { reqStatus = req.status } catch (e) {
// Watch for failed connection; probably just too many requests in a row, why stop now? :)
req.abort();
req = false;
helpReq = false;
startDataRequest(helpName);
}
var helpTitle;
var helpSummary;
if (reqStatus == 200) {
// Got an HTTP 200 OK
var xml = req.responseXML;
if (xml && xml.hasChildNodes()) {
var helpSummary = helpTitle = "";
if (xml.getElementsByTagName('title') && xml.getElementsByTagName('title')[0] && xml.getElementsByTagName('title')[0].firstChild) { helpTitle = xml.getElementsByTagName('title')[0].firstChild.nodeValue; }
if (xml.getElementsByTagName('summary') && xml.getElementsByTagName('summary')[0] && xml.getElementsByTagName('summary')[0].firstChild) { helpSummary = xml.getElementsByTagName('summary')[0].firstChild.nodeValue; }
if (!helpSummary) { helpSummary = "No help found for " + helpName + "."; }
if (helpDiv && helpTextDiv) { helpTextDiv.innerHTML = helpSummary; }
} else {
if (helpDiv && helpTextDiv) { helpTextDiv.innerHTML = 'No extended help available.'; }
}
}
}
}
function isHelpEnabled() {
if (prefs.helpWindow && prefs.helpWindow.value && prefs.helpWindow.value == 'off') {
return false;
}
return true;
}
function disableHelpWindow() {
if (confirm("Are you sure you want to disable the help tooltip?")) {
helpState = 'hidden';
helpDiv.style.display = 'none';
setPref('helpWindow', 'off', true);
if (helpCell) {
alert("You can re-enable tooltips by choosing\n\"enable tooltips\" in the upper left of the screen.");
helpCell.innerHTML = "(enable tooltips)";
blinkElement('enable_tooltips', helpCell.style.backgroundColor, 'red', 6, 300);
}
}
}
function enableHelpWindow() {
setPref('helpWindow', 'on', true);
alert("Tooltips have been re-enabled.");
if (helpCell) {
helpCell.innerHTML = " ";
}
}
function blinkElement(element, oldColor, newColor, count, timeout) {
if (count <= 0) { return; }
var realElement = document.getElementById(element);
if (realElement.style.backgroundColor == "red") {
realElement.style.backgroundColor = oldColor;
} else {
realElement.style.backgroundColor = newColor;
}
count--;
setTimeout("blinkElement('" + element + "', '" + oldColor + "', '" + newColor + "', " + count + ", " + timeout + ")", timeout);
}