/************************************ REVISION LOG ENTRY Revision By: Mihai Filimon ( mfl@exontrol.com ) Created on 3/12/2018 10:00:00 AM Comments: faq.js, faq.css This code may be used in compiled form in any way you desire. This file may not be redistributed modified or unmodified without the authors written consent. ************************************/ var bDisableShowFilterBoxInfo = false; var filterFrameParam = "FR"; var filterParam = "F"; var filterQuestionOnlyParam = "Q"; var filterWordOnlyParam = "W"; var expandParam = "E"; var vtQuestionOnlyClass = "question-only"; var vtWordOnlyClass = "word-only"; var scrollToQuestion = null; var expandFirstItem = null; var noReentry = false; window.onload = loadPage; window.addEventListener("click", clickWindow); window.onresize = resizeWindow; window.onscroll = scrollWindow; if (!hasFilter()) document.onreadystatechange = readyStateChange; var collapsedSections = new Array(); var collapsedSectionsInitialized = false; function getURLHash(sURL) { var i = sURL.indexOf('#'); if (i > 0) return sURL.substr(i + 1); return null; } function removeURLHash(sURL) { var i = sURL.indexOf("#"); if (i >= 0) sURL = sURL.substr(0, i); return sURL; } function getURLParam(sURL, Param) { var i = sURL.indexOf('#'); sURL = i === -1 ? sURL : sURL.substr(0, i); if (sURL.indexOf("?") > 0) { var arrParams = sURL.split("?"); var arrURLParams = arrParams[1].split("&"); var arrParamNames = new Array(arrURLParams.length); var arrParamValues = new Array(arrURLParams.length); var i = 0; for (i = 0; i < arrURLParams.length; i++) { var sParam = arrURLParams[i].split("="); arrParamNames[i] = sParam[0]; if (sParam[1] != "") arrParamValues[i] = unescape(sParam[1]); else arrParamValues[i] = ""; } for (i = 0; i < arrURLParams.length; i++) if (arrParamNames[i] == Param) return arrParamValues[i]; } return null; } function addURLParam(sURL, Param, Value) { return updateURLParameter(sURL, Param, Value); } function removeURLParam(sURL, Param) { return updateURLParameter(sURL, Param, null); } function updateURLParameter(uri, key, value) { var i = uri.indexOf('#'); var hash = i === -1 ? '' : uri.substr(i); uri = i === -1 ? uri : uri.substr(0, i); var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf('?') !== -1 ? "&" : "?"; if (value) { value = value.trim(); if (uri.match(re)) uri = uri.replace(re, '$1' + key + (value.length ? ("=" + value) : "") + '$2'); else uri = uri + separator + key + (value.length ? ("=" + value) : ""); } else { uri = uri.replace(new RegExp("[?&]?" + key + "=[^&]*", "i"), ''); if (uri.slice(-1) === '?') uri = uri.slice(0, -1); if (uri.indexOf('?') === -1) uri = uri.replace(/&/, '?'); // replace first occurrence of & by ? if no ? is present } return uri + hash; } function getIFrameURL(sURL) { if (sURL) { var bGeneralFAQ = sURL.indexOf("/gfaq.jsp") == 0; if (bGeneralFAQ) sURL = sURL.replace("/gfaq.jsp", "/content/support/faq/"); else { bGeneralFAQ = (sURL.indexOf("/sg.jsp?content=support/faq/") == 0); if (bGeneralFAQ) sURL = sURL.replace("/sg.jsp?content=support/faq/", "/content/support/faq/"); } if (bGeneralFAQ) { if (sURL.search(/(\\|\/)$/) < 0) // no \ / adds one sURL += "/"; sURL += "index.jsp"; } } return sURL; } function fixURLQuery(sURL) { if (sURL) { sURL = sURL.replace("?", "&"); var i = sURL.indexOf("&"); if (i >= 0) sURL = sURL.substr(0, i) + "?" + sURL.substr(i + 1); } return sURL; } function getURL(sURL) { if (sURL) { if (sURL.indexOf("/content/products/") >= 0) { sURL = sURL.replace("?", "&"); sURL = sURL.replace("/content/products/", "/howto.jsp?product="); sURL = sURL.replace("/howto/how_to_do_", "&lang="); sURL = sURL.replace(".htm", ""); sURL = fixURLQuery(sURL); } else if (sURL.indexOf("/content/support/faq/") >= 0) { sURL = sURL.replace("?", "&"); sURL = sURL.replace("/content/support/faq/index.jsp", "/gfaq.jsp"); sURL = sURL.replace("/content/support/faq/", "/sg.jsp?content=support/faq/"); sURL = sURL.replace("index.jsp", ""); sURL = fixURLQuery(sURL); } } return sURL; } function getURLFAQ() { var sURL = document.URL.toString(); sURL = removeURLParam(sURL, filterFrameParam); sURL = getURL(sURL); return sURL; } function clickPage(anchor) { var f = Filter.value; if (f.length != 0) if (f != "Filter for...") anchor.href += "?F=" + f; } function nextID(el) { var c = el.nextElementSibling; if (c) { while (c && (el.id != c.id)) c = c.nextElementSibling; return c; } var c = el.nextSibling; while (c && ((c.nodeType != 1) || (el.id != c.id))) c = c.nextSibling; return c; } function isFrameFilterFor() { var fr = getURLParam(document.URL, filterFrameParam); if (fr != null) return fr != ""; return false; } function isFilterForQ() { var frQ = getURLParam(document.URL, filterQuestionOnlyParam); if (frQ != null) return frQ == "only"; return false; } function isFilterForW() { var frW = getURLParam(document.URL, filterWordOnlyParam); if (frW != null) return frW == "only"; return false; } function getFilterFor(e) { var o = e.textContent; if (o != null) return o; return e.innerText; } function getFilterForQ(e) { var c = e.children; return getFilterFor(c[0]) + getFilterFor(c[1].firstElementChild); } function filterFor(text) { onLayoutHeader(); CollapseAll(document.getElementById("toggleAllImage")); var nResults = 0; var o = document.getElementById("question"); if (text.length == 0) { while (o != null) { o.style.display = ""; o = nextID(o); } if (!isFrameFilterFor()) { var p = document.getElementById("pages"); if (p != null) p.style.display = ""; var c = document.getElementById("continue"); if (c != null) { c.innerHTML = ""; c.style.display = "none"; } } } else { // Shows only the items that match text = text.toLowerCase(); var rgFilter = new Array(); var rgAlternatives = text.split(","); var aCount = rgAlternatives.length; for (var a = 0; a < aCount; a++) { var rgAlternative = new Array(); var rgFields = rgAlternatives[a].split(" "); var fCount = rgFields.length; for (var f = 0; f < fCount; f++) { var sField = rgFields[f].replace(" ", ""); if (sField.length) rgAlternative.push(sField); } if (rgAlternative.length) rgFilter.push(rgAlternative); } var l = rgFilter.length; if (l > 0) { var bFilterForQ = isFilterForQ(), bFilterForW = isFilterForW(); while (o != null) { var s = bFilterForQ ? getFilterForQ(o) : getFilterFor(o); s = s.toLowerCase(); var bVisible = false; for (var j = 0; !bVisible && (j < l); j++) { var i = 0, iCount = rgFilter[j].length; for (i = 0; i < iCount; i++) { var w = rgFilter[j][i]; if (bFilterForW) { if (s.search("\\b" + w + "\\b") == -1) break } else if (s.indexOf(w) == -1) break; } bVisible = i == iCount; } o.style.display = bVisible ? "" : "none"; if (bVisible) nResults++; o = nextID(o); } } // Show additional information if (!isFrameFilterFor()) { /* var p = document.getElementById("pages"); if ( p != null ) p.style.display = "none"; */ var c = document.getElementById("continue"); if (c != null) { var iFrame = ""; { var f = Filter.value, iFrames = 0; if (f.length != 0) { var p = document.getElementById("page"); while (p != null) { if (p.id == "page") { var s = p.getAttribute("href"); if (s) if (s.length) { s = getIFrameURL(s); s += ((s.indexOf("?") > 0) ? "&" : "?") + filterFrameParam + "=" + f; if (isFilterForQ()) s += "&" + filterQuestionOnlyParam + "=only"; if (isFilterForW()) s += "&" + filterWordOnlyParam + "=only"; iFrame += ""; iFrames++; } } p = nextID(p); } try { localStorage.setItem("mainSectionFrames", iFrames); startFilterFrames(); if (iFrames == 0) endFilterFrames(); } catch (err) { } } } c.innerHTML = iFrame; c.style.display = ""; } } } var footer = document.getElementById("footerInfo"); if (footer != null) { var info = "", oInfo = "

<%INFO%>

"; var nURL = getURLFAQ(); if (nURL.length > 0) { nURL += (nURL.indexOf("?") > 0) ? "&" : "?"; nURL += "F=" + escape(text); if (isFilterForQ()) { nURL += (nURL.indexOf("?") > 0) ? "&" : "?"; nURL += filterQuestionOnlyParam + "=only"; } if (isFilterForW()) { nURL += (nURL.indexOf("?") > 0) ? "&" : "?"; nURL += filterWordOnlyParam + "=only"; } nURL = updateGlobalURL(nURL); } if (text.length != 0) { if (nResults == 0) info = "no result(s)"; else info += nResults.toString() + " result(s)"; if (nURL.length > 0) info += ", at " + nURL + ""; } oInfo = oInfo.replace("<%INFO%>", info); footer.outerHTML = oInfo; } } function wait() { } function InitCollapsedSections() { var i = 0; var imageId = Load("imageValue" + i); while (imageId != null) { collapsedSections[imageId] = "not expanded"; i++; imageId = Load("imageValue" + i); } } function OnLoadImage() { if (noReentry) return; if (!collapsedSectionsInitialized) { InitCollapsedSections(); collapsedSectionsInitialized = true; } elem = event.srcElement; if (ShouldExpand(elem)) { noReentry = true; try { elem.src = collapseImage.src; ExpandSection(elem); RemoveCollapsedItem(elem.id); collapsedSections[elem.id] = "expanded"; } catch (e) { } noReentry = false; } } function ShouldExpand(elem) { return (collapsedSections[elem.id] == null) || (Load("IsFirstPage") == null); } /* ********** ********** Begin ********** */ function LoadFrame(frame) { var doc = null; try { doc = frame.contentDocument || frame.contentWindow.document; } catch (e) { } if (doc != null) frame.style.height = getMainSectionHeight(doc); else { try { frame.style.height = localStorage.getItem("mainSectionHeight"); } catch (e) { } } try { frame.style.visibility = "visible"; if (doc != null) { try { var rgA = doc.getElementsByTagName("A"); if (rgA) { for (var i = 0; i < rgA.length; i++) { var a = rgA[i]; if (a.getAttribute("target") == null) a.setAttribute("target", "_top"); } } } catch (err) { } } var iFrames = localStorage.getItem("mainSectionFrames"); if (iFrames) { iFrames--; localStorage.setItem("mainSectionFrames", iFrames); if (iFrames == 0) endFilterFrames(); } } catch (err) { } } function startFilterFrames() { var mainSection = document.getElementById("mainSection"); if (mainSection) { //mainSection.style.opacity = .5; var bottomTable = document.getElementById("bottomTable"); if (bottomTable) { //bottomTable.style.opacity = .5; var wait = document.getElementById("wait"); if (wait == null) { var newImage = document.createElement("IMG"); newImage.id = "wait"; newImage.className = "wait"; newImage.src = "http://www.exontrol.com/images/wait.gif"; newImage.style.top = Math.max(32, mainSection.offsetTop) + "px"; mainSection.parentElement.insertBefore(newImage, mainSection); } else { wait.style.display = "block"; wait.style.top = mainSection.offsetTop + "px"; } } } } function endFilterFrames() { resetFilterFrames(); } function resetFilterFrames() { var mainSection = document.getElementById("mainSection"); if (mainSection) { mainSection.style.opacity = 1; var bottomTable = document.getElementById("bottomTable"); if (bottomTable) bottomTable.style.opacity = 1; var wait = document.getElementById("wait"); if (wait != null) wait.style.display = "none"; } onLayoutHeader(); } function getMainSectionHeight(doc) { var h = 0, e; e = doc.getElementById("mainSection"); if (e) h += e.clientHeight; return h + "px"; } function addLineNumbers() { var pre = document.getElementsByTagName('pre'), pl = pre.length; for (var i = 0; i < pl; i++) addLineNumber(pre[i]); } function addLineNumber(p) { p.innerHTML = p.innerHTML.trim(); var num = p.innerText.replace(/\s+$/g, "").split(/\n/).length; if (num > 1) { if (num > 16) p.className += " lesscode"; p.innerHTML = '' + p.innerHTML; var j = 0; for (j = 0; j < num; j++) { var line_num = p.getElementsByTagName('span')[0]; line_num.innerHTML += '' + (j + 1) + ''; } if (num > 16) { try { var rgBold = p.getElementsByTagName("B"); if (rgBold) if (rgBold.length > 0) p.scrollTop = Math.max(0, (rgBold[0].offsetTop - p.offsetTop) - p.clientHeight / 2); // scrolls the highligted elements to the center of the
      }
      catch (err)
      {
      }
    }
  }
}

function replaceURL(sURL)
{
  try
  {
    window.history.replaceState(null, null, sURL);
    sURL = getURL(sURL);
    window.parent.history.replaceState(null, null, sURL);
  }
  catch (err)
  {
  };
}

function SetFilterPlaceHolder()
{
  var vtFilter = document.getElementById("Filter");
  if (vtFilter)
  {
    vtFilter.placeholder = "Filter For...";
    vtFilter.value = "";
    vtFilter.title = "The space separator indicates AND between words, while comma specifies OR between words.";
    vtFilter.onkeypress = function (e)
    {
      if (e)
        if (e.keyCode == 13)
        {
          filterFor(this.value);
          onClickGo();
        }
    }

    var vtFilterQuestionOnly = document.getElementById("btnFilterQuestionOnly");
    if (vtFilterQuestionOnly == null)
    {
      var x = document.createElement("SPAN");
      x.appendChild(document.createTextNode("Full"));
      x.name = "btnFilterQuestionOnly";
      x.title = "The filter is applied to the full content, else the filter is applied to the visible-content only.";
      x.id = "btnFilterQuestionOnly";
      x.className = isFilterForQ() ? "" : vtQuestionOnlyClass;
      x.onclick = function (e)
      {
        if (e)
          if (e.target)
          {
            var sURL = document.URL;
            if (e.target.className == vtQuestionOnlyClass)
              sURL = addURLParam(sURL, filterQuestionOnlyParam, "only");
            else
              sURL = removeURLParam(sURL, filterQuestionOnlyParam);
            replaceURL(sURL);

            var xClass = "";
            if (e.target.className.indexOf(vtQuestionOnlyClass) < 0)
              xClass = vtQuestionOnlyClass;
            e.target.className = xClass;
          }
      };

      vtFilter.parentElement.insertBefore(x, document.getElementById("btnFilter"));
    }

    var vtFilterWordOnly = document.getElementById("btnFilterWordOnly");
    if (vtFilterWordOnly == null)
    {
      var x = document.createElement("SPAN");
      x.appendChild(document.createTextNode("Word"));
      x.name = "btnFilterWordOnly";
      x.title = "The filter searches for any, else it searches for the exact word.";
      x.id = "btnFilterWordOnly";
      x.className = isFilterForW() ? vtWordOnlyClass : "";
      x.onclick = function (e)
      {
        if (e)
          if (e.target)
          {
            var sURL = document.URL;
            if (e.target.className != vtWordOnlyClass)
              sURL = addURLParam(sURL, filterWordOnlyParam, "only");
            else
              sURL = removeURLParam(sURL, filterWordOnlyParam);
            replaceURL(sURL);

            var xClass = "";
            if (e.target.className.indexOf(vtWordOnlyClass) < 0)
              xClass = vtWordOnlyClass;
            e.target.className = xClass;
          }
      };

      vtFilter.parentElement.insertBefore(x, document.getElementById("btnFilter"));
    }
  }
}

function SetActivePage()
{
  var pages = document.getElementById("pages");
  if (pages)
  {
    var sURL = document.URL.toString(), p = pages.children;
    for (var i = 0; i < p.length; i++)
    {
      var hP = p[i].getAttribute("href");
      if (sURL.indexOf(hP) >= 0)
      {
        p[i].removeAttribute("href");
        p[i].removeAttribute("title");
        p[i].className = "active";
      }
    }
  }
}

function getToggleCount()
{
  var vtResult = 0;
  expandFirstItem = null;
  try
  {
    var rgToggle = document.getElementsByClassName("toggle");
    vtResult = rgToggle.length;
    if (vtResult > 0)
      if (vtResult < 16)
        expandFirstItem = rgToggle[0];
  }
  catch (err)
  {
  }
  return vtResult;
}

function SetFilterBoxInfo()
{
  var btnFilter = document.getElementById("btnFilter");
  if (btnFilter)
  {
    var newSpan = document.createElement("SPAN");
    var textnode = document.createTextNode("Enter here the keywords you are looking for, separated by spaces or commas, and then press Enter key or click the Go button.");
    newSpan.appendChild(textnode);
    newSpan.className = "arrow-box";
    newSpan.id = "filter-arrow-box";
    btnFilter.parentElement.insertBefore(newSpan, btnFilter);

    if (getToggleCount() > 16)
    {
      var filterFor = document.getElementById("Filter");
      if (filterFor)
        setTimeout(function () { showFilterBoxInfo(); }, 1000);
    }
  }
}

function setSessionItem(item, value)
{
  try
  {
    window.sessionStorage.setItem(item, value);
  }
  catch (err)
  {
  };
}

function getSessionItem(item)
{
  try
  {
    return window.sessionStorage.getItem(item);
  }
  catch (err)
  {
  };
  return null;
}

function removeSessionItem(item)
{
  try
  {
    window.sessionStorage.removeItem(item);
  }
  catch (err)
{
  };
}

function showFilterBoxInfo()
{
  if (getSessionItem("showFilterBoxInfo") == null)
  {
    if (!bDisableShowFilterBoxInfo)
    {
      var bContinue = true, filterFor = document.getElementById("Filter");
      if (filterFor)
        bContinue = filterFor != document.activeElement;

      if (bContinue)
      {
        var filterInfo = document.getElementById("filter-arrow-box");
        if (filterInfo)
        {
          setSessionItem("showFilterBoxInfo", "show");
          filterInfo.className = "arrow-box-show";
          setTimeout(function () { hideFilterBoxInfo(); }, 6000);
        }
      }
    }
  }
}

function hideFilterBoxInfo()
{
  var filterInfo = document.getElementById("filter-arrow-box");
  if (filterInfo)
    filterInfo.className = "arrow-box-hide";
}

function hasFilter()
{
  return getURLParam(document.URL, filterParam) || getURLParam(document.URL, filterFrameParam);
}

function loadPage()
{
  if (true)
  {
    var bApplyFilter = false, vtFilter = document.getElementById("Filter");
    var sF = hasFilter();
    if (sF != null)
      if (sF.length > 0)
        bApplyFilter = (vtFilter != null);

    SetActivePage();
    SetFilterPlaceHolder();
    SetCollapseAll();
    ExpandCollapseAll(document.getElementById("toggleAllImage"));
    if (bApplyFilter)
    {
      vtFilter.value = sF;
      filterFor(sF);
    }

    if (!bApplyFilter)
      SetFilterBoxInfo();
  }
  else
    SetToggleAllLabel(false);

  // vs70.js did this to allow up/down arrow scrolling, I think
  try { mainSection.setActive(); } catch (e) { }

  // make body visible, now that we're ready to render
  var sBody = "";
  if (isFrameFilterFor())
  {
    if (document.getElementById("error") != null)
      sBody = "none";
    else
    {
      var h = document.getElementById("header");
      if (h != null)
        h.style.display = "none";
      var f = document.getElementById("footer");
      if (f != null)
        f.style.display = "none";
    }
  }
  document.body.style.display = sBody;
  parent.document.body.onhashchange = hashChange;

  if (isFrameFilterFor())
  {
    try
    {
      localStorage.setItem("mainSectionHeight", getMainSectionHeight(document));
    }
    catch (e)
    {
    }
  }

  onLayoutHeader();
  ensureVisibleHash();

}

function ensureVisibleHash()
{
  try
  {
    var sURL = parent.document.URL, sHash = getURLHash(sURL);

    var e = getURLParam(sURL, expandParam), eID = null;
    if (e)
      eID = "Img" + e;

    if (sHash)
    {
      var vtElementsHash = parent.document.getElementsByName(sHash), bFound = false;
      if (vtElementsHash.length)
      {
        var vtTR = vtElementsHash[0];
        while (vtTR && vtTR.tagName != "TR")
          vtTR = vtTR.parentElement;
        if (vtTR)
          if (vtTR.id == "question")
          {
            var eIMG = vtTR.firstElementChild.firstElementChild;
            if (eIMG)
              if (eIMG.tagName == "IMG")
              {
                eID = eIMG.id;
                bFound = true;
              }
          }
      }
      if (!bFound)
        if (e == null)
          eID = "Img" + sHash;

    }

    if (eID)
    {
      var img = parent.document.getElementById(eID);
      if (img)
      {
        img.parentElement.parentElement.style.display = ""; // if hash inside the page, and it is filter, it requires to be visible!
        ExpandItem(img);
        scrollToQuestion = img.parentElement.parentElement;
        if (scrollToQuestion)
        {
          setTimeout(function ()
          {
            try
            {
              if (scrollToQuestion)
                parent.window.scrollTo(0, scrollToQuestion.offsetTop);
              scrollToQuestion = null;
            }
            catch (err)
            {
            }
          }, 100);
        }
      }
    }
    else
      if (expandFirstItem != null) // set by getToggleCount
      {
        ExpandItem(expandFirstItem);
        expandFirstItem = null;
      }

  }
  catch (err)
  {
  }
}

function onLayoutHeader()
{
}

function resizeWindow(e)
{
  onLayoutHeader();
}

function scrollWindow(e)
{
  onLayoutHeader();
  hideFilterBoxInfo();
}

function readyStateChange(e)
{
  document.body.style.display = "block";
}

function hashChange()
{
  ensureVisibleHash();
}

function clickWindow(e)
{
  var bHideFilterBoxInfo = true;

  var tag = e.target.tagName;
  if (tag)
  {
    if (tag == "INPUT")
    {
      var name = e.target.name;
      if (name)
        if (name == "btnFilter")
        {
          bHideFilterBoxInfo = false;
          onClickGo();
        }
        else
          if (name == "btnClear")
            onClickClear();
    }
    else
      if (tag == "IMG")
      {
        var p = e.target.parentElement.parentElement;
        if (p != null)
          if (p.className == "code")
            previewImg(e.target);
      }
      else
      {
        if (e.offsetY < 8)
        {
          if (tag == "PRE") // select code
            selectCode(e.target);
          else
            if (tag == "P") // toggle preview
              previewImg(e.target.firstElementChild);
        }
        else
          if (tag == "PRE")
          {
            if (e.offsetY > e.target.clientHeight - 8) // copy
              copyToClipboard(e.target);
          }
          else
            if (tag == "DIV") // share code
              if (e.offsetY > e.target.clientHeight)
                shareCode(e.target);
      }
  }

  if (bHideFilterBoxInfo)
    hideFilterBoxInfo();

  bDisableShowFilterBoxInfo = true;

}

function onClickGo()
{
  var sURL = document.URL, sOURL = sURL;
  var filterFor = document.getElementById("Filter").value;
  if ((filterFor == null) || (filterFor.length == 0))
  {
    bDisableShowFilterBoxInfo = false;
    removeSessionItem("showFilterBoxInfo");
    showFilterBoxInfo();
    sURL = removeURLParam(sURL, filterParam);
  }
  else
    sURL = addURLParam(sURL, filterParam, filterFor);
  if (sOURL != sURL)
    replaceURL(sURL);
}

function onClickClear()
{
  resetFilterFrames();
  window.scrollTo(0, 0);

  var sURL = document.URL;
  sURL = removeURLHash(sURL);
  sURL = removeURLParam(sURL, filterParam);
  sURL = removeURLParam(sURL, expandParam);
  replaceURL(sURL);
}

function selectURL(sURL)
{
  if (sURL)
  {
    try
    {
      window.parent.parent.location = sURL;
    }
    catch (err)
    {
    }
  }
}

function updateGlobalURL(sURL)
{
  if (sURL)
  {
    try
    {
      var sProduct = "product";
      var vtProduct = getURLParam(window.parent.parent.location.href, sProduct);
      if (vtProduct)
        sURL = addURLParam(sURL, sProduct, vtProduct);
    }
    catch (err)
    {
    }
  }
  return sURL;
}


function shareCode(div)
{
  if (div)
  {
    try
    {
      var sURL = getURL(location.href.replace(filterFrameParam + "=", filterParam + "=")); /*replace the FR with F*/
      sURL = removeURLHash(sURL);

      // shares the hash, in case it contains 
      var sHash = null;
      if (div.children.length)
      {
        var a = div.children[0];
        if (a.tagName == "A")
        {
          sHash = a.getAttribute("name");
          if (sHash)
            if (sHash.length)
              sURL += "#" + sHash;
        }
      }

      if (sHash == null) // shares the E instead
      {
        var sE = div.parentElement.parentElement.firstElementChild.innerText.replace(":", "").replace(" ", "");
        sURL = addURLParam(sURL, expandParam, sE);
      }

      if (isFilterForQ())
        sURL = addURLParam(sURL, filterQuestionOnlyParam, "only");

      if (isFilterForW())
        sURL = addURLParam(sURL, filterWordOnlyParam, "only");

      sURL = updateGlobalURL(sURL);

      selectURL(sURL);
    }
    catch (err)
    {
    }
  }
}

function previewImg(img)
{
  if (img)
    img.className = img.className.length == 0 ? "preview" : "";
}

function addTogglePreview(img)
{
  if (img)
  {
    var p = img.parentElement;
    if (p)
      if (p.tagName == "P")
        if (p.className.length == 0)
          if (img.height > 128)
            p.className = "preview";
  }
}

function selectCode(e)
{

  var sel = window.getSelection();
  if (sel)
  {
    sel.removeAllRanges();

    var range = document.createRange();

    try
    {
      var span = e.firstChild, s = span;
      if (span)
        if (span.tagName == "SPAN")
          if (span.className == "line-number")
            s = span.nextSibling;
      range.setStartBefore(s);
      range.setEndAfter(e.lastChild);

    }
    catch (er)
    {
      var span = e.firstChild;
      if (span)
        if (span.tagName == "SPAN")
          if (span.className == "line-number")
            span.style.display = "none";

      range.selectNodeContents(e);
    };
    sel.addRange(range);
  }
}

function copyToClipboard(e)
{
  var bSuccess = false;
  var sel = window.getSelection();
  if (sel)
  {
    selectCode(e);
    if (bSuccess = document.execCommand('copy'))
      sel.removeAllRanges();
  }
  return bSuccess;
}

var collapsedItems = new Array();

function ExpandItem(imageItem)
{
  if (imageItem)
  {
    imageItem.src = collapseImage.src;
    ExpandSection(imageItem);
    RemoveCollapsedItem(imageItem.id);

    onExpandCollapse();
  }
}

function CollapseItem(imageItem)
{
  if (imageItem)
  {
    imageItem.src = expandImage.src;
    CollapseSection(imageItem);
    AddCollapsedItem(imageItem.id);

    onExpandCollapse();
  }
}

function onExpandCollapse()
{
  SetCollapseAll();

  if (isFrameFilterFor())
  {
    try
    {
      var f = window.frameElement;
      if (f != null)
        f.style.height = getMainSectionHeight(document);
    }
    catch (e)
    {
    }
  }
}

function ExpandCollapse(imageItem)
{
  if (imageItem)
  {
    var bContinue = true;
    try
    {
      if (event)
        if (event.target.tagName == "DIV") // share code
          if (event.offsetY > event.target.clientHeight)
            bContinue = false;
    }
    catch (err)
    {
    };

    if (bContinue)
    {
      noReentry = true; // Prevent entry to OnLoadImage

      if (ItemCollapsed(imageItem.id) == true)
        ExpandItem(imageItem);
      else
        CollapseItem(imageItem);

      noReentry = false;
    }
  }
}

function CollapseAll(imageItem)
{
  noReentry = true; // Prevent entry to OnLoadImage

  var imgElements = document.getElementsByName("toggleSwitch");
  var i;

  imageItem.src = expandAllImage.src;
  AddCollapsedItem(imageItem.id);
  for (i = 0; i < imgElements.length; ++i)
  {
    wait();
    imgElements[i].src = expandImage.src;
    CollapseSection(imgElements[i]);
    AddCollapsedItem(imgElements[i].id);
  }
  SetToggleAllLabel(true);

  noReentry = false;
}

function ExpandHeaderInfo(e, b)
{
  e.className = b ? "" : "collapsed";
}

function isLoading()
{
  try
  {
    return event.type == "load";
  }
  catch (err)
  {
  }
  return false;
}

function ExpandHeaderInfos()
{
  if (!isLoading())
  {
    var rgInfos = document.getElementsByName("infos");
    if (rgInfos)
      for (var iInfo = 0; iInfo < rgInfos.length; iInfo++)
        ExpandHeaderInfo(rgInfos[iInfo], true);
  }
}

function CollapseHeaderInfos()
{
  if (!isLoading())
  {
    var rgInfos = document.getElementsByName("infos");
    if (rgInfos)
    {
      for (var iInfo = 0; iInfo < rgInfos.length; iInfo++)
        ExpandHeaderInfo(rgInfos[iInfo], false);
    }
  }
}

function ExpandCollapseAll(imageItem)
{
  if (imageItem)
  {
    noReentry = true; // Prevent entry to OnLoadImage

    var imgElements = document.getElementsByName("toggleSwitch");
    var i;

    if (ItemCollapsed(imageItem.id) == true)
    {
      ExpandHeaderInfos();
      imageItem.src = collapseAllImage.src;
      RemoveCollapsedItem(imageItem.id);
      for (i = 0; i < imgElements.length; ++i)
      {
        wait();
        imgElements[i].src = collapseImage.src;
        ExpandSection(imgElements[i]);
        RemoveCollapsedItem(imgElements[i].id);
      }
      SetToggleAllLabel(false);
    }
    else
    {
      CollapseHeaderInfos();
      imageItem.src = expandAllImage.src;
      AddCollapsedItem(imageItem.id);
      for (i = 0; i < imgElements.length; ++i)
      {
        wait();
        imgElements[i].src = expandImage.src;
        CollapseSection(imgElements[i]);
        AddCollapsedItem(imgElements[i].id);
      }
      SetToggleAllLabel(true);
    }

    noReentry = false;
  }
}

function ExpandCollapse_CheckKey(imageItem)
{
  if (imageItem)
    if (window.event.keyCode == 13)
      ExpandCollapse(imageItem);
}

function ExpandCollapseAll_CheckKey(imageItem)
{
  if (imageItem)
    if (window.event.keyCode == 13)
      ExpandCollapseAll(imageItem);
}

function ExpandSection(imageItem)
{
  if (imageItem)
    if (imageItem.parentElement != null)
    {
      var c = imageItem.parentElement.parentElement.children;
      if (c.length == 2)
      {

        var cAnswer = c[1].children["answer"];
        if (cAnswer)
        {
          cAnswer.style.display = "block";
          cAnswer.parentElement.className = "answere";
          c[0].style.background = "#f4f4f4";

          try
          {
            var cQuote = cAnswer.firstElementChild.firstElementChild;
            if (cQuote)
            {
              try
              {
                // Adds line numbers once the user expands section
                var rgPre = cQuote.getElementsByTagName("PRE");
                if (rgPre.length)
                {
                  for (var iPre = 0; iPre < rgPre.length; iPre++)
                  {
                    var pre = rgPre[iPre];
                    if (pre.getElementsByClassName)
                    {
                      var ln = pre.getElementsByClassName("line-number");
                      if (ln)
                        if (ln.length == 0)
                          addLineNumber(pre);
                    }
                    else
                      break;
                  }
                }
              }
              catch (err)
              {
              }

              try
              {
                var rgImg = cQuote.getElementsByTagName("IMG");
                if (rgImg.length)
                {
                  for (var iImg = 0; iImg < rgImg.length; iImg++)
                    addTogglePreview(rgImg[iImg]);
                }
              }
              catch (err)
              {
              }

            }
          }
          catch (err)
          {
          }
        }
      }
    }
}

function CollapseSection(imageItem)
{
  if (imageItem)
    if (imageItem.parentElement != null)
    {
      var c = imageItem.parentElement.parentElement.children;
      if (c.length == 2)
      {
        c[0].style.background = "";

        var cAnswer = c[1].children["answer"];
        if (cAnswer)
        {
          cAnswer.style.display = "none";
          cAnswer.parentElement.className = "";
        }
      }
    }
}

function SetCollapseAll()
{
  var imageElement = document.getElementById("toggleAllImage");

  if (imageElement == null)
    return;

  var imgElements = document.getElementsByName("toggleSwitch");
  var allCollapsed = true;
  var i, l = imgElements.length;

  for (i = 0; i < l; ++i)
  {
    wait();
    allCollapsed = allCollapsed && ItemCollapsed(imgElements[i].id)
  }

  if (allCollapsed)
  {
    imageElement.src = expandAllImage.src;
    AddCollapsedItem(imageElement.id);
  }
  else
  {
    imageElement.src = collapseAllImage.src;
    RemoveCollapsedItem(imageElement.id);
  }

  SetToggleAllLabel(allCollapsed);

}

function SetToggleAllLabel(allCollapsed)
{
  var labelElement;
  labelElement = document.getElementById("collapseAllLabel");

  if (labelElement == null)
    return;

  labelElement.style.display = "none";

  labelElement = document.getElementById("expandAllLabel");
  labelElement.style.display = "none";

  if (allCollapsed)
  {
    labelElement = document.getElementById("expandAllLabel");
    labelElement.style.display = "";
  }
  else
  {
    labelElement = document.getElementById("collapseAllLabel");
    labelElement.style.display = "";
  }
}

function ItemCollapsed(imageId)
{
  var i;

  for (i = 0; i < collapsedItems.length; ++i)
  {
    wait();
    if (imageId == collapsedItems[i])
      return true;
  }
  return false;
}

function AddCollapsedItem(imageId)
{
  collapsedItems[collapsedItems.length] = imageId;
}

function RemoveCollapsedItem(imageId)
{
  for (var i = 0; i < collapsedItems.length; ++i)
  {
    wait();
    if (imageId == collapsedItems[i])
      collapsedItems.splice(i, 1);
  }
}

function OpenSection(imageItem)
{
  if (ItemCollapsed(imageItem.id) == true)
    ExpandCollapse(imageItem);
}

function ClickHRefInside(e)
{
  if (e)
  {
    var rgA = e.getElementsByTagName("A");
    if (rgA.length == 1)
      selectURL(rgA[0].href);
  }
}

function ExpandHeaderGroup(e)
{
  if (e)
    e.parentElement.parentElement.className = e.parentElement.parentElement.className.length == 0 ? "collapsed" : "";
}