function CRldXmlHttp()
{
   this.m_objXmlHttp = false;
   this.m_strPageURL = "";
   this.m_bAsync = true;
   this.m_strMethod = "post";
   this.m_ConsumerCallback = null;
   this.m_RequestHeaderNames = new Array();
   this.m_RequestHeaderValues = new Array();
}

CRldXmlHttp.prototype.init = function()
{
   // Data retrieval functionality
   try
   {
      // Works with FF 2.0, IE 6, Opera 8.51
      if (window.XMLHttpRequest)
      {
	      // If IE7, Mozilla, Safari, etc: Use native object
	      this.m_objXmlHttp = new XMLHttpRequest();
      }
      else
      {
	      if (window.ActiveXObject)
	      {
             // ...otherwise, use the ActiveX control for IE5.x and IE6
             this.m_objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	      }
      }
   }
   catch (err)
   {
///      alert(err.description);
   }
}

CRldXmlHttp.prototype.setPageURL = function(strPageURL)
{
   this.m_strPageURL = strPageURL;
}

CRldXmlHttp.prototype.getPageURL = function()
{
   return this.m_strPageURL;
}

CRldXmlHttp.prototype.setAsync = function(bAsync)
{
   this.m_bAsync = bAsync;
}

CRldXmlHttp.prototype.getAsync = function()
{
   return this.m_bAsync;
}

CRldXmlHttp.prototype.setMethod = function(strMethod)
{
   this.m_strMethod = strMethod;
}

CRldXmlHttp.prototype.getMethod = function()
{
   return this.m_strMethod;
}

CRldXmlHttp.prototype.setConsumerCallback = function(callback)
{
   this.m_ConsumerCallback = callback;
}

CRldXmlHttp.prototype.getConsumerCallback = function(callback)
{
   return this.m_ConsumerCallback;
}

CRldXmlHttp.prototype.onReadyStateChangeCallback = function()
{
	//this.m_objXmlHttp.readyState codes:
	//	   * 0 --> uninitialized
   //	   * 1 --> loading
   //	   * 2 --> loaded
   //	   * 3 --> interactive
   //	   * 4 --> complete

   try
   {
      //if (this.m_objXmlHttp.readyState == 4) 
      //{
         this.m_ConsumerCallback(this.m_objXmlHttp);
      //}
   }
   catch (err)
   {
      // Perhaps, we should log this on the server.
      // Fail silently for now.
///      alert(err.description);
   }
}

CRldXmlHttp.prototype.setRequestHeader = function(strName, strValue)
{
   this.m_RequestHeaderNames.push(strName);
   this.m_RequestHeaderValues.push(strValue);
}

CRldXmlHttp.prototype.callPage = function(strArgList)
{
   var bSucceeded = false;
   
   try
   {
	   // Open a connection to the server
      //var bAsynchronous = true;
//      alert(this.getMethod());
//      alert(this.getPageURL());
	   this.m_objXmlHttp.open(
	      this.getMethod(), 
	      this.getPageURL(), 
	      this.getAsync());

      if (this.getAsync() == true)
      {
	      // Setup a function for the server to run when it's done
         var _this = this;
         this.m_objXmlHttp.onreadystatechange = function(){_this.onReadyStateChangeCallback()};
      }

	   // Send the request
      if (this.m_RequestHeaderNames.length && this.m_RequestHeaderValues.length && this.m_RequestHeaderNames.length == this.m_RequestHeaderValues.length)
      {
         var i = 0;
         for (i = 0; i < this.m_RequestHeaderNames.length; i++)
         {
            this.m_objXmlHttp.setRequestHeader(this.m_RequestHeaderNames[i], this.m_RequestHeaderValues[i]);
         }
      }

	   this.m_objXmlHttp.send(strArgList);
	   
	   if (this.getAsync() == false)
	   {
	      if (this.m_ConsumerCallback)
	      {
	         this.m_ConsumerCallback(this.m_objXmlHttp);
	      }
	   }
	   
	   bSucceeded = true;
	}
	catch (err)
	{
///	   alert("callPage:  " + err.description);
	}
	
	return bSucceeded;
}
/*
function SetServerCallSucceeded(bSucceeded)
{
   g_bServerCallSucceeded = bSucceeded;
}

function GetServerCallSucceeded(bSucceeded)
{
   return g_bServerCallSucceeded;
}

function appendPath(strRoot, strAddThis)
{
   var strRet = "";
   
   try
   {
      var nLastIndex = strRoot.lastIndexOf("/");
      var nLenMinus1 = strRoot.length - 1;
      
      if (nLastIndex != nLenMinus1)
      {
         strRoot += "/";
      }
      strRet = strRoot + strAddThis;
   }
   catch (err)
   {
   }
   
   return strRet;
}

function getURLRoot(strHref)
{
   var strRoot = "";

   try
   {
      if (strHref != "")
      {
		   var pieces = strHref.split('/');
         strRoot = pieces[0];

         var i;
         for (i = 2; i < pieces.length - 1; i++)
         {
            if (i == 2)
            {
               strRoot = strRoot + "//";
            }
            else
            {
               strRoot = strRoot + "/";
            }
            strRoot = strRoot + pieces[i];
         }
      }
   }
   catch (err)
   {
   }

   return strRoot;
}


function RetrieveMenuDataAsync(strTableId, strServerPage, strProductIdList, callback)
{
   try
   {
      SetServerCallSucceeded(false);
      
      g_strTableId = strTableId;
      g_strPartialURL = strServerPage;
      g_strProductIdList = strProductIdList;
      g_strDefaultServerURL = g_strURLBase + g_strPartialURL;
      g_responseXMLParser = callback;
      callPage("GET", UrlForRetrieveMenuDataAsync(), true, updatePage);
	}
	catch (err)
	{
      alert(g_strAction + " " + err.description);
	}
}

function UrlForRetrieveMenuDataAsync()
{
   g_strDefaultServerURL = g_strURLBase + g_strPartialURL;
   
   var strURL = g_strDefaultServerURL;
   var strRoot = getURLRoot(location.href);
   if (strRoot != "")
   {
      strURL = appendPath(strRoot, g_strPartialURL);
      strURL = strURL + "?id_list=" + g_strProductIdList;
   }
   
   return strURL;
}


function BuildTableGuts(objResponseXml)
{
   try
   {
      var items = objResponseXml.getElementsByTagName("item");

      //if (items) alert(items.length);
      if (items && items.length > 0)
      {
         var objTable = document.getElementById(g_strTableId);
         if (objTable)
         {
            var strIdList = "";
            
            for (i = 0; i < items.length; i++)
            {
               var IdList = items[i].getElementsByTagName("id");
               var DescriptionList = items[i].getElementsByTagName("description");
               var MinList = items[i].getElementsByTagName("min");
               var MaxList = items[i].getElementsByTagName("max");
               
               var strID = IdList[0].childNodes[0].nodeValue;
               var strDescription = DescriptionList[0].childNodes[0].nodeValue;
               var strMin = MinList[0].childNodes[0].nodeValue;
               var strMax = MaxList[0].childNodes[0].nodeValue;

               // Append strID to strIdList
               if (strIdList != "")
               {
                  // Append comma first
                  strIdList = strIdList + ",";
               }
               strIdList = strIdList + strID;
               
               var objTbody = document.createElement("tbody");
            
               var objRow = document.createElement("tr");
               if (items.length > 1)
               {
                  if (Number(i) % 2 == 0)
                  {
                     objRow.className = "order_form_row";
                  }
                  else
                  {
                     objRow.className = "order_form_row2";
                  }
               }

               var objCol1b = document.createElement("td");
               var theData = document.createTextNode(strDescription);
               objCol1b.appendChild(theData);
            
               var objCol2 = document.createElement("td");
               var objSelectElement = document.createElement("select");
               objSelectElement.name = "select" + strID;
               objSelectElement.id = objSelectElement.name;
               for (j = Number(strMin); j <= Number(strMax); j++)
               {
                  var objOptionElement = document.createElement("option");
                  var strJ = String(j);

                  objOptionElement.value = String(strJ);
                  theData = document.createTextNode(String(strJ));
                  objOptionElement.appendChild(theData);
                  objSelectElement.appendChild(objOptionElement);
               }
               objCol2.appendChild(objSelectElement);
               // If only one item in the order menu, automatically set 
               // the quantity to 1.
               if (items.length == 1)
               {
                  objSelectElement.selectedIndex = 1;
               }

               // Hidden form element containing comma-separated list of product id's
               objInputElement = document.createElement("input");
               objInputElement.name = "product_id_list";
               objInputElement.type = "hidden";
               objInputElement.value = strIdList;
               objCol2.appendChild(objInputElement);

               ///objRow.appendChild(objCol1);
               objRow.appendChild(objCol2);//objCol1b);
               objRow.appendChild(objCol1b);//objCol2);
               objTbody.appendChild(objRow);
               objTable.appendChild(objTbody);
                  
//               // The product names may contain characters with accents.  Those
//               // need to be url-encoded (with encodeURI) before they are posted.
//               objInputElement.value = encodeURI(objAllItems[i].GetName());
            }
         }
      }
   }
   catch (e)
   {
      alert(g_strAction + ":  " + e.description);
   }
}

// Order menu control functionality
var g_bMouseDown_Orderform = false;
var g_nXdiff;
var g_nYdiff;

function DragDropOperation(bInit)
{
   if (bInit)
   {
      document.onmousedown = HandleMouseDown_Orderform; 
      document.onmouseup = HandleMouseUp_Orderform; 
      document.onmousemove = HandleMouseMove_Orderform;
   }
   else
   {
      document.onmousedown = null;
      document.onmouseup = null;
      document.onmousemove = null;
   }
}

// div with id = "orderform"
// button with id = "btnClickToOrder"
function HandleClose()
{
   var objDiv = document.getElementById("orderform");
   if (objDiv)
   {
      objDiv.style.display = "none";
      objDiv.style.visibility = "hidden";
   }
   
   var objBtnClickToOrder = document.getElementById("btnClickToOrder");
   if (objBtnClickToOrder)
   {
      objBtnClickToOrder.style.visibility = "visible";
   }
   
   DragDropOperation(false);
}

function HandleClickToOrder(event)
{
   DragDropOperation(true);
   
   var objEvent = event;
   if (!objEvent)
   {
      objEvent = window.event;
   }

   x=objEvent.clientX;
   y=objEvent.clientY;
   
   var objDiv = document.getElementById("orderform");
   if (objDiv)
   {
      objDiv.style.display = "block";
      objDiv.style.visibility = "visible";
      var strWidth = objDiv.style.width;
      var nWidth = Number( strWidth.substr(0, strWidth.length-2) );
      objDiv.style.left = String(objEvent.clientX - nWidth + 25) + "px";
      objDiv.style.top = String(objEvent.clientY - 15) + "px";
      
      // Need to know when the cursor is over the "orderform" div
      objDiv.onmouseover = function (){g_bInsideDiv = true;};
      objDiv.onmouseout = function (){g_bInsideDiv = false;};
   }

   var objBtnClickToOrder = document.getElementById("btnClickToOrder");
   if (objBtnClickToOrder)
   {
      objBtnClickToOrder.style.visibility = "hidden";
   }

   return true;
}

function EnforceDefaultQuantity(event, strSelectId)
{
   var objTarget;
   if (event.target) 
      objTarget = event.target
   else if (event.srcElement) 
      objTarget = event.srcElement

   if (objTarget.type == "checkbox")
   {
      var objSelect = document.getElementById(strSelectId);
      if (objSelect)
      {
         if (objTarget.checked == true)
         {// box becoming unchecked
            objSelect.selectedIndex = 0;
         }
         else
         {// box becoming checked   
            objSelect.selectedIndex = 1;   
         }
      }
   }
   
   return true;
}

function HandleMouseMove_Orderform(event)
{
   if (event == null) 
   {
      var event = window.event; 
   }

   if (GetMouseDown_Orderform() == true)
   {
      var x = event.clientX;
      var y = event.clientY;
      
      var objDiv = document.getElementById("orderform");
      if (objDiv)
      {
         if (!g_nXdiff)
         {
            g_nXdiff = 0;
         }
         
         if (!g_nYdiff)
         {
            g_nYdiff = 0;
         }
         
         objDiv.style.left = (x - g_nXdiff) + "px";
         objDiv.style.top = (y - g_nYdiff) + "px";
      }
   }
}

function HandleMouseDown_Orderform(event)
{
   if (event == null)
   {
      var event = window.event; 
   }

   if (event.target && event.target.type)
   {// Bail since cannot begin drag via a control

      return true;
   }
   else if (event.srcElement && event.srcElement.type)
   {// Bail since cannot begin drag via a control

      return true;
   }
   else if (g_bInsideDiv == false)
   {// Bail since the mouse is not over the "orderform" div
      return true;
   }

   // DIFFERENCE IS LEFT, TOP VERSUS X, Y
   if (GetMouseDown_Orderform() == false)
   {
      var objDiv = document.getElementById("orderform");
      if (objDiv)
      {
         var x = event.clientX;
         var y = event.clientY;
         
         var strLeft = objDiv.style.left;
         var strTop = objDiv.style.top;
         
         var nLeft = Number( strLeft.substr(0, strLeft.length-2) );
         var nTop = Number( strTop.substr(0, strTop.length-2) );
         
         g_nXdiff = x - nLeft;
         g_nYdiff = y - nTop;
      }
   }

   SetMouseDown_Orderform(true);

   // cancel out any text selections 
   if (window.opera)
   {
      // Opera browser...cannot select when you make this call:
      // document.body.focus();
   }
   else
   {
      document.body.focus(); 
   }
   // prevent text selection in IE 
   document.onselectstart = function () { return false; }; 
   // prevent text selection (except IE) 
   return false;
}

function HandleMouseUp_Orderform(event)
{
   SetMouseDown_Orderform(false);

   // we're done with these events for now 
   document.onselectstart = null;
}

function SetMouseDown_Orderform(bDown)
{
   g_bMouseDown_Orderform = bDown;
}

function GetMouseDown_Orderform()
{
   return g_bMouseDown_Orderform;
}

function HandleSubmit_OrderForm(strOrderFormId, strServerPage)
{
   SetServerCallSucceeded(false);

   // Make blocking call to php page on web server that
   // adds the items to the cart (omAddItemsToCart.php).
   //
   // If cart update succeeds, return true;
   // If cart update does not succeed, display error, return false;
   try
   {
      g_strPartialURL = strServerPage;
      g_strDefaultServerURL = g_strURLBase + g_strPartialURL;
      g_responseXMLParser = AddItemsToCart_responseXMLParser;
      
      var strIdToAddList = "";
      var strQuantityNameValues = "";
      var IdArray = g_strProductIdList.split(",");

      for (i = 0; i < IdArray.length; i++)
      {
         var strSelectName = "select" + IdArray[i];
         var SelectArray = document.getElementsByName(strSelectName);
         if (SelectArray && SelectArray.length > 0)
         {
            var strQuantity = SelectArray[0].selectedIndex;
            if (Number(strQuantity) > 0)
            {
               if (strIdToAddList != "")
               {
                  strIdToAddList = strIdToAddList + ",";
               }
               strIdToAddList = strIdToAddList + IdArray[i];
               strQuantityNameValues = strQuantityNameValues + "&" + IdArray[i] + "=" + strQuantity;
            }
         }
      }

      if (strIdToAddList != "")
      {
         callPage(
            "GET", 
            UrlForAddItemsToCartSync(strOrderFormId, strIdToAddList, strQuantityNameValues), 
            false, 
            updatePage);
      }
  	}
	catch (err)
	{
      alert(g_strAction + " " + err.description);
	}

   return GetServerCallSucceeded();
}


function UrlForAddItemsToCartSync(strOrderFormId, strIdToAddList, strQuantityNameValues)
{
   var strURL = "";
   
   try
   {
      var strURL = g_strDefaultServerURL;
      var strRoot = getURLRoot(location.href);
      if (strRoot != "")
      {
         strURL = appendPath(strRoot, g_strPartialURL);
         strURL = strURL + "?id_list=" + strIdToAddList + strQuantityNameValues;
      }
   }
   catch (err)
   {
      alert(g_strAction + " " + err.description);
   }

   return strURL;
}

function AddItemsToCart_responseXMLParser(objResponseXml)
{
   // if objResponseXml is non-null, parse objResponseXml
}
*/
