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