function AjaxResponseHandler(_ajaxObj, _callBack, _waitParams)
{
	var me = this;
	me.toString = function() {return "AjaxResponseHandler"; }
	me.shouldParseResponseXML = true;
	me.shouldDisplayDefaultError = true;
	me.formLayer = document;
	me.readyState = "wait";
	me.ajaxObj = _ajaxObj;
	me.args = [];
	me.callBackFunction = _callBack;
	me.waitParams = _waitParams;
	
	if (arguments.length > 2){
    for (var argsi=2; argsi < arguments.length; argsi++){
      me.args.push(arguments[argsi]);
    }
	}
	
	me.parseResponseXML = function(_responseXML){  
    var xmlResp = xLoadXML(_responseXML);
		var xmlRespElem;
		if (!xmlResp){
      //display default error message	
		}else{
      xmlRespElem = xmlResp.firstChild;
      if (!xmlRespElem) { //display an alert (error message) about the blank response;
        return;}
       else
       {
        //if(xmlRespElem.text.indexOf("ship_error") != -1)
        // addressErrorMsg =  xmlRespElem.text.toLowerCase().substring(xmlRespElem.text.indexOf("ship_error")+51,xmlRespElem.text.indexOf("</p>"))
        
       }
                          
      xEach(xmlRespElem.childNodes, func = function (childNode, nodeIndex, nodesLen){
                                            if (childNode.nodeType == 1){
                                                var fChild = eval('handle' + childNode.nodeName);
                                                if (fChild) fChild(childNode, me.args);
                                            }
                                       });
		}
	}
	var addressErrorMsg = "";
	var billaddressErrorMsg = "";
	me.onResponseReceived = function()
	{
		me.readyState = me.ajaxObj.checkReadyState() 
		if (me.readyState == "ok")
		{
			if (me.shouldParseResponseXML){
				var response = me.ajaxObj.request.responseText;
				if(response.indexOf("<error>") != -1 )
				{
				  if(response.indexOf("billingerror") != -1)
				    billaddressErrorMsg = response.substring(response.indexOf("<error>")+7,response.indexOf("</error>"));
				  else
				addressErrorMsg = response.substring(response.indexOf("<error>")+7,response.indexOf("</error>"));
				}
				else
				{
				  //call the method to parse the responses
				  me.parseResponseXML(response);
				  if( document.getElementById("litAtlas") != null)
				  {
			           document.getElementById("litAtlas").innerHTML = '';
                      var newScript = document.createElement('script'); 
	                  newScript.type = 'text/javascript'; 
	             
	                 if(response.toLowerCase().indexOf("<section sectionid=\"#shipping\">") != -1 && response.toLowerCase().indexOf("errortype") == -1)
	                   newScript.src =  "https://switch.atdmt.com/jaction/Gevalia_Step_2_Shipping_Information/v3/atm1."+document.getElementById("hdKeycode").value;
	                 else if(response.toLowerCase().indexOf("<section sectionid=\"#payment\"") != -1 && response.toLowerCase().indexOf("errortype") == -1)
	              	  newScript.src =   "https://switch.atdmt.com/jaction/Gevalia_Step_3_Payment_Information/v3/atm1."+document.getElementById("hdKeycode").value;
	                 else if(response.toLowerCase().indexOf("<section sectionid=\"#review\"") != -1 && response.toLowerCase().indexOf("errortype") == -1)
	                  newScript.src =   "https://switch.atdmt.com/jaction/Gevalia_Step_4_Review_Order/v3/atm1."+document.getElementById("hdKeycode").value;
	                                
	                   document.getElementById("litAtlas").appendChild(newScript);
	              }     
				}  
			}
			if (me.callBackFunction)  me.callBackFunction();
			
		}else if (me.readyState == "error")
		{
			if (me.shouldDisplayDefaultError){
				//display default error message	
			}
			if (me.callBackFunction)  me.callBackFunction();
		}
		
		if(addressErrorMsg == "undefined" || addressErrorMsg == "")
		{}
		else
		{document.getElementById("errorMsg").innerHTML = addressErrorMsg;}
		if(billaddressErrorMsg != "")
		 document.getElementById("billerrorMsg").innerHTML = billaddressErrorMsg;
	}
	
	
	me.showWaitStatus = function()
  {
    var bProcessWin = false;
    if (me.waitParams == 'process')  bProcessWin = true;
    if (bProcessWin){
      toggleModalWindow(null, x$("modalwaitdiv"), 'block', false, true);		
    }else{
      toggleModalWindow(null, x$("modalivwaitdiv"), 'block', false, false);		
    }

    window.status = "Sent the request. Awaiting response..."
  }

  me.clearWaitStatus = function()
  {
    var bProcessWin = false;
    if (me.waitParams == 'process')  bProcessWin = true;
    if (bProcessWin){
      toggleModalWindow(null, x$("modalwaitdiv"), 'none', false, true);		
    }else{
      toggleModalWindow(null, x$("modalivwaitdiv"), 'none', false, false);		
    }
    
    window.status = "Done."
  }
}




function getURL(_getURL, _currentForm, _waitStyle){
  var ajax = new Ajax();
	var oAjxRespHandler = new AjaxResponseHandler(ajax, _currentForm);
	var requestProcessed;
	
	if (window.location.href.indexOf('https:')==0 && _getURL.indexOf('http:')==0){
    _getURL = _getURL.replace('http:','https:');
  }
	oAjxRespHandler.waitParams = _waitStyle;
	
	ajax.uiWaitMethod = oAjxRespHandler.showWaitStatus;
	ajax.uiClearWaitMethod = oAjxRespHandler.clearWaitStatus;
	ajax.makeRequest('GET', _getURL, oAjxRespHandler.onResponseReceived, null);
}


function postURL(_postURL, _currentForm, _waitStyle){
  var ajax = new Ajax();
	var oAjxRespHandler;
	oAjxRespHandler = new AjaxResponseHandler(ajax, _currentForm);
	
	var sFormData = "inputfrom=" + encodeURIComponent(window.location.href);
	sFormData += "&bi=" + encodeURIComponent(__BI);
	sFormData += "&" + formData(_currentForm, null, null);
	var requestProcessed;
	
	if (window.location.href.indexOf('https:')==0 && _postURL.indexOf('http:')==0){
    _postURL = _postURL.replace('http:','https:');
  }
  oAjxRespHandler.waitParams = _waitStyle;
  	
	ajax.uiWaitMethod = oAjxRespHandler.showWaitStatus;
	ajax.uiClearWaitMethod = oAjxRespHandler.clearWaitStatus;
	ajax.makeRequest('POST', _postURL, oAjxRespHandler.onResponseReceived, sFormData);
}

/* seems unnecessary:
function fireURLAtInterval(_getURL, _interval)
{
  var ajax = new Ajax();
	var oAjxRespHandler = new AjaxResponseHandler(ajax);
	var fireInterval = (_interval && !isNaN(_interval)) ? _interval : 0;
	
	if (fireInterval > 0) ajax.constantCheck(fireInterval, getURL);
	ajax.makeRequest('GET', _getURL, oAjxRespHandler.onResponseReceived);
}
*/


function elemData(pElem, elem, arrData, arrGroups, elemValue){
  if (!elem)  return;
  var elemTag = elem.nodeName;
  var elemType, elemName;
  var elemGroup, elemGroupItems;
  
  switch (elemTag.toLowerCase()){
    case "input":
      elemType = xGetAttr(elem, 'type');
      elemType = elemType.toLowerCase();
      if (elemType == "file") return;
      break;
    case "select":
      elemType = "select";
      break;
    case "span":
    case "textarea":
    elemType = "textarea";
      break;
    default:
      return;
  }
  if (!elemType) return;
  

  switch (elemType){
    case "text":
    case "textarea":
    case "hidden":
      elemName = elem.name ? elem.name : elem.id;
      elemValue = elem.value;
      break;
    case "password":
		elemName = elem.name ? elem.name : elem.id;
      elemValue = elem.value;
      break; 
    case "select":
      elemName = elem.name ? elem.name : elem.id;
      elemValue = elem.options[elem.selectedIndex].value;
      break;
      
    case "radio":
    case "checkbox":
      elemName = elem.name;
      elemGroup = 'fieldgroup_' + elemName;
      elemValue = '';
      if (inArr$(arrGroups, elemGroup) < 0){
        elemGroupItems = xClass$(elemGroup, pElem, 'input')
        xEach(elemGroupItems, func = function(elemItem, elemItemIndex, elemItemsLen){
                                            if (elemItem.checked){
                                                elemValue += ',' + elemItem.value;
                                            }
                                        });
        arrGroups.push(elemGroup);
        if (elemValue.length) (elemValue = elemValue.substr(1));
      }
      break;
      
    default:
      elemValue = '';
      break;
  }
  
  if (elemValue && elemValue.length) { 
    arrData.push(encodeURIComponent(elemName) + "=" + encodeURIComponent(elemValue));
  }  
  
}


function formData(pElem, arrPostData, arrGroupNames){
  var submitElems = xClass$('postable', pElem, '*');
  
  if (!isArray(arrPostData))  arrPostData = [];
  if (!isArray(arrGroupNames))  arrGroupNames = [];
  
  xEach(submitElems, func = function(elem, elemIndex, elemLen){
                                elemData(pElem, elem, arrPostData, arrGroupNames);
                            });
  if (!arrPostData.length)  return '';
  return arrPostData.join("&");
}
