// Splintered striper 1.3
// reworking of Zebra Tables and similar methods which works not only for tables and even/odd rows,
// but as a general DOM means of assigning any number of classes to children of a parent element.
// Patrick H. Lauke aka redux / www.splintered.co.uk
// Distributed under the Creative Commons Attribution-ShareAlike license - http://creativecommons.org/licenses/by-sa/2.0/

function striperLoadEvent() {
	striper ('tbody', 'striped', 'tr', 'odd, .');
	striper ('ul', 'striped', 'li', 'odd, .');
	striper ('ul', 'striped alt1', 'li', 'odd, .');
	striper ('ul', 'striped alt2', 'li', 'odd, .');
	striper ('ul', 'big_links', 'li', '.');
	striper ('ol', 'striped', 'li', 'odd, .');
	striper ('dl', 'striped', 'li', 'odd, .');
}

/*
 * Summary:      Core experiment function that applies any number of classes to all child elements
 *               contained in all occurences of a parent element (either with or without a specific class)
 * Parameters:   parentElementTag - parent tag name
 *               parentElementClass - class assigned to the parent; if null, all parentElementTag elements will be affected
 *               childElementTag -  tag name of the child elements to apply the styles to
 *               styleClasses - comma separated list of any number of style classes (using 2 classes gives the classic "zebra" effect)
 * Return:       none
 */
function striper(parentElementTag, parentElementClass, childElementTag, styleClasses)
{
	var i=0, currentParent, currentChild;

	// capability and sanity check
	if ((document.getElementsByTagName) && (parentElementTag) && (childElementTag) && (styleClasses)) {
		// turn the comma separate list of classes into an array
		var styles = styleClasses.split(',');

		// get an array of all parent tags
		var parentItems = document.getElementsByTagName(parentElementTag);

		// loop through all parent elements
		while (currentParent = parentItems[i++]) {
			// if parentElementClass was null, or if the current parent's class matches the specified class
			if ((parentElementClass == null)||(currentParent.className == parentElementClass)) {
				var j=0, k=0;

				// get all child elements in the current parent element
				var childItems = currentParent.getElementsByTagName(childElementTag);

				// loop through all child elements
				while (currentChild = childItems[j++]) {
					// based on the current element and the number of styles in the array, work out which class to apply
					k = (j+(styles.length-1)) % styles.length;

					if (styles[k] != '.') {
						// add the class to the child element - if any other classes were already present, they're kept intact
						//currentChild.className = currentChild.className+" "+styles[k];
						currentChild.className += (!currentChild.className) ? styles[k] : ' '+styles[k];
					}

					// add moveover rules for hover effect
					currentChild.onmouseover = function() {
						this.className += (!this.className) ? 'ruled' : ' ruled';
					}

					currentChild.onmouseout = function() {
						this.className = this.className.replace(' ruled', '').replace('ruled', '');
					}
				}
			}
		}
	}
}

//
// Adds event to window.onload without overwriting currently
// assigned onload functions.
function addLoadEvent(func) {
    if (window.addEventListener)
        window.addEventListener('load', func, false);
    else if (window.attachEvent)
        window.attachEvent('onload', func);
}

addLoadEvent (striperLoadEvent);

