Annotation of kupuMPIWG/common/kupubeforeunload.js, revision 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>