src/js/iframe_embed/embedder.js
branchpopcorn-port
changeset 809 1997dae651c6
parent 589 5f74eb3b2262
child 882 61c384dda19e
--- a/src/js/iframe_embed/embedder.js	Tue Feb 14 17:13:44 2012 +0100
+++ b/src/js/iframe_embed/embedder.js	Tue Feb 14 17:14:57 2012 +0100
@@ -3,3 +3,258 @@
    to the iframe url in the page url.   
 */
 
+IriSP = {};
+
+window.onhashchange = function() {
+  var url = window.location.href;
+  var frame = document.getElementById("metadataplayer_embed");
+
+  if ( url.split( "#" )[ 1 ] != null ) {
+       hashvalue = url.split("#")[1];
+       frame.contentWindow.postMessage({type: "hashchange", value: hashvalue}, "*");
+  }    
+};
+
+
+IriSP.handleMessages = function(e) {
+  var history = window.history;
+  
+  if ( !history.pushState ) {
+    return false;
+  }
+
+  if (e.data.type === "hashchange") {
+    console.log(e.data.value);
+    history.replaceState( {}, "", e.data.value);
+  }
+};
+
+// http://stackoverflow.com/questions/799981/document-ready-equivalent-without-jquery
+var ready = (function(){    
+
+    var readyList,
+        DOMContentLoaded,
+        class2type = {};
+        class2type["[object Boolean]"] = "boolean";
+        class2type["[object Number]"] = "number";
+        class2type["[object String]"] = "string";
+        class2type["[object Function]"] = "function";
+        class2type["[object Array]"] = "array";
+        class2type["[object Date]"] = "date";
+        class2type["[object RegExp]"] = "regexp";
+        class2type["[object Object]"] = "object";
+
+    var ReadyObj = {
+        // Is the DOM ready to be used? Set to true once it occurs.
+        isReady: false,
+        // A counter to track how many items to wait for before
+        // the ready event fires. See #6781
+        readyWait: 1,
+        // Hold (or release) the ready event
+        holdReady: function( hold ) {
+            if ( hold ) {
+                ReadyObj.readyWait++;
+            } else {
+                ReadyObj.ready( true );
+            }
+        },
+        // Handle when the DOM is ready
+        ready: function( wait ) {
+            // Either a released hold or an DOMready/load event and not yet ready
+            if ( (wait === true && !--ReadyObj.readyWait) || (wait !== true && !ReadyObj.isReady) ) {
+                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+                if ( !document.body ) {
+                    return setTimeout( ReadyObj.ready, 1 );
+                }
+
+                // Remember that the DOM is ready
+                ReadyObj.isReady = true;
+                // If a normal DOM Ready event fired, decrement, and wait if need be
+                if ( wait !== true && --ReadyObj.readyWait > 0 ) {
+                    return;
+                }
+                // If there are functions bound, to execute
+                readyList.resolveWith( document, [ ReadyObj ] );
+
+                // Trigger any bound ready events
+                //if ( ReadyObj.fn.trigger ) {
+                //  ReadyObj( document ).trigger( "ready" ).unbind( "ready" );
+                //}
+            }
+        },
+        bindReady: function() {
+            if ( readyList ) {
+                return;
+            }
+            readyList = ReadyObj._Deferred();
+
+            // Catch cases where $(document).ready() is called after the
+            // browser event has already occurred.
+            if ( document.readyState === "complete" ) {
+                // Handle it asynchronously to allow scripts the opportunity to delay ready
+                return setTimeout( ReadyObj.ready, 1 );
+            }
+
+            // Mozilla, Opera and webkit nightlies currently support this event
+            if ( document.addEventListener ) {
+                // Use the handy event callback
+                document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                // A fallback to window.onload, that will always work
+                window.addEventListener( "load", ReadyObj.ready, false );
+
+            // If IE event model is used
+            } else if ( document.attachEvent ) {
+                // ensure firing before onload,
+                // maybe late but safe also for iframes
+                document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+                // A fallback to window.onload, that will always work
+                window.attachEvent( "onload", ReadyObj.ready );
+
+                // If IE and not a frame
+                // continually check to see if the document is ready
+                var toplevel = false;
+
+                try {
+                    toplevel = window.frameElement == null;
+                } catch(e) {}
+
+                if ( document.documentElement.doScroll && toplevel ) {
+                    doScrollCheck();
+                }
+            }
+        },
+        _Deferred: function() {
+            var // callbacks list
+                callbacks = [],
+                // stored [ context , args ]
+                fired,
+                // to avoid firing when already doing so
+                firing,
+                // flag to know if the deferred has been cancelled
+                cancelled,
+                // the deferred itself
+                deferred  = {
+
+                    // done( f1, f2, ...)
+                    done: function() {
+                        if ( !cancelled ) {
+                            var args = arguments,
+                                i,
+                                length,
+                                elem,
+                                type,
+                                _fired;
+                            if ( fired ) {
+                                _fired = fired;
+                                fired = 0;
+                            }
+                            for ( i = 0, length = args.length; i < length; i++ ) {
+                                elem = args[ i ];
+                                type = ReadyObj.type( elem );
+                                if ( type === "array" ) {
+                                    deferred.done.apply( deferred, elem );
+                                } else if ( type === "function" ) {
+                                    callbacks.push( elem );
+                                }
+                            }
+                            if ( _fired ) {
+                                deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+                            }
+                        }
+                        return this;
+                    },
+
+                    // resolve with given context and args
+                    resolveWith: function( context, args ) {
+                        if ( !cancelled && !fired && !firing ) {
+                            // make sure args are available (#8421)
+                            args = args || [];
+                            firing = 1;
+                            try {
+                                while( callbacks[ 0 ] ) {
+                                    callbacks.shift().apply( context, args );//shifts a callback, and applies it to document
+                                }
+                            }
+                            finally {
+                                fired = [ context, args ];
+                                firing = 0;
+                            }
+                        }
+                        return this;
+                    },
+
+                    // resolve with this as context and given arguments
+                    resolve: function() {
+                        deferred.resolveWith( this, arguments );
+                        return this;
+                    },
+
+                    // Has this deferred been resolved?
+                    isResolved: function() {
+                        return !!( firing || fired );
+                    },
+
+                    // Cancel
+                    cancel: function() {
+                        cancelled = 1;
+                        callbacks = [];
+                        return this;
+                    }
+                };
+
+            return deferred;
+        },
+        type: function( obj ) {
+            return obj == null ?
+                String( obj ) :
+                class2type[ Object.prototype.toString.call(obj) ] || "object";
+        }
+    }
+    // The DOM ready check for Internet Explorer
+    function doScrollCheck() {
+        if ( ReadyObj.isReady ) {
+            return;
+        }
+
+        try {
+            // If IE is used, use the trick by Diego Perini
+            // http://javascript.nwbox.com/IEContentLoaded/
+            document.documentElement.doScroll("left");
+        } catch(e) {
+            setTimeout( doScrollCheck, 1 );
+            return;
+        }
+
+        // and execute any waiting functions
+        ReadyObj.ready();
+    }
+    // Cleanup functions for the document ready method
+    if ( document.addEventListener ) {
+        DOMContentLoaded = function() {
+            document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+            ReadyObj.ready();
+        };
+
+    } else if ( document.attachEvent ) {
+        DOMContentLoaded = function() {
+            // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+            if ( document.readyState === "complete" ) {
+                document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                ReadyObj.ready();
+            }
+        };
+    }
+    function ready( fn ) {
+        // Attach the listeners
+        ReadyObj.bindReady();
+
+        var type = ReadyObj.type( fn );
+
+        // Add the callback
+        readyList.done( fn );//readyList is result of _Deferred()
+    }
+    return ready;
+})();
+
+ready(function() { window.addEventListener('message', IriSP.handleMessages, false); });
\ No newline at end of file