/* 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); }