js/remote-player.js
changeset 11 9833f3e24105
child 21 007254e97333
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/remote-player.js	Thu Mar 21 18:48:12 2013 +0100
@@ -0,0 +1,119 @@
+function Player() {
+	
+	var events = {},
+        self = this,
+        loaded = false,
+//        tvWindow,
+        destination = document.location.href.replace(/^(https?:\/\/[^\/]+).*$/,'$1'),
+        timeAtLoad,
+        timeDelta = 0,
+        timeOut,
+        playAtLoad = false;
+    
+    this.currentTime = 0;
+    this.duration = 0;
+    this.paused = true;
+    
+	function receiveMessage(evt) {
+		var dataparts = evt.data.split(":");
+		loaded = true;
+		switch(dataparts[0]) {
+			case "loadedmetadata":
+				self.duration = parseFloat(dataparts[1]);
+				self.setCurrentTime(self.currentTime);
+				if (!self.paused) {
+					self.play();
+				}
+			break;
+			case "play":
+				self.paused = false;
+				self.trigger("play");
+			break;
+			case "pause":
+				self.paused = true;
+				self.trigger("pause");
+			break;
+			case "timeupdate":
+				self.currentTime = parseFloat(dataparts[1])
+				self.trigger("timeupdate", self.currentTime);
+			break;
+			case "unload":
+				loaded = false;
+				self.pause();
+			break;
+		}
+	}
+	
+    function updateTime() {
+    	clearTimeout(timeOut);
+        if (!loaded && !self.paused) {
+            self.currentTime = (new Date().valueOf() / 1000 - timeDelta);
+            if (self.currentTime <= self.duration) {
+                self.trigger("timeupdate", self.currentTime);
+                timeOut = setTimeout(updateTime, 100);
+            } else {
+                self.currentTime = self.duration;
+                self.pause();
+            }
+        }
+    }
+	
+	function sendMessage(msg) {
+		if (tvWindow) {
+			tvWindow.postMessage(msg, destination);
+		}
+	}
+	
+	$(".tv").click(function() {
+		tvWindow = window.open("tv.html","TV","width=640,height=360,toolbar=0,location=0,status=0,titlebar=0");
+		window.addEventListener("message",receiveMessage,false);
+	});
+	
+	this.setCurrentTime = function(t) {
+		if (loaded) {
+			sendMessage("timeupdate:" + t);
+		} else {
+        	timeDelta = (new Date().valueOf() / 1000 - t);
+			self.currentTime = t;
+			self.trigger("timeupdate",t);
+		}
+	}
+	this.play = function() {
+		if (loaded) {
+			sendMessage("play")
+		} else {
+	        self.paused = false;
+	        timeDelta = (new Date().valueOf() / 1000 - self.currentTime)
+	        self.trigger("play");
+	        updateTime();
+		}
+	}
+	this.pause = function() {
+		if (loaded) {
+			sendMessage("pause");
+		} else {
+			self.paused = true;
+			self.trigger("pause");
+		}
+	}
+	
+	this.on = function(_event, _callback) {
+	    if (typeof events[_event] === "undefined") {
+	        events[_event] = [];
+	    }
+	    events[_event].push(_callback);
+	}
+	this.off = function(_event, _callback) {
+	    if (typeof events[_event] !== "undefined") {
+	        events[_event] = _(events[_event]).reject(function(_fn) {
+	            return _fn === _callback;
+	        });
+	    }
+	}
+	this.trigger = function(_event, _data) {
+	    var _list = this;
+	    _(events[_event]).each(function(_callback) {
+	        _callback.call(_list, _data);
+	    });
+	}
+}