/*
 * Functiebibliotheek
 * 
 * Overzicht
 * 
 * Events
 * ------
 * addLoadEvent
 * addEvent
 * removeEvent
 * 
 * Select elements
 * ---------------
 * getElementsByClassName
 * 
 * IE only
 * -------
 * fixFocus
 * fixHover
 *
 * 20080818
 * addLoadEvent
 * getElementsByClassName
 * 20081027
 * Als base.js
 */


/*****************/
/**** Events *****/
/*****************/

/**
 * Adds a function to onload event
 * addLoadEvent(functionName)
 * of
 * addLoadEvent(function() { ...code...})
 *
 * @param {Function} func	Naam van de functie zonder () of aanhalingstekens
 */
function addLoadEvent(func){
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        window.onload = function(){
            oldonload();
            func();
        }
    }
}

/**
 * Universal event adder
 * addEvent( document.getElementById('foo'), 'click', doSomething );
 * of
 * addEvent( obj, 'mouseover', function(){ alert('hello!'); } );
 * 
 * @author http://ejohn.org/projects/flexible-javascript-events/
 * 
 * @param {Object} obj The element on which the event needs adding
 * @param {String} type  Sort of event ex. "load"
 * @param {Function} fn Name of function ex. functionName or anonymous function
 */
function addEvent( obj, type, fn ) {
  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.addEventListener( type, fn, false );
}
/**
 * Remove event
 * removeEvent( object, eventType, function );
 * 
 * @author http://ejohn.org/projects/flexible-javascript-events/
 * 
 * @param {Object} obj The element on which the event needs adding
 * @param {String} type  Sort of event ex. "load"
 * @param {Function} fn Name of function ex. functionName or anonymous function
 */
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}

/***************************/
/***** Select elements *****/
/***************************/

/**
 * Select elements based on classname, tagname
 *
 * @param {Array} oElm List of elements containing the class		
 * @param {String} strTagName 	Name of the element. "*" selects all
 * @param {String, Array} oClassNames Classname or classnames (=array) to be selecdted
 */
function getElementsByClassName(oElm, strTagName, oClassNames){
    var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    var arrRegExpClassNames = new Array();
    if (typeof oClassNames == "object") {
        for (var i = 0; i < oClassNames.length; i++) {
            arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)"));
        }
    }
    else {
        arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));
    }
    var oElement;
    var bMatchesAll;
    for (var j = 0; j < arrElements.length; j++) {
        oElement = arrElements[j];
        bMatchesAll = true;
        for (var k = 0; k < arrRegExpClassNames.length; k++) {
            if (!arrRegExpClassNames[k].test(oElement.className)) {
                bMatchesAll = false;
                break;
            }
        }
        if (bMatchesAll) {
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements)
}

/***********************/
/***** IE Functies *****/
/***********************/

/**
 * Functie die in IE className .focus toevoegt en verwijdert
 * 
 * @param {object} currItem Object that needs .focus added
 */

function fixFocus(currItem){
	if(!/MSIE (5|6|7)/.test(navigator.userAgent)) return;
	addEvent(currItem,"focus", function(){this.className+=" focus";});
	addEvent(currItem,"blur", function(){this.className =this.className.replace(/ focus/i,"");});
}
/*
 * Functie die in IE className .focus toevoegt en verwijdert
 */

function fixHover(currItem){
	if(!/MSIE (5|6|7)/.test(navigator.userAgent)) return;
	addEvent(currItem,"mouseover", function(){this.className+=" hover";});
	addEvent(currItem,"mouseout", function(){this.className =this.className.replace(/ hover/i,"");});
}

