function XMLHttpObject()
{
    this.isMSIE = false;

    var XMLHttpObjectVar = null;
    try {
       try {             // if Mozilla Browser
          XMLHttpObjectVar = new XMLHttpRequest();
       }
       catch(e1) {       // IE Browser
          try {
             XMLHttpObjectVar = new ActiveXObject("MSXML3.XmlHttp");
          }
          catch(e2) {
             try {
                XMLHttpObjectVar = new ActiveXObject("MSXML2.XmlHttp");
             }
             catch(e3) {
                XMLHttpObjectVar = new ActiveXObject("Microsoft.XmlHttp");
             }
          }
          this.isMSIE = true;
       }
    }
    catch (ex) {
    	window.alert("Browser not support XmlHttp");
    	return;
    }
	
    this.Object = XMLHttpObjectVar;

    this.open = XMLHttp_open;
    this.send = XMLHttp_send;
    this.responseText = XMLHttp_responseText;
    this.responseXML = XMLHttp_responseXML;
    this.setRequestHeader = XMLHttp_setRequestHeader;
}

function XMLHttp_open(v1, v2, v3)
{
    return this.Object.open(v1, v2, v3);
}

function XMLHttp_send()
{
	if(arguments.length === 0) {
	    if(!this.isMSIE) {
    	    var datavar = "";
        	return this.Object.send(datavar);
	    }
    	else {
        	return this.Object.send();
	    }
	}
	return this.Object.send(arguments[0]);
}

function XMLHttp_responseText()
{
    return this.Object.responseText;
}

function XMLHttp_responseXML()
{
    return this.Object.responseXML;
}

function XMLHttp_setRequestHeader(var1, var2)
{
	return this.Object.setRequestHeader(var1, var2);
}

function Ajaxaction()
{
	this.action = null;
	if(arguments.length != 1 && arguments.length != 2) {
		window.alert("Action should have 1 or 2 argument(s).");
		return;
	}
	
	if(arguments.length == 1) {
		this.action = arguments[0];
	}
	else {
		this.classname = arguments[0];
		this.method = arguments[1];
	}
	
    this.xmlDoc = "";
	this.result_info = "";

	this.XmlDocToArray = XmlDocToArray;
	this.execute = execute;
	this.execute1 = execute1;
	this.executeArray = executeArray;
	this.getResult = getResult;
	this.toObjectArray = toObjectArray;
	this.toObject = toObject;
}

function execute()
{
	var AObject = new AutoObject(this, arguments);
    var jsonstring = JSON.stringify(AObject);
    var xhr = new XMLHttpObject();
    
    xhr.open("POST", "servlet/ajaxactionservlet?&funid=" + new Date().getTime(), false);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
    xhr.send(jsonstring);

    this.result_info = xhr.responseText();
    return this.result_info;
}

function execute1()
{
	var AObject = new AutoObject(this, arguments);
    var jsonstring = JSON.stringify(AObject);
    var xhr = new XMLHttpObject();
    
    xhr.open("POST", "../servlet/ajaxactionservlet?&funid=" + new Date().getTime(), false);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
    xhr.send(jsonstring);

    this.result_info = xhr.responseText();
    return this.result_info;
}

function executeArray(argArray)
{
	var AObject = new AutoObject(this, argArray);
    var jsonstring = JSON.stringify(AObject);
    var xhr = new XMLHttpObject();
    xhr.open("POST", "servlet/ajaxactionservlet?&funid=" + new Date().getTime(), false);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
    xhr.send(jsonstring);

    this.result_info = xhr.responseText();
    return this.result_info;
}

function AutoObject(ajaxaction, args)
{
	if(ajaxaction.action !== null) {
	  this.action = ajaxaction.action;
	}
	else {
		this.classname = ajaxaction.classname;
		this.method = ajaxaction.method;
	}
	
    for(var i = 0; i < args.length; i = i + 1) {
        var name = "arg" + i;
        this[name] = args[i];
    }
}

function getResult()
{
	return this.result_info;
}

function getResultXML()
{
	return this.xmlDoc;
}

function toObjectArray()
{
	var xparser = new XmlParser();
	this.xmlDoc = xparser.loadXML(this.result_info);
	//this.xmlDoc = this.XMLHttp_responseXML();
	return this.XmlDocToArray();
}

function toObject()
{
	return this.toObjectArray()[0];
}

////////
function XmlParser()
{
	this.xmlDoc = "";
	this.loadXML = loadXMLString;
	this.load = loadXMLFile;
	this.removeBlankTextNode = removeBlankTextNode;
	this.XmlDocToArray = XmlDocToArray;
}

function loadXMLString(XmlString)
{
	try {//Internet Explorer
	    this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		this.xmlDoc.async = false;
		this.xmlDoc.loadXML(XmlString);
	}
	catch(e) {
 	  	try {//Firefox, Mozilla, Opera, etc.
	    	parser = new DOMParser();
	    	this.xmlDoc = parser.parseFromString(XmlString, "text/xml");
	
			removeBlankTextNode(this.xmlDoc);
	    }
		catch(e) {
			window.alert(e.message);
		}
	}
	
	return this.xmlDoc;
}

function loadXMLFile(dname) 
{
	try { //Internet Explorer
	    this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	}
	catch(e) {
	    try {//Firefox, Mozilla, Opera, etc.
	        this.xmlDoc = document.implementation.createDocument("","",null);
			removeBlankTextNode(this.xmlDoc);
	    }
	    catch(e) {
	        window.alert(e.message);
	    }
	}
	
	try {
	    this.xmlDoc.async=false;
	    this.xmlDoc.load(dname);
		removeBlankTextNode(this.xmlDoc);
	    return this.xmlDoc;
	}
	catch(e) {
	    window.alert(e.message);
	}
	
	return null;
}

function removeBlankTextNode(xmldoc)
{
	var i = 0;
	while(i < xmldoc.childNodes.length) {
		var node = xmldoc.childNodes[i];
		if(node.nodeType == 1) {
			removeBlankTextNode(node);
		}
		if(node.nodeType == 3) {
			var value = trim(node.nodeValue);
			if(value === "") {
			  xmldoc.removeChild(node);
			}
			continue;
		}
		i++;
	}
}

function XmlDocToArray()
{
    var jsobjects = new Array();

    var xmlobjects = this.xmlDoc.getElementsByTagName("Object");
    for(var i = 0; i < xmlobjects.length; i++) {
        var xmlobject = xmlobjects[i];
        var xmlclassnamenode = xmlobject.childNodes[0].childNodes[0];
        if(xmlclassnamenode.nodeValue == "String") {
        	jsobjects[i] = xmlobject.childNodes[1].nodeValue;
        }
        else {
	        var jsobject = new Object();
	        for(var j = 1; j < xmlobject.childNodes.length; j++) {
	        	var xmlfield = xmlobject.childNodes[j];
	        	var name = xmlfield.childNodes[0].childNodes[0].nodeValue;
	        	var value = "";
	        	try {
	        		value = xmlfield.childNodes[1].childNodes[0].nodeValue;
	        	}
	        	catch(ex) {
	        	}
	        	jsobject[name] = value;
	        	//eval("jsobject." + name + "='" + value + "'");
	        }
	        jsobjects[i] = jsobject;
        }
    } //×¢تح
    
    return jsobjects;
}

function AjaxFuncString(action)
{
	var aje = new Ajaxaction(action);
	var args = new Array();
	
	for(var i = 1; i < arguments.length; i++) {
	  args[i - 1] = arguments[i];
	}

	aje.executeArray(args);
	return aje.getResult();
}

function AjaxFuncObjects(action)
{
	var aje = new Ajaxaction(action);
	var args = new Array();
	
	for(var i = 1; i < arguments.length; i++) {
	  args[i - 1] = arguments[i];
	}

	aje.executeArray(args);
	return aje.toObjectArray();
}

function AjaxFuncObject(action)
{
	var aje = new Ajaxaction(action);
	var args = new Array();
	
	for(var i = 1; i < arguments.length; i++) {
	  args[i - 1] = arguments[i];
	}

	aje.executeArray(args);
	return aje.toObject();
}

function JAXobject()
{
    this.getObjects = function(action)
    		{
				var aje = new Ajaxaction(action);
				var args = new Array();
	
				for(var i = 1; i < arguments.length; i++) {
					args[i - 1] = arguments[i];
				}

				aje.executeArray(args);
				return aje.toObjectArray();
			};

    this.getObject = function(action)
    		{
				var aje = new Ajaxaction(action);
				var args = new Array();
	
				for(var i = 1; i < arguments.length; i++) {
					args[i - 1] = arguments[i];
				}

				aje.executeArray(args);
				return aje.toObject();
			};

    this.getString = function(action)
    		{
				var aje = new Ajaxaction(action);
				var args = new Array();
	
				for(var i = 1; i < arguments.length; i++) {
					args[i - 1] = arguments[i];
				}

				aje.executeArray(args);
				return aje.getResult();
			};
}

if(!this.JAX) {
	JAX = new JAXobject();
}


