| [0] | 1 | function 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 | |
|---|
| 10 | confirmClose.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 | |
|---|
| 145 | var confirmClosePage = new confirmClose(); |
|---|
| 146 | |
|---|
| [3449] | 147 | chainHandler(window, 'onload', function() { |
|---|
| [0] | 148 | confirmClosePage.getCurrentForms(); |
|---|
| 149 | }); |
|---|
| 150 | |
|---|
| [3449] | 151 | chainHandler(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 | }); |
|---|