initial commit
authorHakim El Hattab <hakim.elhattab@gmail.com>
Tue, 7 Jun 2011 19:10:59 +0000 (21:10 +0200)
committerHakim El Hattab <hakim.elhattab@gmail.com>
Tue, 7 Jun 2011 19:10:59 +0000 (21:10 +0200)
.gitignore [new file with mode: 0644]
LICENSE [new file with mode: 0644]
README.md [new file with mode: 0644]
assets/fonts/leaguegothic/league_gothic-webfont.ttf [new file with mode: 0644]
assets/images/breakdom.jpg [new file with mode: 0644]
css/main.css [new file with mode: 0644]
css/reset.css [new file with mode: 0644]
index.html [new file with mode: 0644]
js/slideshow.js [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..dec0ea4
--- /dev/null
@@ -0,0 +1,4 @@
+.DS_Store
+.svn
+log/*.log
+tmp/**
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..28cfd7d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2011 Hakim El Hattab, http://hakim.se
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..923ddb8
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# CSS 3D Slideshow
diff --git a/assets/fonts/leaguegothic/league_gothic-webfont.ttf b/assets/fonts/leaguegothic/league_gothic-webfont.ttf
new file mode 100644 (file)
index 0000000..29f896a
Binary files /dev/null and b/assets/fonts/leaguegothic/league_gothic-webfont.ttf differ
diff --git a/assets/images/breakdom.jpg b/assets/images/breakdom.jpg
new file mode 100644 (file)
index 0000000..64dc3f3
Binary files /dev/null and b/assets/images/breakdom.jpg differ
diff --git a/css/main.css b/css/main.css
new file mode 100644 (file)
index 0000000..494cfc2
--- /dev/null
@@ -0,0 +1,218 @@
+/**
+ * @author Hakim El Hattab
+ */
+
+
+/*********************************************
+ * FONT-FACE DEFINITIONS
+ *********************************************/
+
+@font-face {
+       font-family: 'League Gothic';
+       src: url('../assets/fonts/leaguegothic/league_gothic-webfont.ttf') format('truetype');
+       font-weight: normal;
+       font-style: normal;
+}
+
+
+/*********************************************
+ * GLOBAL STYLES
+ *********************************************/
+
+html, body {
+       padding: 0;
+       margin: 0;
+       overflow: hidden;
+       
+       font-family: 'Crimson Text', Times, 'Times New Roman', serif;
+       font-size: 36px;
+       
+       background: #fff;
+       color: #222;
+       
+       width: 100%;
+       height: 100%;
+       
+       background-image: -webkit-gradient(
+               radial, 
+               50% 50%, 0, 
+               50% 50%, 1000, 
+               from(rgba(245,245,245,1.0)), 
+               to(rgba(100,100,100,1.0))
+       );
+
+       background-image: -moz-radial-gradient(
+               50% 50% 90deg,
+               rgba(245,245,245,1.0) 0%, 
+               rgba(100,100,100,1.0) 100%
+       );
+       
+}
+
+
+/*********************************************
+ * HEADERS
+ *********************************************/
+h1, h2, h3, h4 {
+       margin: 0 0 20px 0;
+       font-family: 'League Gothic', Arial, Helvetica, sans-serif;
+       line-height: 0.9em;
+       letter-spacing: 0.02em;
+       text-transform: uppercase;
+       color: #222;
+       text-shadow: 0px 0px 2px #fff, 0px 0px 4px #bbb;
+}
+
+h1 { font-size: 136px;         }
+h2 { font-size: 76px;  }
+h3 { font-size: 56px;  }
+h4 { font-size: 36px;  }
+
+h1.inverted,
+h2.inverted,
+h3.inverted,
+h4.inverted {
+       color: #fff;
+       text-shadow: 0px 0px 2px #fff, 0px 0px 2px #888;
+}
+
+
+/*********************************************
+ * SLIDES
+ *********************************************/
+#main {
+       position: absolute;
+       width: 800px;
+       height: 600px;
+       
+       left: 50%;
+       top: 50%;
+       margin-left: -400px;
+       margin-top: -320px;
+       
+       text-align: center;
+       
+       -webkit-perspective: 600px;
+       -webkit-perspective-origin: 50% 25%;
+}
+
+#main>section,
+#main>section>section {
+       display: none;
+       
+       position: absolute;
+       width: 100%;
+       min-height: 600px;
+       
+       -webkit-transform-style: preserve-3d;
+       
+       -webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 
+          -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 
+            -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); 
+               transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+}
+
+#main section.past {
+       display: block;
+       opacity: 0;
+       
+       -webkit-transform:      translate3d(-100%, 0, 0) 
+                                               rotateY(-90deg) 
+                                               translate3d(-100%, 0, 0);
+}
+
+#main section.present {
+       display: block;
+}
+
+#main section.future {
+       display: block;
+       opacity: 0;
+       
+       -webkit-transform:      translate3d(100%, 0, 0) 
+                                               rotateY(90deg) 
+                                               translate3d(100%, 0, 0);
+}
+
+#main section>section.past {
+       display: block;
+       opacity: 0;
+       
+       -webkit-transform:      translate3d(0, -50%, 0) 
+                                               rotateX(70deg) 
+                                               translate3d(0, -50%, 0);
+}
+#main section>section.future {
+       display: block;
+       opacity: 0;
+       
+       -webkit-transform:      translate3d(0, 50%, 0) 
+                                               rotateX(-70deg) 
+                                               translate3d(0, 50%, 0);
+}
+
+
+/*********************************************
+ * DEFAULT ELEMENT STYLES
+ *********************************************/
+
+#main>section {
+       line-height: 1.2em;
+       text-shadow: 0px 0px 2px #fff, 0px 0px 4px #bbb;
+       font-weight: 600;
+}
+
+ol {
+       list-style: decimal;
+       list-style-position: inside;
+}
+
+li, p {
+       margin-bottom: 10px;
+}
+
+a:not(.image) {
+       color: #1b6263;
+       text-decoration: none;
+       border-bottom: 1px dashed rgba(0,0,0,0.3);
+       padding: 1px 3px;
+}
+       
+       a:not(.image):hover {
+               color: #fff;
+               background: #2fa794;
+               text-shadow: none;
+               border: none;
+       }
+
+img {
+       margin: 30px 0 0 0;
+       background: rgba(255,255,255,0.12);
+       border: 4px solid #eee;
+       
+       -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
+          -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
+               box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
+       
+       -webkit-transition: all .11s linear;
+          -moz-transition: all .11s linear;
+            -o-transition: all .11s linear;
+               transition: all .11s linear;
+}
+
+       a.image:hover img {
+               background: rgba(255,255,255,0.2);
+               
+               -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.25);
+                  -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.25);
+                       box-shadow: 0 0 20px rgba(0, 0, 0, 0.25);
+       }
+
+
+
+
+
+
+
+
+
diff --git a/css/reset.css b/css/reset.css
new file mode 100644 (file)
index 0000000..68f227a
--- /dev/null
@@ -0,0 +1,57 @@
+/* http://meyerweb.com/eric/tools/css/reset/ 
+   v2.0 | 20110126
+   License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+       margin: 0;
+       padding: 0;
+       border: 0;
+       font-size: 100%;
+       font: inherit;
+       vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section {
+       display: block;
+}
+body {
+       line-height: 1;
+}
+ol, ul {
+       list-style: none;
+}
+blockquote, q {
+       quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+       content: '';
+       content: none;
+}
+table {
+       border-collapse: collapse;
+       border-spacing: 0;
+}
+
+
+/* HTML5BP:
+   These selection declarations have to be separate.
+   No text-shadow: twitter.com/miketaylr/status/12228805301
+   Also: hot pink. */
+::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; }
+::selection { background:#FF5E99; color:#fff; text-shadow: none; }
+
diff --git a/index.html b/index.html
new file mode 100644 (file)
index 0000000..5c71250
--- /dev/null
@@ -0,0 +1,151 @@
+<!doctype html>  
+<html lang="en">
+       
+       <head>
+               <meta charset="utf-8">
+               
+               <title>CSS 3D Slideshow</title>
+               
+               <link href='http://fonts.googleapis.com/css?family=Crimson+Text:regular,600,bold' rel='stylesheet' type='text/css'>
+               
+               <link rel="stylesheet" href="css/reset.css">
+               <link rel="stylesheet" href="css/main.css">
+       </head>
+       
+       <body>
+               
+               <!-- Any section element inside of this container is displayed as a slide -->
+               <div id="main">
+                       
+                       <section>
+                               <h1>Slideshow</h1>
+                               <h3 class="inverted">With 3D effects. And stuff.</h3>
+                               <script>
+                                       // Delicously hacky. Look away.
+                                       var message = navigator.userAgent.match( /(iPhone|iPad|iPod|Android)/i ) ? 'Tap to navigate' : 'Navigate via keyboard';
+                                       document.write( '<p style="color: rgba(0,0,0,0.1); text-shadow: none;">('+message+')</p>' );
+                               </script>
+                       </section>
+                       
+                       <section>
+                               <h2>Heads Up</h2>
+                               <p>
+                                       This requires a browser with support for CSS3 3D transforms, such as Mobile Safari.
+                               </p>
+                       </section>
+                       
+                       <!-- Example of nested vertical slides -->
+                       <section>
+                               <section>
+                                       <h2>Vertical Slides</h2>
+                                       <p>
+                                               Slides can be nested inside of other slides,<br/>
+                                               try pressing <a href="#/2/1">down</a>.
+                                       </p>
+                                       <a href="#/2/1" class="image">
+                                               <img src="data:image/png;base64,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">
+                                       </a>
+                               </section>
+                               <section>
+                                       <h2>Basement Level 1</h2>
+                                       <p>Press down or up to navigate.</p>
+                               </section>
+                               <section>
+                                       <h2>Basement Level 2</h2>
+                                       <p>This is totally the Google logo:</p>
+                                       <img src="data:image/png;base64,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%3D%3D">
+                               </section>
+                               <section>
+                                       <h2>Basement Level 3</h2>
+                                       <p>That's it, time to go back up.</p>
+                                       <a href="#/2" class="image">
+                                               <img style="-webkit-transform: rotate(180deg);" src="data:image/png;base64,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">
+                                       </a>
+                               </section>
+                       </section>
+                               
+                       <section>
+                               <h2>Marvelous Unordered List</h2>
+                               <ul>
+                                       <li>No order here</li>
+                                       <li>Or here</li>
+                                       <li>Or here</li>
+                                       <li>Or here</li>
+                               </ul>
+                       </section>
+                       
+                       <section>
+                               <h2>Fantastic Ordered List</h2>
+                               <ol>
+                                       <li>One is smaller than...</li>
+                                       <li>Two is smaller than...</li>
+                                       <li>Three!</li>
+                               </ol>
+                       </section>
+                       
+                       <section>
+                               <h2>Intergalactic Interconnections</h2>
+                               <p>
+                                       You can link between slides internally,<br/>
+                                       <a href="#/2/3">like this</a>.
+                               </p>
+                       </section>
+                       
+                       <section>
+                               <h2>Spectacular image!</h2>
+                               <a class="image" href="http://hakim.se/experiments/html5/breakdom/" target="_blank">
+                                       <img src="assets/images/breakdom.jpg">
+                               </a>
+                       </section>
+                       
+                       <section>
+                               <h2>Stellar Links</h2>
+                               <ul>
+                                       <li><a href="hakim-slideshow-0.3.zip">Download this slideshow</a></li>
+                                       <li><a href="http://hakim.se/experiments/css3-3d-slideshow">Read more on my site</a></li>
+                                       <li><a href="http://twitter.com/hakimel">Follow me on Twitter</a></li>
+                               </ul>
+                       </section>
+                       
+                       <section>
+                               <h1>THE END</h1>
+                               <h3 class="inverted">BY Hakim El Hattab / hakim.se</h3>
+                       </section>
+                       
+               </div>
+               
+               <script src="js/slideshow.js"></script>
+               
+               
+               
+               <!-- Everything below this point is unrelated to the slideshow -->
+               
+               <div class="tweet-button" style="position: absolute; bottom: 10px; left: 50%; margin-left: -25px">
+                       <a href="http://twitter.com/share" class="twitter-share-button" data-text="A CSS 3D slideshow by @hakimel." data-url="http://hakim.se/experiments/css3-3d-slideshow" data-count="none" data-related="hakimel"></a>
+                       <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
+               </div>
+               
+               <script>
+               var _gaq = [['_setAccount', 'UA-15240703-1'], ['_trackPageview']];
+               (function(d, t) {
+               var g = d.createElement(t),
+                   s = d.getElementsByTagName(t)[0];
+               g.async = true;
+               g.src = ('https:' == location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+               s.parentNode.insertBefore(g, s);
+               })(document, 'script');
+               </script>
+               
+               <style>a[href="http://www.w3counter.com"] { display: none!important; }</style>
+               <script src="http://www.w3counter.com/tracker.js"></script>
+               <script>
+                       w3counter(49720);
+                       var ps = document.createElement('script');
+                               ps.type = 'text/javascript';
+                               ps.async = true;
+                               ps.src = '//pulse.w3counter.com/pulse.js?id=49720';
+                       (document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(ps);
+               </script>
+               
+       </body>
+</html>
\ No newline at end of file
diff --git a/js/slideshow.js b/js/slideshow.js
new file mode 100644 (file)
index 0000000..8165a40
--- /dev/null
@@ -0,0 +1,282 @@
+/**
+ * Copyright (C) 2011 Hakim El Hattab, http://hakim.se
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/**
+ * Handles the very minimal navigation logic involved in the 
+ * slideshow. Including keyboard navigation, touch interaction 
+ * and URL history behavior.
+ * 
+ * Slides are given unique hash based URL's so that they can be 
+ * opened directly. I didn't use the HTML5 History API for this 
+ * as it would have required the addition of server side rewrite 
+ * rules and hence require more effort for anyone to set up.
+ * 
+ * This component can be called from other scripts via a tiny API:
+ * - Slideshow.navigateTo( indexh, indexv );
+ * - Slideshow.navigateLeft();
+ * - Slideshow.navigateRight();
+ * - Slideshow.navigateUp();
+ * - Slideshow.navigateDown();
+ * 
+ * 
+ * version 0.1:
+ * - First release
+ * 
+ * version 0.2:                
+ * - Refactored code and added inline documentation
+ * - Slides now have unique URL's
+ * - A basic API to invoke navigation was added
+ * 
+ * version 0.3:                
+ * - Added licensing terms
+ * 
+ *     
+ * @author Hakim El Hattab
+ * @version 0.3
+ */
+var Slideshow = (function(){
+       
+       var indexh = 0,
+               indexv = 0;
+       
+       /**
+        * Activates the main program logic.
+        */
+       function initialize() {
+               document.addEventListener('keydown', onDocumentKeyDown, false);
+               document.addEventListener('touchstart', onDocumentTouchStart, false);
+               window.addEventListener('hashchange', onWindowHashChange, false);
+               
+               // Read the initial state of the URL (hash)
+               readURL();
+       }
+       
+       /**
+        * Handler for the document level 'keydown' event.
+        * 
+        * @param {Object} event
+        */
+       function onDocumentKeyDown( event ) {
+               
+               if( event.keyCode >= 37 && event.keyCode <= 40 ) {
+                       
+                       switch( event.keyCode ) {
+                               case 37: navigateLeft(); break; // left
+                               case 39: navigateRight(); break; // right
+                               case 38: navigateUp(); break; // up
+                               case 40: navigateDown(); break; // down
+                       }
+                       
+                       slide();
+                       
+                       event.preventDefault();
+                       
+               }
+       }
+       
+       /**
+        * Handler for the document level 'touchstart' event.
+        * 
+        * This enables very basic tap interaction for touch
+        * devices. Added mainly for performance testing of 3D
+        * transforms on iOS but was so happily surprised with
+        * how smoothly it runs so I left it in here. Apple +1
+        * 
+        * @param {Object} event
+        */
+       function onDocumentTouchStart( event ) {
+               
+               // We're only interested in one point taps
+               if (event.touches.length == 1) {
+                       event.preventDefault();
+                       
+                       var point = {
+                               x: event.touches[0].clientX,
+                               y: event.touches[0].clientY
+                       };
+                       
+                       // Define the extent of the areas that may be tapped
+                       // to navigate
+                       var wt = window.innerWidth * 0.3;
+                       var ht = window.innerHeight * 0.3;
+                       
+                       if( point.x < wt ) {
+                               navigateLeft();
+                       }
+                       else if( point.x > window.innerWidth - wt ) {
+                               navigateRight();
+                       }
+                       else if( point.y < ht ) {
+                               navigateUp();
+                       }
+                       else if( point.y > window.innerHeight - ht ) {
+                               navigateDown();
+                       }
+                       
+                       slide();
+                       
+               }
+       }
+       
+       
+       /**
+        * Handler for the window level 'hashchange' event.
+        * 
+        * @param {Object} event
+        */
+       function onWindowHashChange( event ) {
+               readURL();
+       }
+       
+       /**
+        * Updates one dimension of slides by showing the slide
+        * with the specified index.
+        * 
+        * @param {String} selector A CSS selector that will fetch
+        * the group of slides we are working with
+        * @param {Number} index The index of the slide that should be
+        * shown
+        * 
+        * @return {Number} The index of the slide that is now shown,
+        * might differ from the passed in index if it was out of 
+        * bounds.
+        */
+       function updateSlides( selector, index ) {
+               
+               // Select all slides and convert the NodeList result to
+               // an array
+               var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) );
+               
+               if( slides.length ) {
+                       // Enforce max and minimum index bounds
+                       index = Math.max(Math.min(index, slides.length - 1), 0);
+                       
+                       slides[index].setAttribute('class', 'present');
+                       
+                       // Any element previous to index is given the 'past' class
+                       slides.slice(0, index).map(function(element){
+                               element.setAttribute('class', 'past');
+                       });
+                       
+                       // Any element subsequent to index is given the 'future' class
+                       slides.slice(index + 1).map(function(element){
+                               element.setAttribute('class', 'future');
+                       });
+               }
+               else {
+                       // Since there are no slides we can't be anywhere beyond the 
+                       // zeroth index
+                       index = 0;
+               }
+               
+               return index;
+               
+       }
+       
+       /**
+        * Updates the visual slides to represent the currently
+        * set indices. 
+        */
+       function slide() {
+               indexh = updateSlides( '#main>section', indexh );
+               indexv = updateSlides( 'section.present>section', indexv );
+               
+               writeURL();
+       }
+       
+       /**
+        * Reads the current URL (hash) and navigates accordingly.
+        */
+       function readURL() {
+               // Break the hash down to separate components
+               var bits = window.location.hash.slice(2).split('/');
+               
+               // Read the index components of the hash
+               indexh = bits[0] ? parseInt( bits[0] ) : 0;
+               indexv = bits[1] ? parseInt( bits[1] ) : 0;
+               
+               navigateTo( indexh, indexv );
+       }
+       
+       /**
+        * Updates the page URL (hash) to reflect the current
+        * navigational state. 
+        */
+       function writeURL() {
+               var url = '/';
+               
+               // Only include the minimum possible number of components in
+               // the URL
+               if( indexh > 0 || indexv > 0 ) url += indexh
+               if( indexv > 0 ) url += '/' + indexv
+               
+               window.location.hash = url;
+       }
+       
+       /**
+        * Triggers a navigation to the specified indices.
+        * 
+        * @param {Number} h The horizontal index of the slide to show
+        * @param {Number} v The vertical index of the slide to show
+        */
+       function navigateTo( h, v ) {
+               indexh = h === undefined ? indexh : h;
+               indexv = v === undefined ? indexv : v;
+               
+               slide();
+       }
+       
+       function navigateLeft() {
+               indexh --;
+               indexv = 0;
+               slide();
+       }
+       function navigateRight() {
+               indexh ++;
+               indexv = 0;
+               slide();
+       }
+       function navigateUp() {
+               indexv --;
+               slide();
+       }
+       function navigateDown() {
+               indexv ++;
+               slide();
+       }
+       
+       // Initialize the program. Done right before returning to ensure
+       // that any inline variable definitions are available to all
+       // functions 
+       initialize();
+       
+       // Expose some methods publicly
+       return {
+               navigateTo: navigateTo,
+               navigateLeft: navigateLeft,
+               navigateRight: navigateRight,
+               navigateUp: navigateUp,
+               navigateDown: navigateDown
+       };
+       
+})();
+