var finalizeMe = (function(){
	var global = this;
	var base;
	var safe = false;
	var svType = (global.addEventListener && 2)||
	                  (global.attachEvent && 3)|| 0;
	function addFnc(next, f){
		function t(ev){
			if(next)next(ev);
			f(ev);
		};
		t.addItem = function(d){
			if(f != d.getFunc()){ //don't add duplicates!
				if(next){
					next.addItem(d);
				}else{
					next = d;
				}
			}
			return this;
		};
		t.remove = function(d){
			if(f == d){
				f = null;
				return next;
			}else if(next){
				next = next.remove(d);
			}
			return this;
		};
		t.getFunc = function(){return f;};
		t.finalize = function(){
			if(next)next = next.finalize();
			return (f = null);
		};
		return t;
	};
	function addFunction(f){
		if(base){
			base = base.addItem(addFnc(null, f));
		}else{
			base = addFnc(null, f);
		}
	};
	function ulQue(f){
		addFunction(f);
		if(!safe){
			switch(svType){
				case 2:
					global.addEventListener("unload", base, false);
					safe = true;
					break;
				case 3:
					global.attachEvent("onunload", base);
					safe = true;
					break;
				default:
					if(global.onunload != base){
						if(global.onunload)addFunction(global.onunload);
						global.onunload = base;
					}
					break;
			}
		}
	};
	ulQue.remove = function(f){
		if(base)base.remove(f);
	};
	function finalize(){
		if(base){
			base.finalize();
			switch(svType){
				case 2:
					global.removeEventListener("unload", base, false);
					break;
				case 3:
					global.detachEvent("onunload", base);
					break;
				default:
					global.onunload = null;
					break;
			}
			base = null;
		}
		safe = false;
	};
	ulQue(finalize);
	return ulQue;
})();