Dotclear

source: admin/js/confirm-close.js @ 3449:bddaf36a61e9

Revision 3449:bddaf36a61e9, 3.6 KB checked in by franck <carnet.franck.paul@…>, 9 years ago (diff)

Fixes confirm-close.js code, switch meta-editor.js a links to buttons, addresses #1776

RevLine 
[0]1function confirmClose() {
[2566]2
[0]3     if (arguments.length > 0) {
[3449]4          for (var i = 0; i < arguments.length; i++) {
[0]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,
[2566]15
[0]16     getCurrentForms: function() {
[3449]17          // Store current form's element's values
18
[0]19          var formsInPage = this.getForms();
[3449]20          var f, e;
[0]21          var This = this;
[3449]22          this.forms = new Array();
23          for (var i = 0; i < formsInPage.length; i++) {
[0]24               f = formsInPage[i];
25               var tmpForm = new Array();
[3449]26               for (var j = 0; j < f.elements.length; j++) {
27                    e = this.getFormElementValue(f[j]);
28                    if (e != undefined) {
29                         tmpForm.push(e);
30                    }
[0]31               }
32               this.forms.push(tmpForm);
[2566]33
[3449]34               chainHandler(f, 'onsubmit', function() {
[0]35                    This.formSubmit = true;
36               });
37          }
38     },
[2566]39
[0]40     compareForms: function() {
[3449]41          // Compare current form's element's values to their original values
42          // Return false if any difference, else true
43
[0]44          if (this.forms.length == 0) {
45               return true;
46          }
[2566]47
[0]48          var formsInPage = this.getForms();
[3449]49          var f, e;
50          for (var i = 0; i < formsInPage.length; i++) {
[0]51               f = formsInPage[i];
[3449]52               var tmpForm = new Array();
53               for (var j = 0; j < f.elements.length; j++) {
54                    e = this.getFormElementValue(f[j]);
55                    if (e != undefined) {
56                         tmpForm.push(e);
57                    }
58               }
59               for (var j = 0; j < this.forms[i].length; j++) {
60                    if (this.forms[i][j] != tmpForm[j]) {
[0]61                         return false;
62                    }
63               }
64          }
[2566]65
[0]66          return true;
67     },
[2566]68
[0]69     getForms: function() {
[3449]70          // Get current list of forms as HTMLCollection(s)
71
[0]72          if (!document.getElementsByTagName || !document.getElementById) {
73               return new Array();
74          }
[2566]75
[0]76          if (this.forms_id.length > 0) {
77               var res = new Array();
78               var f;
[3449]79               for (var i = 0; i < this.forms_id.length; i++) {
[0]80                    f = document.getElementById(this.forms_id[i]);
81                    if (f != undefined) {
82                         res.push(f);
83                    }
84               }
85               return res;
86          } else {
87               return document.getElementsByTagName('form');
88          }
[2566]89
[0]90          return new Array();
91     },
[2566]92
[0]93     getFormElementValue: function(e) {
[3449]94          // Return current value of an form element
95
96          if (e == undefined) {
97               // Unknown object
98               return undefined;
99          }
100          if (e.type != undefined && e.type == 'button') {
101               // Ignore button element
102               return undefined;
103          }
104          if (e.classList.contains('meta-helper') || e.classList.contains('checkbox-helper')) {
105               // Ignore some application helper element
106               return undefined;
[3445]107          }
[0]108          if (e.type != undefined && e.type == 'radio') {
[3449]109               // Return actual radio button value if selected, else null
[0]110               return this.getFormRadioValue(e);
111          } else if (e.type != undefined && e.type == 'checkbox') {
[3449]112               // Return actual checkbox button value if checked, else null
[0]113               return this.getFormCheckValue(e);
[3449]114          } else if (e.type != undefined && e.type == 'password') {
115               // Ignore password element
[2904]116               return null;
[0]117          } else if (e.value != undefined) {
[3449]118               // Return element value if not undefined
[0]119               return e.value;
120          } else {
[3449]121               // Every other case, return null
[0]122               return null;
123          }
124     },
[2566]125
[0]126     getFormCheckValue: function(e) {
127          if (e.checked) {
128               return e.value;
129          }
130          return null;
131     },
[2566]132
[0]133     getFormRadioValue: function(e) {
[3449]134          for (var i = 0; i < e.length; i++) {
[0]135               if (e[i].checked) {
136                    return e[i].value;
137               } else {
138                    return null;
139               }
140          }
141          return null;
142     }
143};
144
145var confirmClosePage = new confirmClose();
146
[3449]147chainHandler(window, 'onload', function() {
[0]148     confirmClosePage.getCurrentForms();
149});
150
[3449]151chainHandler(window, 'onbeforeunload', function(event_) {
[0]152     if (event_ == undefined && window.event) {
153          event_ = window.event;
154     }
[2566]155
[0]156     if (!confirmClosePage.formSubmit && !confirmClosePage.compareForms()) {
157          event_.returnValue = confirmClosePage.prompt;
158          return confirmClosePage.prompt;
159     }
160     return false;
[2566]161});
Note: See TracBrowser for help on using the repository browser.

Sites map