/*begin version of Core, SitePoint*/
var Basis = {};

/*w3c*/
    if (document.addEventListener) {
        Basis.addEventListener = function(target, type, listener) {
            target.addEventListener(type, listener, false);
        };

        Basis.removeEventListener = function(target, type, listener) {
            target.removeEventListener(type, listener, false);
        };

        Basis.preventDefault = function(event) {
            event.preventDefault();
        };

        Basis.stopPropagation = function(event) {
            event.stopPropagation();
        };
    }

/*IE*/
    else if (document.attachEvent) {
        Basis.addEventListener = function(target, type, listener) {
            if (Basis._findListener(target, type, listener) != -1) {
                return;
            }
            var listener2 = function() {
                var event = window.event;

                if (Function.prototype.call) {
                    listener.call(target, event);
                }
                else {
                    target._currentListener = listener;
                    target._currentListener(event)
                    target._currentListener = null;
                }
            };

            target.attachEvent('on' + type, listener2);

            var listenerRecord = {
                target: target,
                type: type,
                listener: listener,
                listener2: listener2
            };

            var targetDocument = target.document || target;
            var targetWindow = targetDocument.parentWindow;
            
            var listenerId = 'l' + Basis._listenerCounter++;

            if (!targetWindow._allListeners) {
                targetWindow._allListeners = {};
            }
            targetWindow._allListeners[listenerId] = listenerRecord;

            if (!target._listeners) { 
                target._listeners = [];
            }
            target._listeners[target._listeners.length] = listenerId;

            if (!targetWindow._unloadListenerAdded) {
                targetWindow._unloadListenerAdded = true;
                targetWindow.attachEvent('onunload', Basis._removeAllListeners);
            }
        };

        Basis.removeEventListener = function(target, type, listener) {
            var listenerIndex = Basis._findListener(target, type, listener);
            if (listenerIndex == -1) {
                return;
            }

            var targetDocument = target.document || target;
            var targetWindow = targetDocument.parentWindow;

            var listenerId = target._listeners[listenerIndex];
            var listenerRecord = targetWindow._allListeners[listenerId];

            target.detachEvent('on' + type, listenerRecord.listener2);
            target._listeners.splice(listenerIndex, 1);

            delete targetWindow._allListeners[listenerId];
        };

        Basis.preventDefault = function(event) {
            event.returnValue = false;
        };

        Basis.stopPropagation = function(event) {
            event.cancelBubble = true;
        };

        Basis._findListener = function(target, type, listener) {
            var listeners = target._listeners;
            if (!listeners) { 
                return -1;
            }

            var targetDocument = target.document || target;
            var targetWindow = targetDocument.parentWindow;

            for (var i = listeners.length - 1; i >= 0; i--) {
                var listenerId = listeners[i];
                var listenerRecord = targetWindow._allListeners[listenerId];

                if (listenerRecord.type == type && listenerRecord.listener == listener) {
                    return i;
                }
            }
            return -1;
        };

        Basis._removeAllListeners = function() {
            var targetWindow = this;
            for (id in targetWindow._allListeners) {
                var listenerRecord = targetWindow._allListeners[id];
                listenerRecord.target.detachEvent('on' + listenerRecord.type, listenerRecord.listener2);
                delete targetWindow._allListeners[id];
            }
        };

        Basis._listenerCounter = 0;
    }
/*end IE*/
/*end Core*/

    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.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; i < allElements.length; i++) {
            if(pattern.test(allElements[i].className)) {
                matchedElements[matchedElements.length] = allElements[i];
            }
        }
        return matchedElements;
    }

    Basis.createTextarea = function(rows, cols, id, name) {
        var textarea = document.createElement('textarea');
        textarea.rows = rows;
        textarea.cols = cols;
        if (id) {
            textarea.id = id;
        }
        textarea.name = name;
        return textarea;
    }

    Basis.createSpan = function(text, id) {
        var span = document.createElement('span');
        span.appendChild(document.createTextNode(text));
        if (id) {
            span.id = id;
        }
        return span;
    }

    Basis.createAnchor = function(href, id, title) {
        var anchor = document.createElement('a');
        anchor.href = href;
        if (id) {
            anchor.id = id;
        }
        if (title) {
            anchor.title = title;
        }    
        return anchor;
    }
    
    Basis.createImg = function(src, w, h, alt) {
        var img = document.createElement('img');
        img.src = src;
        img.w = w;
        img.h = h;
        img.alt = alt + ' /';

        return img;
    }

    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;
        while(sib && sib.nodeType !== 1) {
            sib = sib.nextSibling;
        }
        return sib;
    } 
    Basis.getPrevSibling = function(target) {
        var sib = target.previousSibling;
        while(sib && sib.nodeType !== 1) {
            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.addEventListener(window, 'load', run.init);
    };
