var CZ = function(obj) {
	return new CZ.fn(obj);
};
CZ.fn = function(obj) {
	if ( obj == 'document' ) {
		this.obj = [document];
	} else if ( obj.nodeName ) {
		this.obj = [obj];
	} else if ( obj.slice(0,1) == '#') {
		this.obj = [document.getElementById(obj.slice(1))];
	} else {
		this.obj = null;
	}
	return this;
};
CZ.fn.prototype.addEvent = function(type, callback) {
	var eventHandler = function(e) {
		e = e || event;
		var target = e.target || e.srcElement;
		if ( e.type == 'mouseover' ) {
			var related = e.relatedTarget || e.fromElement;
		} else if ( e.type == 'mouseout' ) {
			var related = e.relatedTarget || e.toElement;
		} else {
			var related = null;
		}
		callback({
			"target": target,
			"type": e.type,
			"related": related,
			"preventDefault": function() {
				if ( e.preventDefault ) {
					e.preventDefault();
				} else {
					e.returnValue = false;
				}
			},
			"preventPropagation": function() {
				if ( e.preventPropagation ) {
					e.preventPropagation();
				} else {
					e.cancelBubble = true;
				}
			},
			"mouse": {"position": {"x":e.pageX || e.clientX, "y": e.pageY || e.clientY}},
			"original": e
		});
	};
	var obj = this.obj;
	var length = obj.length;
	for ( var i = 0; i < length; i++ ) {
		if ( this.obj[i].addEventListener ) {
			this.obj[i].addEventListener(type, eventHandler, true);
		} else {
			this.obj[i].attachEvent('on'+type, eventHandler);
		}
	}
};
CZ.fn.prototype.offset = function() {
	var obj = this.obj[0];
	var objO = obj;
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
		return {"left": curleft,"top": curtop, "width": objO.offsetWidth, "height": objO.offsetHeight};
	}
};
CZ.XMLHttpObject = function(callback, parameters) {
	var XMLHttpObject;
	try {
		XMLHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
	} catch(e) {
		XMLHttpObject = new XMLHttpRequest();
	}
	if ( typeof callback == 'function' &&  typeof parameters != 'undefined' ) {
		if ( typeof parameters.async == 'undefined' ) { parameters.async = true; }
		if ( typeof parameters.method == 'undefined' ) { parameters.method = 'GET'; }
		if ( typeof parameters.send == 'undefined' ) { parameters.send = null; }

		if ( typeof parameters.headers != 'undefined' ) {
			var length = parameters.headers.length;
			for ( var i = 0; i < length; i++ ) {
				httpObj.setRequestHeader(parameters.headers[i].name, parameters.headers[i].value);
			}
		}

		var parseResponse = function() {
			if ( XMLHttpObject.readyState == 4 ) {
				if ( XMLHttpObject.status == 200 ) {
					try {
						var responseJSON = JSON.parse(XMLHttpObject.responseText) || eval('('+XMLHttpObject.responseText+')');
					} catch (error) {
						var responseJSON = null
					}
					callback({
						"success": true,
						"headers": XMLHttpObject.getAllResponseHeaders().split('\n'),
						"responseText": XMLHttpObject.responseText,
						"responseXML": XMLHttpObject.responseXML,
						"responseJSON": responseJSON
					});
				} else {
					callback({
						"success": false,
						"headers": XMLHttpObject.getAllResponseHeaders().split('\n'),
						"status": XMLHttpObject.status
					});
				}
			}
		};

		
		if ( parameters.async == true ) {
			XMLHttpObject.onreadystatechange = parseResponse;
		} else {
			parseResponse();
		}
		XMLHttpObject.open(parameters.method, parameters.url, parameters.async, parameters.username, parameters.password);
		XMLHttpObject.send(parameters.send);
	}
	return XMLHttpObject;
};
