
var __ds_events=Array();

function ds_event_rec()
{
	this.type=null;
	this.node=null;
	this.listeners=Array();
}

function ds_listener_rec()
{
	this.thisptr=null;
	this.fn=null;
}

function ds_findEventRecIdx(type, node)
{
	for(var i=0; i < __ds_events.length; i++){
		if(__ds_events[i]!=null && __ds_events[i].type==type && (node==null || __ds_events[i].node==node))
			return i;
	}
	return -1;
}

function ds_event_handler_click(e)
{
	var target=getEventTarget(e);
	
	//alert("here" + target.nodeName);
	
	var idx=ds_findEventRecIdx("click", null);
	
	if(idx==-1) return;
	
	var listeners=__ds_events[idx].listeners;
	
	for(var i=0; i < listeners.length; i++){
		return eval("listeners[i].thisptr." + listeners[i].fn + "(e)");
	}
}

function attachEventClass(node, evType, thisptr, fn, useCapture)
{
	if(!attachEvent(node, evType, eval("ds_event_handler_" + evType), useCapture))
		return false;
		
	var idx=ds_findEventRecIdx(evType, node);
	var rec;
	
	if(idx==-1){
		rec=new ds_event_rec();
		__ds_events[__ds_events.length]=rec;
		rec.type=evType;
		rec.node=node;
	}
	else
		rec=__ds_events[idx];
	
	for(var i=0; i < rec.listeners.length; i++){
		if(rec.listeners[i]==thisptr)
			return true;
	}
	

	var l=new ds_listener_rec();
	rec.listeners[rec.listeners.length]=l;
	l.thisptr=thisptr;
	l.fn=fn;
	
	return true;
}

function getEvent(e)
{
	if(!e) e=window.event;
	return e;
}

function getEventTarget(e)
{
	var t=null;
	e=getEvent(e);
	if(!e.target && e.srcElement)	t=e.srcElement;
	if(t==null && e.target) t=e.target;
	return t;
}

function attachEvent(obj, evType, fn, useCapture)
{
	// Opera 7+ hacks
	if (window.opera) {
		// Opera doesn't accept attaching events on object window, but accepts them on object document
		if (obj == window) 
			obj = document;
	}

	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	} 
	else if (obj.attachEvent){
		var r = obj.attachEvent("on" + evType, fn);
		return r;
	} 
	else 
		return false;
}

function detachEvent(obj, evType, fn, useCapture) {
	// Opera 7+ hacks
	if (window.opera) {
		// Opera doesn't accept detaching events on object window, but accepts them on object document
		if (obj == window) 
			obj = document;
	}

	if (obj.removeEventListener) {
		obj.removeEventListener(evType, fn, useCapture);
		return true;
	} 
	else if (obj.detachEvent) {
		var r = obj.detachEvent("on" + evType, fn);
		return r;
	} 
	else 
		return false;
}

function cancelEvent(e, preventDefault)
{
	var bRes=false;
	e=getEvent(e);
	if(e){
		// DOM event
		if(e.stopPropagation){
			e.stopPropagation();
			bRes=true;
		}
		// ms event
		else{
			e.cancelBubble = true;
			bRes=true;
		}
	}
	if(preventDefault) 
		preventEventDefault(e);
		
	return bRes;
}

function preventEventDefault(e)
{
	e=getEvent(e);
	if(e){
		if(e.preventDefault) 
			e.preventDefault();
		else
			e.returnValue=true;
	}
}
