JSCom = (function(){
	
	return {
		defaultPath : "",
		cache : false,
		timeout : 5000,
		
		init : function(){
			LoadControl.loadModule("Controller.Selection");
		},
		
		Response : {
			responseList : {},
			set : function(name, data) {
				if(JSCom.Request.requestList[name]){
					if(typeof JSCom.Request.requestList[name].onSuccess == "function"){
						JSCom.Request.requestList[name].data = data;
						JSCom.Request.requestList[name].time = new Date().getTime();
						JSCom.Request.requestList[name].status = 200;
						JSCom.Request.requestList[name].onSuccess(JSCom.Request.requestList[name]);
					}
				}
			}
		},
		
		Request : {
			requestList : {},
			send : function(name, onSuccess, onError, config){
			
				var header = Selection.get("head")[0];
				
				if(this.requestList[name]){
					header.removeChild(this.requestList[name].element);
					if(JSCom.cache || config.cache){
						var stat = 304;
					}
					delete this.requestList[name];
				}
				
				var srcPath = (config) ? config.path || JSCom.defaultPath : JSCom.defaultPath;
								
				if(config){
					srcPath += (config.parameter) ? "&" + config.parameter.join("&") : "" ;
				}
				
				var id = "js-com-request-"+name;
				if(Selection.get("#"+ id).length > 0){
					element = Selection.get("#"+ id)[0];
				}else{
					var element = document.createElement("script");
					element.src  = srcPath
					element.id = id;
				}
				
				this.requestList[name] = {
					data : "",
					time : new Date().getTime(),
					status : stat ||100,
					element : element,
					onSuccess : onSuccess,
					onError : onError
				}
				
				if(Selection.get("#"+ id).length > 0){
					element.src = srcPath;
				}else{
					header.appendChild(element);
				}

				window.setTimeout(function(){ JSCom.Request.checkRequests() }, JSCom.timeout);
			},
			
			checkRequests : function(){
				for(req in this.requestList){
				
					if((this.requestList[req].time + JSCom.timeout - 1) < new Date().getTime() && this.requestList[req].status != 200){
						this.requestList[req].status = 500;
						if(typeof this.requestList[req].onError == "function"){
							this.requestList[req].onError(this.requestList[req]);
						}
						Selection.get("head")[0].removeChild(this.requestList[req].element);
						delete this.requestList[req];
					}
				}
			}
		}		
	}
})();
