summaryrefslogtreecommitdiffstats
path: root/javascripts/libs/idselector.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascripts/libs/idselector.js')
-rw-r--r--javascripts/libs/idselector.js532
1 files changed, 532 insertions, 0 deletions
diff --git a/javascripts/libs/idselector.js b/javascripts/libs/idselector.js
new file mode 100644
index 0000000..fac2331
--- /dev/null
+++ b/javascripts/libs/idselector.js
@@ -0,0 +1,532 @@
+(function () {
+ function gen_selector() {
+ var quirksMode = document.compatMode != 'CSS1Compat';
+
+ function log(msg) {
+ if (window.console) {window.console.log('ID Selector: ' + msg);}
+ }
+
+ function readCookie(name) {
+ var nameEQ = name + "=";
+ var ca = document.cookie.split(';');
+ for(var i=0;i < ca.length;i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1,c.length);
+ if (c.indexOf(nameEQ) == 0)
+ return decodeURIComponent(c.substring(nameEQ.length,c.length));
+ }
+ return null;
+ }
+ var openidCookie = readCookie('__openid_selector_openid');
+ var opIdCookie = readCookie('__openid_selector_op_id');
+ var unameCookie = readCookie('__openid_selector_uname');
+
+ var s;
+ var providers = [{shortname: "myOpenID", url_suffix: ".myopenid.com/", openid1: true, openid2: true, id: 8, icon: "myopenid.ico", url_prefix: "http://", website: "https://www.myopenid.com/", longname: "myOpenID", usercalled: "username"}, {shortname: "claimID", url_suffix: "", openid1: true, openid2: false, id: 4, icon: "claimid.ico", url_prefix: "http://claimid.com/", website: "http://claimid.com/", longname: "claimID", usercalled: "username"}, {shortname: "Clickpass", url_suffix: "", openid1: true, openid2: true, id: 5, icon: "clickpass.ico", url_prefix: "http://clickpass.com/public/", website: "http://www.clickpass.com/", longname: "Clickpass", usercalled: "username"}, {shortname: "Wordpress", url_suffix: ".wordpress.com/", openid1: true, openid2: false, id: 14, icon: "wordpress.ico", url_prefix: "http://", website: "http://www.wordpress.com/", longname: "Wordpress", usercalled: "username"}, {shortname: "Blogger", url_suffix: ".blogspot.com/", openid1: true, openid2: false, id: 2, icon: "blogger.ico", url_prefix: "http://", website: "http://www.blogger.com/", longname: "Google Blogger", usercalled: "blog name"}, {shortname: "Livejournal", url_suffix: ".livejournal.com/", openid1: true, openid2: false, id: 7, icon: "lj.ico", url_prefix: "http://", website: "http://www.livejournal.com/", longname: "Livejournal", usercalled: "username"}, {shortname: "Technorati", url_suffix: "", openid1: true, openid2: false, id: 10, icon: "technorati.ico", url_prefix: "http://technorati.com/people/technorati/", website: "http://www.technorati.com/", longname: "Technorati", usercalled: "username"}, {shortname: "Flickr", url_suffix: "", openid1: false, openid2: true, id: 6, icon: "flickr.ico", url_prefix: "http://www.flickr.com/photos/", website: "http://www.flickr.com/", longname: "Flickr", usercalled: "username"}, {shortname: "Identity.net", url_suffix: ".identity.net/", openid1: true, openid2: true, id: 23, icon: "identity.ico", url_prefix: "http://", website: "http://identity.net/", longname: "Identity.net", usercalled: "username"}, {shortname: "Google", url_suffix: "", openid1: false, openid2: true, id: 26, icon: "google.ico", url_prefix: "", website: "https://www.google.com/accounts/o8/id", longname: "Google", usercalled: "username"}, {shortname: "Yahoo!", url_suffix: "", openid1: false, openid2: true, id: 15, icon: "yahoo.ico", url_prefix: "http://me.yahoo.com/", website: "http://yahoo.com/", longname: "Yahoo!", usercalled: "yahoo id"}, {shortname: "AOL", url_suffix: "", openid1: true, openid2: false, id: 1, icon: "aol.ico", url_prefix: "http://openid.aol.com/", website: "http://www.aol.com/", longname: "America Online/AIM", usercalled: "screenname"}];
+
+ var oidTbId = window.idselector_input_id ? window.idselector_input_id : "openid_identifier";
+ var oidTb = document.getElementById(oidTbId);
+ if (oidTb == null) {
+ log('couldn\'t find openid input box with id = ' + oidTbId);
+ for (i = 0; !oidTb && i < document.forms.length; i++) {
+ oidTb = document.forms[i].openid_identifier;}
+ for (i = 0; !oidTb && i < document.forms.length; i++) {
+ oidTb = document.forms[i].openid_url;}
+ }
+
+ if (oidTb == null) {log('couldn\'t find openid input box'); return;}
+ var orig = oidTb.value;
+
+ var btnIcn = document.createElement('img');
+ s = btnIcn.style; s.width = '16px'; s.height = '16px';
+ s.verticalAlign = 'middle'; s.padding = '0px'; s.border = '0px';
+ s.margin = '0px'; s.display = 'inline';
+
+ var btnMkr = document.createElement('div');
+ btnMkr.innerHTML = "<button type=\"button\"></button>";
+
+ var arrow = document.createElement('img');
+ arrow.src = "https://www.idselector.com/images/arrow.gif";
+ arrow.style.display = 'inline';
+
+ var btn = btnMkr.firstChild;
+ btnMkr.removeChild(btn);
+ btn.id = '__idselector_button';
+ btn.style.cursor = "pointer";
+
+ btn.appendChild(btnIcn);
+ btn.appendChild(document.createTextNode(" "));
+ btn.appendChild(arrow);
+
+ var popup = document.createElement('iframe');
+ popup.frameBorder = 0; popup.scrolling = 'no';
+ s = popup.style; s.display = 'none'; s.position = 'absolute';
+ s.width = '400px'; s.height = '0px'; s.margin = '0px'; s.padding = '0px'; s.zIndex = 10000;
+ s.border = '0px';
+
+ var prnt = oidTb.parentNode;
+ var target = null;
+ if (window.idselector_target_id) {
+ target = document.getElementById(window.idselector_target_id);
+ if (!target) {log("couldn't find element with id " + window.idselector_target_id);}
+ }
+ if (target) {
+ target.insertBefore(btn, target.firstChild);
+ } else {
+ prnt.insertBefore(btn, oidTb.nextSibling);
+ prnt.insertBefore(document.createTextNode(" "), btn);
+ }
+ document.body.appendChild(popup);
+
+ var pdoc = popup.contentWindow.document;
+ pdoc.open();
+ pdoc.write('<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"><html><head><title>ID Selector</title><style type=\"text/css\">html{color:#000;background:#6e91af;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:\'\';}abbr,acronym {border:0;font-variant:normal;}sup {vertical-align:text-top;}sub {vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}body {border:1px solid #6e91af;font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}</style></head><body></body></html>');
+ pdoc.close();
+
+ var pbody = pdoc.body;
+
+ var back = pdoc.createElement('img');
+ back.style.verticalAlign = "middle"; back.style.cursor = "pointer";
+ back.src = "https://www.idselector.com/images/arrow_white_back.png";
+
+ var forward = pdoc.createElement('img');
+ forward.style.verticalAlign = "middle"; forward.style.cursor = "pointer";
+ forward.src = "https://www.idselector.com/images/arrow_white_forward.png";
+
+ var headRight = pdoc.createElement('div');
+ headRight.style[document.all ? 'styleFloat' : 'cssFloat'] = 'right';
+ headRight.innerHTML = '<a href="https://www.myopenid.com/signup?affiliate_id=21239" style="color:#fff;" target="_blank">Get an OpenID</a>';
+
+ var header = pdoc.createElement('div');
+ s = header.style; s.fontWeight = "bold"; s.color = "#fff";
+ s.padding = "2px 8px 2px 8px";
+
+ header.appendChild(headRight);
+ header.appendChild(pdoc.createTextNode("Sign in with OpenID using"));
+
+ var nameLabel = pdoc.createElement('span');
+ nameLabel.appendChild(pdoc.createTextNode("xxx:"));
+
+ var nameTb = pdoc.createElement('input');
+ nameTb.type = "text";
+ nameTb.size = 20;
+ s = nameTb.style; s.verticalAlign = 'middle'; s.padding = '2px 2px 2px 20px';
+ s.backgroundRepeat = 'no-repeat'; s.backgroundPosition = '2px 2px';
+
+ var footer = pdoc.createElement('div');
+ s = footer.style;
+ s.color = "#fff";
+ s.padding = "2px 8px 2px 8px";
+ s.textAlign = "right";
+ s.position = "relative";
+
+ footer.appendChild(nameLabel);
+ footer.appendChild(pdoc.createTextNode(" "))
+ footer.appendChild(nameTb);
+
+ function Cell(grid, idx) {
+ this.grid = grid;
+ this.idx = idx;
+
+ var td = this.td = pdoc.createElement('td');
+ s = td.style;
+ s.fontWeight = "bold";
+ s.padding = "4px";
+ s.verticalAlign = "middle";
+ s.cursor = "pointer";
+
+ var _this = this;
+ td.onmouseover = function () {
+ _this.onMouseOver();
+ }
+ td.onmouseout = function () {
+ _this.onMouseOut();
+ }
+ td.onclick = function () {
+ _this.onClick();
+ }
+
+ var provider = providers[idx];
+ var icon = pdoc.createElement("img");
+ icon.src = provider ? ('https://www.idselector.com/static/opicons/' + provider.icon) :
+ 'https://www.idselector.com/images/openid.ico';
+ icon.style.width = "16px";
+ icon.style.height = "16px";
+ icon.style.verticalAlign = "middle";
+ td.appendChild(icon);
+ td.appendChild(pdoc.createTextNode(" "));
+ td.appendChild(pdoc.createTextNode(provider ? provider.shortname : "Other OpenID"));
+
+ this.selected = false;
+ }
+
+ _id = Cell.prototype = {};
+ _id.onMouseOver = function () {
+ if (!this.selected) {
+ this.td.style.backgroundColor = "#eee";
+ }
+ }
+ _id.onMouseOut = function () {
+ if (!this.selected) {
+ this.td.style.backgroundColor = "";
+ }
+ }
+ _id.onClick = function () {
+ this.grid.select(this);
+ provider = providers[this.idx];
+ if (this.idx == -1) {
+ oidTb.value = 'http://';
+ oidTb.focus();
+ } else {
+ if (provider["openid2"] && !provider["openid1"]) {
+ oidTb.focus();
+ setTimeout(hidePopup, 1);
+ } else {
+ nameTb.focus();
+ nameTb.select();
+ }
+ }
+ }
+
+ _id.setSelected = function (selected) {
+ this.td.style.backgroundColor = selected ? '#c6d9e8' : "";
+ this.selected = selected;
+ }
+
+ function Grid() {
+ this.table = pdoc.createElement('table');
+ this.table.style.backgroundColor = "#FFF";
+ this.table.style.width = "100%";
+ this.table.style.border = "1px solid #6e91af";
+ this.tbody = pdoc.createElement('tbody');
+ this.table.appendChild(this.tbody);
+ this.maxOffset = (Math.ceil(providers.length/12) - 1) * 12;
+ this.cells = [];
+ for (var i = 0; i < providers.length; i++) {
+ this.cells[i] = new Cell(this, i);
+ }
+
+ this.rows = [pdoc.createElement('tr'), pdoc.createElement('tr'),
+ pdoc.createElement('tr'), pdoc.createElement('tr')];
+
+ this.otherCell = new Cell(this, -1);
+ var links = pdoc.createElement('td');
+ links.style.padding = "4px";
+ links.style.textAlign = "right";
+ links.style.verticalAlign = "middle";
+ links.colSpan = 2;
+ links.innerHTML = '<a href="http://openid.net/" style="color:#6e91af;" target="_blank">Help</a>';
+
+ var bottom_row = pdoc.createElement('tr');
+ bottom_row.style.borderTop = "1px solid #AAA";
+ bottom_row.appendChild(this.otherCell.td);
+ bottom_row.appendChild(links);
+
+ for (var j = 0; j < 4; j++) {this.tbody.appendChild(this.rows[j]);}
+ this.tbody.appendChild(bottom_row);
+
+ this.offset = 0;
+ }
+
+ _id = Grid.prototype = {};
+ _id.forward = function() {
+ this.offset = Math.min(this.offset + 12, this.maxOffset)
+ this.gen();
+ }
+ _id.back = function() {
+ this.offset = Math.max(this.offset - 12, 0)
+ this.gen();
+ }
+ _id.gen = function() {
+ for (var i = 0; i < 4; i++) {
+ var row = this.rows[i];
+ while (row.firstChild) {row.removeChild(row.firstChild);}
+ }
+ for (var i = 0; i < 12; i++) {
+ var row = this.rows[Math.floor(i/3)];
+ var cell = this.cells[this.offset + i];
+ if (cell) {
+ row.appendChild(cell.td);
+ } else {
+ row.appendChild(pdoc.createElement('td'));
+ }
+ }
+ forward.style.visibility = (this.offset == this.maxOffset) ? 'hidden' : '';
+ back.style.visibility = (this.offset == 0) ? 'hidden' : '';
+ popup.style.height = (pbody.offsetHeight + 2) + "px";
+ }
+
+ _id.select = function (cell) {
+ if (this.curr) {
+ this.curr.setSelected(false);
+ }
+
+ this.curr = cell;
+ cell.setSelected(true);
+ if (cell.idx > -1) {
+ var provider = providers[cell.idx];
+
+ if (provider["openid2"] && !provider["openid1"]) {
+ nameLabel.style.visibility = 'hidden';
+ nameTb.style.visibility = 'hidden';
+ oidTb.value = provider['website'];
+ } else {
+ nameLabel.style.visibility = '';
+ nameTb.style.visibility = '';
+
+ nameLabel.removeChild(nameLabel.firstChild);
+ var s = pdoc.createTextNode(provider.longname + " " +
+ provider.usercalled + ":");
+ nameLabel.appendChild(s);
+ nameTb.style.backgroundImage = 'url(https://www.idselector.com/static/opicons/' + provider.icon + ')';
+ oidTb.value = provider.url_prefix + "username" +
+ provider.url_suffix;
+ nameTb.value = "username";
+ }
+ btnIcn.src = 'https://www.idselector.com/static/opicons/' + provider.icon;
+ } else {
+ nameLabel.style.visibility = 'hidden';
+ nameTb.style.visibility = 'hidden';
+ btnIcn.src = 'https://www.idselector.com/images/openid.ico';
+ }
+ }
+
+ _id.setName = function (name) {
+ var p = providers[this.curr.idx];
+ oidTb.value = p.url_prefix + name + p.url_suffix;
+ }
+
+ var grid = new Grid();
+ grid.gen();
+
+ pbody.appendChild(header);
+ pbody.appendChild(grid.table);
+ pbody.appendChild(footer);
+
+ function showPopup() {
+ var scrolled = window.ActiveXObject ? (quirksMode ? document.body.scrollLeft : document.documentElement.scrollLeft) : window.pageXOffset;
+ var viewportWidth = quirksMode ? document.body.clientWidth : document.documentElement.clientWidth;
+ var xUpper = viewportWidth + scrolled - 401;
+ var x = oidTb.offsetLeft;
+ var y = oidTb.offsetTop;
+ if (oidTb.clientTop) {
+ y += oidTb.clientTop;
+ } else if (document.defaultView &&
+ document.defaultView.getComputedStyle) {
+ var cs = document.defaultView.getComputedStyle(oidTb, '');
+ y += parseInt(cs.getPropertyValue('border-top-width'));
+ y += parseInt(cs.getPropertyValue('border-bottom-width'));
+ }
+
+ var w = oidTb.offsetParent;
+ while (w) {
+ x += w.offsetLeft;
+ y += w.offsetTop;
+ if (w.clientLeft) {
+ x += w.clientLeft;
+ y += w.clientTop;
+ } else if (document.defaultView &&
+ document.defaultView.getComputedStyle) {
+
+ var cs = document.defaultView.getComputedStyle(w, '');
+ y += parseInt(cs.getPropertyValue('border-top-width'));
+ x += parseInt(cs.getPropertyValue('border-left-width'));
+ }
+ w = w.offsetParent;
+ }
+ y = y + oidTb.offsetHeight;
+
+ x = Math.max(Math.min(x, xUpper), 0);
+
+ var s = popup.style; s.left = x + "px"; s.top = y + "px";
+ s.display = 'block'; s.height = (pbody.offsetHeight + 2) + "px";
+ var html = document.body.parentNode;
+ }
+
+ function hidePopup() {
+ popup.style.display = 'none';
+ }
+
+ function cursorEnd(tb) {
+ if (tb.isTextEdit) {
+ var rng = tb.createTextRange();
+ if (rng) {
+ rng.move("character", tb.value.length);
+ rng.select();
+ }
+ }
+
+ }
+
+ function oidFocus() {
+ if (oidTb.value == "Click to Sign In") {
+ oidTb.value = 'http://';
+ }
+ cursorEnd(oidTb);
+ showPopup();
+ }
+
+ btn.onclick = function(e) {
+ (popup.style.display == 'none') ? showPopup() : hidePopup();
+ if (e) {e.cancelBubble = true;} /* safari */
+ return false;
+ }
+
+ btn.onfocus = function () {
+ btn.blur();
+ }
+
+ forward.onclick = function() {
+ grid.forward();
+ }
+
+ back.onclick = function() {
+ grid.back();
+ }
+
+ oidTb.onkeypress = function(e) {
+ var key;
+ if(window.event) {
+ key = window.event.keyCode;
+ } else if(e.which) {key = e.which;}
+ if (key != 13 && key != 9) {
+ grid.select(grid.otherCell);
+ }
+ }
+
+
+ nameTb.onkeydown = function(e) {
+ var key;
+ if(popup.contentWindow.event) {
+ key = popup.contentWindow.event.keyCode;
+ } else if(e.which) {key = e.which;}
+ if (key == 13 || key == 9) {
+ setTimeout(function () {
+ oidTb.onfocus = oidFocus;
+ oidTb.focus();
+ setTimeout(hidePopup, 1);
+ }, 1);
+ }
+ }
+
+ nameTb.onkeyup = function() {
+ var val = this.value;
+ if (!val) {
+ val = "username";
+ this.value = val;
+ this.select();
+ }
+ grid.setName(val);
+ }
+
+ oldOnResize = window.onresize;
+ window.onresize = function (evt) {
+ try {
+ if (popup.style.display == 'block') {
+ showPopup();
+ }
+ } finally {
+ oldOnResize && oldOnResize(evt);
+ }
+ }
+
+ oldOnScroll = window.onscroll;
+ window.onscroll = function (evt) {
+ try {
+ if (popup.style.display == 'block') {
+ showPopup();
+ }
+ } finally {
+ oldOnScroll && oldOnScroll(evt);
+ }
+ }
+
+ if (opIdCookie) {
+ var cell = null;
+ for (var i = 0; i < providers.length; i++) {
+ if (providers[i].id == opIdCookie) {
+ cell = grid.cells[i];
+ }
+ }
+
+ if (cell) {
+ grid.select(cell);
+ nameTb.value = unameCookie;
+ }
+ }
+
+ if (!grid.curr) {
+ grid.select(grid.otherCell);
+ }
+ if (openidCookie) {
+ oidTb.value = openidCookie;
+ } else if (orig.length == 0) {
+ oidTb.value = "Click to Sign In";
+ }
+
+ function createCookie(name,value,days) {
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime()+(days*24*60*60*1000));
+ var expires = "; expires="+date.toGMTString();
+ }
+ else var expires = "";
+ document.cookie = name+"="+encodeURIComponent(value)+expires+"; path=/";
+ }
+
+ oidTb.onfocus = oidFocus;
+
+
+ var form = null;
+ prnt = oidTb.parentNode;
+ while (prnt && prnt.nodeType == 1) {
+ if (prnt.nodeName == 'FORM') {
+ form = prnt;
+ break;
+ }
+ prnt = prnt.parentNode;
+ }
+ if (form) {
+ var oldOnSubmit = form.onsubmit;
+ form.onsubmit = function(evt) {
+ try {
+ createCookie('__openid_selector_openid', oidTb.value, 365);
+ if (grid.curr.idx > -1) {
+ var opId = providers[grid.curr.idx].id;
+ createCookie('__openid_selector_op_id', opId, 365);
+ createCookie('__openid_selector_uname', nameTb.value, 365);
+ } else {
+ createCookie('__openid_selector_op_id','',-1);
+ createCookie('__openid_selector_uname','',-1);
+ }
+ } finally {
+ if (oldOnSubmit) {
+ return oldOnSubmit(evt);
+ }
+ }
+ };
+ }
+
+ if (window.ActiveXObject) {
+ document.body.parentNode.attachEvent('onclick', function() {
+ if (window.event.srcElement != oidTb &&
+ window.event.srcElement != btn) {
+ hidePopup();
+ }
+ });
+ } else {
+ document.body.parentNode.addEventListener('click', function(evt) {
+ if (evt.target != oidTb && evt.target != btn) {hidePopup();}
+ }, false);
+ }
+ }
+
+ var oldOnLoad = window.onload;
+ window.onload = function(evt) {
+ try {
+ gen_selector();
+ } finally {
+ return oldOnLoad && oldOnLoad(evt);
+ }
+ }
+})(); \ No newline at end of file