CP.IsArray = function (obj) {
    if (obj.constructor.toString().indexOf("Array") == -1)
        return false;
    else
        return true;
};

CP.IsNumber = function (obj) {
    if (obj.constructor.toString().indexOf("Number") == -1)
        return false;
    else
        return true;
};

CP.IsString = function (obj) {
    if (obj.constructor.toString().indexOf("String") == -1)
        return false;
    else
        return true;
};

CP.IsBoolean = function (obj) {
    if (obj.constructor.toString().indexOf("Boolean") == -1)
        return false;
    else
        return true;
};

CP.IsObject = function (obj) {
    if (obj.constructor.toString().indexOf("Object") == -1)
        return false;
    else
        return true;
};

CP.IsNullOrEmpty = function (obj) {
    try {
        if (obj != undefined && obj != null && obj != "" && obj.length != 0)
            return false;
        else
            return true;
    }
    catch (ex) {
        return true;
    }
};

CP.Browser = function () { return navigator.userAgent; };

CP.Browser.IsIE = function () { return /MSIE/i.test(navigator.userAgent); };

CP.Browser.IsIE6 = function () { return /MSIE 6/i.test(navigator.userAgent); };

CP.Browser.IsIE8 = function () { return /MSIE 8/i.test(navigator.userAgent); };

CP.Browser.IsMozilla = function () { return /Firefox/i.test(navigator.userAgent); };

CP.Browser.IsNetscape = function () { return /Netscape/.test(navigator.userAgent); };

CP.Browser.IsOpera = function () { return /Opera/i.test(navigator.userAgent); };

CP.Browser.IsSafari = function () { return /Safari/i.test(navigator.userAgent); };

CP.Browser.IsChrome = function () { return /Chrome/i.test(navigator.userAgent); };

CP.Browser.Size = function () {
    var w;
    var h;

    if (typeof window.innerWidth != 'undefined') {
        w = window.innerWidth;
        h = window.innerHeight;
    }
    else if (typeof document.documentElement != 'undefined'
        && typeof document.documentElement.clientWidth != 'undefined'
        && document.documentElement.clientWidth != 0) {
        w = document.documentElement.clientWidth;
        h = document.documentElement.clientHeight;
    }
    else {
        w = document.getElementsByTagName('body')[0].clientWidth;
        h = document.getElementsByTagName('body')[0].clientHeight;
    }

    return { width: w, height: h };
};

CP.GetOffset = function(domObj){
	var curleft = curtop = 0;
	if (domObj.offsetParent) {
		do {
			curleft += domObj.offsetLeft;
			curtop += domObj.offsetTop;
		} while (domObj = domObj.offsetParent);
	}
	return { left : curleft, top : curtop }
};

CP.ContextHandler = function (fn, param) {
    return function (e) { return fn(e, param); }
};

CP.Clone = function (obj) {
    var newObj = {};
    for (var i in obj)
        newObj[i] = newObj[i];
    return newObj;
};

CP.RemoveChildren = function (domObj) {
    if (domObj.hasChildNodes()) {
        while (domObj.childNodes.length >= 1) {
            domObj.removeChild(domObj.firstChild);
        }
    }
};

CP.Attr = function (domObj, arg1, arg2) {
    if (arguments.length == 3){
    	if(arg1 == "type") { domObj.type = arg2; }
    	else if(arg1 == "value") { domObj.value = arg2; }
    	else { domObj.setAttribute(arg1, arg2); }
    }
    else if (arguments.length == 2) {
        if (CP.IsObject(arg1)) {
            for (prop in arg1) {
            	if(arg1 == "type"){ domObj.type = arg1[prop]; }
            	else { domObj.setAttribute(prop, arg1[prop]); }
            }
        }
        else if (CP.IsString(arg1)) {
        	if(arg1 == "type"){ return domObj.type; }
        	else if(arg1 == "value"){ return domObj.value; }
        	else { return domObj.getAttribute(arg1); }
        }
    }
};

CP.RemoveAttr = function (domObj, arg1) {
    if (CP.IsString(arg1)) {
    	if(arg1 == "type"){ domObj.type = ""; }
    	else { domObj.removeAttribute(arg1); }
    }
    else if (CP.IsArray(arg1)) {
        for (var i = 0; i < arg1.length; i++) {
        	if(arg1[i] == "type"){ domObj.type = ""; }
        	else{ domObj.removeAttribute(arg1[i]); }
        }
    }
};

CP.AddClass = function (domObj, className) {
    if (!CP.HasClass(domObj, className)) {
        if (!CP.IsNullOrEmpty(domObj.className))
            domObj.className += " ";
        domObj.className += className;
    }
};

CP.RemoveClass = function (domObj, className) {
    if (CP.HasClass(domObj, className)) {
        if ((domObj.className.indexOf(" ")) <= 0)
            domObj.className = "";
        else {
            var cArr = domObj.className.split(" ");
            var newCArr = new Array();
            var cString = "";
            for (var i = 0; i < cArr.length; i++) {
                if (cArr[i] != className)
                    newCArr.push(cArr[i]);
            }
            for (var j = 0; j < newCArr.length; j++) {
                cString += newCArr[j];
                if (j != (newCArr.length - 1))
                    cString += " ";
            }
            domObj.className = cString;
        }
    }
};

CP.HasClass = function (domObj, className) {
    return domObj.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
};

CP.LoadXML = function (address, returnFunction) {
    var xmlHttp = null;
    try {
        xmlHttp = new XMLHttpRequest();
    }
    catch (e) {
        try {
            xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch (e) {
            try {
                xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch (e) {
                xmlHttp = new PokeIn.HttpRequest(id);
            }
        }
    }
    xmlHttp.open("GET", address, true);
    xmlHttp.onreadystatechange = CP.ContextHandler(function (e, param) {
        if (param.req.readyState == 4) {
            param.fn(param.req.responseXML);
        }
    }, { fn: returnFunction, req: xmlHttp });
    xmlHttp.send(null);
};

CP.GetElementsByClassName = function (classname, node) {
    if (!node) node = document.getElementsByTagName("body")[0];
    var returnArr = [];
    var regEx = new RegExp('\\b' + classname + '\\b');
    var elements = node.getElementsByTagName("*");
    for (var i = 0, j = elements.length; i < j; i++) {
        if (regEx.test(elements[i].className)) { returnArr.push(elements[i]); }
    }
    return returnArr;
};

CP.AttachEvent = function (domObj, eventName, fn) {
    if (domObj.attachEvent) {
        domObj['e' + eventName + fn] = fn;
        domObj[eventName + fn] = function () { domObj['e' + eventName + fn](window.event); }
        domObj.attachEvent('on' + eventName, domObj[eventName + fn]);
    } else
        var event = domObj.addEventListener(eventName, fn, false);
    return fn;
};

CP.DetachEvent = function (domObj, eventName, fn) {
    if (domObj.detachEvent) {
        domObj.detachEvent('on' + eventName, domObj[eventName + fn]);
        domObj[eventName + fn] = null;
    } else
        domObj.removeEventListener(eventName, fn, false);
};

CP.TriggerEvent = function (domObj, eventName) {
    if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent(eventName, false, true);
        domObj.dispatchEvent(event);
    } else
        domObj.fireEvent("on" + eventName);
};

CP.AttachWindowEvent = function (eventName, fn) {
    if (window.attachEvent) {
        window.attachEvent("on" + eventName, fn);
    }
    else {
        window.addEventListener(eventName, fn, false);
    }
};

CP.DetachWindowEvent = function (eventName, fn) {
    if (window.detachEvent) {
        window.detachEvent("on" + eventName, fn);
    }
    else {
        window.removeEventListener(eventName, fn, false);
    }
};
