133 lines
3.6 KiB
JavaScript
133 lines
3.6 KiB
JavaScript
(function() {
|
|
'use strict';
|
|
|
|
var initialized = false;
|
|
var i18n;
|
|
|
|
// i18n key prefix for MUC ("muc.") or 1:1 chat ("chat.")
|
|
var key_prefix;
|
|
var display_data = null;
|
|
|
|
function show_clients(client_array) {
|
|
var list = document.getElementById('client_list');
|
|
for (var id = 0; id < client_array.length; id++) {
|
|
var item = document.createElement('p');
|
|
item.innerHTML = client_array[id];
|
|
list.appendChild(item);
|
|
}
|
|
}
|
|
|
|
function load_clients(url) {
|
|
var request = new XMLHttpRequest();
|
|
request.open('GET', url);
|
|
request.onreadystatechange = function () {
|
|
if (request.readyState === 4) {
|
|
if (request.status === 200 || (isLocalFileRequest(url) && request.responseText.length > 0)) {
|
|
show_clients(JSON.parse(request.responseText));
|
|
}
|
|
}
|
|
};
|
|
request.send(null);
|
|
}
|
|
|
|
function load_hash() {
|
|
var muc = false;
|
|
key_prefix = "chat.";
|
|
var jid = window.location.search || window.location.hash;
|
|
jid = decodeURIComponent(jid.substring(jid.indexOf('#') + 1, jid.length));
|
|
|
|
if (jid === "")
|
|
jid = "decentralized@conference.moemoekyun.moe?join"
|
|
|
|
try {
|
|
base_decoded = window.atob(jid);
|
|
if (base_decoded.search('@') >= 0)
|
|
jid = base_decoded;
|
|
} catch (err) {
|
|
// ignore error, JID wasn't base64 encoded
|
|
}
|
|
if (jid.search("\\?join") >= 0) {
|
|
muc = true;
|
|
key_prefix = "muc.";
|
|
}
|
|
|
|
// TODO: proper error checking / display / Creation of invitations
|
|
if (jid.search("@") <= 0) return {jid:jid, jid_encoded:jid, name: jid};
|
|
|
|
var name = jid.split("@")[0];
|
|
name = name.charAt(0).toUpperCase() + name.slice(1);
|
|
|
|
var jid_parts = jid.split("?");
|
|
jid_parts[0] = encodeURIComponent(jid_parts[0]) // URL-encode the JID only
|
|
var jid_encoded = jid_parts.join("?");
|
|
|
|
return {jid: jid, jid_encoded: jid_encoded, name: name};
|
|
}
|
|
|
|
function translate_ui() {
|
|
// translation
|
|
document.title = i18n.text(key_prefix + 'title', display_data);
|
|
// MUC/chat specific
|
|
['heading', 'button'].forEach(function(id) {
|
|
document.getElementById(id).innerHTML = i18n.text(key_prefix + id, display_data);
|
|
});
|
|
// and agnostic
|
|
['clients', 'recommend', 'checkfulllist', 'xmppis'].forEach(function(id) {
|
|
document.getElementById(id).innerHTML = i18n.text(id, display_data);
|
|
});
|
|
}
|
|
|
|
function rehash() {
|
|
display_data = load_hash();
|
|
document.getElementById('button').href = "xmpp:" + display_data.jid_encoded;
|
|
document.getElementById('url_in').value = "xmpp:" + display_data.jid;
|
|
translate_ui();
|
|
}
|
|
|
|
function createQR() {
|
|
display_data = load_hash();
|
|
new QRCode(document.getElementById("qrcode"), "xmpp:" + display_data.jid);
|
|
}
|
|
|
|
function load_done() {
|
|
if (initialized) return;
|
|
initialized = true;
|
|
|
|
// load i18n and perform translation
|
|
i18n = new I18nText({path: 'lang'});
|
|
i18n.once(I18nText.event.LOCALE_CHANGE, function (data) {
|
|
rehash();
|
|
});
|
|
i18n.setLocale('ru');
|
|
|
|
// functionality
|
|
if (navigator.userAgent.indexOf("Android") >= 0) {
|
|
load_clients("json/clients_Android.json")
|
|
}
|
|
else if (navigator.userAgent.indexOf("Linux") >= 0) {
|
|
load_clients("json/clients_Linux.json");
|
|
createQR();
|
|
}
|
|
else if (navigator.userAgent.indexOf("iPhone") >= 0) {
|
|
load_clients("json/clients_iOS.json")
|
|
}
|
|
else {
|
|
load_clients("json/clients_Windows.json");
|
|
createQR();
|
|
}
|
|
|
|
window.addEventListener("hashchange", rehash, false);
|
|
document.getElementById("url_in").addEventListener("focus", function(event) {
|
|
event.target.select();
|
|
});
|
|
}
|
|
|
|
// Wait for the DOM to be ready
|
|
document.addEventListener('DOMContentLoaded', load_done, false);
|
|
document.onreadystatechange = function() {
|
|
if (document.readyState === 'interactive') {
|
|
load_done();
|
|
}
|
|
};
|
|
})();
|