/*********************************************************************************************************************
****************************  Ajax_JS.js  *****************************************
****************************  Version : 1.0 ***************************************
**************************** Date : 22-03-2007 ************************************
****** Eteam Websolutions India Pvt. Ltd ******************************************
***********************************************************************************************************************/


var AjaxRequestQueue = new Array();
var currentRunningRequestObject = null;
var isRequestRunning = false;
var TIMERID = 0;
var AjaxRequest = {
	CreateAjaxRequest: function(){
		switch(arguments.length){
			case 0:
				return(new this.createRequestWithNoParameter());
			case 1:
				return(new this.createRequestWithOneParameter(arguments[0]));
		}
	},
	createRequestWithNoParameter : function(){
		this.requestURL = "#";
		this.method = "POST";
		this.formQueryString = null;
		this.queryString = "";
		this.responseString = null;
		this.isRequestPending = true;
		this.callbackFunc = null;
		this.responseType = 'xml';
	},

	createRequestWithOneParameter : function(arg1){
		this.requestURL = arg1;
		this.method = "POST";
		this.formQueryString = null;
		this.queryString = "";
		this.responseString = null;
		this.isRequestPending = true;
		this.callbackFunc = null;
		this.responseType = 'xml';
	}
};

AjaxRequest.createRequestWithNoParameter.prototype = {
	setRequestURL: function(requestURL){
		this.requestURL = requestURL;
	},
	getRequestURL : function(){
		return(this.requestURL);
	},
	setMethod: function(method){
		this.method = method;
	},
	getMethod : function(){
		return(this.method);
	},
	setFormData : function(formObj){
		var formObjectCount = formObj.elements.length;
		this.formQueryString = "";
		for(i=0; i < formObjectCount; i++){
			if(i != (formObjectCount - 1)){
				this.formQueryString += formObj.elements[i].name + "=" + formObj.elements[i].value + "&";
			}else{
				this.formQueryString += formObj.elements[i].name + "=" + formObj.elements[i].value;
			}
		}
	},
	setSelectedFormData : function(formName, formElementArray){
		this.formQueryString = "";
		for(i=0; i < formElementArray.length; i++){
			if(formName != ''){
				element = eval('document.forms[\"'+formName+'\"].' + formElementArray[i]);
			}else{
				element = document.getElementById(formElementArray[i]);
			}
			if(i != (formElementArray.length - 1)){
				this.formQueryString += element.name + "=" + element.value + "&";
			}else{
				this.formQueryString += element.name + "=" + element.value;
			}
		}
	},
	getFormQueryString : function(){
		return(this.formQueryString);
	},
	setQueryString :  function(queryString){
		this.queryString = queryString;
	},
	getQueryString : function(){
		return(this.queryString);
	},
	setResponseType : function(responseType){
		this.responseType = responseType;
	},
	getResponseType : function(){
		return(this.responseType);
	},
	doCall : function(){
		addRequestQueue(this);
	},
	getResponseString : function(){
		return(this.responseString);
	},
	registerCallbackFunction : function(func){
		this.callbackFunc = func;
	},
	invokeCallbackFunction : function(){
		this.callbackFunc();
	}
};

AjaxRequest.createRequestWithOneParameter.prototype = {
	setRequestURL: function(requestURL){
		this.requestURL = requestURL;
	},
	getRequestURL : function(){
		return(this.requestURL);
	},
	setMethod: function(method){
		this.method = method;
	},
	getMethod : function(){
		return(this.method);
	},
	setFormData : function(formObj){
		var formObjectCount = formObj.elements.length;
		this.formQueryString = "";
		for(i=0; i < formObjectCount; i++){
			if(i != (formObjectCount - 1)){
				this.formQueryString += formObj.elements[i].name + "=" + formObj.elements[i].value + "&";
			}else{
				this.formQueryString += formObj.elements[i].name + "=" + formObj.elements[i].value;
			}
		}
	},
	setSelectedFormData : function(formName, formElementArray){
		this.formQueryString = "";
		for(i=0; i < formElementArray.length; i++){
			if(formName != ''){
				element = eval('document.forms[\"'+formName+'\"].' + formElementArray[i]);
			}else{
				element = document.getElementById(formElementArray[i]);
			}
			if(i != (formElementArray.length - 1)){
				this.formQueryString += element.name + "=" + element.value + "&";
			}else{
				this.formQueryString += element.name + "=" + element.value;
			}
		}
	},
	getFormQueryString : function(){
		return(this.formQueryString);
	},
	setQueryString :  function(queryString){
		this.queryString = queryString;
	},
	getQueryString : function(){
		return(this.queryString);
	},
	setResponseType : function(responseType){
		this.responseType = responseType;
	},
	getResponseType : function(){
		return(this.responseType);
	},
	doCall : function(){
		addRequestQueue(this);
	},
	getResponseString : function(){
		return(this.responseString);
	},
	registerCallbackFunction : function(func){
		this.callbackFunc = func;
	},
	invokeCallbackFunction : function(){
		this.callbackFunc();
	}
};

function addRequestQueue(requestObject){
	AjaxRequestQueue.push(requestObject);
	if(TIMERID == 0){
		TIMERID = setInterval("ajaxCall()", 100);
	}
}

function ajaxCall(){
	if(!isRequestRunning){		
		isRequestRunning = true;
		currentRunningRequestObject = AjaxRequestQueue.pop();
		currentRunningRequestObject.isStateRunning = true;
		ajaxObj = createAjaxObj();
		ajaxObj.onreadystatechange = getResponseText;
		ajaxObj.open(currentRunningRequestObject.getMethod(), currentRunningRequestObject.getRequestURL() + "?" + currentRunningRequestObject.getQueryString(), true);
		ajaxObj.send(currentRunningRequestObject.getQueryString());
	}
	if(AjaxRequestQueue.length == 0){
		clearInterval(TIMERID);
		TIMERID = 0;
	}
}

function getResponseText(){
	if (ajaxObj.readyState == 4){ //if request of file completed
		if (ajaxObj.status == 200){ //if request was successful
			if(currentRunningRequestObject.getResponseType() == 'xml'){
				xmlData = ajaxObj.responseXML;
			}else{
				xmlData = ajaxObj.responseText;
			}
			currentRunningRequestObject.responseString = xmlData;
			currentRunningRequestObject.invokeCallbackFunction();
		}
		isRequestRunning = false;
		currentRunningRequestObject.isRequestPending = false;
	}
}

function createAjaxObj(){
	var httprequest=false
	if (window.XMLHttpRequest){ // if Mozilla, Safari etc
		httprequest=new XMLHttpRequest()
		if (httprequest.overrideMimeType)
			httprequest.overrideMimeType('text/xml')
	}else if (window.ActiveXObject){ // if IE
		try {
			httprequest=new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				httprequest=new ActiveXObject("Microsoft.XMLHTTP");
			}catch (e){}
		}
	}
	return httprequest
}

function createXMLDocument(xmlString){
	// code for IE
	var xmlDoc = null;
	if (window.ActiveXObject){
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "false";
		xmlDoc.loadXML(xmlString);
	}else{ // code for Mozilla, Firefox, Opera, etc.
		var parser = new DOMParser();
		xmlDoc = parser.parseFromString(xmlString, "text/xml");
	}
	return(xmlDoc);
}

function formatXMLDocument(xmlDocument, formatString){
	var resultElement = xmlDocument.getElementsByTagName("ajax-result")[0];
	var noOfNodes = resultElement.childNodes.length;
	var returnString = "";
	for(index=0; index<noOfNodes; index++){
		itemElement = resultElement.childNodes[index];
		returnString += formatString;
		for(index1=0; index1<itemElement.childNodes.length; index1++){
			paramElement = itemElement.childNodes[index1];
			returnString = returnString.replace("{["+paramElement.nodeName+"]}", paramElement.childNodes[0].nodeValue);
		}
	}
	return(returnString);
}

function getTagValue(xmlDocument, strTagName){
	var resultElement = xmlDocument.getElementsByTagName("ajax-result")[0];
	return(resultElement.getElementsByTagName(strTagName)[0].childNodes[0].nodeValue);
}
