function addEvent(elem, evType, fn) {
        if (elem.addEventListener) {
                elem.addEventListener(evType, fn, false);
                return fn;
        }
        iefn = function() { fn.call(elem) }
        elem.attachEvent('on' + evType, iefn);
        return iefn;
}

function removeEvent(elem, evType, fn) {
        if(elem.addEventListener) {
                elem.removeEventListener(evType, fn, false)
        }
        elem.detachEvent('on' + evType, fn)
}

function addClass(o, c){
        var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g")
        if (re.test(o.className)) return
        o.className = (o.className + " " + c).replace(/\s+/g, " ").replace(/(^ | $)/g, "")
}

function removeClass(o, c){
        var re = new RegExp("(^|\\s)" + c + "(\\s|$)", "g")
        o.className = o.className.replace(re, "$1").replace(/\s+/g, " ").replace(/(^ | $)/g, "")
}

function getCookie(name) {
        var matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"))
        return matches ? decodeURIComponent(matches[1]) : undefined
}

function setCookie(name, value, props) {
        props = props || {}
        var exp = props.expires
        if (typeof exp == "number" && exp) {
                var d = new Date()
                d.setTime(d.getTime() + exp*1000)
                exp = props.expires = d
        }
        if(exp && exp.toUTCString) { props.expires = exp.toUTCString() }

        value = encodeURIComponent(value)
        var updatedCookie = name + "=" + value
        for(var propName in props){
                updatedCookie += "; " + propName
                var propValue = props[propName]
                if(propValue !== true){ updatedCookie += "=" + propValue }
        }
        document.cookie = updatedCookie
}

function deleteCookie(name) {
        setCookie(name, null, { expires: -1 })
}

function getOffset(elem) {
        if (elem.getBoundingClientRect) {
                return getOffsetRect(elem)
        } else {
                return getOffsetSum(elem)
        }
}

function getOffsetSum(elem) {
        var top=0, left=0
        while(elem) {
                top = top + parseInt(elem.offsetTop)
                left = left + parseInt(elem.offsetLeft)
                elem = elem.offsetParent
        }
        return {top: top, left: left}
}

function getOffsetRect(elem) {
        var box = elem.getBoundingClientRect()
        var body = document.body
        var docElem = document.documentElement
        var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
        var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
        var clientTop = docElem.clientTop || body.clientTop || 0
        var clientLeft = docElem.clientLeft || body.clientLeft || 0
        var top  = box.top +  scrollTop - clientTop
        var left = box.left + scrollLeft - clientLeft
        return { top: Math.round(top), left: Math.round(left) }
}

function trim( str, charlist ) {
        charlist = !charlist ? ' \s\xA0' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
        var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
        return str.replace(re, '');
}

function bindReady(handler) {
        var called = false
        function ready() {
                if (called) return
                called = true
                handler()
        }
        if ( document.addEventListener ) {
                document.addEventListener( "DOMContentLoaded", function(){
                        document.removeEventListener( "DOMContentLoaded", arguments.callee, false)
                        ready()
                }, false )
        } else if ( document.attachEvent ) {
                if ( document.documentElement.doScroll && window == window.top ) {
                        function tryScroll(){
                                if (called) return
                                try {
                                        document.documentElement.doScroll("left")
                                        ready()
                                } catch(e) {
                                        setTimeout(tryScroll, 0)
                                }
                        }
                        tryScroll()
                }
                document.attachEvent("onreadystatechange", function(){

                        if ( document.readyState === "complete" ) {
                                document.detachEvent( "onreadystatechange", arguments.callee )
                                ready()
                        }
                })
        }
        if (window.addEventListener) window.addEventListener('load', ready, false)
        else if (window.attachEvent) window.attachEvent('onload', ready)
        //else window.onload=ready
}

readyList = []

function onReady(handler) {
        if (!readyList.length) {
                bindReady(function() {
                        for(var i=0; i<readyList.length; i++) {
                                readyList[i]()
                        }
                })
        }
        readyList.push(handler)
}
