|
1 function Player() { |
|
2 |
|
3 var events = {}, |
|
4 self = this, |
|
5 loaded = false, |
|
6 // tvWindow, |
|
7 destination = document.location.href.replace(/^(https?:\/\/[^\/]+).*$/,'$1'), |
|
8 timeAtLoad, |
|
9 timeDelta = 0, |
|
10 timeOut, |
|
11 playAtLoad = false; |
|
12 |
|
13 this.currentTime = 0; |
|
14 this.duration = 0; |
|
15 this.paused = true; |
|
16 |
|
17 function receiveMessage(evt) { |
|
18 var dataparts = evt.data.split(":"); |
|
19 loaded = true; |
|
20 switch(dataparts[0]) { |
|
21 case "loadedmetadata": |
|
22 self.duration = parseFloat(dataparts[1]); |
|
23 self.setCurrentTime(self.currentTime); |
|
24 if (!self.paused) { |
|
25 self.play(); |
|
26 } |
|
27 break; |
|
28 case "play": |
|
29 self.paused = false; |
|
30 self.trigger("play"); |
|
31 break; |
|
32 case "pause": |
|
33 self.paused = true; |
|
34 self.trigger("pause"); |
|
35 break; |
|
36 case "timeupdate": |
|
37 self.currentTime = parseFloat(dataparts[1]) |
|
38 self.trigger("timeupdate", self.currentTime); |
|
39 break; |
|
40 case "unload": |
|
41 loaded = false; |
|
42 self.pause(); |
|
43 break; |
|
44 } |
|
45 } |
|
46 |
|
47 function updateTime() { |
|
48 clearTimeout(timeOut); |
|
49 if (!loaded && !self.paused) { |
|
50 self.currentTime = (new Date().valueOf() / 1000 - timeDelta); |
|
51 if (self.currentTime <= self.duration) { |
|
52 self.trigger("timeupdate", self.currentTime); |
|
53 timeOut = setTimeout(updateTime, 100); |
|
54 } else { |
|
55 self.currentTime = self.duration; |
|
56 self.pause(); |
|
57 } |
|
58 } |
|
59 } |
|
60 |
|
61 function sendMessage(msg) { |
|
62 if (tvWindow) { |
|
63 tvWindow.postMessage(msg, destination); |
|
64 } |
|
65 } |
|
66 |
|
67 $(".tv").click(function() { |
|
68 tvWindow = window.open("tv.html","TV","width=640,height=360,toolbar=0,location=0,status=0,titlebar=0"); |
|
69 window.addEventListener("message",receiveMessage,false); |
|
70 }); |
|
71 |
|
72 this.setCurrentTime = function(t) { |
|
73 if (loaded) { |
|
74 sendMessage("timeupdate:" + t); |
|
75 } else { |
|
76 timeDelta = (new Date().valueOf() / 1000 - t); |
|
77 self.currentTime = t; |
|
78 self.trigger("timeupdate",t); |
|
79 } |
|
80 } |
|
81 this.play = function() { |
|
82 if (loaded) { |
|
83 sendMessage("play") |
|
84 } else { |
|
85 self.paused = false; |
|
86 timeDelta = (new Date().valueOf() / 1000 - self.currentTime) |
|
87 self.trigger("play"); |
|
88 updateTime(); |
|
89 } |
|
90 } |
|
91 this.pause = function() { |
|
92 if (loaded) { |
|
93 sendMessage("pause"); |
|
94 } else { |
|
95 self.paused = true; |
|
96 self.trigger("pause"); |
|
97 } |
|
98 } |
|
99 |
|
100 this.on = function(_event, _callback) { |
|
101 if (typeof events[_event] === "undefined") { |
|
102 events[_event] = []; |
|
103 } |
|
104 events[_event].push(_callback); |
|
105 } |
|
106 this.off = function(_event, _callback) { |
|
107 if (typeof events[_event] !== "undefined") { |
|
108 events[_event] = _(events[_event]).reject(function(_fn) { |
|
109 return _fn === _callback; |
|
110 }); |
|
111 } |
|
112 } |
|
113 this.trigger = function(_event, _data) { |
|
114 var _list = this; |
|
115 _(events[_event]).each(function(_callback) { |
|
116 _callback.call(_list, _data); |
|
117 }); |
|
118 } |
|
119 } |