<html>
<script type="text/javascript">

function context_event(event)
{
  if (window.event)
  {
    event = window.event;
  }
  var swallow = document.getElementById("swallow_context").checked;

  var str =
         "EVENT PROPERTIES<br>"                       +
         "cancelable      = "+event.cancelable+"<br>" +
         "ctrlKey         = "+event.ctrlKey+"<br>"    +
         "metaKey         = "+event.metaKey+"<br>"    +
         "shiftKey        = "+event.shiftKey+"<br>"   +
         "<br>"                                       +
         "TEST PROPERTIES<br>"                        +
         "prevent default = "+swallow+"<br>"          +
         "event time      = "+new Date()+"<br>"       +
         "";
  document.getElementById("event_info").innerHTML=str;

  if (swallow)
  {
    if ((typeof event.cancelBubble) != "undefined")
      event.cancelBubble=true;

    if ((typeof event.preventDefault) != "undefined")
      event.preventDefault();

    if ((typeof event.returnValue) != "undefined")
      event.returnValue = false;

    if ((typeof event.stopPropagation) != "undefined")
      event.stopPropagation();

    return false;
  }

  return true;
}

</script>

<body oncontextmenu="return context_event(event)">
<div>To activate context menu, right-click or ctrl-click anywhere on the page.</div>
<div>&nbsp;</div>
<div><input type="checkbox" value="1" name="swallow_context" id="swallow_context"> Prevent default context menu</div>
<div>&nbsp;</div>
<tt id="event_info" style='background-color:#eeeeee'>
 -- No event captured --
</tt>
</body>
</html>
