Dotclear

source: admin/js/confirm-close.js @ 2904:ac2188d5a99e

Revision 2904:ac2188d5a99e, 2.5 KB checked in by Dsls, 11 years ago (diff)

Exclude passwords from form modification check, fixes #2040

Line 
1function confirmClose() {
2
3     if (arguments.length > 0) {
4          for (var i=0; i<arguments.length; i++) {
5               this.forms_id.push(arguments[i]);
6          }
7     }
8};
9
10confirmClose.prototype = {
11     prompt: 'You have unsaved changes.',
12     forms_id: new Array(),
13     forms: new Array(),
14     formSubmit: false,
15
16     getCurrentForms: function() {
17          var formsInPage = this.getForms();
18          var f;
19          var This = this;
20          this.forms=new Array();
21          for (var i=0; i<formsInPage.length; i++) {
22               f = formsInPage[i];
23               var tmpForm = new Array();
24               for (var j=0; j<f.elements.length; j++) {
25                    tmpForm.push(this.getFormElementValue(f[j]));
26               }
27               this.forms.push(tmpForm);
28
29               chainHandler(f,'onsubmit',function() {
30                    This.formSubmit = true;
31               });
32          }
33     },
34
35     compareForms: function() {
36          if (this.forms.length == 0) {
37               return true;
38          }
39
40          var formsInPage = this.getForms();
41          var f;
42          for (var i=0; i<formsInPage.length; i++) {
43               f = formsInPage[i];
44               for (var j=0; j<f.elements.length; j++) {
45                    if (this.forms[i][j] != this.getFormElementValue(f[j])) {
46                         return false;
47                    }
48               }
49          }
50
51          return true;
52     },
53
54     getForms: function() {
55          if (!document.getElementsByTagName || !document.getElementById) {
56               return new Array();
57          }
58
59          if (this.forms_id.length > 0) {
60               var res = new Array();
61               var f;
62               for (var i=0; i<this.forms_id.length; i++) {
63                    f = document.getElementById(this.forms_id[i]);
64                    if (f != undefined) {
65                         res.push(f);
66                    }
67               }
68               return res;
69          } else {
70               return document.getElementsByTagName('form');
71          }
72
73          return new Array();
74     },
75
76     getFormElementValue: function(e) {
77          if (e.type != undefined && e.type == 'radio') {
78               return this.getFormRadioValue(e);
79          } else if (e.type != undefined && e.type == 'checkbox') {
80               return this.getFormCheckValue(e);
81          } else if (e.type == 'password') {
82               return null;
83          } else if (e.value != undefined) {
84               return e.value;
85          } else {
86               return null;
87          }
88     },
89
90     getFormCheckValue: function(e) {
91          if (e.checked) {
92               return e.value;
93          }
94          return null;
95     },
96
97     getFormRadioValue: function(e) {
98          for (var i=0; i <e.length; i++) {
99               if (e[i].checked) {
100                    return e[i].value;
101               } else {
102                    return null;
103               }
104          }
105          return null;
106     }
107};
108
109var confirmClosePage = new confirmClose();
110
111chainHandler(window,'onload',function() {
112     confirmClosePage.getCurrentForms();
113});
114
115chainHandler(window,'onbeforeunload',function(event_) {
116     if (event_ == undefined && window.event) {
117          event_ = window.event;
118     }
119
120     if (!confirmClosePage.formSubmit && !confirmClosePage.compareForms()) {
121          event_.returnValue = confirmClosePage.prompt;
122          return confirmClosePage.prompt;
123     }
124     return false;
125});
Note: See TracBrowser for help on using the repository browser.

Sites map