PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/www/tags/NOV_07_2009/htdocs/ruby/slides/02005/euruko/ui/slides.js

#
JavaScript | 552 lines | 511 code | 35 blank | 6 comment | 206 complexity | de1ff18e37b1b6c08b080ad20e1f3d0d MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. // S5 v1.1 slides.js -- released under CC by-sa 2.0 license
  2. //
  3. // Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
  4. // about all the wonderful and talented contributors to this code!
  5. var undef;
  6. var slideCSS = '';
  7. var snum = 0;
  8. var smax = 1;
  9. var incpos = 0;
  10. var number = undef;
  11. var s5mode = true;
  12. var defaultView = 'slideshow';
  13. var controlVis = 'visible';
  14. var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
  15. var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
  16. var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
  17. function hasClass(object, className) {
  18. if (!object.className) return false;
  19. return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
  20. }
  21. function hasValue(object, value) {
  22. if (!object) return false;
  23. return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
  24. }
  25. function removeClass(object,className) {
  26. if (!object) return;
  27. object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
  28. }
  29. function addClass(object,className) {
  30. if (!object || hasClass(object, className)) return;
  31. if (object.className) {
  32. object.className += ' '+className;
  33. } else {
  34. object.className = className;
  35. }
  36. }
  37. function GetElementsWithClassName(elementName,className) {
  38. var allElements = document.getElementsByTagName(elementName);
  39. var elemColl = new Array();
  40. for (var i = 0; i< allElements.length; i++) {
  41. if (hasClass(allElements[i], className)) {
  42. elemColl[elemColl.length] = allElements[i];
  43. }
  44. }
  45. return elemColl;
  46. }
  47. function isParentOrSelf(element, id) {
  48. if (element == null || element.nodeName=='BODY') return false;
  49. else if (element.id == id) return true;
  50. else return isParentOrSelf(element.parentNode, id);
  51. }
  52. function nodeValue(node) {
  53. var result = "";
  54. if (node.nodeType == 1) {
  55. var children = node.childNodes;
  56. for (var i = 0; i < children.length; ++i) {
  57. result += nodeValue(children[i]);
  58. }
  59. }
  60. else if (node.nodeType == 3) {
  61. result = node.nodeValue;
  62. }
  63. return(result);
  64. }
  65. function slideLabel() {
  66. var slideColl = GetElementsWithClassName('*','slide');
  67. var list = document.getElementById('jumplist');
  68. smax = slideColl.length;
  69. for (var n = 0; n < smax; n++) {
  70. var obj = slideColl[n];
  71. var did = 'slide' + n.toString();
  72. obj.setAttribute('id',did);
  73. if (isOp) continue;
  74. var otext = '';
  75. var menu = obj.firstChild;
  76. if (!menu) continue; // to cope with empty slides
  77. while (menu && menu.nodeType == 3) {
  78. menu = menu.nextSibling;
  79. }
  80. if (!menu) continue; // to cope with slides with only text nodes
  81. var menunodes = menu.childNodes;
  82. for (var o = 0; o < menunodes.length; o++) {
  83. otext += nodeValue(menunodes[o]);
  84. }
  85. list.options[list.length] = new Option(n + ' : ' + otext, n);
  86. }
  87. }
  88. function currentSlide() {
  89. var cs;
  90. if (document.getElementById) {
  91. cs = document.getElementById('currentSlide');
  92. } else {
  93. cs = document.currentSlide;
  94. }
  95. cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
  96. '<span id="csSep">\/<\/span> ' +
  97. '<span id="csTotal">' + (smax-1) + '<\/span>';
  98. if (snum == 0) {
  99. cs.style.visibility = 'hidden';
  100. } else {
  101. cs.style.visibility = 'visible';
  102. }
  103. }
  104. function go(step) {
  105. if (document.getElementById('slideProj').disabled || step == 0) return;
  106. var jl = document.getElementById('jumplist');
  107. var cid = 'slide' + snum;
  108. var ce = document.getElementById(cid);
  109. if (incrementals[snum].length > 0) {
  110. for (var i = 0; i < incrementals[snum].length; i++) {
  111. removeClass(incrementals[snum][i], 'current');
  112. removeClass(incrementals[snum][i], 'incremental');
  113. }
  114. }
  115. if (step != 'j') {
  116. snum += step;
  117. lmax = smax - 1;
  118. if (snum > lmax) snum = lmax;
  119. if (snum < 0) snum = 0;
  120. } else
  121. snum = parseInt(jl.value);
  122. var nid = 'slide' + snum;
  123. var ne = document.getElementById(nid);
  124. if (!ne) {
  125. ne = document.getElementById('slide0');
  126. snum = 0;
  127. }
  128. if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
  129. if (incrementals[snum].length > 0 && incpos == 0) {
  130. for (var i = 0; i < incrementals[snum].length; i++) {
  131. if (hasClass(incrementals[snum][i], 'current'))
  132. incpos = i + 1;
  133. else
  134. addClass(incrementals[snum][i], 'incremental');
  135. }
  136. }
  137. if (incrementals[snum].length > 0 && incpos > 0)
  138. addClass(incrementals[snum][incpos - 1], 'current');
  139. ce.style.visibility = 'hidden';
  140. ne.style.visibility = 'visible';
  141. jl.selectedIndex = snum;
  142. currentSlide();
  143. number = 0;
  144. }
  145. function goTo(target) {
  146. if (target >= smax || target == snum) return;
  147. go(target - snum);
  148. }
  149. function subgo(step) {
  150. if (step > 0) {
  151. removeClass(incrementals[snum][incpos - 1],'current');
  152. removeClass(incrementals[snum][incpos], 'incremental');
  153. addClass(incrementals[snum][incpos],'current');
  154. incpos++;
  155. } else {
  156. incpos--;
  157. removeClass(incrementals[snum][incpos],'current');
  158. addClass(incrementals[snum][incpos], 'incremental');
  159. addClass(incrementals[snum][incpos - 1],'current');
  160. }
  161. }
  162. function toggle() {
  163. var slideColl = GetElementsWithClassName('*','slide');
  164. var slides = document.getElementById('slideProj');
  165. var outline = document.getElementById('outlineStyle');
  166. if (!slides.disabled) {
  167. slides.disabled = true;
  168. outline.disabled = false;
  169. s5mode = false;
  170. fontSize('1em');
  171. for (var n = 0; n < smax; n++) {
  172. var slide = slideColl[n];
  173. slide.style.visibility = 'visible';
  174. }
  175. } else {
  176. slides.disabled = false;
  177. outline.disabled = true;
  178. s5mode = true;
  179. fontScale();
  180. for (var n = 0; n < smax; n++) {
  181. var slide = slideColl[n];
  182. slide.style.visibility = 'hidden';
  183. }
  184. slideColl[snum].style.visibility = 'visible';
  185. }
  186. }
  187. function showHide(action) {
  188. var obj = GetElementsWithClassName('*','hideme')[0];
  189. switch (action) {
  190. case 's': obj.style.visibility = 'visible'; break;
  191. case 'h': obj.style.visibility = 'hidden'; break;
  192. case 'k':
  193. if (obj.style.visibility != 'visible') {
  194. obj.style.visibility = 'visible';
  195. } else {
  196. obj.style.visibility = 'hidden';
  197. }
  198. break;
  199. }
  200. }
  201. // 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
  202. function keys(key) {
  203. if (!key) {
  204. key = event;
  205. key.which = key.keyCode;
  206. }
  207. if (key.which == 84) {
  208. toggle();
  209. return;
  210. }
  211. if (s5mode) {
  212. switch (key.which) {
  213. case 10: // return
  214. case 13: // enter
  215. if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
  216. if (key.target && isParentOrSelf(key.target, 'controls')) return;
  217. if(number != undef) {
  218. goTo(number);
  219. break;
  220. }
  221. case 32: // spacebar
  222. case 34: // page down
  223. case 39: // rightkey
  224. case 40: // downkey
  225. if(number != undef) {
  226. go(number);
  227. } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
  228. go(1);
  229. } else {
  230. subgo(1);
  231. }
  232. break;
  233. case 33: // page up
  234. case 37: // leftkey
  235. case 38: // upkey
  236. if(number != undef) {
  237. go(-1 * number);
  238. } else if (!incrementals[snum] || incpos <= 0) {
  239. go(-1);
  240. } else {
  241. subgo(-1);
  242. }
  243. break;
  244. case 36: // home
  245. goTo(0);
  246. break;
  247. case 35: // end
  248. goTo(smax-1);
  249. break;
  250. case 67: // c
  251. showHide('k');
  252. break;
  253. }
  254. if (key.which < 48 || key.which > 57) {
  255. number = undef;
  256. } else {
  257. if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
  258. if (key.target && isParentOrSelf(key.target, 'controls')) return;
  259. number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
  260. }
  261. }
  262. return false;
  263. }
  264. function clicker(e) {
  265. number = undef;
  266. var target;
  267. if (window.event) {
  268. target = window.event.srcElement;
  269. e = window.event;
  270. } else target = e.target;
  271. if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
  272. if (!e.which || e.which == 1) {
  273. if (!incrementals[snum] || incpos >= incrementals[snum].length) {
  274. go(1);
  275. } else {
  276. subgo(1);
  277. }
  278. }
  279. }
  280. function findSlide(hash) {
  281. var target = null;
  282. var slides = GetElementsWithClassName('*','slide');
  283. for (var i = 0; i < slides.length; i++) {
  284. var targetSlide = slides[i];
  285. if ( (targetSlide.name && targetSlide.name == hash)
  286. || (targetSlide.id && targetSlide.id == hash) ) {
  287. target = targetSlide;
  288. break;
  289. }
  290. }
  291. while(target != null && target.nodeName != 'BODY') {
  292. if (hasClass(target, 'slide')) {
  293. return parseInt(target.id.slice(5));
  294. }
  295. target = target.parentNode;
  296. }
  297. return null;
  298. }
  299. function slideJump() {
  300. if (window.location.hash == null) return;
  301. var sregex = /^#slide(\d+)$/;
  302. var matches = sregex.exec(window.location.hash);
  303. var dest = null;
  304. if (matches != null) {
  305. dest = parseInt(matches[1]);
  306. } else {
  307. dest = findSlide(window.location.hash.slice(1));
  308. }
  309. if (dest != null)
  310. go(dest - snum);
  311. }
  312. function fixLinks() {
  313. var thisUri = window.location.href;
  314. thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
  315. var aelements = document.getElementsByTagName('A');
  316. for (var i = 0; i < aelements.length; i++) {
  317. var a = aelements[i].href;
  318. var slideID = a.match('\#slide[0-9]{1,2}');
  319. if ((slideID) && (slideID[0].slice(0,1) == '#')) {
  320. var dest = findSlide(slideID[0].slice(1));
  321. if (dest != null) {
  322. if (aelements[i].addEventListener) {
  323. aelements[i].addEventListener("click", new Function("e",
  324. "if (document.getElementById('slideProj').disabled) return;" +
  325. "go("+dest+" - snum); " +
  326. "if (e.preventDefault) e.preventDefault();"), true);
  327. } else if (aelements[i].attachEvent) {
  328. aelements[i].attachEvent("onclick", new Function("",
  329. "if (document.getElementById('slideProj').disabled) return;" +
  330. "go("+dest+" - snum); " +
  331. "event.returnValue = false;"));
  332. }
  333. }
  334. }
  335. }
  336. }
  337. function externalLinks() {
  338. if (!document.getElementsByTagName) return;
  339. var anchors = document.getElementsByTagName('a');
  340. for (var i=0; i<anchors.length; i++) {
  341. var anchor = anchors[i];
  342. if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
  343. anchor.target = '_blank';
  344. addClass(anchor,'external');
  345. }
  346. }
  347. }
  348. function createControls() {
  349. var controlsDiv = document.getElementById("controls");
  350. if (!controlsDiv) return;
  351. var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
  352. var hideDiv, hideList = '';
  353. if (controlVis == 'hidden') {
  354. hideDiv = hider;
  355. } else {
  356. hideList = hider;
  357. }
  358. controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
  359. '<div id="navLinks">' +
  360. '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
  361. '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
  362. '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
  363. '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
  364. '<\/div><\/form>';
  365. if (controlVis == 'hidden') {
  366. var hidden = document.getElementById('navLinks');
  367. } else {
  368. var hidden = document.getElementById('jumplist');
  369. }
  370. addClass(hidden,'hideme');
  371. }
  372. function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
  373. if (!s5mode) return false;
  374. var vScale = 22; // both yield 32 (after rounding) at 1024x768
  375. var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
  376. if (window.innerHeight) {
  377. var vSize = window.innerHeight;
  378. var hSize = window.innerWidth;
  379. } else if (document.documentElement.clientHeight) {
  380. var vSize = document.documentElement.clientHeight;
  381. var hSize = document.documentElement.clientWidth;
  382. } else if (document.body.clientHeight) {
  383. var vSize = document.body.clientHeight;
  384. var hSize = document.body.clientWidth;
  385. } else {
  386. var vSize = 700; // assuming 1024x768, minus chrome and such
  387. var hSize = 1024; // these do not account for kiosk mode or Opera Show
  388. }
  389. var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
  390. fontSize(newSize + 'px');
  391. if (isGe) { // hack to counter incremental reflow bugs
  392. var obj = document.getElementsByTagName('body')[0];
  393. obj.style.display = 'none';
  394. obj.style.display = 'block';
  395. }
  396. }
  397. function fontSize(value) {
  398. if (!(s5ss = document.getElementById('s5ss'))) {
  399. if (!isIE) {
  400. document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
  401. s5ss.setAttribute('media','screen, projection');
  402. s5ss.setAttribute('id','s5ss');
  403. } else {
  404. document.createStyleSheet();
  405. document.s5ss = document.styleSheets[document.styleSheets.length - 1];
  406. }
  407. }
  408. if (!isIE) {
  409. while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
  410. s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
  411. } else {
  412. document.s5ss.addRule('body','font-size: ' + value + ' !important;');
  413. }
  414. }
  415. function notOperaFix() {
  416. slideCSS = document.getElementById('slideProj').href;
  417. var slides = document.getElementById('slideProj');
  418. var outline = document.getElementById('outlineStyle');
  419. slides.setAttribute('media','screen');
  420. outline.disabled = true;
  421. if (isGe) {
  422. slides.setAttribute('href','null'); // Gecko fix
  423. slides.setAttribute('href',slideCSS); // Gecko fix
  424. }
  425. if (isIE && document.styleSheets && document.styleSheets[0]) {
  426. document.styleSheets[0].addRule('img', 'behavior: url(v11rc1/default/iepngfix.htc)');
  427. document.styleSheets[0].addRule('div', 'behavior: url(v11rc1/default/iepngfix.htc)');
  428. document.styleSheets[0].addRule('.slide', 'behavior: url(v11rc1/default/iepngfix.htc)');
  429. }
  430. }
  431. function getIncrementals(obj) {
  432. var incrementals = new Array();
  433. if (!obj)
  434. return incrementals;
  435. var children = obj.childNodes;
  436. for (var i = 0; i < children.length; i++) {
  437. var child = children[i];
  438. if (hasClass(child, 'incremental')) {
  439. if (child.nodeName == 'OL' || child.nodeName == 'UL') {
  440. removeClass(child, 'incremental');
  441. for (var j = 0; j < child.childNodes.length; j++) {
  442. if (child.childNodes[j].nodeType == 1) {
  443. addClass(child.childNodes[j], 'incremental');
  444. }
  445. }
  446. } else {
  447. incrementals[incrementals.length] = child;
  448. removeClass(child,'incremental');
  449. }
  450. }
  451. if (hasClass(child, 'show-first')) {
  452. if (child.nodeName == 'OL' || child.nodeName == 'UL') {
  453. removeClass(child, 'show-first');
  454. if (child.childNodes[isGe].nodeType == 1) {
  455. removeClass(child.childNodes[isGe], 'incremental');
  456. }
  457. } else {
  458. incrementals[incrementals.length] = child;
  459. }
  460. }
  461. incrementals = incrementals.concat(getIncrementals(child));
  462. }
  463. return incrementals;
  464. }
  465. function createIncrementals() {
  466. var incrementals = new Array();
  467. for (var i = 0; i < smax; i++) {
  468. incrementals[i] = getIncrementals(document.getElementById('slide'+i));
  469. }
  470. return incrementals;
  471. }
  472. function defaultCheck() {
  473. var allMetas = document.getElementsByTagName('meta');
  474. for (var i = 0; i< allMetas.length; i++) {
  475. if (allMetas[i].name == 'defaultView') {
  476. defaultView = allMetas[i].content;
  477. }
  478. if (allMetas[i].name == 'controlVis') {
  479. controlVis = allMetas[i].content;
  480. }
  481. }
  482. }
  483. // Key trap fix, new function body for trap()
  484. function trap(e) {
  485. if (!e) {
  486. e = event;
  487. e.which = e.keyCode;
  488. }
  489. try {
  490. modifierKey = e.ctrlKey || e.altKey || e.metaKey;
  491. }
  492. catch(e) {
  493. modifierKey = false;
  494. }
  495. return modifierKey || e.which == 0;
  496. }
  497. function startup() {
  498. defaultCheck();
  499. if (!isOp) createControls();
  500. slideLabel();
  501. fixLinks();
  502. externalLinks();
  503. fontScale();
  504. if (!isOp) {
  505. notOperaFix();
  506. incrementals = createIncrementals();
  507. slideJump();
  508. if (defaultView == 'outline') {
  509. toggle();
  510. }
  511. document.onkeyup = keys;
  512. document.onkeypress = trap;
  513. document.onclick = clicker;
  514. }
  515. }
  516. window.onload = startup;
  517. window.onresize = function(){setTimeout('fontScale()', 50);}