function _set_document_loaded_flag(){ window.document_loaded = true; }

function _destroy_collected(){
	for( var i = 0; i < _collected.length; ++i ){
		try{
			if( _collected[i].DESTROY )
				_collected[i].DESTROY(); // i trust you
			else{
				// try to explicitly remove possible references
				for( var j in _collected[i] ){
					_collected[i][j] = null;
				//	_collected[i]    = null; // not sure about this one, yet
				}
			}
		}catch(e){}
	}
}

// stacks for body onload/onunload function references
var _onloads   = [ _set_document_loaded_flag ];
var _onunloads = [ _destroy_collected ];
var _collected = []; // _onloads and _onunloads will take care of themselves

// add_onload(functionname) : add code block to stack to be fired on window event
function add_onload(func){     _onloads[  _onloads.length] = func; }
function add_onunload(func){ _onunloads[_onunloads.length] = func; }
function $collect(obj){      _collected[_collected.length] = obj;  }

// i despise conventional repetition over dynamic execution but i'm trying to limit memory leakage

function _execute_load_events()  { for(var i = 0; i <   _onloads.length; ++i){   _onloads[i]();   _onloads[i] = null; } }
function _execute_unload_events(){ for(var i = 0; i < _onunloads.length; ++i){ _onunloads[i](); _onunloads[i] = null; } }

//function _set_onload(){
//	if(!window.onload   && _onloads.length)
	if( window.onload   ) _onloads.push(  window.onload  );
		window.onload   = _execute_load_events;
//	if(!window.onunload && _onunloads.length)
	if( window.onunload ) _onunloads.push(window.onunload);
		window.onunload = _execute_unload_events;
//}

