/*lib*/
var Basis = {};

    Basis.addLoadListener = function(fn) {
        if (typeof window.addEventListener !== 'undefined') {
            window.addEventListener('load', fn, false);
        }
        else if (typeof document.addEventListener !== 'undefined') {
            document.addEventListener('load', fn, false);
        }
        else if (typeof  window.attachEvent !== 'undefined') {
            window.attachEvent('onload', fn);
        }
    };

    Basis.hasClass = function(target, classValue) {
        var pattern = new RegExp('(^| )' + classValue + '( |$)');
        if (pattern.test(target.className)) {
            return true;
        }
        return false;
    };
    
    Basis.addClass = function(target, classValue) {
        if(!Basis.hasClass(target, classValue)) {
            if (!target.className == '') {
                classValue = ' ' + classValue;
            }
            target.className = target.className + classValue;        }
    };

    Basis.removeClass = function(target, classValue) {
        if (Basis.hasClass(target, classValue)) {
            var pattern = new RegExp('(\\s|^)' + classValue + '(\\s|$)');
            target.className = target.className.replace(pattern, '');
        }
    };

    Basis.toggleClass = function(target, classValue) {
        if (Basis.hasClass(target, classValue)) { 
            Basis.removeClass(target, classValue);
        } 
        else {
	    Basis.addClass(target, classValue);
	}
    };


    Basis.getElementsByClass = function(classValue) {
        var allElements = [];
        if(typeof document.all != 'undefined') {
            allElements = document.all;
        }
        else {
            allElements = document.getElementsByTagName('*');
        }

        var matchedElements = [];
        var pattern = new RegExp('(^| )' + classValue + '( |$)');

        for(var i=0, l = allElements.length; i < l; i++) {
            if(pattern.test(allElements[i].className)) {
                matchedElements[matchedElements.length] = allElements[i];
            }
        }
        return matchedElements;
    };

    Basis.insertAfter = function(newEl, refEl) {
        if (refEl.nextSibling) {
            refEl.parentNode.insertBefore(newEl, refEl.nextSibling);
        } 
        else {
            refEl.parentNode.appendChild(newEl);
        }
    };

    Basis.getNextSibling = function(target) {
        var sib = target.nextSibling;
        /*3 is text node or whitespace*/
        while(sib.nodeType == 3) {
            sib = sib.nextSibling;
        }
        return sib;
    }; 
    Basis.getPrevSibling = function(target) {
        var sib = target.previousSibling;
        while(sib.nodeType == 3) {
            sib = sib.previousSibling;
        }
        return sib;
    };

    Basis.checkBounds = function(obj, bounds) { 
        if (obj.value.length >= bounds) {
            obj.value = obj.value.substring(0, bounds);
        }
    };

// https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/IndexOf
    if (!Array.prototype.indexOf) {
        Array.prototype.indexOf = function(elt /*, from*/) {
            var len = this.length >>> 0;

            var from = Number(arguments[1]) || 0;
            from = (from < 0) ? Math.ceil(from) : Math.floor(from);
            if (from < 0) {
                from += len;
            }

            for (; from < len; from++) {
                if (from in this && this[from] === elt) {
                    return from;
                }
            }
            return -1;
        };
    }

    Basis.begin = function(run) {
        Basis.addLoadListener(run.init);
    };


