Annotation of kupu/common/kupubeforeunload.js, revision 1.1.1.1

1.1       dwinter     1: /* BeforeUnload form processing */
                      2: if (!window.beforeunload) (function() {
                      3:     var BeforeUnloadHandler = function() {
                      4:         var self = this;
                      5: 
                      6:         this.message = "Your form has not been saved. All changes you have made will be lost";
                      7:         if (window._) {
                      8:             this.message = _("Your form has not been saved. All changes you have made will be lost");
                      9:         };
                     10:         this.forms = [];
                     11:         this.chkId = [];
                     12:         this.chkType = new this.CheckType();
                     13:         this.handlers = [this.isAnyFormChanged];
                     14:         this.submitting = false;
                     15: 
                     16:         this.execute = function(event) {
                     17:             if (self.submitting) return;
                     18:             if (!event) event = window.event;
                     19: 
                     20:             for (var i = 0; i < self.handlers.length; i++) {
                     21:                 var fn = self.handlers[i];
                     22:                 var message = message || fn.apply(self);
                     23:             }
                     24:             if (message===true) message = self.message;
                     25:             if (message===false) message = undefined;
                     26:             if (event) event.returnValue = message;
                     27:             return message;
                     28:         }
                     29:         this.execute.tool = this;
                     30:     }
                     31:     var Class = BeforeUnloadHandler.prototype;
                     32: 
                     33:     // form checking code
                     34:     Class.isAnyFormChanged = function() {
                     35:         for (var i=0; i < this.forms.length; i++) {
                     36:             var form = this.forms[i];
                     37:             if (this.isElementChanged(form)) {
                     38:                 return true;
                     39:             }
                     40:         }
                     41:         return false;
                     42:     }
                     43:     Class.addHandler = function(fn) {
                     44:         this.handlers.push(fn);
                     45:     }
                     46:     Class.onsubmit = function() {
                     47:         var tool = window.onbeforeunload && window.onbeforeunload.tool;
                     48:         tool.submitting = true;
                     49:     }
                     50:     Class.addForm = function(form) {
                     51:         for (var i = 0; i < this.forms.length; i++) {
                     52:             if (this.forms[i]==form) return;
                     53:         }
                     54:         this.forms.push(form);
                     55:         form.onsubmit = this.onsubmit;
                     56:         var elements = form.getElementsByTagName('input');
                     57:         for (var j = 0; j < elements.length; j++) {
                     58:             var ele = elements[j];
                     59:             if (ele.type=='hidden') {
                     60:                 ele.setAttribute('originalValue', ele.defaultValue);
                     61:             }
                     62:         }
                     63:     }
                     64:     Class.addForms = function() {
                     65:         for (var i = 0; i < arguments.length; i++) {
                     66:             var element = arguments[i];
                     67:             if (!element) continue;
                     68:             if (element.tagName=='FORM') {
                     69:                 this.addForm(element);
                     70:             }
                     71:             else {
                     72:                 var forms = element.getElementsByTagName('form');
                     73:                 for (var j = 0; j < forms.length; j++) {
                     74:                     this.addForm(forms[j]);
                     75:                 }
                     76:             }
                     77:         }
                     78:     }
                     79:     Class.removeForms = function() {
                     80:         for (var i = 0; i < arguments.length; i++) {
                     81:             var element = arguments[i];
                     82:             if (!element) continue;
                     83:             if (element.tagName=='FORM') {
                     84:                 for (var j = 0; j < arguments.length; j++) {
                     85:                     if (this.forms[j] == element) {
                     86:                         this.forms.splice(j--, 1);
                     87:                         element.onsubmit=null;
                     88:                     }
                     89:                 }
                     90:             } else {
                     91:                 var forms = element.getElementsByTagName('form');
                     92:                 for (var j = 0; j < forms.length; j++) {
                     93:                     this.removeForms(forms[j]);
                     94:                 }
                     95:             }
                     96:         }
                     97:     }
                     98: 
                     99:     Class.CheckType = function() {};
                    100:     var c = Class.CheckType.prototype;
                    101:     c.checkbox = c.radio = function(ele) {
                    102:         return ele.checked != ele.defaultChecked;
                    103:     }
                    104:     c.password = c.textarea = c.text = function(ele) {
                    105:         return ele.value != ele.defaultValue;
                    106:     }
                    107:     // hidden: cannot tell on Mozilla without special treatment
                    108:     c.hidden = function(ele) {
                    109:         var orig = ele.getAttribute("originalValue");
                    110:         return orig && (ele.value != orig);
                    111:     }
                    112: 
                    113:     c['select-one'] = function(ele) {
                    114:         for (var i=0 ; i < ele.length; i++) {
                    115:             var opt = ele.options[i];
                    116:             if ( opt.selected != opt.defaultSelected) {
                    117:                 if (i===0 && opt.selected) continue; /* maybe no default */
                    118:                 return true;
                    119:             }
                    120:         }
                    121:         return false;
                    122:     }
                    123: 
                    124:     c['select-multiple'] = function(ele) {
                    125:         for (var i=0 ; i < ele.length; i++) {
                    126:             var opt = ele.options[i];
                    127:             if ( opt.selected != opt.defaultSelected) {
                    128:                 return true;
                    129:             }
                    130:         }
                    131:         return false;
                    132:     }
                    133: 
                    134:     Class.chk_form = function(form) {
                    135:         var elements = form.elements;
                    136:         for (var i=0; i < elements.length; i++ ) {
                    137:             var element = elements[i];
                    138:             if (this.isElementChanged(element)) {
                    139:                 return true;
                    140:             }
                    141:         }
                    142:         return false;
                    143:     }
                    144: 
                    145:     Class.isElementChanged = function(ele) {
                    146:         var method = ele.id && this.chkId[ele.id];
                    147:         if (!method && ele.type && ele.name)
                    148:             method = this.chkType[ele.type];
                    149:         if (!method && ele.tagName)
                    150:             method = this['chk_'+ele.tagName.toLowerCase()];
                    151: 
                    152:         return method? method.apply(this, [ele]) : false;
                    153:     };
                    154: 
                    155:     window.onbeforeunload = new BeforeUnloadHandler().execute;
                    156: })();

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>