// 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 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 client_Main = function(host,port) { if(port == null) { port = 4201; } this.pageTitle = window.document.title; this.onTimeGet = new haxe_Timer(2000); this.isConnected = false; this.personalHistoryId = -1; 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; }; 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; var guestName = window.document.querySelector("#guestname"); guestName.onkeydown = function(e) { if(e.keyCode == 13) { _gthis.send({ type : "Login", login : { clientName : guestName.value}}); } return; }; var chatLine = window.document.querySelector("#chatline"); chatLine.onkeydown = function(e1) { switch(e1.keyCode) { case 13: _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(e2) { if(_gthis.personal == null) { return; } leaderBtn.classList.toggle("label-success"); _gthis.send({ type : "SetLeader", setLeader : { clientName : _gthis.personal.isLeader ? "" : _gthis.personal.name}}); return; }; window.document.querySelector("#showmediaurl").onclick = function(e3) { 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(e4) { _gthis.addVideoUrl(); return; }; window.document.querySelector("#queue_end").onclick = function(e5) { _gthis.addVideoUrl(); return; }; window.document.querySelector("#mediaurl").onkeydown = function(e6) { if(e6.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 : 162, 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 : 178, 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": 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 list = data.connected.videoList; if(list.length == 0) { return; } this.player.setVideo(list[0]); var _g = 0; var _g1 = data.connected.videoList; while(_g < _g1.length) { var video = _g1[_g]; ++_g; this.player.addVideoItem(video); } break; case "GetTime": var newTime = data.getTime.time; var time = this.player.getTime(); if(Math.abs(time - newTime) < 2) { return; } this.player.setTime(newTime); if(!data.getTime.paused) { this.player.play(); } break; case "Login": this.onLogin(data.login.clients,data.login.clientName); break; case "LoginError": this.serverMessage(4,Lang.get("usernameError")); 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": this.player.pause(); this.player.setTime(data.pause.time); break; case "Play": 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(); if(this.personal == null) { return; } var leaderBtn = window.document.querySelector("#leader_btn"); if(this.personal.isLeader) { leaderBtn.classList.add("label-success"); } else { leaderBtn.classList.remove("label-success"); } 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; } } ,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.pageTitle + " (" + this.clients.length + ")"; 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; } ,addMessage: function(name,msg) { 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"; tstamp.innerHTML = "[" + new Date().toTimeString().split(" ")[0] + "] "; var nameDiv = window.document.createElement("strong"); nameDiv.className = "username"; nameDiv.innerHTML = name + ": "; var textDiv = window.document.createElement("span"); textDiv.innerHTML = msg; var isInChatEnd = msgBuf.scrollHeight - msgBuf.scrollTop == msgBuf.clientHeight; userDiv.appendChild(tstamp); userDiv.appendChild(nameDiv); userDiv.appendChild(textDiv); msgBuf.appendChild(userDiv); if(isInChatEnd) { msgBuf.scrollTop = msgBuf.scrollHeight; } } }; 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.ontimeupdate = 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("