include.js
/**
* Uncompressed source can be found at https://login.persona.org/include.orig.js
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function () {
var a = function () {
function e(a) {
return Array.isArray ? Array.isArray(a) : a.constructor.toString().indexOf("Array") != -1
}
function d(a, c, d) {
var e = b[c][d];
for (var f = 0; f < e.length; f++)e[f].win === a && e.splice(f, 1);
b[c][d].length === 0 && delete b[c][d]
}
function c(a, c, d, e) {
function f(b) {
for (var c = 0; c < b.length; c++)if (b[c].win === a)return!0;
return!1
}
var g = !1;
if (c === "*")for (var h in b) {
if (!b.hasOwnProperty(h))continue;
if (h === "*")continue;
if (typeof b[h][d] == "object") {
g = f(b[h][d]);
if (g)break
}
} else b["*"] && b["*"][d] && (g = f(b["*"][d])), !g && b[c] && b[c][d] && (g = f(b[c][d]));
if (g)throw"A channel is already bound to the same window which overlaps with origin '" + c + "' and has scope '" + d + "'";
typeof b[c] != "object" && (b[c] = {}), typeof b[c][d] != "object" && (b[c][d] = []), b[c][d].push({win:a, handler:e})
}
"use strict";
var a = Math.floor(Math.random() * 1000001), b = {}, f = {}, g = function (a) {
try {
var c = JSON.parse(a.data);
if (typeof c != "object" || c === null)throw"malformed"
} catch (a) {
return
}
var d = a.source, e = a.origin, g, h, i;
if (typeof c.method == "string") {
var j = c.method.split("::");
j.length == 2 ? (g = j[0], i = j[1]) : i = c.method
}
typeof c.id != "undefined" && (h = c.id);
if (typeof i == "string") {
var k = !1;
if (b[e] && b[e][g])for (var l = 0; l < b[e][g].length; l++)if (b[e][g][l].win === d) {
b[e][g][l].handler(e, i, c), k = !0;
break
}
if (!k && b["*"] && b["*"][g])for (var l = 0; l < b["*"][g].length; l++)if (b["*"][g][l].win === d) {
b["*"][g][l].handler(e, i, c);
break
}
} else typeof h != "undefined" && f[h] && f[h](e, i, c)
};
window.addEventListener ? window.addEventListener("message", g, !1) : window.attachEvent && window.attachEvent("onmessage", g);
return{build:function (b) {
var g = function (a) {
if (b.debugOutput && window.console && window.console.log) {
try {
typeof a != "string" && (a = JSON.stringify(a))
} catch (c) {
}
console.log("[" + j + "] " + a)
}
};
if (!window.postMessage)throw"jschannel cannot run this browser, no postMessage";
if (!window.JSON || !window.JSON.stringify || !window.JSON.parse)throw"jschannel cannot run this browser, no JSON parsing/serialization";
if (typeof b != "object")throw"Channel build invoked without a proper object argument";
if (!b.window || !b.window.postMessage)throw"Channel.build() called without a valid window argument";
if (window === b.window)throw"target window is same as present window -- not allowed";
var h = !1;
if (typeof b.origin == "string") {
var i;
b.origin === "*" ? h = !0 : null !== (i = b.origin.match(/^https?:\/\/(?:[-a-zA-Z0-9_\.])+(?::\d+)?/)) && (b.origin = i[0].toLowerCase(), h = !0)
}
if (!h)throw"Channel.build() called with an invalid origin";
if (typeof b.scope != "undefined") {
if (typeof b.scope != "string")throw"scope, when specified, must be a string";
if (b.scope.split("::").length > 1)throw"scope may not contain double colons: '::'"
}
var j = function () {
var a = "", b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (var c = 0; c < 5; c++)a += b.charAt(Math.floor(Math.random() * b.length));
return a
}(), k = {}, l = {}, m = {}, n = !1, o = [], p = function (a, b, c) {
var d = !1, e = !1;
return{origin:b, invoke:function (b, d) {
if (!m[a])throw"attempting to invoke a callback of a nonexistent transaction: " + a;
var e = !1;
for (var f = 0; f < c.length; f++)if (b === c[f]) {
e = !0;
break
}
if (!e)throw"request supports no such callback '" + b + "'";
t({id:a, callback:b, params:d})
}, error:function (b, c) {
e = !0;
if (!m[a])throw"error called for nonexistent message: " + a;
delete m[a], t({id:a, error:b, message:c})
}, complete:function (b) {
e = !0;
if (!m[a])throw"complete called for nonexistent message: " + a;
delete m[a], t({id:a, result:b})
}, delayReturn:function (a) {
typeof a == "boolean" && (d = a === !0);
return d
}, completed:function () {
return e
}}
}, q = function (a, b, c) {
return window.setTimeout(function () {
if (l[a]) {
var d = "timeout (" + b + "ms) exceeded on method '" + c + "'";
(1, l[a].error)("timeout_error", d), delete l[a], delete f[a]
}
}, b)
}, r = function (a, c, d) {
if (typeof b.gotMessageObserver == "function")try {
b.gotMessageObserver(a, d)
} catch (h) {
g("gotMessageObserver() raised an exception: " + h.toString())
}
if (d.id && c) {
if (k[c]) {
var i = p(d.id, a, d.callbacks ? d.callbacks : []);
m[d.id] = {};
try {
if (d.callbacks && e(d.callbacks) && d.callbacks.length > 0)for (var j = 0; j < d.callbacks.length; j++) {
var n = d.callbacks[j], o = d.params, q = n.split("/");
for (var r = 0; r < q.length - 1; r++) {
var s = q[r];
typeof o[s] != "object" && (o[s] = {}), o = o[s]
}
o[q[q.length - 1]] = function () {
var a = n;
return function (b) {
return i.invoke(a, b)
}
}()
}
var t = k[c](i, d.params);
!i.delayReturn() && !i.completed() && i.complete(t)
} catch (h) {
var u = "runtime_error", v = null;
typeof h == "string" ? v = h : typeof h == "object" && (h && e(h) && h.length == 2 ? (u = h[0], v = h[1]) : typeof h.error == "string" && (u = h.error, h.message ? typeof h.message == "string" ? v = h.message : h = h.message : v = ""));
if (v === null)try {
v = JSON.stringify(h), typeof v == "undefined" && (v = h.toString())
} catch (w) {
v = h.toString()
}
i.error(u, v)
}
}
} else d.id && d.callback ? !l[d.id] || !l[d.id].callbacks || !l[d.id].callbacks[d.callback] ? g("ignoring invalid callback, id:" + d.id + " (" + d.callback + ")") : l[d.id].callbacks[d.callback](d.params) : d.id ? l[d.id] ? (d.error ? (1, l[d.id].error)(d.error, d.message) : d.result !== undefined ? (1, l[d.id].success)(d.result) : (1, l[d.id].success)(), delete l[d.id], delete f[d.id]) : g("ignoring invalid response: " + d.id) : c && k[c] && k[c](null, d.params)
};
c(b.window, b.origin, typeof b.scope == "string" ? b.scope : "", r);
var s = function (a) {
typeof b.scope == "string" && b.scope.length && (a = [b.scope, a].join("::"));
return a
}, t = function (a, c) {
if (!a)throw"postMessage called with null message";
var d = n ? "post " : "queue ";
g(d + " message: " + JSON.stringify(a));
if (!c && !n)o.push(a); else {
if (typeof b.postMessageObserver == "function")try {
b.postMessageObserver(b.origin, a)
} catch (e) {
g("postMessageObserver() raised an exception: " + e.toString())
}
b.window.postMessage(JSON.stringify(a), b.origin)
}
}, u = function (a, c) {
g("ready msg received");
if (n)throw"received ready message while in ready state. help!";
c === "ping" ? j += "-R" : j += "-L", v.unbind("__ready"), n = !0, g("ready msg accepted."), c === "ping" && v.notify({method:"__ready", params:"pong"});
while (o.length)t(o.pop());
typeof b.onReady == "function" && b.onReady(v)
}, v = {unbind:function (a) {
if (k[a]) {
if (delete k[a])return!0;
throw"can't delete method: " + a
}
return!1
}, bind:function (a, b) {
if (!a || typeof a != "string")throw"'method' argument to bind must be string";
if (!b || typeof b != "function")throw"callback missing from bind params";
if (k[a])throw"method '" + a + "' is already bound!";
k[a] = b;
return this
}, call:function (b) {
if (!b)throw"missing arguments to call function";
if (!b.method || typeof b.method != "string")throw"'method' argument to call must be string";
if (!b.success || typeof b.success != "function")throw"'success' callback missing from call";
var c = {}, d = [], e = function (a, b) {
if (typeof b == "object")for (var f in b) {
if (!b.hasOwnProperty(f))continue;
var g = a + (a.length ? "/" : "") + f;
typeof b[f] == "function" ? (c[g] = b[f], d.push(g), delete b[f]) : typeof b[f] == "object" && e(g, b[f])
}
};
e("", b.params);
var g = {id:a, method:s(b.method), params:b.params};
d.length && (g.callbacks = d), b.timeout && q(a, b.timeout, s(b.method)), l[a] = {callbacks:c, error:b.error, success:b.success}, f[a] = r, a++, t(g)
}, notify:function (a) {
if (!a)throw"missing arguments to notify function";
if (!a.method || typeof a.method != "string")throw"'method' argument to notify must be string";
t({method:s(a.method), params:a.params})
}, destroy:function () {
d(b.window, b.origin, typeof b.scope == "string" ? b.scope : ""), window.removeEventListener ? window.removeEventListener("message", r, !1) : window.detachEvent && window.detachEvent("onmessage", r), n = !1, k = {}, m = {}, l = {}, b.origin = null, o = [], g("channel destroyed"), j = ""
}};
v.bind("__ready", u), setTimeout(function () {
}, 0);
return v
}}
}();
WinChan = function () {
function i() {
var b = window.location, c = window.opener.frames, d = b.protocol + "//" + b.host;
for (var e = c.length - 1; e >= 0; e--)try {
if (c[e].location.href.indexOf(d) === 0 && c[e].name === a)return c[e]
} catch (f) {
}
return
}
function h(a) {
/^https?:\/\//.test(a) || (a = window.location.href);
var b = /^(https?:\/\/[\-_a-zA-Z\.0-9:]+)/.exec(a);
return b ? b[1] : a
}
function g() {
return window.JSON && window.JSON.stringify && window.JSON.parse && window.postMessage
}
function f() {
try {
var a = navigator.userAgent;
return a.indexOf("Fennec/") != -1 || a.indexOf("Firefox/") != -1 && a.indexOf("Android") != -1
} catch (b) {
}
return!1
}
function e() {
var a = -1;
if (navigator.appName === "Microsoft Internet Explorer") {
var b = navigator.userAgent, c = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");
c.exec(b) != null && (a = parseFloat(RegExp.$1))
}
return a >= 8
}
function d(a, b, c) {
a.detachEvent ? a.detachEvent("on" + b, c) : a.removeEventListener && a.removeEventListener(b, c, !1)
}
function c(a, b, c) {
a.attachEvent ? a.attachEvent("on" + b, c) : a.addEventListener && a.addEventListener(b, c, !1)
}
var a = "__winchan_relay_frame", b = "die", j = e();
return g() ? {open:function (e, g) {
function q(a) {
try {
var b = JSON.parse(a.data);
b.a === "ready" ? m.postMessage(o, l) : b.a === "error" ? g && (g(b.d), g = null) : b.a === "response" && (d(window, "message", q), d(window, "unload", p), p(), g && (g(null, b.d), g = null))
} catch (c) {
}
}
function p() {
k && document.body.removeChild(k), k = undefined;
if (n)try {
n.close()
} catch (a) {
m.postMessage(b, l)
}
n = m = undefined
}
if (!g)throw"missing required callback argument";
var i;
e.url || (i = "missing required 'url' parameter"), e.relay_url || (i = "missing required 'relay_url' parameter"), i && setTimeout(function () {
g(i)
}, 0), e.window_name || (e.window_name = null);
if (!e.window_features || f())e.window_features = undefined;
var k, l = h(e.url);
if (l !== h(e.relay_url))return setTimeout(function () {
g("invalid arguments: origin of url and relay_url must match")
}, 0);
var m;
j && (k = document.createElement("iframe"), k.setAttribute("src", e.relay_url), k.style.display = "none", k.setAttribute("name", a), document.body.appendChild(k), m = k.contentWindow);
var n = window.open(e.url, e.window_name, e.window_features);
m || (m = n);
var o = JSON.stringify({a:"request", d:e.params});
c(window, "unload", p), c(window, "message", q);
return{close:p, focus:function () {
if (n)try {
n.focus()
} catch (a) {
}
}}
}} : {open:function (a, b, c, d) {
setTimeout(function () {
d("unsupported browser")
}, 0)
}}
}();
var b = function () {
function l() {
return c
}
function k() {
c = g() || h() || i() || j();
return!c
}
function j() {
if (!(window.JSON && window.JSON.stringify && window.JSON.parse))return"JSON_NOT_SUPPORTED"
}
function i() {
if (!a.postMessage)return"POSTMESSAGE_NOT_SUPPORTED"
}
function h() {
try {
var b = "localStorage"in a && a.localStorage !== null;
if (b)a.localStorage.setItem("test", "true"), a.localStorage.removeItem("test"); else return"LOCALSTORAGE_NOT_SUPPORTED"
} catch (c) {
return"LOCALSTORAGE_DISABLED"
}
}
function g() {
return f()
}
function f() {
var a = e(), b = a > -1 && a < 8;
if (b)return"BAD_IE_VERSION"
}
function e() {
var a = -1;
if (b.appName == "Microsoft Internet Explorer") {
var c = b.userAgent, d = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");
d.exec(c) != null && (a = parseFloat(RegExp.$1))
}
return a
}
function d(c, d) {
b = c, a = d
}
var a = window, b = navigator, c;
return{setTestEnv:d, isSupported:k, getNoSupportReason:l}
}();
navigator.id || (navigator.id = {});
if (!navigator.id.request || navigator.id._shimmed) {
var c = "https://login.persona.org", d = navigator.userAgent, e = d.indexOf("Fennec/") != -1 || d.indexOf("Firefox/") != -1 && d.indexOf("Android") != -1, f = e ? undefined : "menubar=0,location=1,resizable=1,scrollbars=1,status=0,dialog=1,minimizable=1,width=700,height=375", g, h = {login:null, logout:null, ready:null}, i, j = undefined;
function k(a) {
a !== !0;
if (j === undefined)j = a; else if (j != a)throw new Error("you cannot combine the navigator.id.watch() API with navigator.id.getVerifiedEmail() or navigator.id.get()this site should instead use navigator.id.request() and navigator.id.watch()")
}
var l, m = !1, n = b.isSupported();
function o(a) {
document.addEventListener ? document.addEventListener("DOMContentLoaded", function b() {
document.removeEventListener("DOMContentLoaded", b), a()
}, !1) : document.attachEvent && document.readyState && document.attachEvent("onreadystatechange", function c() {
var b = document.readyState;
if (b === "loaded" || b === "complete" || b === "interactive")document.detachEvent("onreadystatechange", c), a()
})
}
function p() {
if (!!n) {
var b = window.document;
if (!b.body) {
m || (o(p), m = !0);
return
}
try {
if (!l) {
var d = b.createElement("iframe");
d.style.display = "none", b.body.appendChild(d), d.src = c + "/communication_iframe", l = a.build({window:d.contentWindow, origin:c, scope:"mozid_ni", onReady:function () {
l.call({method:"loaded", success:function () {
h.ready && h.ready()
}, error:function () {
}})
}}), l.bind("logout", function (a, b) {
h.logout && h.logout()
}), l.bind("login", function (a, b) {
h.login && h.login(b)
}), q(i) && l.notify({method:"loggedInUser", params:i})
}
} catch (e) {
l = undefined
}
}
}
function q(a) {
return typeof a != "undefined"
}
function r(a) {
try {
console.warn(a)
} catch (b) {
}
}
function s(a, b) {
if (q(a[b])) {
r(b + " has been deprecated");
return!0
}
}
function t(a, b, c) {
if (q(a[b]) && q(a[c]))throw new Error("you cannot supply *both* " + b + " and " + c);
s(a, b) && (a[c] = a[b], delete a[b])
}
function u(a) {
if (typeof a == "object") {
if (a.onlogin && typeof a.onlogin != "function" || a.onlogout && typeof a.onlogout != "function" || a.onready && typeof a.onready != "function")throw new Error("non-function where function expected in parameters to navigator.id.watch()");
if (!a.onlogin)throw new Error("'onlogin' is a required argument to navigator.id.watch()");
if (!a.onlogout)throw new Error("'onlogout' is a required argument to navigator.id.watch()");
h.login = a.onlogin || null, h.logout = a.onlogout || null, h.ready = a.onready || null, t(a, "loggedInEmail", "loggedInUser"), i = a.loggedInUser, p()
}
}
var v;
function w() {
var a = v;
a === "request" && (h.ready ? a = "watch_with_onready" : a = "watch_without_onready");
return a
}
function x(a) {
s(a, "requiredEmail"), t(a, "tosURL", "termsOfService"), t(a, "privacyURL", "privacyPolicy"), a.termsOfService && !a.privacyPolicy && r("termsOfService ignored unless privacyPolicy also defined"), a.privacyPolicy && !a.termsOfService && r("privacyPolicy ignored unless termsOfService also defined"), a.rp_api = w(), v = null;
if (g)try {
g.focus()
} catch (d) {
} else {
if (!b.isSupported()) {
var e = b.getNoSupportReason(), i = "unsupported_dialog";
e === "LOCALSTORAGE_DISABLED" && (i = "cookies_disabled"), g = window.open(c + "/" + i, null, f);
return
}
l && l.notify({method:"dialog_running"}), g = WinChan.open({url:c + "/sign_in", relay_url:c + "/relay", window_features:f, window_name:"__persona_dialog", params:{method:"get", params:a}}, function (b, c) {
l && (!b && c && c.email && l.notify({method:"loggedInUser", params:c.email}), l.notify({method:"dialog_complete"})), g = undefined;
if (!b && c && c.assertion)try {
h.login && h.login(c.assertion)
} catch (d) {
}
if (b === "client closed window" || !c)a && a.oncancel && a.oncancel(), delete a.oncancel
})
}
}
navigator.id = {request:function (a) {
if (this != navigator.id)throw new Error("all navigator.id calls must be made on the navigator.id object");
a = a || {}, k(!1), v = "request", a.returnTo || (a.returnTo = document.location.pathname);
return x(a)
}, watch:function (a) {
if (this != navigator.id)throw new Error("all navigator.id calls must be made on the navigator.id object");
k(!1), u(a)
}, logout:function (a) {
if (this != navigator.id)throw new Error("all navigator.id calls must be made on the navigator.id object");
p(), l && l.notify({method:"logout"}), typeof a == "function" && (r("navigator.id.logout callback argument has been deprecated."), setTimeout(a, 0))
}, get:function (a, b) {
var c = {};
b = b || {}, c.privacyPolicy = b.privacyPolicy || undefined, c.termsOfService = b.termsOfService || undefined, c.privacyURL = b.privacyURL || undefined, c.tosURL = b.tosURL || undefined, c.siteName = b.siteName || undefined, c.siteLogo = b.siteLogo || undefined, v = v || "get";
s(b, "silent") ? a && setTimeout(function () {
a(null)
}, 0) : (k(!0), u({onlogin:function (b) {
a && (a(b), a = null)
}, onlogout:function () {
}}), c.oncancel = function () {
a && (a(null), a = null), h.login = h.logout = h.ready = null
}, x(c))
}, getVerifiedEmail:function (a) {
r("navigator.id.getVerifiedEmail has been deprecated"), k(!0), v = "getVerifiedEmail", navigator.id.get(a)
}, _shimmed:!0}
}
})()