var g_objXmlHttp = false;
var g_strURLBase = "http://www.dealfarm.com/";//"https://www.dealfarm.com/";
var g_strPartialURL = "";
var g_strDefaultServerURL = "";
var g_strFormID = "TheForm";
var g_strLoadingID = "";
var g_strAction = "";
var g_objResponseXml;
var g_responseXMLParser;
var g_strTableId = "";
var g_strProductIdList = "";
var g_bServerCallSucceeded = false;
var g_bInsideDiv = false;

// 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
	   g_objXmlHttp = new XMLHttpRequest();
   }
   else
   {
	   if (window.ActiveXObject)
	   {
          // ...otherwise, use the ActiveX control for IE5.x and IE6
          g_objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	   }
   }
}
catch (err)
{
   alert(err.description);
}

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;
      callServer("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 callServer(strMethod, strURL, bAsynchronous, readystatechange_handler) 
{
   try
   {
      SetServerCallSucceeded(false);

	   // Open a connection to the server
      //var bAsynchronous = true;
	   g_objXmlHttp.open(strMethod, strURL, bAsynchronous);

	   // Setup a function for the server to run when it's done
	   if (readystatechange_handler)
	   {
	      g_objXmlHttp.onreadystatechange = readystatechange_handler;
	   }

	   // Send the request
	   g_objXmlHttp.send(null);
	   
	   if (bAsynchronous == false)
	   {
	      if (readystatechange_handler)
	      {
	         readystatechange_handler();
	      }
	   }
	}
	catch (err)
	{
	   alert("callServer:  " + err.description);
	}
}

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 updatePage() 
{
	//g_objXmlHttp.readyState codes:
	//	   * 0 --> uninitialized
   //	   * 1 --> loading
   //	   * 2 --> loaded
   //	   * 3 --> interactive
   //	   * 4 --> complete

   try
   {
      if (g_objXmlHttp.readyState == 4) 
      {
         var strErrors = "";

         if (g_objXmlHttp.status == 200) 
         {
            var objResponseXml = g_objXmlHttp.responseXML;
            if (objResponseXml)
            {
               if (objResponseXml.getElementsByTagName("bail_to")[0])
               {// Server wants to redirect us
               
                  var strRedirectURL = objResponseXml.getElementsByTagName("bail_to")[0].childNodes[0].nodeValue;
                  window.location.replace(strRedirectURL);
               }
            }
            
            // Set global to indicate success
            SetServerCallSucceeded(true);
            
            // Call XML parsing function....could be a more generic if
            // we passed in the entire g_objXmlHttp object.
            g_responseXMLParser(objResponseXml);
         } 
         else 
         {
            // error
         }
      }
   }
   catch (err)
   {
      // Perhaps, we should log this on the server.
      // Fail silently for now.
      alert(err.description);
   }
}

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 objCol1 = document.createElement("td");
               var objInputElement = document.createElement("input");
               objInputElement.name = "checkbox" + strID;
               objInputElement.type = "checkbox";

               //
               // Tried this route, but the disparity between the way FF 
               // and IE handle events would make the resulting code messy:
               // 
               // IE
               // objInputElement.onmouseup = new Function("alert(window.event);");
               //
               // FF
               // objInputElement.onmouseup = new Function("event", "alert(arguments[0]");
               //
               objInputElement.onmouseup = function EnforceDefaultQuantity(event)
                  {
                     var objEvent;
                     if (event)
                     {
                        objEvent = event;
                        //alert("ff");
                     }
                     else
                     {
                        objEvent = window.event;
                        //alert("ie");
                     }

                     if (objEvent)
                     {
                        var objTarget;
                        if (objEvent.target) 
                        {
                           objTarget = objEvent.target;
                        }
                        else if (objEvent.srcElement) 
                        {
                           objTarget = objEvent.srcElement;
                        }

                        if (objTarget)
                        {
                           if (objTarget.type == "checkbox")
                           {
                              // Parse id from the checkbox name and assign it to strSelectId
                              var strCheckboxName = objTarget.name;
                              var strSelectId = strCheckboxName.replace("checkbox", "");
                              if (strSelectId != "")
                              {
                                 strSelectId = "select" + strSelectId;

                                 var objSelect = document.getElementById(strSelectId);
                                 if (objSelect)
                                 {
                                    if (objTarget.checked == true)
                                    {// box becoming unchecked
                                       objSelect.selectedIndex = 0;
                                    }
                                    else
                                    {// box becoming checked   
                                       objSelect.selectedIndex = 1;   
                                    }
                                 }
                              }
                              else
                              {
                                 alert("Need ID of select control");
                              }
                           }
                        }
                     }
                     
                     return true;
                  };
               objCol1.appendChild(objInputElement);
*/
               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 != "")
      {
         callServer(
            "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
}
