hide popup message if failure is handled - not sure what knock on effect this may...
[Pman.Core] / Pman.Login.js
1 //<script type="text/javascript">
2
3 /**
4  * login code -
5  * fires Pman 'authrefreshed'  event on every poll to server..
6  *
7  */
8
9 /***
10 re-arrange language code...
11 * flipping language should be like this:
12
13 * Ext.apply(_T, _T[lang]);
14
15 **/
16  
17   
18
19 Pman.Login =  new Roo.util.Observable({
20     
21     events : {
22         
23         'render' : true
24        
25     },
26     disabled : false,
27     
28     dialog : false,
29     form: false,
30     haslogo : false,
31     
32     authUserId: 0,
33     authUser: { id : false },
34        
35     checkFails : 0,
36     versionWarn: false,
37     sending : false,
38     
39     checkConnection : false, // the Roo.data.Connection for checking if still authenticated.
40     
41     onLoad : function() // called on page load...
42     {
43         // load 
44        
45          
46         if (Roo.get('loading')) {
47             Roo.get('loading').remove();
48         }
49         this.switchLang('en');
50        
51         // check if we are logged in..
52         Roo.Ajax.request({  
53             url: baseURL + '/Login.js',  
54             params: {
55                 getAuthUser: true
56             },  
57             method: 'GET',  
58             success:  function(response, opts)  {  // check successfull...
59             
60                 var res = Pman.processResponse(response);
61                 this.checkFails =0;
62                 if (!res.success) { // error!
63                     this.checkFails = 5;
64                     //console.log('call failure');
65                     return Pman.Login.failure(response,opts);
66                 }
67                 
68                 
69                 if (!res.data.id) { // id=0 == login failure.
70                     return this.show(true);
71                 }
72                 
73                               
74                         //console.log(success);
75                 this.fillAuth(res.data);   
76                 this.checkFails =0;
77                 Pman.onload();
78                 return false;
79             },
80             failure : Pman.Login.show,
81             scope : Pman.Login
82               
83         });  
84     }, 
85     
86     
87     check: function(again) // called every so often to refresh cookie etc..
88     {
89         if (again) { // could be undefined..
90             Pman.Login.checkFails++;
91         } else {
92             Pman.Login.checkFails = 0;
93         }
94         var _this = this;
95         if (this.sending) {
96             
97             if ( Pman.Login.checkFails > 4) {
98                 Pman.Preview.disable();
99                 Roo.MessageBox.alert("Error",  
100                     "Error getting authentication status. - try reloading, or wait a while", function() {
101                         _this.sending = false;
102                     }); 
103                 return;
104             }
105             
106             _this.check.defer(10000, _this, [ true ]); // check in 10 secs.
107             return;
108         }
109         this.sending = true;
110         if (!this.checkConnection) {
111             this.checkConnection = new Roo.data.Connection();
112         }
113         this.checkConnection.request({
114             url: baseURL + '/Login.js',  
115             params: {
116                 getAuthUser: true
117             },  
118             method: 'GET',  
119             success:  Pman.Login.success,
120             failure : Pman.Login.failure,
121             scope : Pman.Login
122               
123         });  
124     }, 
125     
126     
127     
128     failure : function (response, opts) // called if login 'check' fails.. (causes re-check)
129     {
130         this.authUser = -1;
131         this.sending = false;
132         var res = Pman.processResponse(response);
133         //console.log(res);
134         if ( Pman.Login.checkFails > 2) {
135             Pman.Preview.disable();
136             Roo.MessageBox.alert("Error", res.errorMsg ? res.errorMsg : 
137                 "Error getting authentication status. - try reloading"); 
138             return;
139         }
140             
141         Pman.Login.check.defer(1000, Pman.Login, [ true ]);
142         return;  
143     },
144     
145     
146     success : function(response, opts)  // check successfull...
147     {  
148         this.sending = false;
149         var res = Pman.processResponse(response);
150         if (!res.success) {
151             return this.failure(response, opts);
152         }
153         if (!res.data || !res.data.id) {
154             return this.failure(response,opts);
155         }
156         //console.log(res);
157         this.fillAuth(res.data);
158         
159         this.checkFails =0;
160         
161         
162         if (Pman.onload) { 
163             Pman.onload();
164         }
165         if (Pman.Login.callback) {
166             Pman.Login.callback();
167             
168         }
169         return false;
170     },
171     
172     fillAuth: function(au) {
173         this.startAuthCheck();
174         this.authUserId = au.id;
175         this.authUser = au;
176         this.lastChecked = new Date();
177         // if login is used on other applicaitons..
178         if (Pman.fireEvent) { Pman.fireEvent('authrefreshed', au); }
179         
180         
181         //Pman.Tab.FaxQueue.newMaxId(au.faxMax);
182         //Pman.Tab.FaxTab.setTitle(au.faxNumPending);
183         
184         //this.switchLang(Roo.state.Manager.get('Pman.Login.lang', 'en'));
185         Roo.state.Manager.set('Pman.Login.lang.'+appNameShort, au.lang);
186         this.switchLang(au.lang);
187         
188      
189         // open system... - -on setyp..
190         if (this.authUserId  < 0) {
191             Roo.MessageBox.alert("Warning", 
192                 "This is an open system - please set up a admin user with a password.");  
193         }
194          
195         //Pman.onload(); // which should do nothing if it's a re-auth result...
196         
197              
198     },
199     
200     
201     intervalID : false,   /// the login refresher...
202     
203     lastChecked : false,
204     
205     startAuthCheck : function() // starter for timeout checking..
206     {
207         if (Pman.Login.intervalID) { // timer already in place...
208             return false;
209         }
210         
211         Pman.Login.intervalID =  window.setInterval(function() {
212                   Pman.Login.check(false);
213                 }, 120000); // every 120 secs = 2mins..
214         return true;
215         
216     },
217     
218     
219     create : function()
220     {
221         if (this.dialog) {
222             return;
223         }
224         var _this = this;
225         
226         this.dialog = new Roo.LayoutDialog(Roo.get(document.body).createChild({tag:'div'}),
227         { // the real end set is here...
228             autoCreated: true,
229             title: "Login",
230             modal: true,
231             width:  350,
232             height: 230,
233             shadow:true,
234             minWidth:200,
235             minHeight:180,
236             //proxyDrag: true,
237             closable: false,
238             draggable: false,
239             collapsible: false,
240             resizable: false,
241             center: {
242                 autoScroll:false,
243                 titlebar: false,
244                // tabPosition: 'top',
245                 hideTabs: true,
246                 closeOnTab: true,
247                 alwaysShowTabs: false
248             }  
249             
250         });
251         
252         
253         
254         this.dialog.addButton("Forgot Password", function()
255         {
256             
257             var n = _this.form.findField('username').getValue();
258             if (!n.length) {
259                 Roo.MessageBox.alert("Error", "Fill in your email address");
260                 return;
261             }
262             new Pman.Request({
263                 url: baseURL + '/Login.js',
264                 mask : "Sending Password Reset email",
265                 params: {
266                     passwordRequest: n
267                 },
268                 method: 'POST',  
269                 success:  function(res)  {  // check successfull...
270                 
271                     if (!res.success) { // error!
272                        Roo.MessageBox.alert("Error" , res.errorMsg ? res.errorMsg  : "Problem Requesting Password Reset");
273                        return;
274                     }
275                     Roo.MessageBox.alert("Notice" , "Please check you email for the Password Reset message");
276                 },
277                 failure : function() {
278                     Roo.MessageBox.alert("Error" , "Problem Requesting Password Reset");
279                 }
280                 
281             });
282         });
283         
284         this.dialog.addButton("Login", function()
285         {
286             Pman.Login.dialog.el.mask("Logging in");
287             Pman.Login.form.doAction('submit', {
288                     url: baseURL + '/Login',
289                     method: 'POST'
290             });
291         });
292         this.layout = this.dialog.getLayout();
293         this.layout.beginUpdate();
294         
295         //layout.add('center', new Roo.ContentPanel('center', {title: 'The First Tab'}));
296         // generate some other tabs
297         this.form = new Roo.form.Form({
298             labelWidth: 100 ,
299             
300             listeners : {
301                 actionfailed : function(f, act) {
302                     // form can return { errors: .... }
303                         
304                     //act.result.errors // invalid form element list...
305                     //act.result.errorMsg// invalid form element list...
306                     
307                     Pman.Login.dialog.el.unmask();
308                     var msg = act.result.errorMsg || act.result.message;
309                     msg = msg ||   "Login failed - communication error - try again.";
310                     Roo.MessageBox.alert("Error",  msg); 
311                               
312                 },
313                 actioncomplete: function(re, act) {
314                      
315                     Roo.state.Manager.set('Pman.Login.username.'+appNameShort,  Pman.Login.form.findField('username').getValue() );
316                     Roo.state.Manager.set('Pman.Login.lang.'+appNameShort,  Pman.Login.form.findField('lang').getValue() );
317                     Pman.Login.fillAuth(act.result.data);
318                       
319                     Pman.Login.dialog.hide();
320                     if (Roo.get('loading-mask')) {
321                         //Roo.get('loading').show();
322                         Roo.get('loading-mask').show();
323                     }
324                     if (Pman.onload) { 
325                         Pman.onload();
326                     }
327                     if (Pman.Login.callback) {
328                         Pman.Login.callback();
329                      
330                     }
331                     
332                 }
333             }
334         
335             
336             
337              
338         });
339           
340         
341         
342         this.form.add( 
343        
344             new Roo.form.TextField({
345                 fieldLabel: "Email Address",
346                 name: 'username',
347                 width:200,
348                 autoCreate : {tag: "input", type: "text", size: "20"}
349             }),
350
351             new Roo.form.TextField({
352                 fieldLabel: "Password",
353                 inputType: 'password',
354                 name: 'password',
355                 width:200,
356                 autoCreate : {tag: "input", type: "text", size: "20"},
357                 listeners : {
358                     specialkey : function(e,ev) {
359                         if (ev.keyCode == 13) {
360                             Pman.Login.dialog.el.mask("Logging in");
361                             Pman.Login.form.doAction('submit', {
362                                     url: baseURL + '/Login',
363                                     method: 'POST'
364                             });
365                         }
366                     }
367                 }  
368             }) ,
369             new Roo.form.ComboBox({
370                 fieldLabel: "Language",
371                 name : 'langdisp',
372                 store: {
373                     xtype : 'SimpleStore',
374                     fields: ['lang', 'ldisp'],
375                     data : [
376                         [ 'en', 'English' ],
377                         [ 'zh_HK' , '\u7E41\u4E2D' ],
378                         [ 'zh_CN', '\u7C21\u4E2D' ]
379                     ]
380                 },
381                 
382                 valueField : 'lang',
383                 hiddenName:  'lang',
384                 width: 200,
385                 displayField:'ldisp',
386                 typeAhead: false,
387                 editable: false,
388                 mode: 'local',
389                 triggerAction: 'all',
390                 emptyText:'Select a Language...',
391                 selectOnFocus:true,
392                 listeners : {
393                     select :  function(cb, rec, ix) {
394                         
395                         
396                         Pman.Login.switchLang(rec.data.lang);
397                         
398                     }
399                 }
400             
401             })
402
403         );
404          
405         
406         var ef = this.dialog.getLayout().getEl().createChild({tag: 'div'});
407         ef.dom.style.margin = 10;
408           
409         this.form.render(ef.dom);
410          // logoprefix comes from base config - normally the owner company logo...
411          // ??? 
412          
413         var img = typeof(appLogo) != 'undefined'  && appLogo.length ? appLogo :
414             rootURL + '/Pman/'+appNameShort + '/templates/images/logo.gif' ;
415          
416          Pman.Login.form.el.createChild({
417                 tag: 'img', 
418                 src: img,
419                 style: 'margin-bottom: 10px;'
420             },
421             Pman.Login.form.el.dom.firstChild 
422         ).on('error', function() {
423             this.dom.style.visibility = 'hidden';
424             this.dom.style.height = '10px';
425         });
426        
427         var vp = this.dialog.getLayout().add('center', new Roo.ContentPanel(ef, {
428             autoCreate : true,
429             //title: 'Org Details',
430             //toolbar: this.tb,
431             width: 250,
432             maxWidth: 250,
433             fitToFrame:true
434         }));
435         
436         this.layout.endUpdate();
437         
438         this.fireEvent('render', this);
439         
440         
441         
442         
443         
444     },
445     resizeToLogo : function()
446     {
447         var sz = Roo.get(Pman.Login.form.el.query('img')[0]).getSize();
448         if (!sz) {
449             this.resizeToLogo.defer(1000,this);
450             return;
451         }
452         var w = Roo.lib.Dom.getViewWidth() - 100;
453         var h = Roo.lib.Dom.getViewHeight() - 100;
454         Pman.Login.dialog.resizeTo(Math.max(350, Math.min(sz.width + 30, w)),Math.min(sz.height+200, h));
455         Pman.Login.dialog.center();
456     },
457     
458      
459     
460     show: function (modal, cb) 
461     {
462         if (this.disabled) {
463             return;
464         }
465         
466         
467         
468         this.callback = cb; // used for non-pman usage..
469         modal = modal || false;
470         if (Pman.Login.authUserId < 0) { // logout!?
471             return;
472         }
473         
474         if (Pman.Login.intervalID) {
475             // remove the timer
476             window.clearInterval(Pman.Login.intervalID);
477             Pman.Login.intervalID = false;
478         }
479         
480         this.create();
481         
482         
483         
484         if (Roo.get('loading')) {
485             Roo.get('loading').remove();
486         }
487         if (Roo.get('loading-mask')) {
488             Roo.get('loading-mask').hide();
489         }
490         
491         //incomming._node = tnode;
492         // why we want this non-modal????
493         this.form.reset();
494         this.dialog.modal = !modal;
495         this.dialog.show();
496         this.dialog.el.unmask(); 
497         this.resizeToLogo.defer(1000,this);
498         
499         // if we have not created a provider.. do it now...
500         if (!Roo.state.Manager.getProvider().expires) { 
501             Roo.state.Manager.setProvider(new Roo.state.CookieProvider());
502         }
503          
504          
505         this.form.setValues({
506             'username' : Roo.state.Manager.get('Pman.Login.username.'+appNameShort, ''),
507             'lang' : Roo.state.Manager.get('Pman.Login.lang.'+appNameShort, 'en')
508         });
509         Pman.Login.switchLang(Roo.state.Manager.get('Pman.Login.lang.'+appNameShort, ''));
510         if (this.form.findField('username').getValue().length > 0 ){
511             this.form.findField('password').focus();
512         } else {
513            this.form.findField('username').focus();
514         }
515         
516         
517     },
518  
519     
520      
521     logout: function()
522     {
523         window.onbeforeunload = function() { }; // false does not work for IE..
524         Pman.Login.authUserId = -1;
525         Roo.Ajax.request({  
526             url: baseURL + '/Login.html',  
527             params: {
528                 logout: 1
529             },  
530             method: 'GET',
531             failure : function() {
532                 Roo.MessageBox.alert("Error", "Error logging out. - continuing anyway.", function() {
533                     document.location = baseURL + '?ts=' + Math.random();
534                 });
535                 
536             },
537             success : function() {
538                 Pman.Login.authUserId = -1;
539                 Pman.Login.checkFails =0;
540                 // remove the 
541                 document.location = baseURL + '?ts=' + Math.random();
542             }
543               
544               
545         }); 
546     },
547     switchLang : function (lang) {
548         if (!lang || !lang.length) {
549             return;
550         }
551         if (typeof(_T.en) == 'undefined') {
552             _T.en = {};
553             Roo.apply(_T.en, _T);
554         }
555         
556         if (typeof(_T[lang]) == 'undefined') {
557             Roo.MessageBox.alert("Sorry", "Language not available yet (" + lang +')');
558             return;
559         }
560         
561         
562         Roo.apply(_T, _T[lang]);
563         // just need to set the text values for everything...
564         if (this.form) {
565             
566                
567             function formLabel(name, val) {
568                 
569                 var lbl = Pman.Login.form.findField( name ).el.dom.parentNode.parentNode;
570                 if (lbl.getElementsByTagName('label').length) {
571                     lbl = lbl.getElementsByTagName('label')[0];
572                 } else  {
573                     lbl = lbl.parentNode.getElementsByTagName('label')[0];
574                 }
575                    
576                 lbl.innerHTML = val;
577             }
578             
579             formLabel('password', "Password"+':');
580             formLabel('username', "Email Address"+':');
581             formLabel('lang', "Language"+':');
582             this.dialog.setTitle("Login");
583             this.dialog.buttons[0].setText("Forgot Password");
584             this.dialog.buttons[1].setText("Login");
585         }
586         
587         
588     },
589     
590     inGroup : function(g)
591     {
592         return this.authUser && this.authUser.groups && 
593             this.authUser.groups.indexOf(g) > -1;
594     },
595     isOwner : function()
596     {
597         return this.authUser && this.authUser.company_id_comptype && 
598             this.authUser.company_id_comptype == 'OWNER';
599     },
600     
601     /**
602      * Depreciated = use Pman.I18n
603      */
604     
605     i18nList: function (type, codes)
606     {
607         
608         return Pman.I18n.listToNames(type, codes);
609     },
610     i18n: function(type, code) 
611     {
612         return Pman.I18n.toName(type, code);
613         
614     }
615     
616     
617 });
618
619
620
621
622