function runtimeRegistry() {
	/*global _attachHandler, window, _execute, e, self */
	var _hashEvt = {};
	var _hashHandler = {};

	function _findCode( strCode, arr ) {
		for( var iii = 0; iii < arr.length; iii++ ) {
			if( arr[iii] == strCode ) {
				return true;
			}
		}
		return false;
	}

	function _fncDefer( voidCode, bRunMany ) {
		this.code     = voidCode;
		this.runOnce  = !bRunMany;
		this.executed = false;
		return this;
	}

	function _addEvent( strCode, strEvt, bDupeOk, bRunMany ) {
		if( strCode ) {
			var arr = _hashEvt[strEvt];
			if( !arr ) { arr = _hashEvt[strEvt] = []; }
			if( bRunMany === null ) { bRunMany = false; }
			if( bDupeOk === true ) {
				arr.push( new _fncDefer( strCode, bRunMany ) );
				_attachHandler( strEvt );
				return true;
			} else if( arr && !_findCode( strCode, arr ) ) {
				arr.push( new _fncDefer( strCode, bRunMany ) );
				_attachHandler( strEvt );
				return true;
			}
		}
		return false;
	}

	function _attachHandler( strEvt ) {
		var eh = _hashHandler[strEvt];
		if( !eh ) {
			_hashHandler[strEvt] = true;
			if( typeof window.addEventListener != 'undefined' ) { // DOM2
				window.addEventListener( strEvt, _execute, false );
			} else if( typeof window.attachEvent != 'undefined' ) { // IE
				window.attachEvent( 'on' + strEvt, _execute );
			} else {
				if( window.onload !== null ) {
					var oldOnload = window.onload;
					window.onload = function( e ) {
							oldOnload( e );
							_execute( e );
						};
				} else {
					window.onload = _execute( e );
				}
				if( window.onresize !== null ) {
					var oldResize = window.onresize;
					window.onresize = function( e ) {
							oldResize( e );
							_execute( e ) ;
						};
				} else {
					window.onresize = _execute( e );
				}
			}
		}
		return false;
	}

	function _execute( evt ) {
		if( evt && evt.type ) {
			var arr = _hashEvt[evt.type];
			if( arr ) {
				for( var iii = 0; iii < arr.length; iii++ ) {
					var dfnc = arr[iii];
					if( !( dfnc.executed && dfnc.runOnce ) ) {
						switch( typeof ( dfnc.code ) ) {
							case 'string':
								var lparen = dfnc.code.indexOf( '(' );
								if( lparen < 0 ) { dfnc.code += '()'; }
								eval( dfnc.code );
								break;
							case 'function':
								dfnc.code();
								break;
							default:
								break;
						}
						dfnc.executed = true;
					}
				}
			}
		}
		return false;
	}

	this.addEvent = function( strCode, strEvent, bDupeOk, bRunMany ) {
		return _addEvent( strCode, strEvent, bDupeOk, bRunMany );
	};
	this.addLoadEvent = function( strCode, bDupeOk ) {
		return _addEvent( strCode, 'load', bDupeOk, this.RUNONCE );
	};
	this.addResizeEvent = function( strCode, bDupeOk ) {
		return _addEvent( strCode, 'resize', bDupeOk, this.RUNMANY );
	};
	this.addUnloadEvent = function( strCode, bDupeOk ) {
		return _addEvent( strCode, 'unload', bDupeOk, this.RUNONCE );
	};

	this.DUPE_OK = true; // use as a documenting constant in calling code like:
	// RTReg.addLoadEvent( 'false', RTReg.DUPE_OK );

	this.RUNONCE = false;
	this.RUNMANY = true;
	// this.execute = function( strEvt ) { return _execute( strEvt ); }
	this.handle_event = _execute;

	return this;
} // RuntimeRegistry object

var RuntimeRegistry = new runtimeRegistry();
var RTReg = RuntimeRegistry;
// These are kept to maintain backwards compatibility
var RegisterRuntimeFunction = RTReg.addLoadEvent;
var ExecuteRegisteredFunctions = function() { return; };

function BuildQSObject() {
	var obj = {};
	if( self.location.search ) {
		var strSch = self.location.search.substr( 1 );
		var arrSch = strSch.split( '&' );
		for( var iii = 0; iii < arrSch.length; iii++ ) {
			var arrFld = arrSch[iii].split( '=' );
			if( arrFld[0].substr( 0, 4 ) == 'amp;' ) {
				arrFld[0] = arrFld[0].substr( 4 );
			}
			obj[arrFld[0]] = arrFld[1];
		}
	}
	return obj;
}
//RTReg.addLoadEvent( 'BuildQSObject();' );
var gObjQS = BuildQSObject();

