
// For implementations that don't include the push() methods for arrays.
if (!Array.prototype.push)
{
    Array.prototype.push = function(elem)
    {
        this[this.length] = elem;
    }
}
var s="qqwer";
function showEvents(oElement)
{

if (oElement.firstChild)
{
	for(var node = oElement.firstChild; node; node = node.nextSibling)
	{


		for (i in node)
		{
			if (i.indexOf("on")===0 && node[i])
			{
			s += "<b>"+i+"</b><br>"+node[i]+"<hr>";
			}
		}

	showEvents(node);
	}
}

}
/* not used form.id : problem solved :)

function getObjectId(oObject)
{
return 	(typeof (oObject.id) =='string'
	|| oObject.id===undefined)
		? oObject.id 
		: (typeof (formId=oObject.children[0].form.id) == 'string'
			? formId
			: oObject.getAttribute('id')
		);
}

*/
var EventManager = 
{
_registry : null,
_registry2 : Array(),

Initialise : function()
    {
        if (this._registry == null)
        {
            this._registry = {};
            this._registry2 = [];


            // Register the cleanup handler on page unload.
            EventManager.Add(window, "unload", this.CleanUp);
        }
    }

, Add : function(obj, type, fn, useCapture)
    {
        this.Initialise();
var objId;
        if (typeof obj == "string")
        {
        objId = obj;
        obj = document.getElementById(obj);

        }
        if (obj == null || fn == null)
            return false;

		if (typeof(obj.id)=='string'
		|| typeof(objId)=='string')
		{
		var rid = typeof(obj.id)=='string'
		? obj.id
		: objId;
		
			if (!this._registry[rid])
			this._registry[rid] = {};

			if (!this._registry[rid][type])
			this._registry[rid][type] = [];

		var rc = this._registry[rid][type];

		rc[rc.length] = {fn: fn};
		rc  = undefined;
		rid = undefined;
		}
		else
		{
		this._registry2.push({"obj":obj, "type":type, "fn":fn, "useCapture":false})
		}
    }

, AddAll : function()
{
var rc, obj, i=0, maxi=0;

	for (i=0, maxi = this._registry2.length; i<maxi; ++i)
	{
	rc = this._registry2[i];

	        if (rc.obj.addEventListener)
        	{
		rc.obj.addEventListener(rc.type, rc.fn, false);
		
		}
	        
		else if (rc.obj.attachEvent 
		&& rc.obj.attachEvent("on" + rc.type, rc.fn))
		{
	        }

	}

	for (objectId in this._registry)
	{
	obj = document.getElementById(objectId);

	function generateHandler(aHandlers)
	{
	return function(argEvent) 
		{
		var j;

			for (j=0; j<aHandlers.length; ++j)
			aHandlers[j]['fn'](argEvent);

		}
	}

		for (eventName in this._registry[objectId])
		{
		this.attachEventHandler(obj, eventName, 
		generateHandler(this._registry[objectId][eventName])
		// test dummy // function(){}
		
		);


	        this._registry[objectId][eventName] = undefined;
		}
        this._registry[objectId] = undefined;
	}
this._registry = undefined;

}

    , CleanUp: function()
    {
    var obj= null, rr=null;
        for (var i = 0; i < EventManager._registry2.length; i++)
        {
        rr = EventManager._registry2[i];

        obj = (typeof rr.obj == "string")
        	? document.getElementById(rr.obj)
        	: rr.obj;

                // Mozilla/W3C listeners?
                if (obj.removeEventListener)
                    obj.removeEventListener(rr.type, rr.fn, false);
                // IE-style listeners?
                else if (obj.detachEvent)
                {
                    obj.detachEvent("on" + rr.type, rr.fn);

                    //alert(obj["on" + rr.type]);
      		}
      		else
      		alert('detach failed:\ntagName='+obj.tagName+'\nid='+getObjectId(obj)+"\nevent"+rr.type+"\nhandler="+rr.fn);      
        }

        // Kill off the registry itself to get rid of the last remaining
        // references.
        EventManager._registry = null;
//        showEvents(document.body);
//    var w = window.open("/test1/1.html");
//w.document.write(s);

    }
, attachEventHandler : function(obj, eventName, fn)
{

	if (obj.addEventListener)
	{
	obj.addEventListener(eventName, fn, false);
	this._registry2.push({"obj":obj.id, "type":eventName, "fn":fn, "useCapture":false})		
	return true;
        }

        else if (obj.attachEvent 
	&& obj.attachEvent("on" + eventName, fn))
        {
	this._registry2.push({"obj":obj.id, "type":eventName, "fn":fn, "useCapture":false})		
        return true;
	}

return false;

}
};




