if(typeof(Controls) == 'undefined')
	var Controls = {};
if(typeof(Controls.TemplateLoader) == 'undefined'){
	Controls.TemplateLoader = {};
	
	Controls.TemplateLoader._templates = new Array();
	Controls.TemplateLoader._sentRequestsCount = 0;
	Controls.TemplateLoader._returnedRequestsCount = 0;
	Controls.TemplateLoader.OnTemplatesLoaded = null;
	Controls.TemplateLoader._startTime = null;
	
	Controls.TemplateLoader.Template = function(fileName, methodName, fileGroup, containerID, onRenderCompleteHandler){
		this.FileName = (typeof(fileName) == "undefined") ? "" : fileName;
		this.MethodName = (typeof(methodName) == "undefined") ? "" : methodName;
		this.FileGroup = (typeof(fileGroup) == "undefined") ? "" : fileGroup;
		this.ContainerID = (typeof(containerID) == "undefined" || containerID == "") ? "" : containerID;
		this.OnRenderCompleteHandler = (typeof(onRenderCompleteHandler) == "undefined") ? null : onRenderCompleteHandler;
		this.RequestType = "HTML";
		this.Arguments = new Array();
	};
	
	Controls.TemplateLoader.Add = function(template){
		Controls.TemplateLoader._templates.push(template);
	};
	
	Controls.TemplateLoader.Clear = function(){
		Controls.TemplateLoader._templates = new Array();
	}
	
	Controls.TemplateLoader.Load = function(){
		Controls.TemplateLoader._sentRequestsCount = 0;
		Controls.TemplateLoader._returnedRequestsCount = 0;
		var width = document.documentElement.clientWidth;
		var height = document.documentElement.clientHeight;
		Controls.TemplateLoader._startTime = new Date();
		
		for(var i = 0; i < 	Controls.TemplateLoader._templates.length; i++){
			var template = Controls.TemplateLoader._templates[i];
			var httpRequest = new CHttpRequest();
			httpRequest.QueryString = "AjaxType="+ template.RequestType +"&RequestFile="+ template.FileGroup +"."+ template.FileName +"&MethodName=" + template.MethodName;
			httpRequest.AssyncCall = true;
			httpRequest.AddProperty("Arguments[ClientWidth]", width);
			httpRequest.AddProperty("Arguments[ClientHeight]", height);
			if(template.Arguments != null){
				for(var argName in template.Arguments){
					httpRequest.AddProperty("Arguments["+ argName +"]", template.Arguments[argName]);
				}
			}
			httpRequest.State = {Template:template, StartTime: new Date()};
			httpRequest.OnResponse = Controls.TemplateLoader.Load_Callback;
			httpRequest.Send();
		}
	}
	
	Controls.TemplateLoader.Load_Callback = function(request, state){
		Controls.TemplateLoader._returnedRequestsCount++;
		
		if(state.Template.ContainerID != null){
			var container = document.getElementById(state.Template.ContainerID);
			if(container != null)
				Ajax.LoadContent(container, request.responseText);
		}
		
		if(state.Template.OnRenderCompleteHandler != null){
			var diff = new Date(new Date() - state.StartTime);
			var milliseconds = diff.getMilliseconds() + diff.getSeconds() * 1000;
			var seconds = new Number(milliseconds / 1000).toFixed(4);
			state.Template.OnRenderCompleteHandler(state.Template, {Html:request.responseText, Xml:request.responseXML, ExecutionTime:new Number(seconds)});
		}
		
		if(Controls.TemplateLoader._returnedRequestsCount == Controls.TemplateLoader._templates.length){
			if(Controls.TemplateLoader.OnTemplatesLoaded != null){
				var diff = new Date(new Date() - state.StartTime);
				var milliseconds = diff.getMilliseconds() + diff.getSeconds() * 1000;
				var seconds = new Number(milliseconds / 1000).toFixed(4);
				Controls.TemplateLoader.OnTemplatesLoaded(Controls.TemplateLoader, {ExecutionTime: new Number(seconds)}); 
			}
			Controls.TemplateLoader.Clear();
		}
	}
}
