// Generated by Haxe 4.0.5
(function ($global) { "use strict";
var $estr = function() { return js_Boot.__string_rec(this,''); },$hxEnums = $hxEnums || {},$_;
function $extend(from, fields) {
var proto = Object.create(from);
for (var name in fields) proto[name] = fields[name];
if( fields.toString !== Object.prototype.toString ) proto.toString = fields.toString;
return proto;
}
var Client = function(ws,name,isLeader) {
if(isLeader == null) {
isLeader = false;
}
this.ws = ws;
this.name = name;
this.isLeader = isLeader;
};
Client.__name__ = true;
Client.fromData = function(data) {
return new Client(null,data.name,data.isLeader);
};
var ClientTools = function() { };
ClientTools.__name__ = true;
ClientTools.setLeader = function(clients,name) {
var _g = 0;
while(_g < clients.length) {
var client = clients[_g];
++_g;
if(client.name == name) {
client.isLeader = true;
} else if(client.isLeader) {
client.isLeader = false;
}
}
};
ClientTools.getByName = function(clients,name) {
var _g = 0;
while(_g < clients.length) {
var client = clients[_g];
++_g;
if(client.name == name) {
return client;
}
}
return null;
};
var EReg = function(r,opt) {
this.r = new RegExp(r,opt.split("u").join(""));
};
EReg.__name__ = true;
EReg.prototype = {
match: function(s) {
if(this.r.global) {
this.r.lastIndex = 0;
}
this.r.m = this.r.exec(s);
this.r.s = s;
return this.r.m != null;
}
};
var HxOverrides = function() { };
HxOverrides.__name__ = true;
HxOverrides.substr = function(s,pos,len) {
if(len == null) {
len = s.length;
} else if(len < 0) {
if(pos == 0) {
len = s.length + len;
} else {
return "";
}
}
return s.substr(pos,len);
};
HxOverrides.remove = function(a,obj) {
var i = a.indexOf(obj);
if(i == -1) {
return false;
}
a.splice(i,1);
return true;
};
HxOverrides.iter = function(a) {
return { cur : 0, arr : a, hasNext : function() {
return this.cur < this.arr.length;
}, next : function() {
return this.arr[this.cur++];
}};
};
var Lambda = function() { };
Lambda.__name__ = true;
Lambda.exists = function(it,f) {
var x = $getIterator(it);
while(x.hasNext()) if(f(x.next())) {
return true;
}
return false;
};
Lambda.find = function(it,f) {
var v = $getIterator(it);
while(v.hasNext()) {
var v1 = v.next();
if(f(v1)) {
return v1;
}
}
return null;
};
var haxe_ds_StringMap = function() {
this.h = { };
};
haxe_ds_StringMap.__name__ = true;
haxe_ds_StringMap.prototype = {
setReserved: function(key,value) {
if(this.rh == null) {
this.rh = { };
}
this.rh["$" + key] = value;
}
,getReserved: function(key) {
if(this.rh == null) {
return null;
} else {
return this.rh["$" + key];
}
}
};
var Lang = function() { };
Lang.__name__ = true;
Lang.request = function(path,callback) {
var http = new haxe_http_HttpJs(path);
http.onData = callback;
http.request();
};
Lang.init = function(folderPath,callback) {
var _this = Lang.langs;
_this.h = { };
_this.rh = null;
var count = 0;
var _g = 0;
var _g1 = Lang.ids;
while(_g < _g1.length) {
var name = [_g1[_g]];
++_g;
Lang.request("" + folderPath + "/" + name[0] + ".json",(function(name1) {
return function(data) {
var data1 = JSON.parse(data);
var lang = new haxe_ds_StringMap();
var _g2 = 0;
var _g11 = Reflect.fields(data1);
while(_g2 < _g11.length) {
var key = _g11[_g2];
++_g2;
var v = Reflect.field(data1,key);
if(__map_reserved[key] != null) {
lang.setReserved(key,v);
} else {
lang.h[key] = v;
}
}
var id = haxe_io_Path.withoutExtension(name1[0]);
var _this1 = Lang.langs;
if(__map_reserved[id] != null) {
_this1.setReserved(id,lang);
} else {
_this1.h[id] = lang;
}
count += 1;
if(count == Lang.ids.length && callback != null) {
callback();
}
return;
};
})(name));
}
};
Lang.get = function(key) {
var key1 = Lang.lang;
var _this = Lang.langs;
if((__map_reserved[key1] != null ? _this.getReserved(key1) : _this.h[key1]) == null) {
Lang.lang = "en";
}
var key2 = Lang.lang;
var _this1 = Lang.langs;
var _this2 = __map_reserved[key2] != null ? _this1.getReserved(key2) : _this1.h[key2];
var text = __map_reserved[key] != null ? _this2.getReserved(key) : _this2.h[key];
if(text == null) {
return key;
} else {
return text;
}
};
Math.__name__ = true;
var Reflect = function() { };
Reflect.__name__ = true;
Reflect.field = function(o,field) {
try {
return o[field];
} catch( e ) {
return null;
}
};
Reflect.fields = function(o) {
var a = [];
if(o != null) {
var hasOwnProperty = Object.prototype.hasOwnProperty;
for( var f in o ) {
if(f != "__id__" && f != "hx__closures__" && hasOwnProperty.call(o,f)) {
a.push(f);
}
}
}
return a;
};
Reflect.isFunction = function(f) {
if(typeof(f) == "function") {
return !(f.__name__ || f.__ename__);
} else {
return false;
}
};
Reflect.compareMethods = function(f1,f2) {
if(f1 == f2) {
return true;
}
if(!Reflect.isFunction(f1) || !Reflect.isFunction(f2)) {
return false;
}
if(f1.scope == f2.scope && f1.method == f2.method) {
return f1.method != null;
} else {
return false;
}
};
var Std = function() { };
Std.__name__ = true;
Std.string = function(s) {
return js_Boot.__string_rec(s,"");
};
var StringTools = function() { };
StringTools.__name__ = true;
StringTools.startsWith = function(s,start) {
if(s.length >= start.length) {
return s.lastIndexOf(start,0) == 0;
} else {
return false;
}
};
StringTools.replace = function(s,sub,by) {
return s.split(sub).join(by);
};
var client_Main = function(host,port) {
if(port == null) {
port = 4201;
}
this.onTimeGet = new haxe_Timer(2000);
this.isConnected = false;
this.personalHistoryId = -1;
this.filters = [];
this.pageTitle = window.document.title;
this.personalHistory = [];
this.clients = [];
var _gthis = this;
this.player = new client_Player(this);
if(host == null) {
host = window.location.hostname;
}
if(host == "") {
host = "localhost";
}
this.initListeners();
this.onTimeGet.run = function() {
_gthis.send({ type : "GetTime"});
return;
};
window.document.onvisibilitychange = function() {
if(!window.document.hidden && _gthis.onBlinkTab != null) {
window.document.title = _gthis.getPageTitle();
_gthis.onBlinkTab.stop();
_gthis.onBlinkTab = null;
}
return;
};
Lang.init("langs",function() {
_gthis.openWebSocket(host,port);
return;
});
};
client_Main.__name__ = true;
client_Main.main = function() {
new client_Main();
};
client_Main.prototype = {
openWebSocket: function(host,port) {
var _gthis = this;
this.ws = new WebSocket("ws://" + host + ":" + port);
this.ws.onmessage = $bind(this,this.onMessage);
this.ws.onopen = function() {
_gthis.serverMessage(1);
return _gthis.isConnected = true;
};
this.ws.onclose = function() {
if(_gthis.isConnected) {
_gthis.serverMessage(2);
}
_gthis.isConnected = false;
_gthis.player.pause();
return haxe_Timer.delay(function() {
_gthis.openWebSocket(host,port);
return;
},2000);
};
}
,initListeners: function() {
var _gthis = this;
window.document.querySelector("#smilesbtn").onclick = function(e) {
var smilesWrap = window.document.querySelector("#smileswrap");
if(smilesWrap.style.display == "") {
return smilesWrap.style.display = "block";
} else {
return smilesWrap.style.display = "";
}
};
var guestName = window.document.querySelector("#guestname");
guestName.onkeydown = function(e1) {
if(guestName.value.length == 0) {
return;
}
if(e1.keyCode == 13) {
_gthis.send({ type : "Login", login : { clientName : guestName.value}});
}
return;
};
var chatLine = window.document.querySelector("#chatline");
chatLine.onkeydown = function(e2) {
switch(e2.keyCode) {
case 13:
if(chatLine.value.length == 0) {
return;
}
_gthis.send({ type : "Message", message : { clientName : "", text : chatLine.value}});
_gthis.personalHistory.push(chatLine.value);
if(_gthis.personalHistory.length > 50) {
_gthis.personalHistory.shift();
}
_gthis.personalHistoryId = -1;
chatLine.value = "";
break;
case 38:
_gthis.personalHistoryId--;
if(_gthis.personalHistoryId == -2) {
_gthis.personalHistoryId = _gthis.personalHistory.length - 1;
if(_gthis.personalHistoryId == -1) {
return;
}
} else if(_gthis.personalHistoryId == -1) {
_gthis.personalHistoryId++;
}
chatLine.value = _gthis.personalHistory[_gthis.personalHistoryId];
break;
case 40:
if(_gthis.personalHistoryId == -1) {
return;
}
_gthis.personalHistoryId++;
if(_gthis.personalHistoryId > _gthis.personalHistory.length - 1) {
_gthis.personalHistoryId = -1;
chatLine.value = "";
return;
}
chatLine.value = _gthis.personalHistory[_gthis.personalHistoryId];
break;
}
};
client_MobileView.init();
var leaderBtn = window.document.querySelector("#leader_btn");
leaderBtn.onclick = function(e3) {
if(_gthis.personal == null) {
return;
}
if(!_gthis.personal.isLeader) {
leaderBtn.classList.add("label-success");
} else {
leaderBtn.classList.remove("label-success");
}
_gthis.send({ type : "SetLeader", setLeader : { clientName : _gthis.personal.isLeader ? "" : _gthis.personal.name}});
return;
};
window.document.querySelector("#showmediaurl").onclick = function(e4) {
window.document.querySelector("#showmediaurl").classList.toggle("collapsed");
window.document.querySelector("#showmediaurl").classList.toggle("active");
return window.document.querySelector("#addfromurl").classList.toggle("collapse");
};
window.document.querySelector("#queue_next").onclick = function(e5) {
_gthis.addVideoUrl();
return;
};
window.document.querySelector("#queue_end").onclick = function(e6) {
_gthis.addVideoUrl();
return;
};
window.document.querySelector("#mediaurl").onkeydown = function(e7) {
if(e7.keyCode == 13) {
_gthis.addVideoUrl();
}
};
}
,isLeader: function() {
if(this.personal != null) {
return this.personal.isLeader;
} else {
return false;
}
}
,addVideoUrl: function() {
var _gthis = this;
var mediaUrl = window.document.querySelector("#mediaurl");
var url = mediaUrl.value;
var name = this.personal == null ? "Unknown" : this.personal.name;
this.getRemoteVideoDuration(mediaUrl.value,function(duration) {
var tmp = Lang.get("rawVideo");
_gthis.send({ type : "AddVideo", addVideo : { item : { url : url, title : tmp, author : name, duration : duration}}});
return;
});
mediaUrl.value = "";
}
,getRemoteVideoDuration: function(src,callback) {
var player = window.document.querySelector("#ytapiplayer");
var video = window.document.createElement("video");
video.src = src;
video.onloadedmetadata = function() {
haxe_Log.trace(video.duration,{ fileName : "src/client/Main.hx", lineNumber : 185, className : "client.Main", methodName : "getRemoteVideoDuration"});
player.removeChild(video);
callback(video.duration);
return;
};
this.prepend(player,video);
}
,prepend: function(parent,child) {
if(parent.firstChild == null) {
parent.appendChild(child);
} else {
parent.insertBefore(child,parent.firstChild);
}
}
,onMessage: function(e) {
var data = JSON.parse(e.data);
var t = data.type;
var t1 = t.charAt(0).toLowerCase() + HxOverrides.substr(t,1,null);
haxe_Log.trace("Event: " + data.type,{ fileName : "src/client/Main.hx", lineNumber : 201, className : "client.Main", methodName : "onMessage", customParams : [data[t1]]});
switch(data.type) {
case "AddVideo":
if(this.player.isListEmpty()) {
this.player.setVideo(data.addVideo.item);
}
this.player.addVideoItem(data.addVideo.item);
break;
case "Connected":
this.setConfig(data.connected.config);
if(data.connected.isUnknownClient) {
this.updateClients(data.connected.clients);
window.document.querySelector("#guestlogin").style.display = "block";
window.document.querySelector("#chatline").style.display = "none";
} else {
this.onLogin(data.connected.clients,data.connected.clientName);
}
var guestName = window.document.querySelector("#guestname");
if(guestName.value.length > 0) {
this.send({ type : "Login", login : { clientName : guestName.value}});
}
var _g = 0;
var _g1 = data.connected.history;
while(_g < _g1.length) {
var message = _g1[_g];
++_g;
this.addMessage(message.name,message.text,message.time);
}
var list = data.connected.videoList;
if(list.length == 0) {
return;
}
this.player.setVideo(list[0]);
var _g2 = 0;
var _g3 = data.connected.videoList;
while(_g2 < _g3.length) {
var video = _g3[_g2];
++_g2;
this.player.addVideoItem(video);
}
break;
case "GetTime":
var newTime = data.getTime.time;
var time = this.player.getTime();
if(this.isLeader()) {
if(Math.abs(time - newTime) < 2) {
return;
}
this.player.setTime(time,false);
return;
}
if(Math.abs(time - newTime) < 2) {
return;
}
this.player.setTime(newTime);
if(!data.getTime.paused) {
this.player.play();
} else {
this.player.pause();
}
break;
case "Login":
this.onLogin(data.login.clients,data.login.clientName);
break;
case "LoginError":
var text = StringTools.replace(Lang.get("usernameError"),"$MAX","" + this.config.maxLoginLength);
this.serverMessage(4,text);
break;
case "Logout":
this.updateClients(data.logout.clients);
this.personal = null;
window.document.querySelector("#guestlogin").style.display = "block";
window.document.querySelector("#chatline").style.display = "none";
break;
case "Message":
this.addMessage(data.message.clientName,data.message.text);
break;
case "Pause":
if(this.isLeader()) {
return;
}
this.player.pause();
this.player.setTime(data.pause.time);
break;
case "Play":
if(this.isLeader()) {
return;
}
this.player.setTime(data.play.time);
this.player.play();
break;
case "RemoveVideo":
this.player.removeItem(data.removeVideo.url);
if(this.player.isListEmpty()) {
this.player.pause();
}
break;
case "SetLeader":
ClientTools.setLeader(this.clients,data.setLeader.clientName);
this.updateUserList();
var leaderBtn = window.document.querySelector("#leader_btn");
if(this.isLeader()) {
leaderBtn.classList.add("label-success");
} else {
leaderBtn.classList.remove("label-success");
}
if(this.isLeader()) {
this.player.setTime(this.player.getTime(),false);
}
break;
case "SetTime":
var newTime1 = data.setTime.time;
var time1 = this.player.getTime();
if(Math.abs(time1 - newTime1) < 2) {
return;
}
this.player.setTime(newTime1);
break;
case "UpdateClients":
this.updateClients(data.updateClients.clients);
if(this.personal != null) {
this.personal = ClientTools.getByName(this.clients,this.personal.name);
}
break;
case "VideoLoaded":
this.player.setTime(0);
this.player.play();
break;
}
}
,setConfig: function(config) {
this.config = config;
this.pageTitle = config.channelName;
window.document.querySelector("#guestname").maxLength = config.maxLoginLength;
window.document.querySelector("#chatline").maxLength = config.maxMessageLength;
this.filters.length = 0;
var _g = 0;
var _g1 = config.filters;
while(_g < _g1.length) {
var filter = _g1[_g];
++_g;
this.filters.push({ regex : new EReg(filter.regex,filter.flags), replace : filter.replace});
}
var _g2 = 0;
var _g3 = config.emotes;
while(_g2 < _g3.length) {
var emote = _g3[_g2];
++_g2;
this.filters.push({ regex : new EReg(this.escapeRegExp(emote.name),"g"), replace : ""});
}
var smilesWrap = window.document.querySelector("#smileswrap");
smilesWrap.onclick = function(e) {
var el = e.target;
var form = window.document.querySelector("#chatline");
form.value += " " + el.title;
form.focus();
return;
};
smilesWrap.innerHTML = "";
var _g4 = 0;
var _g5 = config.emotes;
while(_g4 < _g5.length) {
var emote1 = _g5[_g4];
++_g4;
var img = window.document.createElement("img");
img.className = "smile-preview";
img.src = emote1.image;
img.title = emote1.name;
smilesWrap.appendChild(img);
}
}
,onLogin: function(data,clientName) {
this.updateClients(data);
this.personal = ClientTools.getByName(this.clients,clientName);
if(this.personal == null) {
return;
}
window.document.querySelector("#guestlogin").style.display = "none";
window.document.querySelector("#chatline").style.display = "block";
}
,updateClients: function(newClients) {
this.clients.length = 0;
var _g = 0;
while(_g < newClients.length) this.clients.push(Client.fromData(newClients[_g++]));
this.updateUserList();
}
,send: function(data) {
if(!this.isConnected) {
return;
}
this.ws.send(JSON.stringify(data));
}
,serverMessage: function(type,text) {
var msgBuf = window.document.querySelector("#messagebuffer");
var div = window.document.createElement("div");
var time = "[" + new Date().toTimeString().split(" ")[0] + "] ";
switch(type) {
case 1:
div.className = "server-msg-reconnect";
div.innerHTML = Lang.get("msgConnected");
break;
case 2:
div.className = "server-msg-disconnect";
div.innerHTML = Lang.get("msgDisconnected");
break;
case 3:
div.className = "server-whisper";
div.innerHTML = time + text + " " + Lang.get("entered");
break;
case 4:
div.className = "server-whisper";
div.innerHTML = time + text;
break;
default:
}
msgBuf.appendChild(div);
msgBuf.scrollTop = msgBuf.scrollHeight;
}
,updateUserList: function() {
window.document.querySelector("#usercount").innerHTML = this.clients.length + " " + Lang.get("online");
window.document.title = this.getPageTitle();
var list_b = "";
var _g = 0;
var _g1 = this.clients;
while(_g < _g1.length) {
var client1 = _g1[_g];
++_g;
if(client1.isLeader) {
list_b += "";
}
list_b += Std.string("" + client1.name + "");
}
window.document.querySelector("#userlist").innerHTML = list_b;
}
,getPageTitle: function() {
return "" + this.pageTitle + " (" + this.clients.length + ")";
}
,addMessage: function(name,text,time) {
var _gthis = this;
var msgBuf = window.document.querySelector("#messagebuffer");
var userDiv = window.document.createElement("div");
userDiv.className = "chat-msg-" + name;
var tstamp = window.document.createElement("span");
tstamp.className = "timestamp";
if(time == null) {
time = "[" + new Date().toTimeString().split(" ")[0] + "] ";
}
tstamp.innerHTML = time;
var nameDiv = window.document.createElement("strong");
nameDiv.className = "username";
nameDiv.innerHTML = name + ": ";
var textDiv = window.document.createElement("span");
var _g = 0;
var _g1 = this.filters;
while(_g < _g1.length) {
var filter = _g1[_g];
++_g;
text = text.replace(filter.regex.r,filter.replace);
}
textDiv.innerHTML = text;
var isInChatEnd = msgBuf.scrollHeight - msgBuf.scrollTop == msgBuf.clientHeight;
userDiv.appendChild(tstamp);
userDiv.appendChild(nameDiv);
userDiv.appendChild(textDiv);
msgBuf.appendChild(userDiv);
if(isInChatEnd) {
while(msgBuf.children.length > 200) msgBuf.removeChild(msgBuf.firstChild);
msgBuf.scrollTop = msgBuf.scrollHeight;
}
if(this.personal != null && this.personal.name == name) {
msgBuf.scrollTop = msgBuf.scrollHeight;
}
if(window.document.hidden && this.onBlinkTab == null) {
this.onBlinkTab = new haxe_Timer(1000);
this.onBlinkTab.run = function() {
if(StringTools.startsWith(window.document.title,_gthis.pageTitle)) {
return window.document.title = "*Chat*";
} else {
return window.document.title = _gthis.getPageTitle();
}
};
this.onBlinkTab.run();
}
}
,escapeRegExp: function(regex) {
var _this_r = new RegExp("([.*+?^${}()|[\\]\\\\])","g".split("u").join(""));
return regex.replace(_this_r,"\\$1");
}
};
var client_MobileView = function() { };
client_MobileView.__name__ = true;
client_MobileView.init = function() {
var mvbtn = window.document.querySelector("#mv_btn");
mvbtn.onclick = function(e) {
if(client_MobileView.toggleFullScreen()) {
window.document.body.classList.add("mobile-view");
mvbtn.classList.add("label-success");
var vwrap = window.document.querySelector("#videowrap");
if(vwrap.children[0] == window.document.querySelector("currenttitle")) {
vwrap.appendChild(vwrap.children[0]);
}
} else {
window.document.body.classList.remove("mobile-view");
mvbtn.classList.remove("label-success");
var vwrap1 = window.document.querySelector("videowrap");
if(vwrap1.children[0] != window.document.querySelector("currenttitle")) {
vwrap1.insertBefore(vwrap1.children[1],vwrap1.children[0]);
}
}
return;
};
};
client_MobileView.toggleFullScreen = function() {
var state = true;
var doc = window.document;
if(window.document.fullscreenElement == null && doc.mozFullScreenElement == null && doc.webkitFullscreenElement == null) {
if(window.document.documentElement.requestFullscreen != null) {
window.document.documentElement.requestFullscreen();
} else if(doc.documentElement.mozRequestFullScreen != null) {
doc.documentElement.mozRequestFullScreen();
} else if(doc.documentElement.webkitRequestFullscreen != null) {
doc.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
} else {
state = false;
}
} else {
if(doc.cancelFullScreen != null) {
doc.cancelFullScreen();
} else if(doc.mozCancelFullScreen != null) {
doc.mozCancelFullScreen();
} else if(doc.webkitCancelFullScreen != null) {
doc.webkitCancelFullScreen();
}
state = false;
}
return state;
};
var client_Player = function(main) {
this.skipSetTime = false;
this.isLoaded = false;
this.player = window.document.querySelector("#ytapiplayer");
this.videoItemsEl = window.document.querySelector("#queue");
this.items = [];
this.main = main;
};
client_Player.__name__ = true;
client_Player.prototype = {
setVideo: function(item) {
var _gthis = this;
this.isLoaded = false;
this.video = window.document.createElement("video");
this.video.id = "videoplayer";
this.video.src = item.url;
this.video.controls = true;
this.video.oncanplaythrough = function(e) {
if(!_gthis.isLoaded) {
_gthis.main.send({ type : "VideoLoaded"});
}
return _gthis.isLoaded = true;
};
this.video.onseeking = function(e1) {
if(_gthis.skipSetTime) {
_gthis.skipSetTime = false;
return;
}
if(!_gthis.main.isLeader()) {
return;
}
_gthis.main.send({ type : "SetTime", setTime : { time : _gthis.video.currentTime}});
return;
};
this.video.onpause = function(e2) {
if(!_gthis.main.isLeader()) {
return;
}
_gthis.main.send({ type : "Pause", pause : { time : _gthis.video.currentTime}});
return;
};
this.video.onplay = function(e3) {
if(!_gthis.main.isLeader()) {
return;
}
_gthis.main.send({ type : "Play", play : { time : _gthis.video.currentTime}});
return;
};
this.player.innerHTML = "";
this.player.appendChild(this.video);
}
,addVideoItem: function(item) {
var _gthis = this;
this.items.push(item);
var itemEl = this.nodeFromString("