PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

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

#
JavaScript | 587 lines | 498 code | 37 blank | 52 comment | 203 complexity | 527c93a359d0e5923c3390cc5effe2bb 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 snum = 0;
  7. var smax = 1;
  8. var incpos = 0;
  9. var number = undef;
  10. var s5mode = true;
  11. var slideCSS = document.getElementById('slideProj').href;
  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('div','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 67: // c
  245. showHide('k');
  246. break;
  247. }
  248. if (key.which < 48 || key.which > 57) {
  249. number = undef;
  250. } else {
  251. if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
  252. if (key.target && isParentOrSelf(key.target, 'controls')) return;
  253. number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
  254. }
  255. }
  256. }
  257. function clicker(e) {
  258. number = undef;
  259. var target;
  260. if (window.event) {
  261. target = window.event.srcElement;
  262. e = window.event;
  263. } else target = e.target;
  264. if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
  265. if (!e.which || e.which == 1) {
  266. if (!incrementals[snum] || incpos >= incrementals[snum].length) {
  267. go(1);
  268. } else {
  269. subgo(1);
  270. }
  271. }
  272. }
  273. function findSlide(hash) {
  274. var target = null;
  275. var slides = GetElementsWithClassName('*','slide');
  276. for (var i = 0; i < slides.length; i++) {
  277. var targetSlide = slides[i];
  278. if ( (targetSlide.name && targetSlide.name == hash)
  279. || (targetSlide.id && targetSlide.id == hash) ) {
  280. target = targetSlide;
  281. break;
  282. }
  283. }
  284. while(target != null && target.nodeName != 'BODY') {
  285. if (hasClass(target, 'slide')) {
  286. return parseInt(target.id.slice(5));
  287. }
  288. target = target.parentNode;
  289. }
  290. return null;
  291. }
  292. function slideJump() {
  293. if (window.location.hash == null) return;
  294. var sregex = /^#slide(\d+)$/;
  295. var matches = sregex.exec(window.location.hash);
  296. var dest = null;
  297. if (matches != null) {
  298. dest = parseInt(matches[1]);
  299. } else {
  300. dest = findSlide(window.location.hash.slice(1));
  301. }
  302. if (dest != null)
  303. go(dest - snum);
  304. }
  305. function fixLinks() {
  306. var thisUri = window.location.href;
  307. thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
  308. var aelements = document.getElementsByTagName('A');
  309. for (var i = 0; i < aelements.length; i++) {
  310. var a = aelements[i].href;
  311. var slideID = a.match('\#slide[0-9]{1,2}');
  312. if ((slideID) && (slideID[0].slice(0,1) == '#')) {
  313. var dest = findSlide(slideID[0].slice(1));
  314. if (dest != null) {
  315. if (aelements[i].addEventListener) {
  316. aelements[i].addEventListener("click", new Function("e",
  317. "if (document.getElementById('slideProj').disabled) return;" +
  318. "go("+dest+" - snum); " +
  319. "if (e.preventDefault) e.preventDefault();"), true);
  320. } else if (aelements[i].attachEvent) {
  321. aelements[i].attachEvent("onclick", new Function("",
  322. "if (document.getElementById('slideProj').disabled) return;" +
  323. "go("+dest+" - snum); " +
  324. "event.returnValue = false;"));
  325. }
  326. }
  327. }
  328. }
  329. }
  330. function externalLinks() {
  331. if (!document.getElementsByTagName) return;
  332. var anchors = document.getElementsByTagName('a');
  333. for (var i=0; i<anchors.length; i++) {
  334. var anchor = anchors[i];
  335. if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
  336. anchor.target = '_blank';
  337. addClass(anchor,'external');
  338. }
  339. }
  340. }
  341. function createControls() {
  342. var controlsDiv = document.getElementById("controls");
  343. if (!controlsDiv) return;
  344. var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
  345. var hideDiv, hideList = '';
  346. if (controlVis == 'hidden') {
  347. hideDiv = hider;
  348. } else {
  349. hideList = hider;
  350. }
  351. controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
  352. '<div id="navLinks">' +
  353. '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
  354. '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
  355. '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
  356. '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
  357. '<\/div><\/form>';
  358. if (controlVis == 'hidden') {
  359. var hidden = document.getElementById('navLinks');
  360. } else {
  361. var hidden = document.getElementById('jumplist');
  362. }
  363. addClass(hidden,'hideme');
  364. }
  365. 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
  366. if (!s5mode) return false;
  367. var vScale = 22; // both yield 32 (after rounding) at 1024x768
  368. var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
  369. if (window.innerHeight) {
  370. var vSize = window.innerHeight;
  371. var hSize = window.innerWidth;
  372. } else if (document.documentElement.clientHeight) {
  373. var vSize = document.documentElement.clientHeight;
  374. var hSize = document.documentElement.clientWidth;
  375. } else if (document.body.clientHeight) {
  376. var vSize = document.body.clientHeight;
  377. var hSize = document.body.clientWidth;
  378. } else {
  379. var vSize = 700; // assuming 1024x768, minus chrome and such
  380. var hSize = 1024; // these do not account for kiosk mode or Opera Show
  381. }
  382. var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
  383. fontSize(newSize + 'px');
  384. if (isGe) { // hack to counter incremental reflow bugs
  385. var obj = document.getElementsByTagName('body')[0];
  386. obj.style.display = 'none';
  387. obj.style.display = 'block';
  388. }
  389. }
  390. function fontSize(value) {
  391. if (!(s5ss = document.getElementById('s5ss'))) {
  392. if (!isIE) {
  393. document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
  394. s5ss.setAttribute('media','screen, projection');
  395. s5ss.setAttribute('id','s5ss');
  396. } else {
  397. document.createStyleSheet();
  398. document.s5ss = document.styleSheets[document.styleSheets.length - 1];
  399. }
  400. }
  401. if (!isIE) {
  402. while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
  403. s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
  404. } else {
  405. document.s5ss.addRule('body','font-size: ' + value + ' !important;');
  406. }
  407. }
  408. function notOperaFix() {
  409. var slides = document.getElementById('slideProj');
  410. var outline = document.getElementById('outlineStyle');
  411. slides.setAttribute('media','screen');
  412. outline.disabled = true;
  413. if (isGe) {
  414. slides.setAttribute('href','null'); // Gecko fix
  415. slides.setAttribute('href',slideCSS); // Gecko fix
  416. }
  417. }
  418. function getIncrementals(obj) {
  419. var incrementals = new Array();
  420. if (!obj)
  421. return incrementals;
  422. var children = obj.childNodes;
  423. for (var i = 0; i < children.length; i++) {
  424. var child = children[i];
  425. if (hasClass(child, 'incremental')) {
  426. if (child.nodeName == 'OL' || child.nodeName == 'UL') {
  427. removeClass(child, 'incremental');
  428. for (var j = 0; j < child.childNodes.length; j++) {
  429. if (child.childNodes[j].nodeType == 1) {
  430. addClass(child.childNodes[j], 'incremental');
  431. }
  432. }
  433. } else {
  434. incrementals[incrementals.length] = child;
  435. removeClass(child,'incremental');
  436. }
  437. }
  438. if (hasClass(child, 'show-first')) {
  439. if (child.nodeName == 'OL' || child.nodeName == 'UL') {
  440. removeClass(child, 'show-first');
  441. if (child.childNodes[isGe].nodeType == 1) {
  442. removeClass(child.childNodes[isGe], 'incremental');
  443. }
  444. } else {
  445. incrementals[incrementals.length] = child;
  446. }
  447. }
  448. incrementals = incrementals.concat(getIncrementals(child));
  449. }
  450. return incrementals;
  451. }
  452. function createIncrementals() {
  453. var incrementals = new Array();
  454. for (var i = 0; i < smax; i++) {
  455. incrementals[i] = getIncrementals(document.getElementById('slide'+i));
  456. }
  457. return incrementals;
  458. }
  459. function defaultCheck() {
  460. var allMetas = document.getElementsByTagName('meta');
  461. for (var i = 0; i< allMetas.length; i++) {
  462. if (allMetas[i].name == 'defaultView') {
  463. defaultView = allMetas[i].content;
  464. }
  465. if (allMetas[i].name == 'controlVis') {
  466. controlVis = allMetas[i].content;
  467. }
  468. }
  469. }
  470. // Key trap fix, new function body for trap()
  471. function trap(e) {
  472. if (!e) {
  473. e = event;
  474. e.which = e.keyCode;
  475. }
  476. try {
  477. modifierKey = e.ctrlKey || e.altKey || e.metaKey;
  478. }
  479. catch(e) {
  480. modifierKey = false;
  481. }
  482. return modifierKey || e.which == 0;
  483. }
  484. function startup() {
  485. defaultCheck();
  486. if (!isOp) createControls();
  487. slideLabel();
  488. fixLinks();
  489. externalLinks();
  490. fontScale();
  491. if (!isOp) {
  492. notOperaFix();
  493. incrementals = createIncrementals();
  494. slideJump();
  495. if (defaultView == 'outline') {
  496. toggle();
  497. }
  498. document.onkeyup = keys;
  499. document.onkeypress = trap;
  500. document.onclick = clicker;
  501. }
  502. }
  503. //IE/Win PNG transparency hack -- ONLY WORKS FOR FOREGROUND IMAGES!
  504. /*@cc_on
  505. @if (@_win16 != @_win16)
  506. @set @_win16 = false
  507. @end
  508. @if (@_win32 != @_win32)
  509. @set @_win32 = false
  510. @end
  511. @if (@_jscript_version >= 5.5 && (@_win32 || @_win16))
  512. window.attachEvent(
  513. 'onload', function() {
  514. for (var i = 0; i < document.images.length; i++) {
  515. var img = document.images[i];
  516. var len = img.src.length;
  517. if ('.PNG' == img.src.substring(len - 4, len).toUpperCase()) {
  518. var span = {
  519. id: img.id
  520. ,className: img.className
  521. ,title: (img.title) ? img.title : img.alt
  522. ,style: 'display:inline-block;width:'
  523. + img.width + 'px;height:' + img.height + 'px;'
  524. + 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\''
  525. + img.src + '\',sizingMethod=\'scale\');'
  526. ,toString: function() {
  527. return '<span '
  528. + ((this.id) ? 'id="' + this.id + '" ' : '')
  529. + ((this.className) ? 'class="' + this.className + '" ' : '')
  530. + 'title="' + this.title + '" '
  531. + 'style="' + this.style + '"><\/span>';
  532. }
  533. }
  534. if ('left' == img.align)
  535. span.style += 'float:left;';
  536. if ('right' == img.align)
  537. span.style += 'float:right;';
  538. if (img.parentElement.href)
  539. span.style += 'cursor:hand;';
  540. if (0 != img.style.cssText.length)
  541. span.style = img.currentStyle + ';' + span.style;
  542. img.outerHTML = span + '';
  543. i--;
  544. }
  545. }
  546. }
  547. );
  548. @end @*/
  549. window.onload = startup;
  550. window.onresize = function(){setTimeout('fontScale()', 50);}