(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();
		}
	};
})();
