packages feed

agda-server-0.1: copy/slidy.js

// after w3c slidy, http://www.w3.org/Talks/Tools/Slidy2/

var slidy = {
  key_wanted: false,
  slide_number: 0, // integer slide count: 0, 1, 2, ...
  view_all: true,  // true: view all slides + handouts

  show_slide: function () {
    window.scrollTo(0,0);
    set_class(document.getElementsByTagName('body')[0].children[slidy.slide_number], "current");
  },

  switch_slide: function (event, n) {
    if (slidy.view_all) {
      return true;
    } else {
      var x = document.getElementsByTagName('body')[0].children;
      if (n >= 0 && n < x.length && n != slidy.slide_number) {
        set_class(x[slidy.slide_number], "");
        slidy.slide_number = n;
        slidy.show_slide();
      }
      return slidy.cancel(event);
    }
  },

  // needed for Opera to inhibit default behavior
  // since Opera delivers keyPress even if keyDown
  // was cancelled
  key_press: function (event) {
    if (!event)
      event = window.event;

    if (!slidy.key_wanted)
      return slidy.cancel(event);

    return true;
  },

  //  See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes
  key_down: function (event) {
    var key, target, tag;

    slidy.key_wanted = true;

    if (!event)
      event = window.event;

    // kludge around NS/IE differences 
    if (window.event)
    {
      key = window.event.keyCode;
      target = window.event.srcElement;
    }
    else if (event.which)
    {
      key = event.which;
      target = event.target;
    }
    else
      return true; // Yikes! unknown browser

    // ignore event if key value is zero
    // as for alt on Opera and Konqueror
    if (!key)
       return true;

    if (slidy.special_element(target))
      return true;

    // check for concurrent control/command/alt key
    // but are these only present on mouse events?
    if (event.ctrlKey || event.altKey || event.metaKey)
       return true;

    if (key == 32 || key == 39) { // space bar, right arrow
      slidy.switch_slide(event, slidy.slide_number + 1);
    } else if (key == 37) { // left arrow
      slidy.switch_slide(event, slidy.slide_number - 1);
    } else if (key == 36) { // Home
      slidy.switch_slide(event, 0);
    } else if (key == 35) { // End
      slidy.switch_slide(event, document.getElementsByTagName('body')[0].children.length - 1);
    } else if (key == 65 && document.getElementsByTagName('body')[0].children.length > 3) {  // A

        var x = document.getElementsByTagName('body')[0].children;

        if (slidy.view_all) {
          set_class(document.getElementsByTagName('body')[0], "single_slide");
          // var y = 0; //yTop();
          // slidy.slide_number = 0;
          // while (findDiff(x[slidy.slide_number])[1] < 0
          //       && slidy.slide_number < x.length - 1) {
          //  slidy.slide_number += 1;
          // }
          slidy.show_slide();
        } else {
          set_class(document.getElementsByTagName('body')[0], "");
          x[slidy.slide_number].scrollIntoView();
          // set_class(x[slidy.slide_number], "");
        }
        slidy.view_all = !slidy.view_all;
        return slidy.cancel(event);
    }
    return true;
  },

  special_element: function (e) {
    var tag = e.nodeName.toLowerCase();

    return e.onkeydown ||
      e.onclick ||
      tag == "a" ||
      tag == "embed" ||
      tag == "object" ||
      tag == "video" ||
      tag == "audio" ||
      tag == "input" ||
      tag == "textarea" ||
      tag == "select" ||
      tag == "option";
  },

  cancel: function (event) {
    if (event)
    {
       event.cancel = true;
       event.returnValue = false;

      if (event.preventDefault)
        event.preventDefault();
    }

    slidy.key_wanted = false;
    return false;
  },
};

function set_class(element, name) {
  if (typeof element.className != 'undefined') {
    element.className = name;
  } else {
    element.setAttribute("class", name);
  }
};

function add_listener(event, handler) {
    if (window.addEventListener)
      document.addEventListener(event, handler, false);
    else
      document.attachEvent("on"+event, handler);
};

// attach event listeners for initialization
function slidy_init() { 
  add_listener("keydown", slidy.key_down);
  add_listener("keypress", slidy.key_press);
};