// JavaScript Document

// wrapper for event listeners
function addListener( e, eventName, func, useCapture ) {
    try {
        if( e.addEventListener )
            e.addEventListener( eventName, func, useCapture );
        else if( e.attachEvent )
            e.attachEvent( "on" + eventName, func );
        else
            e[ "on" + eventName ] = func;
    }catch( e ) {}
}

// wrapper for event listeners
function removeListener( e, eventName, func, useCapture ) {
    try {
        if( e.removeEventListener )
            e.removeEventListener( eventName, func, useCapture );
        else if( e.detachEvent )
            e.detachEvent( "on" + eventName, func );
        else
            e[ "on" + eventName ] = undefined;
    } catch( e ) {}
}

// If we pass an element to this accidently just give it back
function getElement( e ) {
    return (typeof e == "string" || typeof e == "number") ? document.getElementById( e ) : e;
}

// Convenience
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)
}

/* function extensions */

Function.prototype.bindEventListener = function (object) {
    var method = this;
    return function (event) {
        method.call(object, event || window.event);
    };
}