
var LexHttp = {};

LexHttp._factories =[
                  function() {return new XMLHttpRequest();},
                  function() {return new ActiveXObject("Msxml2.XMLHTTP");},
                  function() {return new ActiveXObject("Microsoft.XMLHTTP");},
                  ];

LexHttp._factory = null;

LexHttp.newRequest = function() {
	if(LexHttp._factory != null) {
		return LexHttp._factory();
	}
	for(var i = 0; i < LexHttp._factories.length; i++) {
		try {
			var factory = LexHttp._factories[i];
			var request = factory();
			if(request != null) {
				LexHttp._factory = factory;
				return request;
			}
		} catch(e) {
			continue;
		}
	}
	LexHttp._factory = function () {
		throw new Error("XMLHttpRequest is not supported");
	};
	LexHttp._factory();
};

LexHttp.getText = function(url, callback) {
	var request = LexHttp.newRequest();
	request.onreadystatechange = function() {
		if(request.readyState == 4 && request.status == 200) {
			callback(request.responseText);
		}
	};
	request.open("GET", url);
	request.send(null);
};

LexHttp.getXml = function(url, callback) {
	var request = LexHttp.newRequest();
	request.onreadystatechange = function() {
		if(request.readyState == 4 && request.status == 200) {
			callback(request.responseXML);
		}
	};
	request.open("GET", url);
	request.send(null);
};

LexHttp.encodeFormData = function(data) {
	var pairs = [];
	var regexp = /%20/g;
	for(var name in data) {
		var value = data[name].toString();
		var pair = encodeURIComponent(name).replace(regexp, "+") + '=' + encodeURIComponent(value).replace(regexp, "+");
		pairs.push(pair);
	}
	return pairs.join('&');
};


LexHttp._getResponse = function(request) {
	var contentType = request.getResponseHeader("Content-Type");
	var p = contentType.indexOf(';');
	if(p != -1){
		contentType = contentType.substring(0, p);
	}	
	switch(contentType) {
	case "text/xml":
		return request.responseXML;
	case "text/json":
	case "text/javascript":
	case "application/javascript":
	case "application/x-javascript":
		return request.responseText;
	default:
		return request.responseText;
	}
};

/**
 * @param url
 * @param callback
 * @param options
 */
LexHttp.get = function(url, callback, options) {
	var request = LexHttp.newRequest();
	var n = 0;
	var timer;
	if(options != null && options != "" && options.timeout) {
		timer = setTimeout(function() {
				request.abort();
				if(options.timoutHandler) {
					options.timeoutHandler(url);
				}
			},
			options.timeout);
	}
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			if(timer) {
				clearTimeout(timer);
			}
			if(request.status == 200) {
				callback(LexHttp._getResponse(request));
			} else {
				if(options != null && options != "" && options.errorHandler) {
					options.errorHandler(request.status, request.statusText);
				} else {
					callback(null);
				}
			}
		} else if(options != null && options != "" && options.progressHandler) {
			options.progressHandler(++n);
		}
	};
	
	var target = url;
	if(options != null && options != "" && options.parameters) {
		target += "?" + LexHttp.encodeFormData(options.parameters);
	}
	request.open("GET", target);
	request.send(null);
};

/**
 * @param url
 * @param values
 * @param callback
 * @param errorHandler
 */
LexHttp.post = function(url, values, callback, errorHandler) {
	var request = LexHttp.newRequest();
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			if(request.status == 200) {
				callback(LexHttp._getResponse(request));
			} else {
				if(errorHandler) {
					errorHandler(request.status, request.statusText);
				} else {
					callback(null);
				}
			}
		}
	};
	request.open("POST", url);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.send(LexHttp.encodeFormData(values));
};






