]> sipb.mit.edu Git - ikiwiki.git/blob - underlays/openid-selector/ikiwiki/openid/openid-jquery.js
Remove MyOpenID from OpenID selector
[ikiwiki.git] / underlays / openid-selector / ikiwiki / openid / openid-jquery.js
1 /*
2 Simple OpenID Plugin
3 http://code.google.com/p/openid-selector/
4
5 This code is licenced under the New BSD License.
6 */
7
8 var providers_large = {
9     google: {
10         name: 'Google',
11         icon: 'http://google.com/favicon.ico',
12         url: 'https://www.google.com/accounts/o8/id'
13     },
14     yahoo: {
15         name: 'Yahoo',      
16         icon: 'http://yahoo.com/favicon.ico',
17         url: 'http://me.yahoo.com/'
18     },    
19     openid: {
20         name: 'OpenID',     
21         icon: 'wikiicons/openidlogin-bg.gif',
22         label: 'Enter your OpenID:',
23         url: null
24     }
25 };
26 var providers_small = {
27     livejournal: {
28         name: 'LiveJournal',
29         icon: 'http://livejournal.com/favicon.ico',
30         label: 'Enter your Livejournal username:',
31         url: 'http://{username}.livejournal.com/'
32     },
33     flickr: {
34         name: 'Flickr',        
35         icon: 'http://flickr.com/favicon.ico',
36         label: 'Enter your Flickr username:',
37         url: 'http://flickr.com/photos/{username}/'
38     },
39     wordpress: {
40         name: 'Wordpress',
41         icon: 'https://s2.wp.com/i/favicon.ico',
42         label: 'Enter your Wordpress.com username:',
43         url: 'http://{username}.wordpress.com/'
44     },
45     claimid: {
46         name: 'ClaimID',
47         icon: 'http://claimid.com/favicon.ico',
48         label: 'Enter your ClaimID username:',
49         url: 'http://claimid.com/{username}'
50     },
51     aol: {
52         name: 'AOL',     
53         icon: 'http://aol.com/favicon.ico',
54         label: 'Enter your AOL username:',
55         url: 'http://openid.aol.com/{username}'
56     },
57     verisign: {
58         name: 'Verisign',
59         icon: 'http://verisign.com/favicon.ico',
60         label: 'Enter your Verisign username:',
61         url: 'http://{username}.pip.verisignlabs.com/'
62     }
63 };
64 var providers = $.extend({}, providers_large, providers_small);
65
66 var openid = {
67
68         demo: false,
69         ajaxHandler: null,
70         cookie_expires: 6*30,   // 6 months.
71         cookie_name: 'openid_provider',
72         cookie_path: '/',
73         
74         img_path: 'images/',
75         
76         input_id: null,
77         provider_url: null,
78         provider_id: null,
79         localsignin_id: null,
80         
81     init: function(input_id, localsignin_id) {
82         
83         var openid_btns = $('#openid_btns');
84         
85         this.input_id = input_id;
86         
87         $('#openid_choice').show();
88         $('#openid_input_area').empty();
89         
90         // add box for each provider
91         for (id in providers_large) {
92                 openid_btns.append(this.getBoxHTML(providers_large[id], 'large'));
93         }
94
95         if (providers_small) {
96                 openid_btns.append('<br/>');
97                 
98                 for (id in providers_small) {
99                 
100                         openid_btns.append(this.getBoxHTML(providers_small[id], 'small'));
101                 }
102         }
103         if (localsignin_id != "") {
104                 this.localsignin_id=localsignin_id;
105                 openid_btns.append(
106                         '<a href="javascript: openid.signin(\'localsignin\');"' +
107                         ' style="background: #FFF" ' +
108                         'class="localsignin openid_small_btn">' +
109                         '<img alt="" width="16" height="16" src="favicon.ico" />' +
110                         ' other' +
111                         '</a>'
112                 );
113                 $('#'+this.localsignin_id).hide();
114         }
115         
116         $('#openid_form').submit(this.submit);
117         
118         var box_id = this.readCookie();
119         if (box_id) {
120                 this.signin(box_id, true);
121         }
122     },
123     getBoxHTML: function(provider, box_size) {
124         var label="";
125         var title=""
126         if (box_size == 'large') {
127                 label=' ' + provider["name"];
128         }
129         else {
130                 title=' title="'+provider["name"]+'"';
131         }
132         var box_id = provider["name"].toLowerCase();
133         return '<a' + title +' href="javascript: openid.signin(\''+ box_id +'\');"' +
134                         ' style="background: #FFF" ' + 
135                         'class="' + box_id + ' openid_' + box_size + '_btn">' +
136                         '<img alt="" width="16" height="16" src="' + provider["icon"] + '" />' +
137                         label +
138                         '</a>';
139     
140     },
141     /* Provider image click */
142     signin: function(box_id, onload) {
143
144         if (box_id == 'localsignin') {
145                 this.highlight(box_id);
146                 $('#openid_input_area').empty();
147                 $('#'+this.localsignin_id).show();
148                 this.setCookie(box_id);
149                 return;
150         }
151         else {
152                 if (this.localsignin_id) {
153                         $('#'+this.localsignin_id).hide();
154                 }
155         }
156
157         var provider = providers[box_id];
158                 if (! provider) {
159                         return;
160                 }
161                 
162                 this.highlight(box_id);
163                 
164                 this.provider_id = box_id;
165                 this.provider_url = provider['url'];
166                 
167                 // prompt user for input?
168                 if (provider['label']) {
169                         this.setCookie(box_id);
170                         this.useInputBox(provider);
171                 } else {
172                         this.setCookie('');
173                         $('#openid_input_area').empty();
174                         if (! onload) {
175                                 $('#openid_form').submit();
176                         }
177                 }
178     },
179     /* Sign-in button click */
180     submit: function() {
181         
182         var url = openid.provider_url; 
183         if (url) {
184                 url = url.replace('{username}', $('#openid_username').val());
185                 openid.setOpenIdUrl(url);
186         }
187         if(openid.ajaxHandler) {
188                 openid.ajaxHandler(openid.provider_id, document.getElementById(openid.input_id).value);
189                 return false;
190         }
191         if(openid.demo) {
192                 alert("In client demo mode. Normally would have submitted OpenID:\r\n" + document.getElementById(openid.input_id).value);
193                 return false;
194         }
195         return true;
196     },
197     setOpenIdUrl: function (url) {
198     
199         var hidden = $('#'+this.input_id);
200         if (hidden.length > 0) {
201                 hidden.value = url;
202         } else {
203                 $('#openid_form').append('<input style="display:none" id="' + this.input_id + '" name="' + this.input_id + '" value="'+url+'"/>');
204         }
205     },
206     highlight: function (box_id) {
207         
208         // remove previous highlight.
209         var highlight = $('#openid_highlight');
210         if (highlight) {
211                 highlight.replaceWith($('#openid_highlight a')[0]);
212         }
213         // add new highlight.
214         $('.'+box_id).wrap('<div id="openid_highlight"></div>');
215     },
216     setCookie: function (value) {
217     
218                 var date = new Date();
219                 date.setTime(date.getTime()+(this.cookie_expires*24*60*60*1000));
220                 var expires = "; expires="+date.toGMTString();
221                 
222                 document.cookie = this.cookie_name+"="+value+expires+"; path=" + this.cookie_path;
223     },
224     readCookie: function () {
225                 var nameEQ = this.cookie_name + "=";
226                 var ca = document.cookie.split(';');
227                 for(var i=0;i < ca.length;i++) {
228                         var c = ca[i];
229                         while (c.charAt(0)==' ') c = c.substring(1,c.length);
230                         if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
231                 }
232                 return null;
233     },
234     useInputBox: function (provider) {
235         
236                 var input_area = $('#openid_input_area');
237                 
238                 var html = '';
239                 var id = 'openid_username';
240                 var value = '';
241                 var label = provider['label'];
242                 var style = '';
243                 
244                 if (provider['name'] == 'OpenID') {
245                         id = this.input_id;
246                         value = '';
247                         style = 'background:#FFF url(wikiicons/openidlogin-bg.gif) no-repeat scroll 0 50%; padding-left:18px;';
248                 }
249                 if (label) {
250                         html = '<label for="'+ id +'" class="block">' + label + '</label>';
251                 }
252                 html += '<input id="'+id+'" type="text" style="'+style+'" name="'+id+'" value="'+value+'" />' + 
253                                         '<input id="openid_submit" type="submit" value="Login"/>';
254                 
255                 input_area.empty();
256                 input_area.append(html);
257
258                 $('#'+id).focus();
259     },
260     setDemoMode: function (demoMode) {
261         this.demo = demoMode;
262     },
263     setAjaxHandler: function (ajaxFunction) {
264         this.ajaxHandler = ajaxFunction;
265     }
266 };