js/remote-player.js
changeset 11 9833f3e24105
child 21 007254e97333
equal deleted inserted replaced
10:ab587bf164f9 11:9833f3e24105
       
     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 }