    var objAJAXRequest = false;
    var iAJAXCount = 0;
    
	var sWYSIWYGFieldName = "";
	var sWYSIWYGValue = "";
			
    
	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
    function makeRequest(url, strSubmit, strResultFunc) 
    {

        objAJAXRequest = false;
        
        // start the animation
        spinner_ani();

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            objAJAXRequest = new XMLHttpRequest();
            if (objAJAXRequest.overrideMimeType) {
                objAJAXRequest.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                objAJAXRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                objAJAXRequest = new ActiveXObject("Microsoft.XMLHTTP");
            	} catch (e) {
	                try {
	                objAJAXRequest = new ActiveXObject("Msxml.XMLHTTP");
	            	} catch (e) {
		                try {
		                objAJAXRequest = new ActiveXObject("Msxml3.XMLHTTP");
		            	} catch (e) {}
	            	}
            	}
            }
        }

        if (!objAJAXRequest) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
// uncomment this to see all the data that is being submitted to the form to be processed
//document.write (strSubmit);
        switch (strResultFunc){
        	case 'alertContents':
        		objAJAXRequest.onreadystatechange = alertContents;
        		break;
        	case 'AJAXPopulateForm':
        		objAJAXRequest.onreadystatechange = AJAXPopulateForm;
        		break;
        }
        
        objAJAXRequest.open('POST', url, true);

        objAJAXRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        objAJAXRequest.send(strSubmit);
    }
    //************************************************************************************
	
	
   
	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
   function alertContents() 
   {
        if (objAJAXRequest.readyState == 4) {
        	// stop the animation
        	stopinterval();
        	
            if (objAJAXRequest.status == 200) {
// uncomment the next line to dump the results (can be used to display non-xml)
//alert(objAJAXRequest.responseText);
//document.write(objAJAXRequest.responseText);	// this prints it onto the page for easy copy/paste
				var response  = objAJAXRequest.responseXML.documentElement;

				var sData	  = response.getElementsByTagName('sDebug')[0].firstChild.data;
				// change the text on the page to the error/success message - this is the extra (dynamic) data returned
				DisplayError(sData);
            } else {
            	alert('There was a problem with the request.');
// uncomment the next line to dump an error message if the .asp file is generating one
alert(objAJAXRequest.responseText);
            }
        }

	}
	//************************************************************************************
	
	
	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
	function DisplayError(sData)
	{
		var sTempError;

		if ( sData != "" )
		{
			switch(sData){
				case '1':
					sTempError = "Please enter your name.";
					break;
				case '2':
					sTempError = "Please enter your postal code.";
					break;
				case '4':
					sTempError = "Your email has been sent.<br><br>Thank you!";
					break;
			}
			return overlib('<Table cellpadding=0 cellspacing=0 border=0><tr><td><img src=\"'+sAJAXPath+'bubble_top_left.gif\" width=16 height=15></td><td background=\"'+sAJAXPath+'bubble_top.gif\"><img src=\"'+sAJAXPath+'bubble_top.gif\" width=16 height=15></td><td><img src=\"'+sAJAXPath+'bubble_top_right.gif\" width=22 height=15></td></tr><tr><td background=\"'+sAJAXPath+'bubble_left.gif\" width=15><img src=\"'+sAJAXPath+'bubble_left.gif\" width=15></td><td width=100\%><span style=\"FONT-SIZE: 14px; COLOR: #000000\">' + sTempError + '<br><br><a href=\"javascript:void(0);\" onClick=\"cClick();\"><img src=\"'+sAJAXPath2+'Close_Window.png\" width=93 height=15 alt=\"Click to close this window\" border=0></a></span></td><td background=\"'+sAJAXPath+'bubble_right.gif\" width=22><img src=\"'+sAJAXPath+'bubble_right.gif\" width=22></td></tr><tr><td><img src=\"'+sAJAXPath+'bubble_bottom_left.gif\" width=16 height=15></td><td background=\"'+sAJAXPath+'bubble_bottom.gif\"><img src=\"'+sAJAXPath+'bubble_bottom.gif\" width=16 height=15></td><td><img src=\"'+sAJAXPath+'bubble_bottom_right.gif\" width=22 height=15></td></tr></table>', CENTERPOPUP, STICKY, CLOSECLICK, CENTER, FGCOLOR, '#FFFFFF', BGCOLOR, '#FFFFFF', BORDER, 0);
		}

	}
	//************************************************************************************


	//************************************************************************************
	//*																					*
	//*		This code is copyright 2003 by Matthew Eernisse (mde@state26.com)			*
	//*		Additional bugfixes by Mark Pruett (mark.pruett@comcast.net)				*
	//*																					*
	//************************************************************************************
	function formData2QueryString(docForm) 
	{
	
		var strSubmitContent = '';
		var formElem;
		var strLastElemName = '';
		var i;

		for (i = 0; i < docForm.elements.length; i++) {
			
			formElem = docForm.elements[i];
			if ( formElem.name == "details" ){
				// this is a case that only works in the manager w/ the WYSIWYG editor if it is named 'details'
				try {
				    strSubmitContent += 'details=' + escape(FCKeditorAPI.GetInstance('details').GetHTML(123)) + '&';
				} catch (e) {
				    try {
				    	// it appears as though they have disabled the FCKeditor (probably on the product edit page)
						strSubmitContent += 'details=' + escape(formElem.value) + '&';
				    } catch (e) {}
				}
			}else{
				switch (formElem.type) {
					// Text fields, hidden form elements
					case 'hidden':
					case 'text':
					case 'password':
					case 'textarea':
					case 'select-one':
						strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
						break;
						
					// Radio buttons
					case 'radio':
						if (formElem.checked) {
							strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
						}
						break;
						
					// Checkboxes
					case 'checkbox':
						if (formElem.checked)
							strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
							
/*						if (formElem.checked) {
							// Continuing multiple, same-name checkboxes
							if (formElem.name == strLastElemName) {
								// Strip of end ampersand if there is one
								if (strSubmitContent.lastIndexOf('&') == strSubmitContent.length-1) {
									//strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
								}
								// Append value as comma-delimited string
								strSubmitContent += ',' + escape(formElem.value);
							}
							else {
								strSubmitContent += formElem.name + '=' + escape(formElem.value);
							}
							strSubmitContent += '&';
							strLastElemName = formElem.name;
						}*/

						break;
					case 'select-multiple':
						strSubmitContent += formElem.name + '=';
						for (iX = 0; iX < formElem.length; iX++) 
						{
							if ( formElem.options[iX].selected )
							{
								strSubmitContent += ',' + escape(formElem.options[iX].value);
							}
						}
						strSubmitContent += '&';
						break;
				}
			}
		}
		
		// Remove trailing separator
		strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
		return strSubmitContent;
	}
	//************************************************************************************



	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
	function stopinterval()
	{
		clearTimeout(timer);
		obj = document.getElementById("spinner");
		try {
		    obj.firstChild.nodeValue = " ";
		} catch (e) {}
	}
	//************************************************************************************
	
	

	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
	function spinner_ani()
	{
		var sChars=new Array();
		sChars[0] = "\\";
		sChars[1] = "|";
		sChars[2] = "/";
		sChars[3] = "-";
		
		sChars[4] = "\\";
		sChars[5] = "|";
		sChars[6] = "/";
		sChars[7] = "-";
	
		obj = document.getElementById("spinner");
		if ( iAJAXCount == 8 ){
			iAJAXCount = 0;
		}else{
			try {
			    obj.firstChild.nodeValue = sChars[iAJAXCount];
			} catch (e) {}
			iAJAXCount++;
		}
	
		timer=setTimeout("spinner_ani()",50)
	}
	//************************************************************************************
	
	

	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
   function AJAXPopulateForm() 
   {

// got to make sure that we check if the form field (or whatever) exists since sometimes they won't -- depending on RIGHTS
        if (objAJAXRequest.readyState == 4) {
        	// stop the animation
        	stopinterval();
        	
            if (objAJAXRequest.status == 200) {
// uncomment the next line to dump the results (can be used to display non-xml)
//alert(objAJAXRequest.responseText);

				var response  = objAJAXRequest.responseXML.documentElement;

				var sDebug    = objAJAXRequest.responseXML.getElementsByTagName("sDebug")[0];
				var sData    = objAJAXRequest.responseXML.getElementsByTagName("sData")[0];

				AJAXDebug(response.getElementsByTagName('sDebug')[0].firstChild.data, response.getElementsByTagName('sData')[0].firstChild.data);
				AJAXParseXML(sData);

				// just re-doing this in case the first time it failed - sometimes the API code has not yet loaded
				if ( sWYSIWYGFieldName != "" )
				{
					try {
						var objFCK = FCKeditorAPI.GetInstance(sWYSIWYGFieldName);
					    objFCK.SetHTML(sWYSIWYGValue, true);
					} catch (e) {}
				}
				
            } else {
            	alert('There was a problem with the request (2).');
// uncomment the next line to dump an error message if the .asp file is generating one
document.write(objAJAXRequest.responseText);
            }
        }

	}
	//************************************************************************************
	
	
	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
	function AJAXDebug(sDebug, sData)
	{
		var sTempError;
		
		switch (sDebug) {
			case '1':
				sTempError = "Please log in before proceeding.";
				break;
		}

		if ( sDebug != "0" )
			return overlib('<Table cellpadding=0 cellspacing=0 border=0><tr><td><img src=\"'+sAJAXPath+'bubble_top_left.gif\" width=16 height=15></td><td background=\"'+sAJAXPath+'bubble_top.gif\"><img src=\"'+sAJAXPath+'bubble_top.gif\" width=16 height=15></td><td><img src=\"'+sAJAXPath+'bubble_top_right.gif\" width=22 height=15></td></tr><tr><td background=\"'+sAJAXPath+'bubble_left.gif\" width=15><img src=\"'+sAJAXPath+'bubble_left.gif\" width=15></td><td width=100\%><span style=\"FONT-SIZE: 14px; COLOR: #000000\">' + sTempError + '<br><br><a href=\"javascript:void(0);\" onClick=\"cClick();\"><img src=\"'+sAJAXPath2+'Close_Window.png\" width=93 height=15 alt=\"Click to close this window\" border=0></a></span></td><td background=\"'+sAJAXPath+'bubble_right.gif\" width=22><img src=\"'+sAJAXPath+'bubble_right.gif\" width=22></td></tr><tr><td><img src=\"'+sAJAXPath+'bubble_bottom_left.gif\" width=16 height=15></td><td background=\"'+sAJAXPath+'bubble_bottom.gif\"><img src=\"'+sAJAXPath+'bubble_bottom.gif\" width=16 height=15></td><td><img src=\"'+sAJAXPath+'bubble_bottom_right.gif\" width=22 height=15></td></tr></table>', CENTERPOPUP, STICKY, CLOSECLICK, CENTER, FGCOLOR, '#FFFFFF', BGCOLOR, '#FFFFFF', BORDER, 0);

if ( 0 == 1 ){
		if ( sDebug.firstChild.data != "0" )
		{
			if ( sData != null )
				if ( sData.firstChild != null )
				{
					try {
						// first see if the data passed back is a function or javascript call
						eval(sData.firstChild.data);
					} catch (e) {
						// otherwise it's just a error message...the sData holds the path to the images
						switch (sDebug) {
							case '1':
								sTempError = "Please log in before proceeding.";
								break;
						}
						
						overlib('<Table cellpadding=0 cellspacing=0 border=0><tr><td><img src=\"bubble_top_left.gif\" width=16 height=15></td><td background=\"bubble_top.gif\"><img src=\"bubble_top.gif\" width=16 height=15></td><td><img src=\"bubble_top_right.gif\" width=22 height=15></td></tr><tr><td background=\"bubble_left.gif\" width=15><img src=\"bubble_left.gif\" width=15></td><td width=100\%><span style=\"FONT-SIZE: 14px; COLOR: #000000\">' + sTempError + '<br><br><a href=\"javascript:void(0);\" onClick=\"cClick();\"><img src=\"/Images/Close_Window.png\" width=93 height=15 alt=\"Click to close this window\" border=0></a></span></td><td background=\"bubble_right.gif\" width=22><img src=\"bubble_right.gif\" width=22></td></tr><tr><td><img src=\"bubble_bottom_left.gif\" width=16 height=15></td><td background=\"bubble_bottom.gif\"><img src=\"bubble_bottom.gif\" width=16 height=15></td><td><img src=\"bubble_bottom_right.gif\" width=22 height=15></td></tr></table>', CENTERPOPUP, STICKY, CLOSECLICK, CENTER, FGCOLOR, '#FFFFFF', BGCOLOR, '#FFFFFF', BORDER, 0);
					}
				}
		}
}

	}
	//************************************************************************************
	
	
	//************************************************************************************
	//*																					*
	//*																					*
	//*																					*
	//************************************************************************************
	function AJAXParseXML(node)
	{
		var sFormName;
		var sType;
		var sFieldName;
		var sValue;
		var sIndex;
		
		// loop through all the datanode entries
		for(var iX=0;iX<node.childNodes.length;iX++)
		{
			// now get all the children and do the Switch statement
			//var sDataNode = node[0].childNodes;
			var sDataNode = node.childNodes[iX]; 
			sFormName = "";
			sType = "";
			sFieldName = "";
			sValue = "";
			sIndex = "";
			bSelected = "";
			sDisplayed = "";
			// loop through the datanode children and sort them out
			for(var iY=0;iY<sDataNode.childNodes.length;iY++)
			{
				var children = sDataNode.childNodes;
				switch ( children[iY].nodeName )
				{
					case 'formname':
						sFormName = children[iY].childNodes[0].nodeValue;
						break;
					case 'type':
						sType = eval(children[iY].childNodes[0].nodeValue);
						break;
					case 'fieldname':
						sFieldName = children[iY].childNodes[0].nodeValue;
						break;
					case 'value':
						// this is sometimes blank -- which kills the DOM object
						try {
							sValue = children[iY].childNodes[0].nodeValue;
						} catch (e) {
							sValue = "";
						}
						break;
					case 'indexvalue':
						// this is sometimes blank -- which kills the DOM object
						try {
							sIndex = children[iY].childNodes[0].nodeValue;
						} catch (e) {
							sIndex = "";
						}
						break;
					case 'displayed':	// displayed text for mulitpick and select lists
						try {
							sDisplayed = children[iY].childNodes[0].nodeValue;
						} catch (e) {
							sDisplayed = "";
						}
					case 'selected':	// true/false if the multipick/select entry is selected
						try {
							bSelected = children[iY].childNodes[0].nodeValue;
						} catch (e) {
							bSelected = "";
						}
						if ( bSelected == "T" )
						{
							bSelected = true;
						}else{
							bSelected = false;
						}
						break;
				}
			}

			switch ( sType)
			{
				case 1:			// C_TEXTBOX
				case 2:			// C_PASSWORD
				case 3:			// C_TEXTAREA
				case 4:			// C_HIDDEN
					try {
					    eval("var objText = document." + sFormName + "." + sFieldName);
					    objText.value = unescape(sValue);
					} catch (e) {}
					break;
				case 5:			// C_CHECKBOX
					if ( sValue != '' )
					{
						var objDD = eval("document." + sFormName + "." + sFieldName);
						var iNumDD = objDD.length;
						if ( sValue == "-clearall" )
						{
							for (var iZ = 0; iZ < iNumDD; iZ++)
							{
								objDD[iZ].checked = false;
							}
						}else{
							for (var iZ = 0; iZ <= iNumDD; iZ++)
							{
								try {
									if ( objDD[iZ].value == sValue )
									{
										objDD[iZ].checked = true;
										break;
									}
								}catch (e){}
							}
						}
					}
/*					try {
						if ( sValue != '' )
							eval("document." + sFormName + "." + sFieldName + ".checked");
					} catch (e) {}*/
					break;
				case 6:			// C_DROPDOWN
				case 7:			// C_MULTIPICK
					if ( sValue != '' )
					{
						try {
							var iNumDD = eval("document." + sFormName + "." + sFieldName + ".length");
							if ( iNumDD > 0 )
							{
								var objDD = eval("document." + sFormName + "." + sFieldName);
								
								if ( sValue == '-clearall' )
								{
									// clear the multi-pick list -- this is most often used before refreshing it w/ new selections
									for (var iZ = 0; iZ < iNumDD; iZ++)
									{
										objDD.options[iZ].selected = false;
									}
								}else{
									if ( sValue == '-empty' )
									{

										// empty the multi-pick list completely
										//for (var iZ = 0; iZ < iNumDD; iZ++)
										for (var iZ = iNumDD; iZ >= 0; iZ--)
										{
											objDD.options[iZ] = null;
										}
									}else{
										for (var iZ = 0; iZ < iNumDD; iZ++)
										{
											if ( objDD.options[iZ].value == sValue )
											{
												eval("document." + sFormName + "." + sFieldName + ".options[" + iZ + "].selected = true;");
												if ( sType == 6 )	// if it's a drop-down we just want the 1st one. multipick, we want ALL
													break;
											}
										}
									}
								}
							}
						} catch (e) {}
					}
					break;
				case 8:			// C_RADIO
					if ( sValue != '' )
					{
						try {
							var iNumDD = eval("document." + sFormName + "." + sFieldName + ".length");
							var objDD = eval("document." + sFormName + "." + sFieldName);
							if ( sValue != "" )
							{
								for (var iZ = 0; iZ < iNumDD; iZ++)
								{
									if ( objDD[iZ].value == sValue )
									{
										objDD[iZ].checked = true;
										break;
									}
								}
							}
						} catch (e) {}
					}
					break;
				case 9:			// C_WYSIWYG
						// have to jump through these hoops because sometimes the FCKEditor API code has not fully loaded
						//	by the time this is called and it generates random errors, randomaly
						try {
							var objFCK = FCKeditorAPI.GetInstance(sFieldName);
						    objFCK.SetHTML(sValue, true);
						} catch (e) {
							// set these globals so we know to try again once we are finished parsing the XML - should give us
							//	enough time for the FCKEditor API to load
							sWYSIWYGFieldName = sFieldName;
							sWYSIWYGValue = sValue;
						}
					break;
				case 10:		// C_IMAGE
					obj = document.getElementById(sFieldName);
					try {
					    obj.src = sValue;
					} catch (e) {}
					break;
				case 11:		// C_FILE
					break;
				case 12:		// C_DIV	- most times it's actually better to use a <span> tag in the HTML, otherwise the <DIV> includes line breaks
					obj = document.getElementById(sFieldName);
					try {
					    obj.firstChild.nodeValue = sValue;
					} catch (e) {}
					break;
				case 13:		// C_HIDDENDIV
					obj = document.getElementById(sFieldName);
					if ( sValue == "1" )
					{
						obj.style.display = "block";
					}else{
						obj.style.display = "none";
					}
					break;
				case 14:		// C_URL
					try {
						obj = document.getElementById(sFieldName);
						obj.href = sValue;
					} catch (e) {}
					break;
				case 15:		// C_CHECKBOXVALUE
					try {
						eval("document." + sFormName + "." + sFieldName + "[" + sIndex + "]" + ".value = " + sValue);
					} catch (e) {}
					break;
				case 16:		// C_MULTIPICKVALUE
					try {
						var objDD = eval("document." + sFormName + "." + sFieldName);
						optionName = new Option(sDisplayed, sValue, false, bSelected)
						objDD.options[sIndex]=optionName
					} catch (e) {}
					break;
				case 17:		// C_FORMDIV - use same way as C_DIV but sent HTML (usually a form field)
					obj = document.getElementById(sFieldName);
					try {
						obj.innerHTML = sValue;
					} catch (e) {}
					break;
					
			}
		}
	}
	//************************************************************************************