/* 
  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 helpURLTemplate = "/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 = "<a href=\"javascript:disableHelpWindow();\">Disable help popups.</a>";
  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 = "<a target=\"_vbhelp\" href=\"/Help/Main_Page\">More info.</a>";
  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 = "<a target=\"_vbhelp\" id=\"edit_help_link\" href=\"/Help/Main_Page\">Edit.</a>";
    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 = "<a id=\"enable_tooltips\" style=\"color: #777777;\" href=\"javascript:enableHelpWindow();\">(enable tooltips)</a>";
  }
}
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("#", "&section=");
  // 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 = "<a id=\"enable_tooltips\" style=\"color: #777777;\" href=\"javascript:enableHelpWindow();\">(enable tooltips)</a>";
      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 = "&nbsp;";
  }
}
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);
}
