PageRenderTime 36ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/Demo/slides.js

http://github.com/mbebenita/Broadway
JavaScript | 163 lines | 138 code | 23 blank | 2 comment | 28 complexity | b97c3df992d87c5d95439973b3e00e2e MD5 | raw file
Possible License(s): BSD-3-Clause
  1. function editSource() {
  2. window.open("http://etherpad.mozilla.org:9000" +
  3. window.location.pathname);
  4. }
  5. onclick = function(event) {
  6. if (event.shiftKey)
  7. editSource();
  8. };
  9. onload = function() {
  10. var allSlides = document.querySelectorAll(".slide");
  11. var currSlide;
  12. function $(sel) {
  13. return document.querySelector(sel);
  14. }
  15. function each(sel, fun) {
  16. var nodeList = document.querySelectorAll(sel);
  17. for (var i = 0; i < nodeList.length; i++)
  18. fun.call(nodeList[i], i);
  19. }
  20. function removeClass(elem, className) {
  21. var classes = elem.className.split(" ");
  22. if (classes.indexOf(className) != -1) {
  23. classes.splice(classes.indexOf(className), 1);
  24. elem.className = classes.join(" ");
  25. }
  26. }
  27. function addClass(elem, className) {
  28. var classes = elem.className.split(" ");
  29. if (classes.indexOf(className) == -1)
  30. elem.className += " " + className;
  31. }
  32. function addFooters() {
  33. var footer = $(".title.slide .footer");
  34. var date = $(".title.slide .date");
  35. each(".normal.slide", function() {
  36. if (date)
  37. this.appendChild(date.cloneNode(true));
  38. if (footer)
  39. this.appendChild(footer.cloneNode(true));
  40. });
  41. each(".slide", function(i) {
  42. var slideNo = document.createElement("div");
  43. slideNo.className = "slide-number";
  44. slideNo.textContent = (i + 1) + " / " + allSlides.length;
  45. this.appendChild(slideNo);
  46. });
  47. }
  48. function setCurrSlide(newCurrSlide) {
  49. if (newCurrSlide != currSlide) {
  50. if (currSlide != undefined)
  51. removeClass(allSlides[currSlide - 1], "selected");
  52. currSlide = newCurrSlide;
  53. addClass(allSlides[currSlide - 1], "selected");
  54. if (currSlide == 1)
  55. window.location.hash = "";
  56. else
  57. window.location.hash = "#" + currSlide;
  58. }
  59. }
  60. function setCurrSlideFromHash() {
  61. var hash = window.location.hash;
  62. var match = hash.match(/#(-?[0-9]+)/);
  63. if (match) {
  64. var newSlide = parseInt(match[1]);
  65. if (newSlide < 0)
  66. newSlide = allSlides.length + newSlide;
  67. setCurrSlide(newSlide);
  68. } else
  69. setCurrSlide(1);
  70. }
  71. function prevSlide() {
  72. if (currSlide > 1)
  73. setCurrSlide(currSlide - 1);
  74. }
  75. function nextSlide() {
  76. if (currSlide < allSlides.length)
  77. setCurrSlide(currSlide + 1);
  78. }
  79. if ('onhashchange' in window)
  80. window.onhashchange = setCurrSlideFromHash;
  81. else
  82. window.setInterval(setCurrSlideFromHash, 250);
  83. window.onkeydown = function(event) {
  84. // Don't let Firefox scroll the window *and*
  85. // advance the slides at the same time.
  86. event.preventDefault();
  87. };
  88. window.onkeyup = function(event) {
  89. const LEFT_ARROW = 37;
  90. const RIGHT_ARROW = 39;
  91. const SPACE = 32;
  92. switch (event.keyCode) {
  93. case SPACE:
  94. case RIGHT_ARROW:
  95. nextSlide();
  96. break;
  97. case LEFT_ARROW:
  98. prevSlide();
  99. break;
  100. }
  101. };
  102. function setupTouchUI() {
  103. var startX;
  104. var startY;
  105. var x;
  106. var y;
  107. var inGesture;
  108. document.body.addEventListener("touchstart", function(event) {
  109. inGesture = true;
  110. startX = event.touches[0].pageX;
  111. startY = event.touches[0].pageY;
  112. }, false);
  113. document.body.addEventListener("touchmove", function(event) {
  114. if (event.touches.length == 3)
  115. editSource();
  116. if (event.touches.length > 1)
  117. inGesture = false;
  118. if (!inGesture)
  119. return;
  120. x = event.targetTouches[0].pageX - startX;
  121. y = event.targetTouches[0].pageY - startY;
  122. event.preventDefault();
  123. }, false);
  124. document.body.addEventListener("touchend", function(event) {
  125. if (!inGesture)
  126. return;
  127. if (Math.abs(x) < Math.abs(y))
  128. return;
  129. if (x < 0)
  130. nextSlide();
  131. if (x > 0)
  132. prevSlide();
  133. }, false);
  134. }
  135. setCurrSlideFromHash();
  136. setupTouchUI();
  137. addFooters();
  138. document.body.style.display = "block";
  139. document.title = $(".title.slide .header").textContent;
  140. };