// Software: Attach_behaviours
// Version:  0.2
// Date:     2005-12-10
// Author:   heerko van der kooij: info@swummoq.net
// License:  Freeware
//
// @method: attaches an eventhandler to a certain type of node within a html structure
// needs an id to start searching within
// @rootNode: 	start element id
// @elements: 	array of tagnames to search into
// @event:		event name to attach
// @method:		method to be called
// example:
//
// <div id="rootNode">
//  <ul>
//   <li>
//    <a href="#">link</a>
//   </li>
//  <ul>
// </div>
//
// to attach an onclick on the a element you would use the following javascript
// attach_behaviours ('rootNode', new Array('ul','li','a'), 'onclick', 'somefuction');

function attach_behaviours (rootNode, elements, event, method) {
	var navRoot
	if (document.getElementById && (navRoot = document.getElementById(rootNode))) {
		recurseTags (navRoot, 0, elements, event, method);
	}
}

function recurseTags(n, depth, elements, event, method) {
	var children = new Array();
	for (var i=0; i<n.childNodes.length; i++)
		if (n.childNodes[i].nodeName.toLowerCase() == elements[depth])
			children.push(n.childNodes[i]);
    if (depth==elements.length)	n[event]=this[method];
    else
    	for(var i=0; i<children.length; i++)
    		recurseTags(children[i], depth+1, elements, event, method);
}

// same as above only this uses getElementsByTagName, so it searches recusively 
// into the childnodes for the elements. 
function attach_behaviours_rec (rootNode, elements, event, method) {
	var navRoot
	if (document.getElementById && (navRoot = document.getElementById(rootNode))) {
		recurseTags2 (navRoot, 0, elements, event, method);
	}
}

function recurseTags2 (n, depth, elements, event, method) {
	var children = n.getElementsByTagName(elements[depth]);
	//alert (elements[depth] + " > "+children)
    if (depth==elements.length-1)
    {
		for(var i=0; i<children.length; i++)
		{
			children[i][event]=this[method];
			//alert (children[i][event]+ " > "+this[method])
		}
	}
    else
    	for(var i=0; i<children.length; i++)
    		recurseTags2(children[i], depth+1, elements, event, method);
}

// @method: 	attaches an eventhandler directly to an element by id
// @id: 		element id
// @event: 		event name
// @method: 	method to be called

function attachEventToId (id, event, method)
{
	if (document.getElementById(id))
	{
		document.getElementById(id)[event] = this[method];
	}
}

function removeEventFromId (id, event)
{
	if (document.getElementById(id))
	{
		document.getElementById(id)[event] = function(){;};
	}
}

function attachEventToNode (node, event, method)
{
	if (node)
	{
		node[event] = this[method];
	}
}

function removeEventFromNode (node, event)
{
	if (node)
	{
		node[event] = function(){;};
	}
}

// doesnt really belong in this document but i dont know where to put it
function Element_getElementById (node, id)
{
	for (var i=0; i<node.childNodes.length; i++)
	{
		var n = node.childNodes[i];
		if (n.id && n.id == id)	return n;
		else
		{
			if (n.nodeName != "#text") 
			{
				var r = Element_getElementById (n, id);
				if (r) return r
			}
		}
	}
	return false;
}

// add/remove event from quirksmode.org
function addEvent( obj, type, fn, capt )
{
	if (capt==null) capt=false;
	if (obj.addEventListener)
		obj.addEventListener( type, fn, capt );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
	else{ obj["on"+type] = obj["e"+type+fn]; }
}

function removeEvent( obj, type, fn, capt )
{
	if (capt==null) capt=false;
	if (obj.removeEventListener)
		obj.removeEventListener( type, fn, capt );
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
	else{ obj["on"+type] = null; }
}