
function $(id) {
    return document.getElementById(id)
}

function bindFunc(func, obj){
    return function(){
         return func.apply(obj, arguments);
    };
}

function bindFuncAsEventListener(func, obj){
    return function(event){
        var args = [(event || window.event)];
        return func.apply(obj, args);
    };
}

function addEvent(obj, evType, fn, useCapture){
    useCapture = useCapture || false;
    if(obj.addEventListener){
        obj.addEventListener(evType, fn, useCapture);
    }else if (obj.attachEvent){
        obj.attachEvent("on"+evType, fn);
    }
}

function getElementsByClassName(tag, className) {
    var elements = document.getElementsByTagName(tag);
    var resultElements = new Array();
    var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
    for(var i = 0; i < elements.length; i++) {
        var el = elements[i];
        if(re.test(el['className']))
            resultElements.push(el);
    }
    return resultElements;
}

function replaceClassName(el, oldClassName, newClassName) {
    if(oldClassName == newClassName)
        return false;
    var classNames = el.className.split(' ');
    var newClassNames = new Array();
    var hasOld = false;
    for(var i = 0; i < classNames.length; i++) {
        if(classNames[i] == oldClassName) {
            newClassNames.push(newClassName);
            hasOld = true;
        }
        else
            newClassNames.push(classNames[i]);
    }
    if(!hasOld)
        newClassNames.push(newClassName)
    el.className = newClassNames.join(' ');
}

function createXhr() {
    if(window.ActiveXObject){
        try {
            return new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                return new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                return null
            }
        }
    } else if(window.XMLHttpRequest){
        return new XMLHttpRequest();
    } else {
        return null
    }
}


function getUrl(url, callback, scope) {
    var xhr = createXhr();
    if(!xhr) {
        callback(null);
        return;
    }
    xhr.open('GET', url, true);
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 4) {
            if(xhr.status >= 200 && xhr.status < 300){
                if(!scope)
                    callback(xhr);
                else
                    callback.apply(scope, [xhr]);
            }
        }
    };
    xhr.send(null);
}

function getPointerXY(e) {
    var pos = [];
    if(!e) e = window.event;
    if(e.pageX || e.pageY){
        pos[0]=e.pageX; pos[1]=e.pageY;
    }
    else if(e.clientX || e.clientY){
        if(document.documentElement.scrollTop){
            pos[0]=e.clientX+document.documentElement.scrollLeft;
            pos[1]=e.clientY+document.documentElement.scrollTop;
        }
        else{
            pos[0]=e.clientX+document.body.scrollLeft;
            pos[1]=e.clientY+document.body.scrollTop;
        }
    }
    return pos;
}

function commify(num) {
    if(num < 1000)
        return num;
    num = num + "";
    var digists = num.split("");
    var result = "";
    for(var i = 0; i < digists.length; i++) {
        result += digists[i];
        if((digists.length - i - 1) > 0 && (digists.length - i - 1) % 3 == 0) {
            result += ',';
        }
    }
    return result;
}