/**
 * @author giuseppe
 */
try
{ var test = (WILLGOODWIN.name == 'WILLGOODWIN'); }
catch (e)
{ WILLGOODWIN = {}; }


WILLGOODWIN.dom = {};

WILLGOODWIN.dom.recurseAllChildNodes 	= function ( node , injected_function, params)
{
	if( node )
	{ 
		injected_function( node, params ); 
		for( var i= 0; i< node.childNodes.length; i++ )
		{								
			var childnode = node.childNodes[i];
			if( childnode != undefined && (childnode.nodeType == childnode.ELEMENT_NODE || childnode.nodeType == 1) ){		// <- IE doesn't support node.ELEMENT_NODE therefore || node.nodeType == 1			
				WILLGOODWIN.dom.recurseAllChildNodes(childnode, injected_function, params);
			}
		}

	}	
}


//The difference between this function and the above is the scope of injected_function
//here the injected function is run within the scope of the object that declares the function
//while the above is run with the scope of the window object.
//The following has also a return of the original node.

WILLGOODWIN.dom.recurseAllChildNodesWithDelegate 	= function ( node , scope, injected_function, params)
{
	if( node )
	{ 
		WILLGOODWIN.delegate(scope, injected_function, params);
		for( var i= 0; i< node.childNodes.length; i++ )
		{								
			var childnode = node.childNodes[i];
			if( childnode != undefined && (childnode.nodeType == childnode.ELEMENT_NODE || childnode.nodeType == 1) ){		// <- IE doesn't support node.ELEMENT_NODE therefore || node.nodeType == 1	

				try{params.currentNode = childnode}catch(e){};

				node.replaceChild(WILLGOODWIN.dom.recurseAllChildNodesWithDelegate(childnode, scope, injected_function, params),node.childNodes[i]);
				//#note: we are using the replace child because IE complains with the following code
				//node.childNodes[i] = WILLGOODWIN.dom.recurseAllChildNodesWithDelegate(childnode, scope, injected_function, params);
			}
		}

	}
	return node;	
}

WILLGOODWIN.dom.getElementPosition = function(element)
{
	var left = 0, top = 0;
	if (element.offsetParent) 
	{
		do 
		{
			left += element.offsetLeft;
			top += element.offsetTop;
		}
		while (element = element.offsetParent);
			}
	return {
		'left': left,
		'top': top
	};
};


/*
Class manipulation functions
*/
WILLGOODWIN.dom.hasClass = function (element, classToCheck)
{
	var classList;
	var classPresent = false;

	if (element.className)
	{ classList = element.className.split(' '); }
	else if (element.getAttribute && element.getAttribute('class'))
	{ classList = element.getAttribute('class').split(' '); }
	else
	{ return false; }
		
	for (var i=0; i<classList.length; i++)
	{ classPresent = (classList[i] == classToCheck) || classPresent; }
	return classPresent;
};
WILLGOODWIN.dom.addClass = function (element, newClass) {
	if (!element.className)
	{ element.className = newClass; }
	else
	{
		var currentClasses = element.className.split(' ');
		currentClasses[currentClasses.length] = newClass;
		element.className = currentClasses.join(' ');
	}
};
WILLGOODWIN.dom.removeClass = function (element, classToRemove) {
	if (element.className)
	{
		var currentClasses = element.className.split(' ');
		for (var n=0; n<currentClasses.length; n++)
		{
			if (currentClasses[n] == classToRemove)
			{
				currentClasses.splice(n, 1);
				break;
			}
		}
		element.className = currentClasses.join(' ');
	}
};
WILLGOODWIN.dom.replaceClass = function (element, oldClass, newClass) {
	this.removeClass(element, oldClass);
	this.addClass(element, newClass);
};


WILLGOODWIN.dom.getElementsByClassName = function(searchClass, node, tag)
{
	var classElements = [];
	if (!node) 
	{
		node = document;
	}
	if (!tag) 
	{
		tag = '*';
	}
	var els = node.getElementsByTagName(tag);
	var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
	for (i = 0, elsLen = els.length; i < elsLen; i++) 
	{
		if (pattern.test(els[i].className)) 
		{
			classElements.push(els[i]);
		}
	}
	return classElements;
};


