# HG changeset patch # User Daichi TOMA # Date 1312181650 -32400 # Node ID 23c1131ea61ce57e5d22675a4d4bac3a986011a8 # Parent 5886962e7ba00fedc955a16dd565bb081bf6b244 add S5 diff -r 5886962e7ba0 -r 23c1131ea61c index.html --- a/index.html Mon Aug 01 14:10:38 2011 +0900 +++ b/index.html Mon Aug 01 15:54:10 2011 +0900 @@ -15,7 +15,5 @@
  • Blog
  • - - diff -r 5886962e7ba0 -r 23c1131ea61c seminar/20110802.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/20110802.html Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,209 @@ + + + + + +Seminar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +
      + +
    1. +

      Seminar

      +

      Daichi Toma

      +
      +
    2. + + +
    3. +

      What Is S5?

      +
        +
      • It's a Simple Standards-based Slide Show System
      • +
      • One XHTML document provides all of the slide show's content
      • +
      • CSS handles the layout and look of the slides
      • +
      • JavaScript handles the dynamic aspects of the show
      • +
      • That's all there is to it! (skip to summary; demonstrates links internal to the slide show)
      • +
      + +
      +
        +
      • I have notes here!
      • +
      • Keen.
      • +
      • Remember to tell people that notes are a new feature in 1.2
      • +
      +
      + +
    4. + + +
    5. +

      Operatic Origins

      +
        +
      • Opera 4 introduced Opera Show, a projection-mode style sheet technology (link demonstrates external link styling and window spawning)
      • +
      • Allows a single XHTML document to be turned into a PowerPoint-like slide show
      • +
      • Adding screen and print style sheets allows for multi-medium views of a single document
      • +
      • Highly efficient, but highly browser centric...
      • +
      + +
      +
        +
      • S5 and OperaShow diverged greatly in S5 1.1
      • +
      • S5 1.2 should (we hope) bring them into harmony once more
      • +
      +
      + +
    6. + + +
    7. +

      Incremental Display

      +
        +
      • Keep hitting/clicking "next" as long as it isn't the control link (»)
      • +
      • Bullet points are revealed one by one +
          +
        • All based on class name of inc
        • +
        • Lists can be classed to make items appear individually
        • +
        • Individual items can be classed as well to create "animations"; see Derek Featherstone's example
        • +
        +
      • +
      • Let's try it again, but without the first bullet point being pre-highlighted...
      • +
      +
    8. + + +
    9. +

      Incremental Display II

      +
        +
      • Keep hitting/clicking "next" as long as it isn't the control link (»)
      • +
      • Bullet points are revealed one by one +
          +
        • All based on class name of incremental
        • +
        • Lists can be classed to make items appear individually
        • +
        • Individual items can be classed as well to create "animations"; see Derek Featherstone's example
        • +
        +
      • +
      • Notice how the sub-list was part of the parent bullet point; that was done on purpose
      • +
      • Now to move on to other test slides!
      • +
      +
    10. + + +
    11. +

      PNG Alpha Tests

      +
      +

      DIV with PNG background followed by foreground PNG

      + +
      +
      +

      DIV with PNG background followed by foreground PNG

      + +
      +
    12. + + +
    13. +

      S5 Default File Structure

      +

      + +

      +
    14. + + +
    15. +

      S5 Themes

      +

      + 
      + 
      +(one way of presenting multiple graphics) +

      +
    16. + + +
    17. +

      Incremental S5 Themes

      +

      + 
      + 
      +(one by one!) +

      +
    18. + + +
    19. +

      Incremental Animation

      +
        +
      • A demonstration of just one of the many ways to accomplish simple animation-like effects (using a diagram from "XFN and...")
      • +
      +

      + + + + + +

      +
    20. + + +
    21. +

      In Summary

      +
        +
      • With minimal scripting, we have recreated and improved upon a (currently) browser-specific technology, making it cross-browser in the process
      • +
      • The S5 format is OSF 1.0 compatible
      • +
      • S5 is a very flexible and lightweight slide show system available for anyone to use
      • +
      +
    22. + +
    + + + diff -r 5886962e7ba0 -r 23c1131ea61c seminar/obj/flash/relog.swf Binary file seminar/obj/flash/relog.swf has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/obj/svg/sun.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/obj/svg/sun.svg Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/S501.jpg Binary file seminar/pix/S501.jpg has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/S502.jpg Binary file seminar/pix/S502.jpg has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/S503.jpg Binary file seminar/pix/S503.jpg has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/S504.jpg Binary file seminar/pix/S504.jpg has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/bank.png Binary file seminar/pix/bank.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/bg-shade.png Binary file seminar/pix/bg-shade.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/blue.png Binary file seminar/pix/blue.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/chalks.png Binary file seminar/pix/chalks.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/green.png Binary file seminar/pix/green.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/horizontal.png Binary file seminar/pix/horizontal.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/lineal.png Binary file seminar/pix/lineal.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/logo.png Binary file seminar/pix/logo.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/mememe01.png Binary file seminar/pix/mememe01.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/mememe02.png Binary file seminar/pix/mememe02.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/mememe03.png Binary file seminar/pix/mememe03.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/mememe04.png Binary file seminar/pix/mememe04.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/mememe05.png Binary file seminar/pix/mememe05.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/panel.png Binary file seminar/pix/panel.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/pixel.gif Binary file seminar/pix/pixel.gif has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/red.png Binary file seminar/pix/red.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/s5filemap.png Binary file seminar/pix/s5filemap.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/s5logo.png Binary file seminar/pix/s5logo.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/sun.png Binary file seminar/pix/sun.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/sunflower.png Binary file seminar/pix/sunflower.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/triangle.png Binary file seminar/pix/triangle.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/vertical.png Binary file seminar/pix/vertical.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/webmaster.png Binary file seminar/pix/webmaster.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/yellow.png Binary file seminar/pix/yellow.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/pix/youcan.png Binary file seminar/pix/youcan.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/audio_support/license.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/audio_support/license.txt Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,29 @@ +Software License Agreement (BSD License) + +Copyright (c) 2007, Scott Schiller (schillmania.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of schillmania.com nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission from schillmania.com. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/audio_support/null.mp3 Binary file seminar/ui/audio_support/null.mp3 has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/audio_support/soundmanager2.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/audio_support/soundmanager2.js Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,658 @@ +/* + SoundManager 2: Javascript Sound for the Web. + -------------------------------------------------- + http://www.schillmania.com/projects/soundmanager2/ + + Copyright (c) 2007, Scott Schiller. All rights reserved. + Code licensed under the BSD License: + http://www.schillmania.com/projects/soundmanager2/license.txt + + Beta V2.0b.20070118 +*/ + +function SoundManager(smURL,smID) { + var self = this; + this.enabled = false; + this.o = null; + this.url = (smURL||'ui/audio_support/soundmanager2.swf'); + this.id = (smID||'sm2movie'); + this.oMC = null; + this.sounds = []; + this.soundIDs = []; + this.allowPolling = true; // allow flash to poll for status update (required for "while playing", "progress" etc. to work.) + this.isIE = (navigator.userAgent.match(/MSIE/)); + this.isSafari = (navigator.userAgent.match(/safari/i)); + this._didAppend = false; + this._didInit = false; + this._disabled = false; + this.version = 'V2.0b.20070118'; + + this.defaultOptions = { + // ----------------- + 'debugMode': false, // enable debug/status messaging, handy for development/troubleshooting - will be written to a DIV with an ID of "soundmanager-debug", you can use CSS to make it pretty + 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can) + 'stream': true, // allows playing before entire file has loaded (recommended) + 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) + 'onid3': null, // callback function for "ID3 data is added/available" + 'onload': null, // callback function for "load finished" + 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) + 'onplay': null, // callback for "play" start + 'whileplaying': null, // callback during play (position update) + 'onstop': null, // callback for "user stop" + 'onfinish': null, // callback function for "sound finished playing" + 'onbeforefinish': null, // callback for "before sound finished playing (at [time])" + 'onbeforefinishtime': 2000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second) + 'onbeforefinishcomplete':null, // function to call when said sound finishes playing + 'onjustbeforefinish':null, // callback for [n] msec before end of current sound + 'onjustbeforefinishtime':200, // [n] - if not using, set to 0 (or null handler) and event will not fire. + 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time + 'pan': 0, // "pan" settings, left-to-right, -100 to 100 + 'volume': 100, // self-explanatory. 0-100, the latter being the max. + // ----------------- + 'foo': 'bar' // you don't need to change this one - it's actually an intentional filler. + } + + // --- public methods --- + + this.getMovie = function(smID) { + // return self.isIE?window[smID]:document[smID]; + return self.isIE?window[smID]:(self.isSafari?document[smID+'-embed']:document.getElementById(smID+'-embed')); + } + + this.loadFromXML = function(sXmlUrl) { + try { + self.o._loadFromXML(sXmlUrl); + } catch(e) { + self._failSafely(); + return true; + } + } + + this.createSound = function(oOptions) { + if (!self._didInit) throw new Error('soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods'); + if (arguments.length==2) { + // function overloading in JS! :) ..assume simple createSound(id,url) use case + oOptions = {'id':arguments[0],'url':arguments[1]} + } + var thisOptions = self._mergeObjects(oOptions); + self._writeDebug('soundManager.createSound(): "'+thisOptions.id+'" ('+thisOptions.url+')'); + if (self._idCheck(thisOptions.id,true)) { + self._writeDebug('sound '+thisOptions.id+' already defined - exiting'); + return false; + } + self.sounds[thisOptions.id] = new SMSound(self,thisOptions); + self.soundIDs[self.soundIDs.length] = thisOptions.id; + try { + self.o._createSound(thisOptions.id,thisOptions.onjustbeforefinishtime); + } catch(e) { + self._failSafely(); + return true; + } + if (thisOptions.autoLoad || thisOptions.autoPlay) self.sounds[thisOptions.id].load(thisOptions); + if (thisOptions.autoPlay) self.sounds[thisOptions.id].playState = 1; // we can only assume this sound will be playing soon. + } + + this.load = function(sID,oOptions) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].load(oOptions); + } + + this.unload = function(sID) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].unload(); + } + + this.play = function(sID,oOptions) { + if (!self._idCheck(sID)) { + if (typeof oOptions != 'Object') oOptions = {url:oOptions}; // overloading use case: play('mySound','/path/to/some.mp3'); + if (oOptions && oOptions.url) { + // overloading use case, creation + playing of sound: .play('someID',{url:'/path/to.mp3'}); + self._writeDebug('soundController.play(): attempting to create "'+sID+'"'); + oOptions.id = sID; + self.createSound(oOptions); + } else { + return false; + } + } + self.sounds[sID].play(oOptions); + } + + this.start = this.play; // just for convenience + + this.setPosition = function(sID,nMsecOffset) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].setPosition(nMsecOffset); + } + + this.stop = function(sID) { + if (!self._idCheck(sID)) return false; + self._writeDebug('soundManager.stop('+sID+')'); + self.sounds[sID].stop(); + } + + this.stopAll = function() { + for (var oSound in self.sounds) { + if (oSound instanceof SMSound) oSound.stop(); // apply only to sound objects + } + } + + this.pause = function(sID) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].pause(); + } + + this.resume = function(sID) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].resume(); + } + + this.togglePause = function(sID) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].togglePause(); + } + + this.setPan = function(sID,nPan) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].setPan(nPan); + } + + this.setVolume = function(sID,nVol) { + if (!self._idCheck(sID)) return false; + self.sounds[sID].setVolume(nVol); + } + + this.setPolling = function(bPolling) { + if (!self.o || !self.allowPolling) return false; + self._writeDebug('soundManager.setPolling('+bPolling+')'); + self.o._setPolling(bPolling); + } + + this.disable = function() { + // destroy all functions + if (self._disabled) return false; + self._disabled = true; + self._writeDebug('soundManager.disable(): Disabling all functions - future calls will return false.'); + for (var i=self.soundIDs.length; i--;) { + self._disableObject(self.sounds[self.soundIDs[i]]); + } + self.initComplete(); // fire "complete", despite fail + self._disableObject(self); + } + + this.getSoundById = function(sID,suppressDebug) { + if (!sID) throw new Error('SoundManager.getSoundById(): sID is null/undefined'); + var result = self.sounds[sID]; + if (!result && !suppressDebug) { + self._writeDebug('"'+sID+'" is an invalid sound ID.'); + // soundManager._writeDebug('trace: '+arguments.callee.caller); + } + return result; + } + + this.onload = function() { + onloadSM2(); + // window.onload() equivalent for SM2, ready to create sounds etc. + // this is a stub - you can override this in your own external script, eg. soundManager.onload = function() {} + // soundManager._writeDebug('Warning: soundManager.onload() is undefined.'); + } + + this.onerror = function() { + onerrorSM2(); + // stub for user handler, called when SM2 fails to load/init + } + + // --- "private" methods --- + + this._idCheck = this.getSoundById; + + this._disableObject = function(o) { + for (var oProp in o) { + if (typeof o[oProp] == 'function') o[oProp] = function(){return false;} + } + oProp = null; + } + + this._failSafely = function() { + // exception handler for "object doesn't support this property or method" + var flashCPLink = 'http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html'; + var fpgssTitle = 'You may need to whitelist this location/domain eg. file://C:/ or C:/ or mysite.com, or set ALWAYS ALLOW under the Flash Player Global Security Settings page. Note that this seems to apply only to file system viewing.'; + var flashCPL = 'view/edit'; + var FPGSS = 'FPGSS'; + if (!self._disabled) { + self._writeDebug('soundManager: JS->Flash communication failed. Possible causes: flash/browser security restrictions ('+flashCPL+'), insufficient browser/plugin support, or .swf not found'); + self._writeDebug('Verify that the movie path of '+self.url+' is correct (test link)'); + if (self._didAppend) { + if (!document.domain) { + self._writeDebug('Loading from local file system? (document.domain appears to be null, this location may need whitelisting by '+FPGSS+')'); + self._writeDebug('Possible security/domain restrictions ('+flashCPL+'), should work when served by http on same domain'); + } + // self._writeDebug('Note: Movie added via JS method, static object/embed in-page markup method may work instead.'); + } + self.disable(); + } + } + + this._createMovie = function(smID,smURL) { + var useDOM = !self.isIE; // IE needs document.write() to work, long story short - lame + if (window.location.href.indexOf('debug=1')+1) self.defaultOptions.debugMode = true; // allow force of debug mode via URL + var html = ['','']; + var debugID = 'soundmanager-debug'; + var debugHTML = '
    '; + if (useDOM) { + self.oMC = document.createElement('div'); + self.oMC.className = 'movieContainer'; + // "hide" flash movie + self.oMC.style.position = 'absolute'; + self.oMC.style.left = '-256px'; + self.oMC.style.width = '1px'; + self.oMC.style.height = '1px'; + self.oMC.innerHTML = html[self.isIE?0:1]; + var oTarget = (!self.isIE && document.body?document.body:document.getElementsByTagName('div')[0]); + oTarget.appendChild(self.oMC); // append to body here can throw "operation aborted" under IE + if (!document.getElementById(debugID)) { + var oDebug = document.createElement('div'); + oDebug.id = debugID; + oDebug.style.display = (self.defaultOptions.debugMode?'block':'none'); + oTarget.appendChild(oDebug); + } + oTarget = null; + } else { + // IE method - local file system, may cause strange JS error at line 53? + // I hate this method, but it appears to be the only one that will work (createElement works, but JS->Flash communication oddly fails when viewing locally.) + // Finally, IE doesn't do application/xhtml+xml yet (thus document.write() is still minimally acceptable here.) + if (document.getElementById(debugID)) debugHTML = ''; // avoid overwriting + document.write('
    '+html[self.isIE?0:1]+'
    '+debugHTML); + } + self._didAppend = true; + self._writeDebug('-- SoundManager 2 Version '+self.version.substr(1)+' --'); + self._writeDebug('soundManager._createMovie(): trying to load '+smURL+''); + } + + this._writeDebug = function(sText) { + if (!self.defaultOptions.debugMode) return false; + var sDID = 'soundmanager-debug'; + try { + var o = document.getElementById(sDID); + if (!o) { + // attempt to create soundManager debug element + var oNew = document.createElement('div'); + oNew.id = sDID; + // o = document.body.appendChild(oNew); + o = null; + if (!o) return false; + } + var p = document.createElement('div'); + p.innerHTML = sText; + // o.appendChild(p); // top-to-bottom + o.insertBefore(p,o.firstChild); // bottom-to-top + } catch(e) { + // oh well + } + o = null; + } + + this._debug = function() { + self._writeDebug('soundManager._debug(): sounds by id/url:'); + for (var i=0,j=self.soundIDs.length; iFlash/ExternalInterface communication fails under non-IE (?!) + } + + this.destruct = function() { + if (self.isSafari) { + /* -- + Safari 1.3.2 (v312.6)/OSX 10.3.9 and perhaps newer will crash if a sound is actively loading when user exits/refreshes/leaves page + (Apparently related to ExternalInterface making calls to an unloading/unloaded page?) + Unloading sounds (detaching handlers and so on) may help to prevent this + -- */ + for (var i=self.soundIDs.length; i--;) { + if (self.sounds[self.soundIDs[i]].readyState == 1) self.sounds[self.soundIDs[i]].unload(); + } + } + self.disable(); + // self.o = null; + // self.oMC = null; + } + +} + +function SMSound(oSM,oOptions) { + var self = this; + var sm = oSM; + this.sID = oOptions.id; + this.url = oOptions.url; + this.options = sm._mergeObjects(oOptions); + this.id3 = { + /* + Name/value pairs set via Flash when available - see reference for names: + http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001567.html + (eg., this.id3.songname or this.id3['songname']) + */ + } + + self.resetProperties = function(bLoaded) { + self.bytesLoaded = null; + self.bytesTotal = null; + self.position = null; + self.duration = null; + self.durationEstimate = null; + self.loaded = false; + self.loadSuccess = null; + self.playState = 0; + self.paused = false; + self.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success + self.didBeforeFinish = false; + self.didJustBeforeFinish = false; + } + + self.resetProperties(); + + // --- public methods --- + + this.load = function(oOptions) { + self.loaded = false; + self.loadSuccess = null; + self.readyState = 1; + self.playState = (oOptions.autoPlay||false); // if autoPlay, assume "playing" is true (no way to detect when it actually starts in Flash unless onPlay is watched?) + var thisOptions = sm._mergeObjects(oOptions); + if (typeof thisOptions.url == 'undefined') thisOptions.url = self.url; + try { + sm._writeDebug('loading '+thisOptions.url); + sm.o._load(self.sID,thisOptions.url,thisOptions.stream,thisOptions.autoPlay,thisOptions.whileloading?1:0); + } catch(e) { + sm._writeDebug('SMSound().load(): JS->Flash communication failed.'); + } + } + + this.unload = function() { + // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3 + sm._writeDebug('SMSound().unload()'); + self.setPosition(0); // reset current sound positioning + sm.o._unload(self.sID,'ui/audio_support/null.mp3'); + // reset load/status flags + self.resetProperties(); + } + + this.play = function(oOptions) { + if (!oOptions) oOptions = {}; + + // --- TODO: make event handlers specified via oOptions only apply to this instance of play() (eg. onfinish applies but will reset to default on finish) + if (oOptions.onfinish) self.options.onfinish = oOptions.onfinish; + if (oOptions.onbeforefinish) self.options.onbeforefinish = oOptions.onbeforefinish; + if (oOptions.onjustbeforefinish) self.options.onjustbeforefinish = oOptions.onjustbeforefinish; + // --- + + var thisOptions = sm._mergeObjects(oOptions); + if (self.playState == 1) { + // var allowMulti = typeof oOptions.multiShot!='undefined'?oOptions.multiShot:sm.defaultOptions.multiShot; + var allowMulti = thisOptions.multiShot; + if (!allowMulti) { + sm._writeDebug('SMSound.play(): "'+self.sID+'" already playing? (one-shot)'); + return false; + } else { + sm._writeDebug('SMSound.play(): "'+self.sID+'" already playing (multi-shot)'); + } + } + if (!self.loaded) { + if (self.readyState == 0) { + sm._writeDebug('SMSound.play(): .play() before load request. Attempting to load "'+self.sID+'"'); + // try to get this sound playing ASAP + thisOptions.stream = true; + thisOptions.autoPlay = true; + // TODO: need to investigate when false, double-playing + // if (typeof oOptions.autoPlay=='undefined') thisOptions.autoPlay = true; // only set autoPlay if unspecified here + self.load(thisOptions); // try to get this sound playing ASAP + } else if (self.readyState == 2) { + sm._writeDebug('SMSound.play(): Could not load "'+self.sID+'" - exiting'); + return false; + } else { + sm._writeDebug('SMSound.play(): "'+self.sID+'" is loading - attempting to play..'); + } + } else { + sm._writeDebug('SMSound.play(): "'+self.sID+'"'); + } + if (self.paused) { + self.resume(); + } else { + self.playState = 1; + self.position = (thisOptions.offset||0); + if (thisOptions.onplay) thisOptions.onplay.apply(self); + self.setVolume(thisOptions.volume); + self.setPan(thisOptions.pan); + if (!thisOptions.autoPlay) { + sm._writeDebug('starting sound '+self.sID); + sm.o._start(self.sID,thisOptions.loop||1,self.position); // TODO: verify !autoPlay doesn't cause issue + } + } + } + + this.start = this.play; // just for convenience + + this.stop = function(bAll) { + if (self.playState == 1) { + self.playState = 0; + self.paused = false; + if (sm.defaultOptions.onstop) sm.defaultOptions.onstop.apply(self); + sm.o._stop(self.sID); + } + } + + this.setPosition = function(nMsecOffset) { + // sm._writeDebug('setPosition('+nMsecOffset+')'); + sm.o._setPosition(self.sID,nMsecOffset/1000,self.paused||!self.playState); // if paused or not playing, will not resume (by playing) + } + + this.pause = function() { + if (self.paused) return false; + sm._writeDebug('SMSound.pause()'); + self.paused = true; + sm.o._pause(self.sID); + } + + this.resume = function() { + if (!self.paused) return false; + sm._writeDebug('SMSound.resume()'); + self.paused = false; + sm.o._pause(self.sID); // flash method is toggle-based (pause/resume) + } + + this.togglePause = function() { + // if playing, pauses - if paused, resumes playing. + sm._writeDebug('SMSound.togglePause()'); + if (!self.playState) { + // self.setPosition(); + self.play({offset:self.position/1000}); + return false; + } + if (self.paused) { + sm._writeDebug('SMSound.togglePause(): resuming..'); + self.resume(); + } else { + sm._writeDebug('SMSound.togglePause(): pausing..'); + self.pause(); + } + } + + this.setPan = function(nPan) { + if (typeof nPan == 'undefined') nPan = 0; + sm.o._setPan(self.sID,nPan); + self.options.pan = nPan; + } + + this.setVolume = function(nVol) { + if (typeof nVol == 'undefined') nVol = 100; + sm.o._setVolume(self.sID,nVol); + self.options.volume = nVol; + } + + // --- "private" methods called by Flash --- + + this._whileloading = function(nBytesLoaded,nBytesTotal,nDuration) { + self.bytesLoaded = nBytesLoaded; + self.bytesTotal = nBytesTotal; + self.duration = nDuration; + self.durationEstimate = parseInt((self.bytesTotal/self.bytesLoaded)*self.duration); // estimate total time (will only be accurate with CBR MP3s.) + if (self.readyState != 3 && self.options.whileloading) self.options.whileloading.apply(self); + // soundManager._writeDebug('duration/durationEst: '+self.duration+' / '+self.durationEstimate); + } + + this._onid3 = function(oID3PropNames,oID3Data) { + // oID3PropNames: string array (names) + // ID3Data: string array (data) + sm._writeDebug('SMSound()._onid3(): "'+this.sID+'" ID3 data received.'); + var oData = []; + for (var i=0,j=oID3PropNames.length; itest URL]')); + self.loaded = bSuccess; + self.loadSuccess = bSuccess; + self.readyState = bSuccess?3:2; + if (self.options.onload) self.options.onload.apply(self); + } + + this._onbeforefinish = function() { + if (!self.didBeforeFinish) { + self.didBeforeFinish = true; + if (self.options.onbeforefinish) self.options.onbeforefinish.apply(self); + } + } + + this._onjustbeforefinish = function(msOffset) { + // msOffset: "end of sound" delay actual value (eg. 200 msec, value at event fire time was 187) + if (!self.didJustBeforeFinish) { + self.didJustBeforeFinish = true; + soundManager._writeDebug('SMSound._onjustbeforefinish()'); + if (self.options.onjustbeforefinish) self.options.onjustbeforefinish.apply(self);; + } + } + + this._onfinish = function() { + // sound has finished playing + sm._writeDebug('SMSound._onfinish(): "'+self.sID+'" finished playing'); + self.playState = 0; + self.paused = false; + if (self.options.onfinish) self.options.onfinish.apply(self); + if (self.options.onbeforefinishcomplete) self.options.onbeforefinishcomplete.apply(self); + // reset some state items + self.setPosition(0); + self.didBeforeFinish = false; + self.didJustBeforeFinish = false; + } + +} + +var soundManager = new SoundManager(); + +// attach onload handler +if (window.addEventListener) { + window.addEventListener('load',soundManager.beginInit,false); + window.addEventListener('beforeunload',soundManager.destruct,false); +} else if (window.attachEvent) { + window.attachEvent('onload',soundManager.beginInit); + window.attachEvent('beforeunload',soundManager.destruct); +} else { + // no add/attachevent support - safe to assume no JS->Flash either. + soundManager.disable(); +} \ No newline at end of file diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/audio_support/soundmanager2.swf Binary file seminar/ui/audio_support/soundmanager2.swf has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/bodybg.gif Binary file seminar/ui/default_utf/bodybg.gif has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/concurrency_logo.png Binary file seminar/ui/default_utf/concurrency_logo.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/framing.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/framing.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,22 @@ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 0.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {text-align: right; width: 100%; margin: 0;} +#currentSlide {position: absolute; width: 12%; left: 44%; bottom: 1em; z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/opera.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/opera.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,7 @@ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/outline.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/outline.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,13 @@ +/* don't change this unless you want the layout stuff to show up in the outline view! */ + +.hide, .layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #sheet {display: block; visibility: visible; margin: 0; padding: 0;} +#sheet {float: right; padding: 0.5em;} +html>body #sheet {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#slide0 h1 {padding-top: 1.5em;} +.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em; border-top: 1px solid #888; border-bottom: 1px solid #AAA;} +#sheet {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/pattern.png Binary file seminar/ui/default_utf/pattern.png has changed diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/pretty.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/pretty.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,105 @@ +/* Following are the presentation styles -- edit away! */ + +body {background: #FFF; color: #000; font-family: Tahoma, Arial, Helvetica, sans-serif; font-size: 2.25em;} +a:link, a:visited {text-decoration: none; color: #00C;} + +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} +h1 {text-shadow: 0.1em 0.1em 0.1em #666;} + +ul, pre {margin: 0; line-height: 1em;} +html, body {margin: 0; padding: 0;} + +blockquote, q {font-style: italic;} +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;} +blockquote p {margin: 0;} +blockquote i {font-style: normal;} +blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;} +blockquote b i {font-style: italic;} + +img {border: 0;} +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} +body { + background-image: url("concurrency_logo.png"); + background-repeat: no-repeat; + background-attachment: fixed; + background-position: right 94% +} + +.slide code {padding: 2px 0.25em; font-weight: bold; color: #c00;} +.slide code.bad, code del {color: red;} +.slide code.old {color: silver;} +.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;} +.slide pre code {display: block;} +.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;} +.slide li {margin-top: 0.75em; margin-right: 0;} +.slide ul ul {line-height: 1;} +.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} + +/* +div#header, div#footer {background: #005; color: #AAB; font-family: Verdana, Arial, Helvetica, sans-serif;} +div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat; line-height: 1px;} +*/ +div#header, div#footer {background: #507aaa; color: #FFF; font-family: Verdana, Arial, Helvetica, sans-serif;} +div#header {background: #507aaa; line-height: 1px;} +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1, #footer h2 {border: none; display: block; padding: 0; position:absolute; bottom:0.5em;} +#footer h1 {left:1em;} +#footer h2 {right:1em; font-style: italic;} + +div.long {font-size: 0.75em;} +.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1; margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap; font: bold 150%/1em Arial, Helvetica, sans-serif; text-transform: capitalize; color: #FFF; background-color: transparent;} +.slide h3 {font-size: 130%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 25%; bottom: 0; width: 50%; text-align: center; font: bold 1em Verdana, Arial, Helvetica, sans-serif;} +html>body div#controls {background: transparent; position: fixed; padding: 0; top: auto; text-align: center;} +#controls #sheet {display: none;} +#controls #controlForm {height: 3.0em; text-align: center; vertical-align: middle;} +#controls #navLinks {padding: 0 0 0.2em 0; margin: 0; background: url(pattern.png) gray bottom repeat-x; border: 2px outset gray; border-top-color: silver; border-left-color: silver; text-align: center; vertical-align: middle; white-space: nowrap;} +#controls #navLinks a {text-shadow: #444 0.1em 0.1em 0.1em; padding: 0; margin: 0em 0.36em; background: transparent; border: none; color: white; cursor: pointer;} +#controls #navLinks a:focus, #controls #navLinks a:hover {text-decoration: none; color: black !important;} +#controls #navLinks a:link, #controls #navLinks a:visited {text-decoration: none; color: white;} +#controls #navLinks .subLinks {display: inline; border: 1px inset gray; border-bottom-color: silver; border-right-color: silver; font-size: 75%; padding: 0 0.25em; margin: -0.2em 0 0 0; background-color: #666; text-align: center; vertical-align: middle; white-space: nowrap;} +#controls #navLinks .subLinks a {text-shadow: none; font-weight: normal; padding: 0; margin: 0; border: none; color: white; cursor: pointer;} + +#jumplist, #volumelist {padding: 0; margin: 0; width: 1.5em; height: 2.25em; cursor: pointer;} + +#currentSlide {white-space: nowrap; text-align: center; margin-bottom: -0.5em; font-size: 0.5em; background-color: transparent; color: #FFF;} + +#guru {position: absolute; visibility: visible; left: 0px; top: 0px; padding: 4px; width: 99%; height: auto; text-align: center; background-color: black; z-index: 10;} +#guru div {border: solid 3px red; padding: 4px; font-family: monospace; font-size: 60%; width: auto; height: auto; color: red; text-align: center;} + +#slide0 {padding-top: 3.5em; font-size: 90%;} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; font: bold 2em Arial, Helvetica, sans-serif; white-space: normal; color: #000; background-color: transparent;} +#slide0 h2 {font: bold italic 1em Arial, Helvetica, sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.note {display: none;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;} +img.incremental, canvas.incremental {visibility: hidden;} +.slide .current {color: #B02;} + +/* diagnostics +li:after {content: " [" attr(class) "]"; color: #F88;} +*/ + +table.piechart, table.barchart, table.linechart { border-spacing: 0.3em 0.15em; } +table.piechart tr th, table.barchart tr th, table.linechart tr th { white-space: nowrap; } +table.piechart tr td, table.barchart tr td, table.linechart tr td { vertical-align: top; white-space: nowrap; } +table.piechart tr td.col, table.barchart tr td.col, table.linechart tr td.col { border-bottom: 1px solid #555; border-right: 1px solid #555; } +table.fs90 tr td, table.fs90 tr th, div.fs90, pre.fs90, p.fs90 ,ul.fs90 {font-size: 0.9em; } +table.fs75 tr td, table.fs75 tr th, div.fs75, pre.fs75, p.fs75 ,ul.fs75 {font-size: 0.75em; } +table.fs66 tr td, table.fs66 tr th, div.fs66, pre.fs66, p.fs66 ,ul.fs66 {font-size: 0.66em; } +table.fs50 tr td, table.fs50 tr th, div.fs50, pre.fs50, p.fs50 ,ul.fs50 {font-size: 0.5em; } + +#soundmanager-debug {position:fixed; top:0px; right:0px; width:30em; height:20em; overflow:auto; border:1px solid red; padding:1em; margin:2em; font-family:"sans serif"; font-size: 12px;color: black; background-color:#f6f6f6; z-index: 100;} +#soundmanager-debug code {font-size: 11px;} diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/print.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/print.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,3 @@ +/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul, p {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} +img {page-break-inside: avoid; page-break-after: avoid;} +/*.slide {page-break-after: always;}*/ body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .hide, .layout, .layout * {display: none !important;} \ No newline at end of file diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/s5-core.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/s5-core.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,8 @@ +/* Do not edit or override these styles! The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, html>body div#controls, html>body .slide {position: fixed;} +.handout, .notes, .hide {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/slides.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/slides.css Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,3 @@ +@import url(s5-core.css); /* required to make the slide show run at all */ +@import url(framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff -r 5886962e7ba0 -r 23c1131ea61c seminar/ui/default_utf/slides.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/seminar/ui/default_utf/slides.js Mon Aug 01 15:54:10 2011 +0900 @@ -0,0 +1,2665 @@ +// S5 1.3beta7 (18-Apr-2007) advanced version by C. Effenberger +// Please see http://s5.netzgesta.de/ for more information +// based on S5 v1.2a1 slides.js -- released into the Public Domain +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information +// about all the wonderful and talented contributors to this code! +// audio extension: soundmanager2 is NOT Public Domain +// Please see http://www.schillmania.com/projects/soundmanager2/ for information + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var incpos = 0; +var number = undef; +var firstTime = 1; +var s5mode = true; +var helpmode = false; +var defaultView = 'slideshow'; //outline +var controlVis = 'visible'; + +// scalable images extension +var empx = 0; +var images = new Array(); +var canvas = new Array(); +var medias = new Array(); +var piecharts = new Array(); +var barcharts = new Array(); +var linecharts = new Array(); +// scalable images extension + +// transition extension +var tranSitions = false; +var fadeModus = false; +var fadeDuration = 500; +var incrDuration = 250; +var opac = 1; +var cid = ''; +var nid = ''; +var tid = ''; +var jl = ''; +// transition extension + +// autoplay extension +var autoMatic = false; +var playLoop = false; +var playPause = false; +var autoRun = false; +var playDelay = 5000; +var remainDer = 0; +var incrDelay = 0; +// autoplay extension + +// audio extension +var sound = new Array(); +var audioSupport = false; +var audioVolume = 100; +var audioError = false; +var swfUnloaded = true; +var bgSoundItem = 9999; +var curSoundID = -1; +// audio extension + +// panel extension +var highLight = "rgb(255, 204, 0)"; +// panel extension + +// canvas chart extension +var canvasSupport = false; +var ChartData = new Array(); +var colorSlice = new Array(); +var font = document.createElement("img"); +font.setAttribute("src", "ui/graphic_support/numeric.png"); +signs = { + '0': {sx: 0, sy: 0, sw: 48, sh: 64}, + '1': {sx: 48, sy: 0, sw: 48, sh: 64}, + '2': {sx: 96, sy: 0, sw: 48, sh: 64}, + '3': {sx: 144, sy: 0, sw: 48, sh: 64}, + '4': {sx: 192, sy: 0, sw: 48, sh: 64}, + '5': {sx: 240, sy: 0, sw: 48, sh: 64}, + '6': {sx: 288, sy: 0, sw: 48, sh: 64}, + '7': {sx: 336, sy: 0, sw: 48, sh: 64}, + '8': {sx: 384, sy: 0, sw: 48, sh: 64}, + '9': {sx: 432, sy: 0, sw: 48, sh: 64}, + '%': {sx: 480, sy: 0, sw: 48, sh: 64}, + '.': {sx: 528, sy: 0, sw: 24, sh: 64} +}; +var colorNames= new Array(); +colorNames["black"]="#000000"; colorNames["maroon"]="#800000"; colorNames["green"]="#008000"; colorNames["olive"]="#808000"; colorNames["navy"]="#000080"; colorNames["purple"]="#800080"; colorNames["teal"]="#008080"; colorNames["gray"]="#808080"; colorNames["silver"]="#C0C0C0"; colorNames["red"]="#FF0000"; colorNames["lime"]="#00FF00"; colorNames["yellow"]="#FFFF00"; colorNames["blue"]="#0000FF"; colorNames["fuchsia"]="#FF00FF"; colorNames["aqua"]="#00FFFF"; colorNames["white"]="#FFFFFF"; colorNames["aliceblue"]="#F0F8FF"; colorNames["antiquewhite"]="#FAEBD7"; colorNames["aquamarine"]="#7FFFD4"; colorNames["azure"]="#F0FFFF"; colorNames["beige"]="#F5F5DC"; colorNames["blueviolet"]="#8A2BE2"; colorNames["brown"]="#A52A2A"; colorNames["burlywood"]="#DEB887"; colorNames["cadetblue"]="#5F9EA0"; colorNames["chartreuse"]="#7FFF00"; colorNames["chocolate"]="#D2691E"; colorNames["coral"]="#FF7F50"; colorNames["cornflowerblue"]="#6495ED"; colorNames["cornsilk"]="#FFF8DC"; colorNames["crimson"]="#DC143C"; colorNames["darkblue"]="#00008B"; colorNames["darkcyan"]="#008B8B"; colorNames["darkgoldenrod"]="#B8860B"; colorNames["darkgray"]="#A9A9A9"; colorNames["darkgreen"]="#006400"; colorNames["darkkhaki"]="#BDB76B"; colorNames["darkmagenta"]="#8B008B"; colorNames["darkolivegreen"]="#556B2F"; colorNames["darkorange"]="#FF8C00"; colorNames["darkorchid"]="#9932CC"; colorNames["darkred"]="#8B0000"; colorNames["darksalmon"]="#E9967A"; colorNames["darkseagreen"]="#8FBC8F"; colorNames["darkslateblue"]="#483D8B"; colorNames["darkslategray"]="#2F4F4F"; colorNames["darkturquoise"]="#00CED1"; colorNames["darkviolet"]="#9400D3"; colorNames["deeppink"]="#FF1493"; colorNames["deepskyblue"]="#00BFFF"; colorNames["dimgray"]="#696969"; colorNames["dodgerblue"]="#1E90FF"; colorNames["firebrick"]="#B22222"; colorNames["floralwhite"]="#FFFAF0"; colorNames["forestgreen"]="#228B22"; colorNames["gainsboro"]="#DCDCDC"; colorNames["ghostwhite"]="#F8F8FF"; colorNames["gold"]="#FFD700"; colorNames["goldenrod"]="#DAA520"; colorNames["greenyellow"]="#ADFF2F"; colorNames["honeydew"]="#F0FFF0"; colorNames["hotpink"]="#FF69B4"; colorNames["indianred"]="#CD5C5C"; colorNames["indigo"]="#4B0082"; colorNames["ivory"]="#FFFFF0"; colorNames["khaki"]="#F0E68C"; colorNames["lavender"]="#E6E6FA"; colorNames["lavenderblush"]="#FFF0F5"; colorNames["lawngreen"]="#7CFC00"; colorNames["lemonchiffon"]="#FFFACD"; colorNames["lightblue"]="#ADD8E6"; colorNames["lightcoral"]="#F08080"; colorNames["lightcyan"]="#E0FFFF"; colorNames["lightgoldenrodyellow"]="#FAFAD2"; colorNames["lightgreen"]="#90EE90"; colorNames["lightgrey"]="#D3D3D3"; colorNames["lightpink"]="#FFB6C1"; colorNames["lightsalmon"]="#FFA07A"; colorNames["lightseagreen"]="#20B2AA"; colorNames["lightskyblue"]="#87CEFA"; colorNames["lightslategray"]="#778899"; colorNames["lightsteelblue"]="#B0C4DE"; colorNames["lightyellow"]="#FFFFE0"; colorNames["limegreen"]="#32CD32"; colorNames["linen"]="#FAF0E6"; colorNames["mediumaquamarine"]="#66CDAA"; colorNames["mediumblue"]="#0000CD"; colorNames["mediumorchid"]="#BA55D3"; colorNames["ediumpurple"]="#9370D"; colorNames["mediumseagreen"]="#3CB371"; colorNames["mediumslateblue"]="#7B68EE"; colorNames["mediumspringgreen"]="#00FA9A"; colorNames["mediumturquoise"]="#48D1CC"; colorNames["mediumvioletred"]="#C71585"; colorNames["midnightblue"]="#191970"; colorNames["mintcream"]="#F5FFFA"; colorNames["mistyrose"]="#FFE4E1"; colorNames["moccasin"]="#FFE4B5"; colorNames["navajowhite"]="#FFDEAD"; colorNames["oldlace"]="#FDF5E6"; colorNames["olivedrab"]="#6B8E23"; colorNames["orange"]="#FFA500"; colorNames["orangered"]="#FF4500"; colorNames["orchid"]="#DA70D6"; colorNames["palegoldenrod"]="#EEE8AA"; colorNames["palegreen"]="#98FB98"; colorNames["paleturquoise"]="#AFEEEE"; colorNames["palevioletred"]="#DB7093"; colorNames["papayawhip"]="#FFEFD5"; colorNames["peachpuff"]="#FFDAB9"; colorNames["peru"]="#CD853F"; colorNames["pink"]="#FFC0CB"; colorNames["plum"]="#DDA0DD"; colorNames["powderblue"]="#B0E0E6"; colorNames["rosybrown"]="#BC8F8F"; colorNames["royalblue"]="#4169E1"; colorNames["saddlebrown"]="#8B4513"; colorNames["salmon"]="#FA8072"; colorNames["sandybrown"]="#F4A460"; colorNames["seagreen"]="#2E8B57"; colorNames["seashell"]="#FFF5EE"; colorNames["sienna"]="#A0522D"; colorNames["skyblue"]="#87CEEB"; colorNames["slateblue"]="#6A5ACD"; colorNames["slategray"]="#708090"; colorNames["snow"]="#FFFAFA"; colorNames["springgreen"]="#00FF7F"; colorNames["steelblue"]="#4682B4"; colorNames["tan"]="#D2B48C"; colorNames["thistle"]="#D8BFD8"; colorNames["tomato"]="#FF6347"; colorNames["turquoise"]="#40E0D0"; colorNames["violet"]="#EE82EE"; colorNames["wheat"]="#F5DEB3"; colorNames["whitesmoke"]="#F5F5F5"; colorNames["yellowgreen"]="#9ACD32"; +var canvas_bgcolor = ""; +var canvas_width = 200; +var canvas_height = 200; +var canvas_noshade = 0; +var canvas_nofill = 0; +var canvas_noshadow = 0; +var canvas_htmltext = 0; +var canvas_imgtext = 0; +var canvas_notext = 0; +// canvas chart extension + +var s5NotesWindow; +var s5NotesWindowLoaded = false; +var previousSlide = 0; +var presentationStart = new Date(); +var slideStart = new Date(); + +var countdown = { + timer: 0, + state: 'pause', + start: new Date(), + end: 0, + remaining: 0 +}; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0; +if(isIE) var notIE7 = parseInt(navigator.appVersion) < 7 ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; +var isS2 = navigator.userAgent.indexOf('Safari') >= 2 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object || !hasClass(object,className)) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function changeClass(object,className) { + if (!object) return; + object.firstChild.className = className; +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + var did = 'slide' + n.toString(); + obj.setAttribute('id',did); + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs, at, fd, ss; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + } else { + cs = document.currentSlide; + } + fd = fadeModus?"F":"–"; + ss = audioSupport?"S":"–"; + at = (autoMatic?(playPause?"||":(playLoop?">0":">|")):"––"); + cs.innerHTML = '