$(function(){ UI.elements = { menu: $('nav > .menu'), main: $('main'), header: $('header'), connection: { status: $('#connection'), user_and_host: $('#user_and_host'), msg: $('#message') } }; UI.buildMenu(); UI.stored.getOpts(); $("body").on("keydown",function(e){ switch (e.key) { case "Escape": { //if context menu, hide if (UI.elements.context_menu) { UI.elements.context_menu.hide(); } break; } } }); UI.elements.main.click(function(e){ //if context menu, hide if (UI.elements.context_menu && !e.isDefaultPrevented()) { UI.elements.context_menu.hide(); } }); //add right click functionality for touch devices var long_click = { timeout: false, delay: 1500 }; UI.elements.main.on("mousedown",function(e){ var ele = e.target; long_click.timeout = setTimeout(function(){ long_click.timeout = false; var event = new Event("contextmenu",{bubbles:true}); event.pageX = e.pageX; event.pageY = e.pageY; ele.dispatchEvent(event); //prevent the click after mouseup that would remove the context menu when let go function captureClick(e) { e.preventDefault(); } function cleanUp() { window.removeEventListener('click',captureClick,true); document.removeEventListener('mouseup',cleanUp); } window.addEventListener('click',captureClick,true); document.addEventListener('mouseup',function(e){ requestAnimationFrame(cleanUp); }); },long_click.delay); }); UI.elements.main.on("mouseleave",function(e){ if (long_click.timeout) { clearTimeout(long_click.timeout); long_click.timeout = false; } }); UI.elements.main.on("mouseup",function(e){ if (long_click.timeout) { clearTimeout(long_click.timeout); long_click.timeout = false; } }); //get stored login data try { if ('mistLogin' in sessionStorage) { var stored = JSON.parse(sessionStorage['mistLogin']); mist.user.name = stored.name; mist.user.password = stored.password; mist.user.host = stored.host; } } catch (e) {} //check if username and host have been stored in the url if (location.hash) { var hash = decodeURIComponent(location.hash).substring(1).split('@'); var user = hash[0].split('&'); mist.user.name = user[0]; if (user[1]) { mist.user.host = user[1]; } } //check if we are logged in mist.send(function(d){ //we're logged in $(window).trigger('hashchange'); },{},{timeout: 5, hide: true}); var lastpos = 0; $('body > div.filler').on('scroll',function(){ var pos = $(this).scrollLeft(); if (pos != lastpos) { UI.elements.header.css('margin-right',-1*pos+'px'); } lastpos = pos; }); }); var lastpage = []; $(window).on('hashchange', function(e) { var loc = decodeURIComponent(location.hash).substring(1).split('@'); if (!loc[1]) { loc[1] = ''; } var tab = loc[1].split('&'); if (tab[0] == '') { tab[0] = 'Overview'; } UI.showTab(tab[0],tab[1],lastpage); if (lastpage[0] != tab[0] || lastpage[1] != tab[1]) lastpage = [tab[0],tab[1]]; }); var MistVideoObject = {}; var otherhost = { host: false, https: false }; var UI = { debug: false, elements: {}, stored: { getOpts: function(){ var stored = localStorage['stored']; if (stored) { stored = JSON.parse(stored); } $.extend(true,this.vars,stored); return this.vars; }, saveOpt: function(name,val){ this.vars[name] = val; localStorage['stored'] = JSON.stringify(this.vars); return this.vars; }, vars: { helpme: true } }, interval: { list: {}, clear: function(){ for (var i in this.list) { clearInterval(this.list[i].id); } this.list = {}; }, set: function(callback,delay){ if (this.opts) { log('[interval]','Set called on interval, but an interval is already active.'); } var opts = { delay: delay, callback: callback, id: setInterval(callback,delay) }; this.list[opts.id] = opts; return opts.id; } }, websockets: { list: [], clear: function(){ for (var i in this.list) { this.list[i].close(); } //they will remove themselves from the list in the onclose call, defined in websockets.create }, create: function(url){ var ws = new WebSocket(url); var me = this; this.list.push(ws); ws.addEventListener("close",function(){ //remove from list for (var i = me.list.length - 1; i >=0; i--) { if (me.list[i] == ws) { me.list.splice(i,1); } } }) return ws; } }, countrylist: {'AF':'Afghanistan','AX':'Åland Islands','AL':'Albania','DZ':'Algeria','AS':'American Samoa','AD':'Andorra', 'AO':'Angola','AI':'Anguilla','AQ':'Antarctica','AG':'Antigua and Barbuda','AR':'Argentina','AM':'Armenia','AW':'Aruba', 'AU':'Australia','AT':'Austria','AZ':'Azerbaijan','BS':'Bahamas','BH':'Bahrain','BD':'Bangladesh','BB':'Barbados', 'BY':'Belarus','BE':'Belgium','BZ':'Belize','BJ':'Benin','BM':'Bermuda','BT':'Bhutan','BO':'Bolivia, Plurinational State of', 'BQ':'Bonaire, Sint Eustatius and Saba','BA':'Bosnia and Herzegovina','BW':'Botswana','BV':'Bouvet Island','BR':'Brazil', 'IO':'British Indian Ocean Territory','BN':'Brunei Darussalam','BG':'Bulgaria','BF':'Burkina Faso','BI':'Burundi','KH':'Cambodia', 'CM':'Cameroon','CA':'Canada','CV':'Cape Verde','KY':'Cayman Islands','CF':'Central African Republic','TD':'Chad','CL':'Chile', 'CN':'China','CX':'Christmas Island','CC':'Cocos (Keeling) Islands','CO':'Colombia','KM':'Comoros','CG':'Congo', 'CD':'Congo, the Democratic Republic of the','CK':'Cook Islands','CR':'Costa Rica','CI':'Côte d\'Ivoire','HR':'Croatia', 'CU':'Cuba','CW':'Curaçao','CY':'Cyprus','CZ':'Czech Republic','DK':'Denmark','DJ':'Djibouti','DM':'Dominica', 'DO':'Dominican Republic','EC':'Ecuador','EG':'Egypt','SV':'El Salvador','GQ':'Equatorial Guinea','ER':'Eritrea','EE':'Estonia', 'ET':'Ethiopia','FK':'Falkland Islands (Malvinas)','FO':'Faroe Islands','FJ':'Fiji','FI':'Finland','FR':'France','GF':'French Guiana', 'PF':'French Polynesia','TF':'French Southern Territories','GA':'Gabon','GM':'Gambia','GE':'Georgia','DE':'Germany','GH':'Ghana', 'GI':'Gibraltar','GR':'Greece','GL':'Greenland','GD':'Grenada','GP':'Guadeloupe','GU':'Guam','GT':'Guatemala','GG':'Guernsey', 'GN':'Guinea','GW':'Guinea-Bissau','GY':'Guyana','HT':'Haiti','HM':'Heard Island and McDonald Islands', 'VA':'Holy See (Vatican City State)','HN':'Honduras','HK':'Hong Kong','HU':'Hungary','IS':'Iceland','IN':'India','ID':'Indonesia', 'IR':'Iran, Islamic Republic of','IQ':'Iraq','IE':'Ireland','IM':'Isle of Man','IL':'Israel','IT':'Italy','JM':'Jamaica', 'JP':'Japan','JE':'Jersey','JO':'Jordan','KZ':'Kazakhstan','KE':'Kenya','KI':'Kiribati', 'KP':'Korea, Democratic People\'s Republic of','KR':'Korea, Republic of','KW':'Kuwait','KG':'Kyrgyzstan', 'LA':'Lao People\'s Democratic Republic','LV':'Latvia','LB':'Lebanon','LS':'Lesotho','LR':'Liberia','LY':'Libya', 'LI':'Liechtenstein','LT':'Lithuania','LU':'Luxembourg','MO':'Macao','MK':'Macedonia, the former Yugoslav Republic of', 'MG':'Madagascar','MW':'Malawi','MY':'Malaysia','MV':'Maldives','ML':'Mali','MT':'Malta','MH':'Marshall Islands', 'MQ':'Martinique','MR':'Mauritania','MU':'Mauritius','YT':'Mayotte','MX':'Mexico','FM':'Micronesia, Federated States of', 'MD':'Moldova, Republic of','MC':'Monaco','MN':'Mongolia','ME':'Montenegro','MS':'Montserrat','MA':'Morocco','MZ':'Mozambique', 'MM':'Myanmar','NA':'Namibia','NR':'Nauru','NP':'Nepal','NL':'Netherlands','NC':'New Caledonia','NZ':'New Zealand','NI':'Nicaragua', 'NE':'Niger','NG':'Nigeria','NU':'Niue','NF':'Norfolk Island','MP':'Northern Mariana Islands','NO':'Norway','OM':'Oman', 'PK':'Pakistan','PW':'Palau','PS':'Palestine, State of','PA':'Panama','PG':'Papua New Guinea','PY':'Paraguay','PE':'Peru', 'PH':'Philippines','PN':'Pitcairn','PL':'Poland','PT':'Portugal','PR':'Puerto Rico','QA':'Qatar','RE':'Réunion', 'RO':'Romania','RU':'Russian Federation','RW':'Rwanda','BL':'Saint Barthélemy','SH':'Saint Helena, Ascension and Tristan da Cunha', 'KN':'Saint Kitts and Nevis','LC':'Saint Lucia','MF':'Saint Martin (French part)','PM':'Saint Pierre and Miquelon', 'VC':'Saint Vincent and the Grenadines','WS':'Samoa','SM':'San Marino','ST':'Sao Tome and Principe','SA':'Saudi Arabia', 'SN':'Senegal','RS':'Serbia','SC':'Seychelles','SL':'Sierra Leone','SG':'Singapore','SX':'Sint Maarten (Dutch part)','SK':'Slovakia', 'SI':'Slovenia','SB':'Solomon Islands','SO':'Somalia','ZA':'South Africa','GS':'South Georgia and the South Sandwich Islands', 'SS':'South Sudan','ES':'Spain','LK':'Sri Lanka','SD':'Sudan','SR':'Suriname','SJ':'Svalbard and Jan Mayen','SZ':'Swaziland', 'SE':'Sweden','CH':'Switzerland','SY':'Syrian Arab Republic','TW':'Taiwan, Province of China','TJ':'Tajikistan', 'TZ':'Tanzania, United Republic of','TH':'Thailand','TL':'Timor-Leste','TG':'Togo','TK':'Tokelau','TO':'Tonga', 'TT':'Trinidad and Tobago','TN':'Tunisia','TR':'Turkey','TM':'Turkmenistan','TC':'Turks and Caicos Islands','TV':'Tuvalu', 'UG':'Uganda','UA':'Ukraine','AE':'United Arab Emirates','GB':'United Kingdom','US':'United States', 'UM':'United States Minor Outlying Islands','UY':'Uruguay','UZ':'Uzbekistan','VU':'Vanuatu','VE':'Venezuela, Bolivarian Republic of', 'VN':'Viet Nam','VG':'Virgin Islands, British','VI':'Virgin Islands, U.S.','WF':'Wallis and Futuna','EH':'Western Sahara','YE':'Yemen', 'ZM':'Zambia','ZW':'Zimbabwe' }, tooltip: { show: function (pos,contents){ $tooltip = this.element; if (!$.contains(document.body,$tooltip[0])) { $('body').append($tooltip); } $tooltip.html(contents); clearTimeout(this.hiding); delete this.hiding; var mh = $(document).height() - $tooltip.outerHeight(); var mw = $(document).width() - $tooltip.outerWidth(); $tooltip.css('left',Math.min(pos.pageX+10,mw-10)); $tooltip.css('top',Math.min(pos.pageY+25,mh-10)); $tooltip.show().addClass('show'); }, hide: function() { $tooltip = this.element; $tooltip.removeClass('show'); this.hiding = setTimeout(function(){ $tooltip.hide(); },500); }, element: $('
').attr('id','tooltip') }, context_menu: function(){ var $ele = $("
").attr("id","context_menu"); $ele[0].style.display = "none"; this.ele = $ele; UI.elements.context_menu = this; this.pos = function(pos){ var $parent = $ele.parent(); var mh = $parent.height() - $ele.outerHeight(); var mw = $parent.width() - $ele.outerWidth(); $ele.css('left',Math.min(pos.pageX - $parent.position().left,mw)); $ele.css('top',Math.min(pos.pageY - $parent.position().top,mh)); }; this.show = function(html,pos){ if ((typeof html == "string") || (html instanceof jQuery)) { $ele.html(html); } else if (typeof html == "object") { $ele.html(""); if (!Array.isArray(html)) { html = [html]; } for (var i in html) { var section = html[i]; if (section instanceof jQuery) { $ele.children().last().remove(); //remove previous
$ele.append(section); $ele.append($("
")); //so that finishing code removes this
and not the section we just inserted continue; } for (var j in section) { var entry = section[j]; var $entry = $("
"); if (typeof entry == "string") { $entry.text(entry); } else if (entry instanceof jQuery) { $ele.append(entry); continue; } else { if ((entry.length >= 2) && (typeof entry[1] == "function")) { //onclick action $entry.click(entry[1]); $entry.on("keydown",function(e){ switch (e.key) { case "Enter": { $(this).click(); break; } } }); $entry.attr("tabindex","0"); } if (entry.length >=3) { //icon if (entry[2].length > 1) { //it's probably an image, not an asci icon $entry.append( $("
").addClass("icon").attr("data-icon",entry[2]) ); } else { $entry.attr("data-icon",entry[2]); } if (entry.length >= 4) { //title $entry.attr("title",entry[3]); } } $entry.append(entry[0]); } $ele.append($entry); } $ele.append($("
")); } $ele.children().last().remove(); $ele.find("[tabindex]").first().focus(); } if (!$ele.parent()) { $("body").append($ele); } if (pos) { this.pos(pos); } $ele[0].style.display = ""; }; this.hide = function(){ $ele[0].style.display = "none"; }; this.remove = function(){ delete UI.element.context_menu; $ele.remove(); }; $ele.on("keydown",function(e){ function getFocussed(dir) { var focussed = $ele.find(":focus"); if (!focussed.length) { $ele.find("[tabindex]").first().focus(); return; } if (dir == "down") { var next = focussed.nextAll("[tabindex]"); if (!next.length) { $ele.find("[tabindex]").first().focus(); } else { next.first().focus(); } } else { var prev = focussed.prevAll("[tabindex]"); if (!prev.length) { $ele.find("[tabindex]").last().focus(); } else { prev.first().focus(); } } } switch (e.key) { case "ArrowDown": { getFocussed("down"); break; } case "ArrowUp": { getFocussed("up"); break; } } }); this.hide(); }, pagecontrol: function(page_ele,default_page_size){ //takes table / div of elements (page_ele) //take into account hidden elements (class = hidden) //add page-functions to paged element //keep track of total amount of (non hidden) items //update control buttons //returns controls container var controls = $("
").addClass("page_control"); controls.elements = { prev: $("