/**
 * @provides javelin-behavior-phabricator-watch-anchor
 * @requires javelin-behavior
 *           javelin-stratcom
 *           javelin-dom
 *           javelin-vector
 */

JX.behavior('phabricator-watch-anchor', function() {

  var highlighted;

  function highlight() {
    highlighted && JX.DOM.alterClass(highlighted, 'anchor-target', false);
    try {
      highlighted = JX.$('anchor-' + window.location.hash.replace('#', ''));
    } catch (ex) {
      highlighted = null;
    }
    highlighted && JX.DOM.alterClass(highlighted, 'anchor-target', true);
  }

  // Defer invocation so other listeners can update the document.
  function defer_highlight() {
    setTimeout(highlight, 0);
  }

  // In some cases, we link to an anchor but the anchor target ajaxes in
  // later. If it pops in within the first few seconds, jump to it.
  function try_anchor(anchor) {
    try {
      // If the anchor exists, assume the browser handled the jump.
      JX.$(anchor);
      defer_highlight();
    } catch (e) {
      var n = 50;
      var try_anchor_again = function () {
        try {
          window.scrollTo(0, JX.$V(JX.$(anchor)).y - 60);
          defer_highlight();
        } catch (e) {
          if (n--) {
            setTimeout(try_anchor_again, 100);
          }
        }
      };
      try_anchor_again();
    }
  }

  JX.Stratcom.listen('hashchange', null, try_anchor);

  var anchor = window.location.hash.replace('#', '');
  if (anchor) {
    try_anchor(anchor);
  }

});

/**
 * @provides javelin-behavior-phabricator-watch-anchor
 * @requires javelin-behavior
 *           javelin-stratcom
 *           javelin-dom
 *           javelin-vector
 */

JX.behavior('phabricator-watch-anchor', function() {

  var highlighted;

  function highlight() {
    highlighted && JX.DOM.alterClass(highlighted, 'anchor-target', false);
    try {
      highlighted = JX.$('anchor-' + window.location.hash.replace('#', ''));
    } catch (ex) {
      highlighted = null;
    }
    highlighted && JX.DOM.alterClass(highlighted, 'anchor-target', true);
  }

  // Defer invocation so other listeners can update the document.
  function defer_highlight() {
    setTimeout(highlight, 0);
  }

  // In some cases, we link to an anchor but the anchor target ajaxes in
  // later. If it pops in within the first few seconds, jump to it.
  function try_anchor() {
    var anchor = window.location.hash.replace('#', '');
    try {
      // If the anchor exists, assume the browser handled the jump.
      if (anchor) {
        JX.$(anchor);
      }
      defer_highlight();
    } catch (e) {
      var n = 50;
      var try_anchor_again = function () {
        try {
          window.scrollTo(0, JX.$V(JX.$(anchor)).y - 60);
          defer_highlight();
        } catch (e) {
          if (n--) {
            setTimeout(try_anchor_again, 100);
          }
        }
      };
      try_anchor_again();
    }
  }

  JX.Stratcom.listen('hashchange', null, try_anchor);
  try_anchor();

});

Fix highlighting anchors on hashchange