var ajax = {};
ajax.xhr = {};

ajax.xhr.Request = function(url , params , callback , method , syncro){
	this.url = url;
	this.params = params;
	this.callback = callback;
	this.method = method;	
	this.syncro = syncro;
	this.send();

}

ajax.xhr.Request.prototype = {
	getXMLHttpRequest:function(){
		if(window.ActiveXObject){
			try{
				return new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{
					return new ActiveXObject("Microsoft.XMLHTTP");
				}catch(e1){
					return null;
				}
			}
		}else if(window.XMLHttpRequest){
			return new XMLHttpRequest();
		}else{
			return null;
		}
							
	},
		
	send:function(){
		this.req = this.getXMLHttpRequest();
		var httpMethod = this.method ? this.method : 'GET';
		if(httpMethod != 'GET' && httpMethod != 'POST'){
			httpMethod = 'GET';
		}	
		
		var httpParams = (this.params == null || this.params == '') ? null : this.params;
		var httpUrl = this.url;
		if(httpMethod == 'GET' && httpParams != null){
			httpUrl = httpUrl + "?" + httpParams;
		}
		
		this.req.open(httpMethod , httpUrl , this.syncro);
		this.req.setRequestHeader('Content-Type' , 'application/x-www-form-urlencoded');
		
		var request = this;

		if(this.method != "") {
			this.req.onreadystatechange = function(){
				request.onStateChange.call(request);
			}	
		}
		this.req.send(httpMethod == 'POST' ? httpParams : null);		
	},
	
	onStateChange:function(){
		this.callback(this.req);
	}
}

ajax.Event = {};
ajax.Event.addListener = function(element , name , observer , useCapture){
	useCapture = useCapture || false;
	
	if(element.addEventListener){
		element.addEventListener(name , observer , useCapture);
	}else if(element.attachEvent){
		element.attachEvent("on"+name , observer);
	}
}

ajax.Event.removeListener = function(element , name , observer , useCapture){
	useCapture = useCapture || false;
	if(element.removeEventListener){
		element.removEventListener(name , observer , useCapture);
	}else if(element.detachEvent){
		element.detachEvent("on"+name , observer);
	}
}

ajax.Event.getTarget = function(event){
	if(event == null) return null;
	else if(event.target) return target;
	else if(event.srcElement) return event.srcElement;
	return null;
}

ajax.Event.getMouseXY = function(event){
	var dd = document.documentElement;
    var db = document.body;

    var mouseX = event.clientX;
    var mouseY = event.clientY;

    if(dd){
    	mouseX += dd.scrollLeft;
        mouseY += dd.scrollTop;
    } else if(db){
        mouseX += db.scrollLeft;
        mouseY += db.scrollTop;
    }
	
	return {x:mouseX , y:mouseY};	
}

ajax.Event.isLeftButton = function(event){
	return (event.which) ? event.which == 1 && event.button == 0 : (event.type == 'click') ? event.button == 0 : event.button == 1;
}

ajax.Event.isRightButton = function(event){
	return event.button == 2;
}

ajax.Event.stopPropagation = function(event){
	if(event.stopPropagation){
		event.stopPropagation();
	}else {
		event.cancelBubble = true;
	}	
}

ajax.Event.preventDefault = function(event){
	if(event.preventDefault){
		event.preventDefault();
	}else{
		event.returnValue = false;
	}
}

ajax.Event.stopEvent = function(event){
	ajax.Event.stopPropagation(event);
	ajax.Event.preventDefault(event);
}

ajax.Event.bindAsListener = function (func , obj){
	return function(){
		return func.apply(obj , arguments);
	}
}


ajax.GUI = {};
ajax.GUI.setOpacity=function(el , opacity){
	if(el.filters){
		el.style.filter = "alpha(opacity="+opacity*100+")";
	}else{
		el.style.opacity = opacity;
	}
}
