MDL-31660 Rename form change detection javascript file
[moodle.git] / lib / yui / formchangechecker / formchangechecker.js
1 YUI.add('moodle-core-formchangechecker',
2     function(Y) {
3         // The CSS selectors we use
4         var CSS = {
5         };
7         var FORMCHANGECHECKERNAME = 'core-formchangechecker';
9         var FORMCHANGECHECKER = function() {
10             FORMCHANGECHECKER.superclass.constructor.apply(this, arguments);
11         }
13         Y.extend(FORMCHANGECHECKER, Y.Base, {
14                 /**
15                  * Initialize the module
16                  */
17                 initializer : function(config) {
18                     var formid = 'form#' + this.get('formid');
20                     // Add change events to the form elements
21                     Y.all(formid + ' input').once('change', M.core_formchangechecker.set_form_changed, this);
22                     Y.all(formid + ' textarea').once('change', M.core_formchangechecker.set_form_changed, this);
23                     Y.all(formid + ' select').once('change', M.core_formchangechecker.set_form_changed, this);
25                     // We need any submit buttons on the form to set the submitted flag
26                     Y.one(formid).on('submit', M.core_formchangechecker.set_form_submitted, this);
28                     // YUI doesn't support onbeforeunload properly so we must use the DOM to set the onbeforeunload. As
29                     // a result, the has_changed must stay in the DOM too
30                     window.onbeforeunload = M.core_formchangechecker.report_form_dirty_state;
31                 },
32             },
33             {
34                 NAME : FORMCHANGECHECKERNAME,
35                 ATTRS : {
36                     formid : {
37                         'value' : ''
38                     }
39                 }
40             }
41         );
43         M.core_formchangechecker = M.core_formchangechecker || {};
45         // We might have multiple instances of the form change protector
46         M.core_formchangechecker.instances = M.core_formchangechecker.instances || [];
47         M.core_formchangechecker.init = function(config) {
48             var formchangechecker = new FORMCHANGECHECKER(config);
49             M.core_formchangechecker.instances.push(formchangechecker);
50             return formchangechecker;
51         }
53         // Store state information
54         M.core_formchangechecker.stateinformation = [];
56         /**
57          * Set the form changed state to true
58          */
59         M.core_formchangechecker.set_form_changed = function() {
60             M.core_formchangechecker.stateinformation.formchanged = 1;
61         }
63         /**
64          * Set the form submitted state to true
65          */
66         M.core_formchangechecker.set_form_submitted = function() {
67             M.core_formchangechecker.stateinformation.formsubmitted = 1;
68         }
70         /**
71          * Attempt to determine whether the form has been modified in any way and
72          * is thus 'dirty'
73          *
74          * @return Integer 1 is the form is dirty; 0 if not
75          */
76         M.core_formchangechecker.get_form_dirty_state = function() {
77             var state = M.core_formchangechecker.stateinformation;
79             // If the form was submitted, then return a non-dirty state
80             if (state.formsubmitted) {
81                 return 0;
82             }
84             // If any fields have been marked dirty, return a dirty state
85             if (state.formchanged) {
86                 return 1;
87             }
89             // Handle TinyMCE editor instances
90             // We can't add a listener in the initializer as the editors may not have been created by that point
91             // so we do so here instead
92             if (typeof tinyMCE != 'undefined') {
93                 for (var editor in tinyMCE.editors) {
94                     if (tinyMCE.editors[editor].isDirty()) {
95                         return 1;
96                     }
97                 }
98             }
100             // If we reached here, then the form hasn't met any of the dirty conditions
101             return 0;
102         };
104         /**
105          * Return a suitable message if changes have been made to a form
106          */
107         M.core_formchangechecker.report_form_dirty_state = function(e) {
108             if (!M.core_formchangechecker.get_form_dirty_state()) {
109                 // the form is not dirty, so don't display any message
110                 return;
111             }
113             // This is the error message that we'll show to browsers which support it
114             var warningmessage = M.util.get_string('changesmadereallygoaway', 'moodle');
116             // Most browsers are happy with the returnValue being set on the event
117             // But some browsers do not consistently pass the event
118             if (e) {
119                 e.returnValue = warningmessage;
120             }
122             // But some require it to be returned instead
123             return warningmessage;
124         };
125     },
126     '@VERSION@', {
127         requires : ['base']
128     }
129 );