	
	//=========================================================================
	// This function performs validity checks on the first page of the estimate
	// request form and displays an informative message to the user if any 
	// errors occurred.
	// If no error has occured the second page of the form will be displayed.
	//=========================================================================
	function NextPage() {
	var frmInfo = document.getElementById('frmInfo');
	var hReturnInfo;
	var bReturnValue = true;
	var dCurrentDate = new Date();
	var sCurrentDate = (dCurrentDate.getMonth() + 1) + '/' + dCurrentDate.getDate() + '/' + dCurrentDate.getFullYear();
	var iIndex;
	var sItemName, sQuantity, sItemText;
	var sOrderItems = '';
	var sOrderRooms = '';
	var sOrderItemsText = '';
	var sOrderRoomsText = '';	
	
		//Clear the error messages and the marked fields.
		ResetErrorDisplay(); 

		try {

			//Format the move date properly.
			document.getElementById('txtEstMoveDate').value = FormatDate(document.getElementById('txtEstMoveDate').value);
				
			//Check if the user entered a valid e-mail address.
			hReturnInfo = CompareDates(document.getElementById('txtEstMoveDate').value, sCurrentDate, 'GE'); 

			if (hReturnInfo.ReturnCode > 0) {
				if (hReturnInfo.ReturnCode != 9)
					throw new UserError('txtEstMoveDate', hReturnInfo.ErrorDescription ,2);
				else
					throw new UserError('txtEstMoveDate', 'Please enter a future date.' ,2);
			}

	
			//Check if the user entered a valid origin zip code. 
			hReturnInfo = IsValidZipCode(document.getElementById('txtFromZipCode').value, false); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtFromZipCode', hReturnInfo.ErrorDescription ,3);


			//Check if the user has entered the origin city name.
			if (IsEmpty(document.getElementById('txtFromCity').value).ReturnCode > 0)
				throw new UserError('txtFromCity', 'Please enter the origin city name', 3)

			//Check if the user selected the origin state.
			if (document.getElementById('cboFromState').selectedIndex == 0)
				throw new UserError('FromState', 'Please select the origin state.', 3)



			//Check if the user entered a valid destination zip code. 
			hReturnInfo = IsValidZipCode(document.getElementById('txtToZipCode').value, true); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtToZipCode', hReturnInfo.ErrorDescription ,4);

			//Check if the user has entered the destination city name.
			if (IsEmpty(document.getElementById('txtToCity').value).ReturnCode > 0)
				throw new UserError('txtToCity', 'Please enter the destination city name', 4)

			//Check if the user selected the destination state.
			if (document.getElementById('cboToState').selectedIndex == 0)
				throw new UserError('cboToState', 'Please select the destination state.', 4)

			//Check if the user selected at least on house hold room or item.
			if (document.getElementById('lstSelectedItems').options.length <= 0 && IsEmpty(document.getElementById('txtTotalItemsWeight').value).ReturnCode > 0)
				throw new UserError('radContentsOption', 'Please specify household items and number of rooms, or total items weight', 6);

			//Check if the user entered a valid total items weight.
			hReturnInfo = IsValidNumber(document.getElementById('txtTotalItemsWeight').value, 1, 9999999, 0, true); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtTotalItemsWeight', hReturnInfo.ErrorDescription, 6);

			//Check if the user entered a valid total volume.
			hReturnInfo = IsValidNumber(document.getElementById('txtTotalVolume').value, 1, 999999, 0, true); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtTotalVolume', hReturnInfo.ErrorDescription, 6);
		}
		
		//If an exeption was raised an error message will be displayed.
		catch (hUserError) {
			hUserError.DisplayError();
			bReturnValue = false;
		}			
		
		//If all the data in the form is valid some data formatting is done
		//before submiting the form.
		if (bReturnValue) {
			//Iterating through the selected household rooms and items and 
			//format them in a convenient way for easy read at the backend. 
			with (document.getElementById('lstSelectedItems').options) {
				for (iIndex=0; iIndex < length; iIndex++) {
					sItemName = item(iIndex).value;
					sItemName = sItemName.substring(0, sItemName.indexOf('_'));
					sItemText = item(iIndex).text;
					sQuantity = item(iIndex).text.substring(item(iIndex).text.indexOf('(')+1, item(iIndex).text.indexOf(')'));

					if (sItemName.indexOf('R') < 0) {
						sOrderItems += sItemName + ';' + sQuantity + ';'; 
						sOrderItemsText += sItemText + ';';
					}
					else {
						sOrderRooms += sItemName.substring(sItemName.indexOf('R') + 1, sItemName.length) + ';' + sQuantity + ';'; 
						sOrderRoomsText += sItemText + ';';
					}

				}
			} 

			//Setting the household rooms and items hidden form fields.			
			frmInfo.txtHouseholdItems.value = sOrderItemsText;
			frmInfo.txtHouseholdRooms.value = sOrderRoomsText;
		
			frmInfo.txtFromHouseType.value = frmInfo.cboFromHouseType.options[frmInfo.cboFromHouseType.selectedIndex].text;
			frmInfo.txtToHouseType.value = frmInfo.cboToHouseType.options[frmInfo.cboToHouseType.selectedIndex].text;
			
			frmInfo.txtMoveWeight.value = frmInfo.cboMoveWeight.options[frmInfo.cboMoveWeight.selectedIndex].text;
			
					
		}
		
		
		//If no error was found then the second page of the estimate request
		//form will be displayed. 
		if (bReturnValue) {
			document.getElementById('EstimatePage1').style.display = 'none';
			//frmInfo.radContentsOption[0].checked = true;
			document.getElementById('EstimatePage2').style.display = 'inline';
		}
	}
	
	
	
	//=========================================================================
	// This function performs validity checks on the second page of the 
	// estimate request form and displays an informative message to the user 
	// if any error occurred.
	// If no error has occured the form will be submitted to the server.
	//=========================================================================
	function frmInfo_onsubmit() {
	var hReturnInfo;
	var bReturnValue = true;
	var iIndex;
	var sItemName, sQuantity;
	var sOrderItems = '';
	var sOrderRooms = '';
	
	
		//Clear the error messages and the marked fields.
		ResetErrorDisplay(); 


		//Perform validity checks on the second half of the form.
		try {
			var frmInfo = document.getElementById('frmInfo');
			//Check if the user entered his full name.
			if (IsEmpty(document.getElementById('txtFullName').value).ReturnCode > 0)
				throw new UserError('txtFullName', 'Please enter your full name.', 1)

	
			//Check if the user entered a valid phone number. 
			hReturnInfo = IsValidPhoneNumber(document.getElementById('txtPhone').value, false); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtPhone', hReturnInfo.ErrorDescription ,1);

			//Format the phone number properly.
			document.getElementById('txtPhone').value = FormatPhoneNumber(document.getElementById('txtPhone').value);
			
			//Check if the phone extension is valid.
			if (IsValidNumber(document.getElementById('txtPhoneExt').value, 1, 99999, 0, 2).ReturnCode > 0)
				throw new UserError('txtPhoneExt', 'Please enter a valid extension number' ,1, 1);
			
			
			//Check if the user entered a valid additional phone number. 
			hReturnInfo = IsValidPhoneNumber(document.getElementById('txtAdditionalPhone').value, true); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtAdditionalPhone', hReturnInfo.ErrorDescription ,1);

			//Format the additional phone number properly.
			frmInfo.txtAdditionalPhone.value = FormatPhoneNumber(document.getElementById('txtAdditionalPhone').value);

			//If the user entered an extension for the additional phone number
			//making sure he will enter the phone number as well.
			if ((IsEmpty(document.getElementById('txtAdditionalPhone').value).ReturnCode > 0) && (IsEmpty(document.getElementById('txtAdditionalPhoneExt').value).ReturnCode == 0))
				throw new UserError('txtAdditionalPhone', 'Please enter your additional phone number', 1, 3);

			//Check if the phone extension is valid.
			if (IsValidNumber(frmInfo.txtAdditionalPhoneExt.value, 1, 99999, 0, 2).ReturnCode > 0)
				throw new UserError('txtAdditionalPhoneExt', 'Please enter a valid extension number' ,1, 1);


			//Check if the user entered a valid e-mail address. 
			hReturnInfo = IsValidEMailAddress(document.getElementById('txtEMail').value, false); 
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtEMail', hReturnInfo.ErrorDescription ,1);
				
				
			frmInfo.txtBestTime.value = frmInfo.cboBestTime.options[frmInfo.cboBestTime.selectedIndex].text;
			frmInfo.txtContactPref.value = frmInfo.cboContactPref.options[frmInfo.cboContactPref.selectedIndex].text;
		}
		
		//If an exption was throwen an error message will be displayed.
		catch (hUserError) {
			hUserError.DisplayError();
			bReturnValue = false;
		}	
		
		return bReturnValue;
	}


	function PreviousPage() {
		document.getElementById('EstimatePage2').style.display = 'none';
		document.getElementById('EstimatePage1').style.display = 'inline';
	}
	
	function DisplayWeightHelp(e) {
	var iLeftPos = 300;
	
		document.getElementById('winPopupHelpWeight').style.left = e.clientX + document.body.scrollLeft - iLeftPos;
		document.getElementById('winPopupHelpWeight').style.top =  e.clientY + document.body.scrollTop;
		document.getElementById('winPopupHelpWeight').style.display = 'inline';
	}

	function DisplayZipHelp(e) {
	var iLeftPos = 300;
	
		document.getElementById('winPopupHelpZip').style.left = e.clientX + document.body.scrollLeft - iLeftPos;
		document.getElementById('winPopupHelpZip').style.top =  e.clientY + document.body.scrollTop;
		document.getElementById('winPopupHelpZip').style.display = 'inline';
	}
		
	function AdjustPopupWindows() {
		document.getElementById('winPopupHelpZip').style.display = 'none'; 	
		document.getElementById('winPopupZipList').style.display = 'none'; 	
		document.getElementById('winPopupHelpWeight').style.display = 'none'; 	
	}
	
	
	function AddSelectedItem() 
	{
	var frmInfo = document.getElementById('frmInfo');
	var hActiveList = (frmInfo.radContentsOption[1].checked?frmInfo.lstHouseholdItems:frmInfo.lstHouseholdRooms);
	var hReturnInfo;
	var bAddItem = true;
	var sNewItemCode, iQuantity;
	var hNewOption;
	var iIndex, bItemFound = false;
	
		//Clear the error messages and the marked fields.
		ResetErrorDisplay(); 

		try {
			//Check if the user entered a valid quantity for the item or room
			//he wants to add.						
			hReturnInfo = IsValidNumber(frmInfo.txtQuantity.value, 1, 999, 0, false);			
			if (hReturnInfo.ReturnCode > 0)
				throw new UserError('txtQuantity', hReturnInfo.ErrorDescription, 6)
		}
		
		//Display an error message if the quantity is invalid.
		catch (hUserError) {		
			hUserError.DisplayError();
			bAddItem = false;
		}	
		
		if (bAddItem) {
		
			//Saving the new item code in a local variable.
			sNewItemCode = hActiveList.value;
			
			//Check if the new item already exists in the selected items list.
			with (frmInfo.lstSelectedItems.options) 
				for (iIndex = 0; iIndex < length && !bItemFound; iIndex++) {
					bItemFound = (item(iIndex).value == sNewItemCode);
					if (bItemFound)
						hNewOption = item(iIndex);
				}
		
			if (!bItemFound) {						
				//Adding the new item to the list if it does not exist.
				hNewOption = document.createElement("OPTION");
				frmInfo.lstSelectedItems.options.add(hNewOption, (frmInfo.radContentsOption[0].checked?0:hActiveList.options.length));
				iQuantity = frmInfo.txtQuantity.value;
			}
			else 
				//Changing the quantity of the item if it does exist.
				iQuantity = Number(hNewOption.innerHTML.substring(hNewOption.innerHTML.indexOf('(')+1, hNewOption.innerHTML.indexOf(')'))) + Number(frmInfo.txtQuantity.value);

			//Setting the item code and text. 			
			hNewOption.innerHTML = hActiveList.options[hActiveList.selectedIndex].text + ' (' + iQuantity + ')';
			hNewOption.value = sNewItemCode;
			
			//Recalculating the total weight if the selected rooms and items.
			frmInfo.txtCalcTotalWeight.value = Number(frmInfo.txtCalcTotalWeight.value) + (Number(frmInfo.txtQuantity.value) * Number(sNewItemCode.substring(sNewItemCode.indexOf('_') + 1, sNewItemCode.length)));
			frmInfo.txtTotalItemsWeight.value = frmInfo.txtCalcTotalWeight.value;
			txtTotalItemsWeight_OnKeyUp(); 
						 
			//Settting the default quantity to 1.
			frmInfo.txtQuantity.value = '1';
		}
	}


	function RemoveSelectedItem() {
	var frmInfo = document.getElementById('frmInfo');
	var iSelectedItemIndex = frmInfo.lstSelectedItems.selectedIndex;
	var sItemCode = frmInfo.lstSelectedItems.value;
	var sItemText = frmInfo.lstSelectedItems.options[iSelectedItemIndex].text;
	
		//Recalculating the total weight if the selected rooms and items.		
		frmInfo.txtCalcTotalWeight.value = Number(document.getElementById('txtCalcTotalWeight').value) - (Number(sItemText.substring(sItemText.indexOf('(')+1, sItemText.indexOf(')'))) * Number(sItemCode.substring(sItemCode.indexOf('_') + 1, sItemCode.length)));
		frmInfo.txtTotalItemsWeight.value = frmInfo.txtCalcTotalWeight.value;
		txtTotalItemsWeight_OnKeyUp(); 

		//Removing the selected item.				
		frmInfo.lstSelectedItems.remove(iSelectedItemIndex);
				
		//Setting the newly selected item to the item that appeared before the
		//deleted item on the list.
		if (iSelectedItemIndex > 0)
			iSelectedItemIndex--;
		
		//Selecting the new item if there is more than one item on the list.	
		if (frmInfo.lstSelectedItems.options.length > 0)
			frmInfo.lstSelectedItems.selectedIndex = iSelectedItemIndex;
		else
			frmInfo.cmdRemoveItem.disabled = true;
	}
	

	
	//Toggle the view between the household items and the rooms list.
	function ToggleListView(e) {
	
		var src;
		
		if (e)
			src = e;
		else
		{
			if (e.srcElement) src = e.srcElement;
			else if (e.target) src = e.target;
		}
			
		switch (src.value)
		{
			case '1':			
				document.getElementById('blkRoomsTitle').style.display = 'none';
				document.getElementById('lstHouseholdRooms').style.display = 'none';
				document.getElementById('blkItemsTitle').style.display = 'inline';
				document.getElementById('lstHouseholdItems').style.display = 'inline';
				document.getElementById('lstSelectedItems').style.display = 'inline';
				document.getElementById('cboMoveWeight').style.display = 'none';
				document.getElementById('blkSelectedItems').style.display = 'inline';
				document.getElementById('blkItemsButtons1').style.display = 'inline';
				document.getElementById('blkItemsButtons2').style.display = 'inline';
				document.getElementById('blkSpecificWeight').style.display = 'none';				
				break;
			case '2':
				document.getElementById('blkItemsTitle').style.display = 'none';
				document.getElementById('lstHouseholdItems').style.display = 'none';
				document.getElementById('blkRoomsTitle').style.display = 'inline';
				document.getElementById('lstHouseholdRooms').style.display = 'inline';
				document.getElementById('lstSelectedItems').style.display = 'inline';
				document.getElementById('cboMoveWeight').style.display = 'none';
				document.getElementById('blkSelectedItems').style.display = 'inline';
				document.getElementById('blkItemsButtons1').style.display = 'inline';
				document.getElementById('blkItemsButtons2').style.display = 'inline';
				document.getElementById('blkSpecificWeight').style.display = 'none';				
				break;
			case '3':
				document.getElementById('blkRoomsTitle').style.display = 'none';
				document.getElementById('lstHouseholdRooms').style.display = 'none';
				document.getElementById('blkItemsTitle').style.display = 'none';
				document.getElementById('lstHouseholdItems').style.display = 'none';
				document.getElementById('lstSelectedItems').style.display = 'none';
				document.getElementById('blkSelectedItems').style.display = 'none';
				document.getElementById('blkItemsButtons1').style.display = 'none';
				document.getElementById('blkItemsButtons2').style.display = 'none';
				document.getElementById('cboMoveWeight').style.display = 'inline';
				document.getElementById('blkSpecificWeight').style.display = 'none';				
				break;
			case '4':
				document.getElementById('blkRoomsTitle').style.display = 'none';
				document.getElementById('lstHouseholdRooms').style.display = 'none';
				document.getElementById('blkItemsTitle').style.display = 'none';
				document.getElementById('lstHouseholdItems').style.display = 'none';
				document.getElementById('lstSelectedItems').style.display = 'none';
				document.getElementById('blkSelectedItems').style.display = 'none';
				document.getElementById('blkItemsButtons1').style.display = 'none';
				document.getElementById('blkItemsButtons2').style.display = 'none';	
				document.getElementById('cboMoveWeight').style.display = 'none';
				document.getElementById('blkSpecificWeight').style.display = 'inline';				
				break;
			default:
				break;			
		}
				
		document.getElementById('cmdAddItem').disabled = true;
	}
		
	
	function SelectNewItem(e) {
	var frmInfo = document.getElementById('frmInfo');
	var sFindText, sTextLength, iIndex, iNewSelectedIndex = -1;

		if (e.keyCode != 13) {
			if (IsEmpty(frmInfo.txtFindItem.value).ReturnCode == 0) {			
				sFindText = frmInfo.txtFindItem.value.toLowerCase();
				sTextLength = sFindText.length;
				with (frmInfo.lstHouseholdItems.options) 
					for (iIndex = 0; (iIndex < length) && (iNewSelectedIndex == -1); iIndex++) 
						iNewSelectedIndex = (sFindText == item(iIndex).text.substring(0, sTextLength).toLowerCase()?iIndex:-1);  												
			}			
			frmInfo.lstHouseholdItems.selectedIndex = iNewSelectedIndex;
			frmInfo.cmdAddItem.disabled = (iNewSelectedIndex == -1);
		}
		else 
			if (!frmInfo.cmdAddItem.disabled)
				frmInfo.cmdAddItem.click();
	}



	function txtQuantity_OnKeyDown(){
		if (event.keyCode == 13) {
			event.returnValue = false;
			if (!document.getElementById('cmdAddItem').disabled) 
				document.getElementById('cmdAddItem').click();
		}
	}
	
	
	
	function txtTotalItemsWeight_OnKeyUp() {
	var sNewVolume;
	
		if (IsValidNumber(document.getElementById('txtTotalItemsWeight').value , 1, 9999999, 0, false).ReturnCode == 0) {
			sNewVolume = (Number(document.getElementById('txtTotalItemsWeight').value) / 7).toString();
			if(sNewVolume.indexOf('.') > -1) {
				document.getElementById('txtTotalVolume').value = sNewVolume.substring(0, sNewVolume.indexOf('.'));
				if (document.getElementById('txtTotalVolume').value == '0') 
					document.getElementById('txtTotalVolume').value = '';
				}
			else
				document.getElementById('txtTotalVolume').value = sNewVolume;
		}
		else
			document.getElementById('txtTotalVolume').value = '';
	}
	
	
	function txtTotalVolume_OnKeyUp() {
	var sNewWeight;
		if (IsValidNumber(document.getElementById('txtTotalVolume').value, 1, 999999, 0, false).ReturnCode == 0) {
			sNewWeight = (Number(document.getElementById('txtTotalVolume').value) * 7).toString();
			document.getElementById('txtTotalItemsWeight').value = sNewWeight;
		}
		else
			document.getElementById('txtTotalItemsWeight').value = '';
	}
	
	function cboMoveWeight_OnChange() {
	var sNewVolume;
	
		document.getElementById('txtTotalItemsWeight').value = document.getElementById('cboMoveWeight').value;
		sNewVolume = (Number(document.getElementById('txtTotalItemsWeight').value) / 7).toString();
		if(sNewVolume.indexOf('.') > -1) {
			document.getElementById('txtTotalVolume').value = sNewVolume.substring(0, sNewVolume.indexOf('.'));
			if (document.getElementById('frmInfo.txtTotalVolume').value == '0') 
				document.getElementById('frmInfo.txtTotalVolume').value = '';
			}
		else
			document.getElementById('txtTotalVolume').value = sNewVolume;
	}

	