﻿
/* sample code
var xmlHttp = new cls_xmlhttp();
xmlHttp.send("/", false);
*/ 

////////////////// XMLHTTP //////////////////////
function GetAjaxResponseText(url) {
    var xmlHttp = new cls_xmlhttp();
	var ret = xmlHttp.send(url, false); // sync
	if (!ret) return;
	return xmlHttp.responseText();
}
function GetAjaxResponseXML(url) {
    var xmlHttp = new cls_xmlhttp();
	var ret = xmlHttp.send(url, false); // sync
	if (!ret) return;
	return xmlHttp.responseXML();
}
////////////////// XMLHTTP END //////////////////

function cls_xmlhttp()
{
	// private
	var xmlHttp = false;
	var onloadFunc = null;
	var self = this;
	
	this.method = "GET";
	this.requestBody = null;

	if (window.XMLHttpRequest) // Mozilla, Firefox, Opera 8.01, Safari
	{
		try {
			xmlHttp = new XMLHttpRequest();
		} catch(e) {
			xmlHttp = false;
		}
	}
	else if (window.ActiveXObject) // IE
	{
		try {
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				xmlHttp = false;
			}
		}
	}
	
	/*
  if (window.XMLHttpRequest)
  {
    xmlHttp = new XMLHttpRequest();
  }
  else if (window.ActiveXObject)
  {
    var aVersions = [ "MSXML2.XMLHttp.5.0"
      ,"MSXML2.XMLHttp.4.0"
      ,"MSXML2.XMLHttp.3.0"
      ,"MSXML2.XMLHttp"
      ,"Microsoft.XMLHttp"
      ];

    for (var i = 0; i < aVersions.length; i++)
    {
      try
      {
        var xmlHttp = new ActiveXObject(aVersions[i]);
      }
      catch (oError)
      {    
      }
    }
  }
	*/
	
	this.send = function(url,async,func)
	{
		if (!xmlHttp) return;
		if (!async) async = false;
		
		//xmlHttp.setoption(0,0);
		xmlHttp.open(this.method, url, async);
		if (this.method.toUpperCase()=="POST")
			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		if (func) {
			onloadFunc = func;
			xmlHttp.onreadystatechange = on_readystatechange; // FF do not call onreadystatechange on async==false
		}
		xmlHttp.setRequestHeader("BDXmlHttp","1");
		xmlHttp.send(this.requestBody);
		if (!async) {
			if (xmlHttp.status!="200") return false;
		}
		return true;
	}

	function on_readystatechange()
	{
		if (xmlHttp==null || xmlHttp.readyState != 4) return;
		if (xmlHttp.responseText.length==0) return;

		if (xmlHttp.status!="200") return;
		if (!onloadFunc) return;

		onloadFunc(self);
	}

	this.responseXML = function() {
		return xmlHttp.responseXML;
	}
	this.responseText = function() {
		return xmlHttp.responseText;
	}
	this.responseEval = function() {
		return eval( '(' + xmlHttp.responseText + ')' );
	}
	this.need_login = function() {
		return (xmlHttp.responseText=="cls_login");
	}

	this.post = function(oForm) {
		this.method = "POST";
		this.requestBody = formData2QueryString(oForm);
	}

	/**
	 * Serializes the data from all the inputs in a Web form
	 * into a query-string style string.
	 * @param docForm -- Reference to a DOM node of the form element
	 * @param formatOpts -- JS object of options for how to format
	 * the return string. Supported options:
	 *    collapseMulti: (Boolean) take values from elements that
	 *    can return multiple values (multi-select, checkbox groups)
	 *    and collapse into a single, comman-delimited value
	 *    (e.g., thisVar=asdf,qwer,zxcv)
	 * @returns query-string style String of variable-value pairs
	 */
	function formData2QueryString(docForm, formatOpts) {
	  
	  var opts = formatOpts || {};
	  var str = '';
	  var formElem;
	  var lastElemName = '';
	  
	  for (i = 0; i < docForm.elements.length; i++) {
		formElem = docForm.elements[i];
	    
		switch (formElem.type) {
		  // Text fields, hidden form elements
		  case 'text':
		  case 'hidden':
		  case 'password':
		  case 'textarea':
		  case 'select-one':
			str += formElem.name + '=' + encodeURI(formElem.value) + '&'
			break;
	        
		  // Multi-option select
		  case 'select-multiple':
			var isSet = false;
			for(var j = 0; j < formElem.options.length; j++) {
			  var currOpt = formElem.options[j];
			  if(currOpt.selected) {
				if (opts.collapseMulti) {
				  if (isSet) {
					str += ',' + encodeURI(currOpt.value);
				  }
				  else {
					str += formElem.name + '=' + encodeURI(currOpt.value);
					isSet = true;
				  }
				}
				else {
				  str += formElem.name + '=' + encodeURI(currOpt.value) + '&';
				}
			  }
			}
			if (opts.collapseMulti) {
			  str += '&';
			}
			break;
	      
		  // Radio buttons
		  case 'radio':
			if (formElem.checked) {
			  str += formElem.name + '=' + encodeURI(formElem.value) + '&'
			}
			break;
	        
		  // Checkboxes
		  case 'checkbox':
			if (formElem.checked) {
			  // Collapse multi-select into comma-separated list
			  if (opts.collapseMulti && (formElem.name == lastElemName)) {
				// Strip of end ampersand if there is one
				if (str.lastIndexOf('&') == str.length-1) {
				  str = str.substr(0, str.length - 1);
				}
				// Append value as comma-delimited string
				str += ',' + encodeURI(formElem.value);
			  }
			  else {
				str += formElem.name + '=' + encodeURI(formElem.value);
			  }
			  str += '&';
			  lastElemName = formElem.name;
			}
			break;
	        
		}
	  }
	  // Remove trailing separator
	  str = str.substr(0, str.length - 1);
	  return str;
	}


}

