/**
 * Filters HTML elements based on their classnames.
 *
 * Copyright 2007 by <GX> creative online development B.V.
 * <GX> open for business
 * http://gx.nl
 *
 * @author	StijnW <Stijn.de.Witt@gx.nl>
 * @date		2007/08/22
 * @desc		KPNP-182
 */

function FilterDefinition(value, description, enabled) {
	this.value = value;
	this.description = description;
	this.enabled = (enabled != null) ? enabled : false;
}

function ElementFilter(elementClass, filters, discard) {
	this.elementClass = elementClass ? elementClass : "filterelement";
	this.filters = filters ? filters : new Array();
	this.discard = (discard != null) ? discard : false;

	this.setFilterState = function(value, enable) {
		for (var idx=0; idx < this.filters.length; idx++) {
			if (this.filters[idx].value == value) {
				this.filters[idx].enabled = enable;
				break;
			}
		}
	}

	this.enableFilter = function(value) {
		this.setFilterState(value, true);
	}

	this.disableFilter = function(value) {
		this.setFilterState(value, false);
	}

	this.filter = function(discard) {
		if (discard == null) discard = this.discard;
		var filterClasses = new Array();
		for (var idx=0; idx < this.filters.length; idx++) {
			if (this.filters[idx].enabled)
				filterClasses[filterClasses.length] = this.filters[idx].value;
		}
		return this.filterElements(this.elementClass, filterClasses, discard);
	};

	/**
	 * Iterates through all elements in the document with class {elementClass}, 
	 * filtering elements that have all classes in {filterClasses}, either
	 * keeping them or discarding them, depending on the {discard} param.
	 * Returns an array of remaining elements.
	 */
	this.filterElements = function (elementClass, filterClasses, discard) {
		if (discard == null) discard = this.discard;

		var results = new Array();
		var filterElements = getElementsByClassName(document, "*", elementClass);
		for(var elIdx=0; elIdx < filterElements.length; elIdx++) {
			var e = filterElements[elIdx];
			var hasAllClasses = true;
			for (var clsIdx=0; clsIdx < filterClasses.length; clsIdx++) {
				var regExp = new RegExp("(^|\\s)" + filterClasses[clsIdx].replace(/\-/g, "\\-") + "(\\s|$)");

				if (! regExp.test(e.className))
					hasAllClasses = false;
			}

			if (hasAllClasses)
				e.style.display = discard ? "none" : "block";
			else
				e.style.display = discard ? "block" : "none";

			if (e.style.display == "block")
				results[results.length] = e;
		}
		return results;
	};
};


/*
    Written by Jonathan Snook, http://www.snook.ca/jonathan
    Add-ons by Robert Nyman, http://www.robertnyman.com
    http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
if (typeof getElementsByClassName != "function") {
	getElementsByClassName = function(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i < arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements);
	}
}