/**

File: classParser.js
Author: Peter J. Frueh
Created: 8.14.2004
Last Modified: 8.21.2004

Description:
Traverses document body and parses element class names.
If the flag 'new--' is found in an elements class name, the specified 
JavaScript function becomes the "class" of that element.
The function can be passed arguments using the '-' char as a delimiter. 
NOTE: All parameters are passed into the function as type string.

Example:
<html>
<head>
	<script type="text/javascript" src="classParser.js"></script>
	<script type="text/javascript">
		function ColoredLink(strLinkColor)
		{
			this.style.color = '#' + strLinkColor;
		}
	</script
</head>
<body onload="parseClassNames()">
	<a href="blue.html" class="new--ColoredLink-0000FF">I'm Blue!</a><br>
	<a href="red.html" class="new--ColoredLink-FF0000">I'm Red!</a>
</body>
</html>

**/

function parseClassNames()
{
	if (!document.getElementById)
		return;
		
	try
	{
		var sPrefixFlag = 'new--';
		var cParamDelimiter = '-';

		var aActionElements = getElementsByClassName(sPrefixFlag, document.getElementsByTagName('body').item(0), false);

		for (var i = 0; i < aActionElements.length; i++)
		{
			var sFunctionName = '';
			var aParams = null;
			var sInitString = '';
			var sClassName = trim(aActionElements[i].className);
			var nFunctionStartIndex = parseInt(sClassName.indexOf(sPrefixFlag)) + sPrefixFlag.length;

			for (var j = nFunctionStartIndex; j < sClassName.length; j++)
			{
				var cChar = sClassName.charAt(j);
				if (cChar != cParamDelimiter && cChar != ' ')
					sFunctionName += cChar;
				else
					break;
			}

			if (cChar == cParamDelimiter)
			{
				var sParamName = '';
				aParams = new Array();

				for (var j = j + cParamDelimiter.length; j < sClassName.length; j++)
				{
					var cChar = sClassName.charAt(j);

					if (cChar != cParamDelimiter && cChar != ' ')
						sParamName += cChar;
					else
					{
						if (cChar == cParamDelimiter)
						{
							aParams[aParams.length] = sParamName;
							sParamName = '';
							j += cParamDelimiter.length - 1;
						}
						else if (cChar == ' ')
						{
							aParams[aParams.length] = sParamName;
							break;
						}
					}

					if (j == sClassName.length - 1)
					{
						aParams[aParams.length] = sParamName;
					}
				}
				sInitString = 'aActionElements[' + i + '].init(';
				for (var k = 0; k < aParams.length; k++)
				{
					sInitString += '"' + aParams[k] + '"';
					if (k != aParams.length - 1)
						sInitString += ', ';
				}
				sInitString += ');';
			}
			else
				sInitString = 'aActionElements[' + i + '].init();'

			aActionElements[i].init = eval(sFunctionName);
			eval(sInitString);
		}
	} 
	catch(error) { return; }
	
	function getElementsByClassName(sClassName, oStartNode, bStrict)
	{
		var oStartNode = (typeof(oStartNode) == 'undefined') ? document.getElementsByTagName('body').item(0) : oStartNode;
		var bStrict = (typeof(bStrict) == 'undefined') ? true : bStrict;
		var aResults = new Array();
		walkNodes(oStartNode);
		return aResults;

		function walkNodes(oStartNode)
		{
			for (var oNode = oStartNode.firstChild; oNode != null; oNode = oNode.nextSibling)
			{
				if (oNode.nodeType == 1 && oNode.className && oNode.className.indexOf(sClassName) != -1)
				{
					if (bStrict)
					{
						var nStartIndex = oNode.className.indexOf(sClassName);
						var nEndIndex = nStartIndex + sClassName.length;
						if ((oNode.className.length == sClassName.length) ||
						   (nStartIndex == 0 && oNode.className.charAt(nEndIndex) == ' ') ||
						   (oNode.className.charAt(nStartIndex - 1) == ' ' && oNode.className.charAt(nEndIndex) == ' ') ||
						   (oNode.className.charAt(nStartIndex - 1) == ' ' && oNode.className.length == nEndIndex))
						{
							aResults[aResults.length] = oNode;
						}
					}
					else
						aResults[aResults.length] = oNode;
				}
				walkNodes(oNode);
			}
		}
	}

	function trim(s)
	{
		while (s.substring(0, 1) == ' ') { s = s.substring(1, s.length); }
		while (s.substring(s.length - 1, s.length) == ' ') { s = s.substring(0, s.length-1); }
		return s;	
	}
}
