var bAvailablity = false;
var fBaseRate = 0;
var fQuote = -1;
var iTimerCQ = 0;
var bResidential_AddingRoom = false;
var bUpholstery_AddingPiece = false;
var bbAreaRug_AddingRug = false;

var iMinimumChargeSFThreshold = 300;

var Residential_SFPrice_Standard = 0.3;
var Residential_SFPrice_Furnished = 0.35;
var Residential_SFSurcharge_Protection = 0.15;
var Residential_Surcharge_HypoAllergenic = 0.10;
var Residential_Price_PerStair = 2;

var Upholstery_Surcharge_Protection = 0.1;
var Upholstery_Surcharge_DustMiteTreatment = 25;
var UpholsteryTypes = {
	"Chaise" : ["Chaise", 18],
	"DiningSeat" : ["Dining Seat Only", 8],
	"DiningSeatBack" : ["Dining Seat &amp; Back", 16],
	"Loveseat" : ["Loveseat", 95],
	"MattressKingQueen" : ["Matress King/Queen", 45],
	"MattressFull" : ["Matress Full", 35],
	"MattressTwin" : ["Matress Twin", 30],
	"Ottoman" : ["Ottoman", 25],
	"Recliner" : ["Recliner", 55],
	"Sectional" : ["Sectional", 18],
	"Sofa" : ["Sofa", 18],
	"WingBackChair" : ["Wing-Back Chair", 49]
};
var Upholstery_PricedPerLinearFeet = ["Sofa", "Sectional", "Chaise"];

var AreaRug_SFPrices = {
	"DeepClean" : 1,
	"SoilRemoval" : 1,
	"Both" : 2
};

var AreaRug_Charge_Protection = 0.15;
var AreaRug_Surcharge_HypoAllergenic = 0.10;
var AreaRug_Charge_PickupAndReturn = 25;
var AreaRug_Charge_PickupAndReturn_Discounted = 12.5;
var AreaRug_Charge_DropOff = 12.5;

var Commercial_SFPrice_Standard = 0.3;
var Commercial_SFPrice_Furnished = 0.35;
var Commercial_SFSurcharge_Protection = 0.15;
var Commercial_Surcharge_HypoAllergenic = 0.10;
var Commercial_Price_PerStair = 2;

var Items = {
	ResidentialAreas : {
		List : [],
		Count : 1,
		SquareFeet : 0
	},
	UpholsteryPieces : {
		List : [],
		Count : 1
	},
	AreaRugs : {
		List : [],
		Count : 1
	},
	CommercialAreas : {
		List : [],
		Count : 1,
		SquareFeet : 0
	}
}

function ScheduleVsEstimate_Change(objElement){
	if(objElement.value == "Estimate"){
		$("Sections_Estimate").show();
		$("Sections_Schedule").hide();
		$("ScheduleAppointment").show();
		$("QuoteBox").show();
	}
	else if(objElement.value == "Schedule"){
		$("Sections_Estimate").hide();
		$("Sections_Schedule").show();
		$("ScheduleAppointment").hide();
		$("QuoteBox").hide();
	}
	else if(objElement.value == "Estimate and Schedule"){
		$("Sections_Estimate").show();
		$("Sections_Schedule").show();
		$("ScheduleAppointment").hide();
		$("QuoteBox").show();
	}
}

function ScheduleAppointment_Click(){
	$("ScheduleVsEstimate").options.selectedIndex = 2;
	$("Sections_Schedule").show();
	$("ScheduleAppointment").hide();
	Effect.ScrollTo($("Sections_Schedule"));
}

function ServiceRequested_Click(objElement){
	if(objElement.checked){
		$(objElement.value).show();
	}
	else{
		$(objElement.value).hide();
	}
}

function ResidentialQuoteBasedOn_Change(objElement){
	if(objElement.value == "combined"){
		$("Residential_QuoteBasedOn_Combined").show();
		$("Residential_QuoteBasedOn_PerRoom").hide();
	}
	else if(objElement.value == "perroom"){
		$("Residential_QuoteBasedOn_Combined").hide();
		$("Residential_QuoteBasedOn_PerRoom").show();
	}
}

function Residential_AddRoom(){
	if(bResidential_AddingRoom) return;
	bResidential_AddingRoom = true;
	$("ResidentialAreas_Loading").show();
	new Ajax.Request(sAJAXServer, {
		method : "post",
		parameters : "cmd=residential-add-room&number=" + (Items.ResidentialAreas.Count + 1),
		onSuccess : function(objRequest){
			objTable = $("tblResidentialAreas");
			objTableBody = objTable.down("tbody");
			if(objTableBody) objTable = objTableBody;
			objTable.insert({bottom : objRequest.responseText});
			Items.ResidentialAreas.Count ++;
			$("Residential_NumberOfAreas").value = Items.ResidentialAreas.Count;
			bResidential_AddingRoom = false;
			$("ResidentialAreas_Loading").hide();
		}
	});
}

function Residential_RemoveRoom(){
	if(Items.ResidentialAreas.Count > 1){
		$("Residential_Areas_" + Items.ResidentialAreas.Count).remove();
		Items.ResidentialAreas.Count --;
		$("Residential_NumberOfAreas").value = Items.ResidentialAreas.Count;
	}
}

function Residential_NumberOfAreas_Change(objElement){
	var iRooms = parseInt(objElement.value);
	if(!isNaN(iRooms)){
		objElement.disabled = true;
		objElement.style.backgroundColor = "#DDDDDD";
		objElement.style.color = "#333333";
		bResidential_AddingRoom = true;
		$("ResidentialAreas_Loading").show();
		new Ajax.Request(sAJAXServer, {
			method : "post",
			parameters : "cmd=residential-add-room&number=" + (Items.ResidentialAreas.Count + 1) + "," + iRooms,
			onSuccess : function(objRequest){
				objTable = $("tblResidentialAreas");
				objTableBody = objTable.down("tbody");
				if(objTableBody) objTable = objTableBody;
				objTable.insert({bottom : objRequest.responseText});
				Items.ResidentialAreas.Count += (iRooms - 1);
				bResidential_AddingRoom = false;
				$("divResidentialAreas").show();
				$("ResidentialAreas_Loading").hide();
			}
		});
	}
}

function Upholstery_AddPiece(){
	if(bUpholstery_AddingPiece) return;
	bUpholstery_AddingPiece = true;
	$("Upholstery_Loading").show();
	new Ajax.Request(sAJAXServer, {
		method : "post",
		parameters : "cmd=upholstery-add-piece&number=" + (Items.UpholsteryPieces.Count + 1),
		onSuccess : function(objRequest){
			objTable = $("tblUpholsteryPieces");
			objTableBody = objTable.down("tbody");
			if(objTableBody) objTable = objTableBody;
			objTable.insert({bottom : objRequest.responseText});
			Items.UpholsteryPieces.Count ++;
			$("Upholstery_Pieces").value = Items.UpholsteryPieces.Count;
			bUpholstery_AddingPiece = false;
			$("Upholstery_Loading").hide();
		}
	});
}

function Upholstery_RemovePiece(){
	if(Items.UpholsteryPieces.Count > 1){
		$("Upholstery_Pieces_" + Items.UpholsteryPieces.Count).remove();
		Items.UpholsteryPieces.Count --;
		$("Upholstery_Pieces").value = Items.UpholsteryPieces.Count;
	}
}

function Upholstery_Pieces_Change(objElement){
	var iPieces = parseInt(objElement.value);
	if(!isNaN(iPieces)){
		objElement.disabled = true;
		objElement.style.backgroundColor = "#DDDDDD";
		objElement.style.color = "#333333";
		bUpholstery_AddingPiece = true;
		$("Upholstery_Loading").show();
		new Ajax.Request(sAJAXServer, {
			method : "post",
			parameters : "cmd=upholstery-add-piece&number=" + (Items.UpholsteryPieces.Count + 1) + "," + iPieces,
			onSuccess : function(objRequest){
				objTable = $("tblUpholsteryPieces");
				objTableBody = objTable.down("tbody");
				if(objTableBody) objTable = objTableBody;
				objTable.insert({bottom : objRequest.responseText});
				Items.UpholsteryPieces.Count += (iPieces - 1);
				bUpholstery_AddingPiece = false;
				$("divUpholsteryPieces").show();
				$("Upholstery_Loading").hide();
			}
		});
	}
}

function Upholstery_Pieces_Type_Change(objElement, iNumber){
	var bIsMattress = false;
	if(objElement.value == "MattressKingQueen" || objElement.value == "MattressFull" || objElement.value == "MattressTwin"){
		bIsMattress = true;
	}
	if(Upholstery_PricedPerLinearFeet.indexOf(objElement.value) != -1){
		$("Upholstery_Pieces_" + iNumber + "_LinearFeet").value = "0";
		$("Upholstery_Pieces_" + iNumber + "_LinearFeet").disabled = false;
	}
	else{
		$("Upholstery_Pieces_" + iNumber + "_LinearFeet").value = "N/A";
		$("Upholstery_Pieces_" + iNumber + "_LinearFeet").disabled = true;
	}
	with($("Upholstery_Pieces_" + iNumber + "_DustMiteTreatment")){
		if(bIsMattress){
			disabled = false;
		}
		else{
			disabled = true;
			checked = false;
		}
	}
}

function AreaRugs_AddRug(){
	if(bbAreaRugs_AddingRug) return;
	bbAreaRugs_AddingRug = true;
	$("AreaRugs_Loading").show();
	new Ajax.Request(sAJAXServer, {
		method : "post",
		parameters : "cmd=arearugs-add-rug&number=" + (Items.AreaRugs.Count + 1),
		onSuccess : function(objRequest){
			objTable = $("tblAreaRugs");
			objTableBody = objTable.down("tbody");
			if(objTableBody) objTable = objTableBody;
			objTable.insert({bottom : objRequest.responseText});
			Items.AreaRugs.Count ++;
			$("AreaRugs_NumberOfRugs").value = Items.AreaRugs.Count;
			bbAreaRugs_AddingRug = false;
			$("AreaRugs_Loading").hide();
		}
	});
}

function AreaRugs_RemoveRug(){
	if(Items.AreaRugs.Count > 1){
		$("AreaRugs_" + Items.AreaRugs.Count).remove();
		Items.AreaRugs.Count --;
		$("AreaRugs_NumberOfRugs").value = Items.AreaRugs.Count;
	}
}

function AreaRugs_NumberOfRugs_Change(objElement){
	var iRooms = parseInt(objElement.value);
	if(!isNaN(iRooms)){
		objElement.disabled = true;
		objElement.style.backgroundColor = "#DDDDDD";
		objElement.style.color = "#333333";
		bbAreaRugs_AddingRug = true;
		$("AreaRugs_Loading").show();
		new Ajax.Request(sAJAXServer, {
			method : "post",
			parameters : "cmd=arearugs-add-rug&number=" + (Items.AreaRugs.Count + 1) + "," + iRooms,
			onSuccess : function(objRequest){
				objTable = $("tblAreaRugs");
				objTableBody = objTable.down("tbody");
				if(objTableBody) objTable = objTableBody;
				objTable.insert({bottom : objRequest.responseText});
				Items.AreaRugs.Count += (iRooms - 1);
				bbAreaRugs_AddingRug = false;
				$("divAreaRugs").show();
				$("AreaRugs_Loading").hide();
			}
		});
	}
}

function CommercialQuoteBasedOn_Change(objElement){
	if(objElement.value == "combined"){
		$("Commercial_QuoteBasedOn_Combined").show();
		$("Commercial_QuoteBasedOn_PerRoom").hide();
	}
	else if(objElement.value == "perroom"){
		$("Commercial_QuoteBasedOn_Combined").hide();
		$("Commercial_QuoteBasedOn_PerRoom").show();
	}
}

function Commercial_AddRoom(){
	if(bCommercial_AddingRoom) return;
	bCommercial_AddingRoom = true;
	$("CommercialAreas_Loading").show();
	new Ajax.Request(sAJAXServer, {
		method : "post",
		parameters : "cmd=Commercial-add-room&number=" + (Items.CommercialAreas.Count + 1),
		onSuccess : function(objRequest){
			objTable = $("tblCommercialAreas");
			objTableBody = objTable.down("tbody");
			if(objTableBody) objTable = objTableBody;
			objTable.insert({bottom : objRequest.responseText});
			Items.CommercialAreas.Count ++;
			$("Commercial_NumberOfAreas").value = Items.CommercialAreas.Count;
			bCommercial_AddingRoom = false;
			$("CommercialAreas_Loading").hide();
		}
	});
}

function Commercial_RemoveRoom(){
	if(Items.CommercialAreas.Count > 1){
		$("Commercial_Areas_" + Items.CommercialAreas.Count).remove();
		Items.CommercialAreas.Count --;
		$("Commercial_NumberOfAreas").value = Items.CommercialAreas.Count;
	}
}

function Commercial_NumberOfAreas_Change(objElement){
	var iRooms = parseInt(objElement.value);
	if(!isNaN(iRooms)){
		objElement.disabled = true;
		objElement.style.backgroundColor = "#DDDDDD";
		objElement.style.color = "#333333";
		bCommercial_AddingRoom = true;
		$("CommercialAreas_Loading").show();
		new Ajax.Request(sAJAXServer, {
			method : "post",
			parameters : "cmd=commercial-add-room&number=" + (Items.CommercialAreas.Count + 1) + "," + iRooms,
			onSuccess : function(objRequest){
				objTable = $("tblCommercialAreas");
				objTableBody = objTable.down("tbody");
				if(objTableBody) objTable = objTableBody;
				objTable.insert({bottom : objRequest.responseText});
				Items.CommercialAreas.Count += (iRooms - 1);
				bCommercial_AddingRoom = false;
				$("divCommercialAreas").show();
				$("CommercialAreas_Loading").hide();
			}
		});
	}
}

function IndividualType_onChange(objElement){
	if(objElement.value == "Company"){
		$("divCompanyName").show();
	}
	else{
		$("divCompanyName").hide();
	}
}

function IsPreviousClient_Click(objElement){
	if(objElement.value == "no"){
		$("divPreviousClientQuestions").show();
	}
	else{
		$("divPreviousClientQuestions").hide();
	}
}

function FormatCurrency(num) {
	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
	num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
	cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function CheckAvailability(){
	var sZipCode = $F("ZipCode");
	if(sZipCode.blank()){
		alert("Please enter the zip code of the location to be serviced.");
		$("ZipCode").focus();
		return;
	}
	fBaseRate = 0;
	bAvailability = false;
	for(var i=0; i<aZipCodes.length; i++){
		for(var j=0; j<aZipCodes[i][1].length; j++){
			if(aZipCodes[i][1][j] == sZipCode){
				fBaseRate = aZipCodes[i][0];
				bAvailability = true;
				break;
			}
		}
	}
	if(bAvailability){
		$("divSpecs").show();
		$("QuoteBox").show();
		iTimerCQ = setInterval(CalculateQuote, 200);
	}
	else{
		$("divSpecs").hide();
		$("QuoteBox").hide();
		clearInterval(iTimerCQ);
		alert("Sorry, there's no availability of our services in your area yet, according to the zip code you entered.");
	}
}

function CalculateQuote(){
	if($F("ScheduleVsEstimate") == "Schedule") return;
	var aQuote = [], fSurCharge, iSquareFeet;
	var fTotal = 0, fSubTotal = 0, fAdditionalCharges = 0;
	var iServicesRequested = 0;
	var bForceUpdate = false;
	
	if($("ServiceResidentialCarpetCleaning").checked) iServicesRequested ++;
	if($("ServiceUpholsteryCleaning").checked) iServicesRequested ++;
	if($("ServiceAreaRugCleaning").checked) iServicesRequested ++;
	if($("ServiceCommercialCarpetCleaning").checked) iServicesRequested ++;
	
	// ***********************************************
	// RESIDENTIAL CARPET CLEANING
	if($("ServiceResidentialCarpetCleaning").checked){
		aQuote.push(["Residential Carpet Cleaning"]);
		var fHypoallergenicCharge = 0;
		var fStairsCharge = 0;
		var fProtectionCharge = 0;
		
		fSubTotal = 0;
		fSurCharge = 0;
		iSquareFeet = 0;
		
		if($("ResidentialFurnished").checked){
			fSFPrice = Residential_SFPrice_Furnished;
		}
		else fSFPrice = Residential_SFPrice_Standard;
		
		if($("ResidentialQuoteBasedOn").value == "combined"){
			iSquareFeet = parseInt($F("Residential_CombinedSquareFeet"));
			if(!isNaN(iSquareFeet) && iSquareFeet != 0){
				fSubTotal = fBaseRate + (fSFPrice * (iSquareFeet > iMinimumChargeSFThreshold ? (iSquareFeet - iMinimumChargeSFThreshold) : 0));
			}
			else{
				fSubTotal = fBaseRate;
				iSquareFeet = iMinimumChargeSFThreshold;
			}
			if($("ResidentialHypoAllergenic").checked){
				fHypoallergenicCharge = (fSFPrice * iSquareFeet) * Residential_Surcharge_HypoAllergenic;
				fSubTotal += fHypoallergenicCharge;
			}
		}
		else if($("ResidentialQuoteBasedOn").value == "perroom"){
			var iStairs = parseInt($F("Residential_StairNumber"));
			if(!isNaN(iStairs)){
				fStairsCharge = (iStairs * Residential_Price_PerStair);
				fSubTotal += fStairsCharge;
				aQuote.push(["Stairs", "=" + FormatCurrency(iStairs * Residential_Price_PerStair)]);
			}
			Items.ResidentialAreas.List = [];
			var iSquareFeet = 0;
			for(var i=1; i<=Items.ResidentialAreas.Count; i++){
				var iWidth = parseInt($F("Residential_Areas_" + i + "_Width"));
				var iLength = parseInt($F("Residential_Areas_" + i + "_Length"));
				if(!isNaN(iWidth) && !isNaN(iLength)){
					var objArea = {
						Type : $F("Residential_Areas_" + i + "_Type"),
						AddProtection : $("Residential_Areas_" + i + "_Protection").checked,
						Width : iWidth,
						Length : iLength,
						SquareFeet : (iWidth * iLength)
					};
					Items.ResidentialAreas.List.push(objArea);
					$("Residential_Areas_" + i + "_SquareFeet").update(objArea.SquareFeet);
					iSquareFeet += objArea.SquareFeet;
					if(objArea.AddProtection){
						fProtectionCharge += (objArea.SquareFeet * Residential_SFSurcharge_Protection);
						fSubTotal += (objArea.SquareFeet * Residential_SFSurcharge_Protection);
					}
				}
				else{
					$("Residential_Areas_" + i + "_SquareFeet").update(0);
				}
			}
			
			if(isNaN(iSquareFeet) || iSquareFeet < iMinimumChargeSFThreshold){
				fSubTotal += fBaseRate;
				iSquareFeet = iMinimumChargeSFThreshold;
			}
			else{
				fSubTotal += fBaseRate + (fSFPrice * (iSquareFeet > iMinimumChargeSFThreshold ? (iSquareFeet - iMinimumChargeSFThreshold) : 0));
			}
			
			if($("ResidentialHypoAllergenic").checked){
				fHypoallergenicCharge = ((iSquareFeet * fSFPrice) * Residential_Surcharge_HypoAllergenic);
				fSubTotal += fHypoallergenicCharge;
			}
		}
		
		if(iSquareFeet != Items.ResidentialAreas.SquareFeet){
			bForceUpdate = true;
		}
		Items.ResidentialAreas.SquareFeet = iSquareFeet;
		aQuote.push(["Total Sq. Ft.", "=" + iSquareFeet]);
		aQuote.push(["1st " + iMinimumChargeSFThreshold + " Sq. Ft.", "=" + FormatCurrency(fBaseRate)]);
		if(iSquareFeet > iMinimumChargeSFThreshold){
			aQuote.push([(iSquareFeet - iMinimumChargeSFThreshold) + " Sq. Ft.", "=" + FormatCurrency(((iSquareFeet - iMinimumChargeSFThreshold) * fSFPrice))]);
		}
		if(fHypoallergenicCharge != 0) aQuote.push(["Hypo-allergenic", "=" + FormatCurrency(fHypoallergenicCharge)]);
		if(fProtectionCharge != 0) aQuote.push(["Protection", "=" + FormatCurrency(fProtectionCharge)]);
		if(fStairsCharge != 0) aQuote.push(["Stairs", "=" + FormatCurrency(fStairsCharge)]);
		aQuote.push(["Total Charge", fSubTotal]);
	}
	// ***********************************************
	// UPHOLSTERY CLEANING
	if($("ServiceUpholsteryCleaning").checked){
		aQuote.push(["Upholstery Cleaning"]);
		Items.UpholsteryPieces.List = [];
		for(var i=1; i<=Items.UpholsteryPieces.Count; i++){
			var iLinearFeet = parseInt($F("Upholstery_Pieces_" + i + "_LinearFeet"));
			if(isNaN(iLinearFeet)) iLinearFeet = 0;
			var objPiece = {
				Type : $F("Upholstery_Pieces_" + i + "_Type"),
				AddProtection : $("Upholstery_Pieces_" + i + "_Protection").checked,
				DustMiteTreatment : $("Upholstery_Pieces_" + i + "_DustMiteTreatment").checked,
				LinearFeet : iLinearFeet
			};
			Items.UpholsteryPieces.List.push(objPiece);
			if(objPiece.Type != ""){
				var aUpholsteryType = UpholsteryTypes[objPiece.Type];
				if(aUpholsteryType){
					var fSurCharge = 1 + (objPiece.AddProtection ? Upholstery_Surcharge_Protection : 0);
					var bPricePerLinearFeet = (Upholstery_PricedPerLinearFeet.indexOf(objPiece.Type) != -1);
					var fPrice = ((aUpholsteryType[1] * (bPricePerLinearFeet ? objPiece.LinearFeet : 1)) * fSurCharge) + (objPiece.DustMiteTreatment ? Upholstery_Surcharge_DustMiteTreatment : 0);
					aQuote.push([aUpholsteryType[0] + " (#" + i + ")", fPrice]);
				}
			}
		}
	}
	// ***********************************************
	// AREA RUG CLEANING
	if($("ServiceAreaRugCleaning").checked){
		aQuote.push(["Area Rug Cleaning"]);
		Items.AreaRugs.List = [];
		for(var i=1; i<=Items.AreaRugs.Count; i++){
			var iWidth = parseInt($F("AreaRugs_" + i + "_Width"));
			var iLength = parseInt($F("AreaRugs_" + i + "_Length"));
			if(!isNaN(iWidth) && !isNaN(iLength)){
				var objRug = {
					Fabric : $F("AreaRugs_" + i + "_Fabric"),
					CleaningType : $F("AreaRugs_" + i + "_CleaningType"),
					AddProtection : $("AreaRugs_" + i + "_Protection").checked,
					Width : iWidth,
					Length : iLength,
					SquareFeet : (iWidth * iLength)
				};
				Items.AreaRugs.List.push(objRug);
				$("AreaRugs_" + i + "_SquareFeet").update(objRug.SquareFeet);
				var fSFPrice = AreaRug_SFPrices[objRug.CleaningType];
				if(fSFPrice){
					var fSurCharge = 0;
					if($("AreaRugs_HypoAllergenic").checked){
						fSurCharge += AreaRug_Surcharge_HypoAllergenic;
					}
					if(objRug.AddProtection){
						fSFPrice += AreaRug_Charge_Protection;
					}
					aQuote.push(["Rug " + i, (((fSFPrice * objRug.SquareFeet) * (1 + fSurCharge)))]);
				}
			}
			else{
				$("AreaRugs_" + i + "_SquareFeet").update(0);
			}
		}
		if($F("AreaRugs_Pickup") == "PickupAndReturn"){
			if(iServicesRequested > 1){
				aQuote.push(["Pickup &amp; Return", AreaRug_Charge_PickupAndReturn_Discounted]);
			}
			else{
				aQuote.push(["Pickup &amp; Return", AreaRug_Charge_PickupAndReturn]);
			}
		}
		else if($F("AreaRugs_Pickup") == "DropOff"){
			aQuote.push(["Drop Off", AreaRug_Charge_DropOff]);
		}
	}
	// ***********************************************
	// COMMERCIAL CARPET CLEANING
	if($("ServiceCommercialCarpetCleaning").checked){
		aQuote.push(["Commercial Carpet Cleaning"]);
		var fHypoallergenicCharge = 0;
		var fStairsCharge = 0;
		var fProtectionCharge = 0;
		
		fSubTotal = 0;
		fSurCharge = 0;
		iSquareFeet = 0;
		
		if($("CommercialFurnished").checked){
			fSFPrice = Commercial_SFPrice_Furnished;
		}
		else fSFPrice = Commercial_SFPrice_Standard;
		
		if($("CommercialQuoteBasedOn").value == "combined"){
			iSquareFeet = parseInt($F("Commercial_CombinedSquareFeet"));
			if(!isNaN(iSquareFeet) && iSquareFeet != 0){
				fSubTotal = fBaseRate + (fSFPrice * (iSquareFeet > iMinimumChargeSFThreshold ? (iSquareFeet - iMinimumChargeSFThreshold) : 0));
			}
			else{
				fSubTotal = iMinimumChargeSFThreshold * fSFPrice;
				iSquareFeet = iMinimumChargeSFThreshold;
			}
			if($("CommercialHypoAllergenic").checked){
				fHypoallergenicCharge = (fSFPrice * iSquareFeet) * Commercial_Surcharge_HypoAllergenic;
				fSubTotal += fHypoallergenicCharge;
			}
		}
		else if($("CommercialQuoteBasedOn").value == "perroom"){
			var iStairs = parseInt($F("Commercial_StairNumber"));
			if(!isNaN(iStairs)){
				fStairsCharge = (iStairs * Commercial_Price_PerStair);
				fSubTotal += fStairsCharge;
				aQuote.push(["Stairs", "=" + FormatCurrency(iStairs * Commercial_Price_PerStair)]);
			}
			Items.CommercialAreas.List = [];
			var iSquareFeet = 0;
			for(var i=1; i<=Items.CommercialAreas.Count; i++){
				var iWidth = parseInt($F("Commercial_Areas_" + i + "_Width"));
				var iLength = parseInt($F("Commercial_Areas_" + i + "_Length"));
				if(!isNaN(iWidth) && !isNaN(iLength)){
					var objArea = {
						Type : $F("Commercial_Areas_" + i + "_Type"),
						AddProtection : $("Commercial_Areas_" + i + "_Protection").checked,
						Width : iWidth,
						Length : iLength,
						SquareFeet : (iWidth * iLength)
					};
					Items.CommercialAreas.List.push(objArea);
					$("Commercial_Areas_" + i + "_SquareFeet").update(objArea.SquareFeet);
					iSquareFeet += objArea.SquareFeet;
					if(objArea.AddProtection){
						fProtectionCharge += (objArea.SquareFeet * Commercial_SFSurcharge_Protection);
						fSubTotal += (objArea.SquareFeet * Commercial_SFSurcharge_Protection);
					}
				}
				else{
					$("Commercial_Areas_" + i + "_SquareFeet").update(0);
				}
			}
			
			if(isNaN(iSquareFeet) || iSquareFeet < iMinimumChargeSFThreshold){
				fSubTotal += fBaseRate;
				iSquareFeet = iMinimumChargeSFThreshold;
			}
			else{
				fSubTotal += fBaseRate + (fSFPrice * (iSquareFeet > iMinimumChargeSFThreshold ? (iSquareFeet - iMinimumChargeSFThreshold) : 0));
			}
			
			if($("CommercialHypoAllergenic").checked){
				fHypoallergenicCharge = ((iSquareFeet * fSFPrice) * Commercial_Surcharge_HypoAllergenic);
				fSubTotal += fHypoallergenicCharge;
			}
		}
		
		if(iSquareFeet != Items.CommercialAreas.SquareFeet){
			bForceUpdate = true;
		}
		Items.CommercialAreas.SquareFeet = iSquareFeet;
		aQuote.push(["Total Sq. Ft.", "=" + iSquareFeet]);
		aQuote.push(["1st " + iMinimumChargeSFThreshold + " Sq. Ft.", "=" + FormatCurrency(fBaseRate)]);
		if(iSquareFeet > iMinimumChargeSFThreshold){
			aQuote.push([(iSquareFeet - iMinimumChargeSFThreshold) + " Sq. Ft.", "=" + FormatCurrency(((iSquareFeet - iMinimumChargeSFThreshold) * fSFPrice))]);
		}
		if(fHypoallergenicCharge != 0) aQuote.push(["Hypo-allergenic", "=" + FormatCurrency(fHypoallergenicCharge)]);
		if(fProtectionCharge != 0) aQuote.push(["Protection", "=" + FormatCurrency(fProtectionCharge)]);
		if(fStairsCharge != 0) aQuote.push(["Stairs", "=" + FormatCurrency(fStairsCharge)]);
		aQuote.push(["Total Charge", fSubTotal]);
	}
	// ***********************************************
	
	var sHTML = "";
	var sText = "";
	for(var i=0; i<aQuote.length; i++){
		if(aQuote[i][1] == null){
			sHTML += "<p" + (i == 0 ? " style=\"margin-top: 0px;\"" : "") + ">" + aQuote[i][0] + "<\/p>";
			sText += "\n" + aQuote[i][0].toUpperCase() + "\n--------------------\n\n";
		}
		else if(aQuote[i][1].toString().substr(0, 1) == "="){
			aQuote[i][1] = aQuote[i][1].toString();
			sHTML += aQuote[i][0] + " = " + aQuote[i][1].substr(1, (aQuote[i][1].length - 1)) + "<br />";
			sText += aQuote[i][0] + " = " + aQuote[i][1].substr(1, (aQuote[i][1].length - 1)) + "\n";
		}
		else{
			sHTML += aQuote[i][0] + ": " + FormatCurrency(aQuote[i][1]) + "<br />";
			sText += aQuote[i][0] + ": " + FormatCurrency(aQuote[i][1]) + "\n";
			fTotal += aQuote[i][1];
		}
	}
	
	if(fTotal != fQuote || bForceUpdate){
		fQuote = fTotal;
		$("frmQuote").Estimate.value = sText;
		$("QuoteBox").update(
			"<h2>Quote</h2>" +
			"<div>" + sHTML + "<\/div>" +
			"<hr /><strong>Total: <\/strong>" + FormatCurrency(fTotal)
		);
		objWrapper = $$("#QuoteBox > div")[0];
		iScroll = objWrapper.scrollHeight - 130;
		if(iScroll < 0) iScroll = 0;
		objWrapper.scrollTop = iScroll;
	}
}

function SubmitRequest(){
	if($F("ScheduleVsEstimate") != "Schedule"){
		if(fQuote <= 0){
			alert("Please select at least one service in order to request an estimate.");
			$("ServiceRequested").scrollTo();
			return;
		}
	}
	
	objValidator = new AJAXValidator({Form : $("frmQuote")});
	
	objValidator.AddField({ID : "IndividualType", Name : "Individual Type", Required : true});
	if($F("IndividualType") == "Company"){
		objValidator.AddField({ID : "CompanyName", Name : "Company Name", Required : true});
	}
	objValidator.AddField({ID : "PersonalFirstName", Name : "First Name", Required : true});
	objValidator.AddField({ID : "PersonalLastName", Name : "Last Name", Required : true})
	objValidator.AddField({ID : "Phone", Name : "Phone", Required : true});
	objValidator.AddField({ID : "Email", Name : "Email", Format : F_EMAIL, Required : true});
	objValidator.AddField({ID : "Address", Name : "Address", Required : true});
	objValidator.AddField({ID : "City", Name : "City", Required : true});
	objValidator.AddField({ID : "recaptcha_response_field", Name : "Verification Code", Required : true});
	
	if($F("ScheduleVsEstimate") == "Schedule" || $F("ScheduleVsEstimate") == "Estimate and Schedule"){
		var iDateFormat = objValidator.AddFormat({
			Validator : function(sInput){
				if(sInput == "") return true;
				var objRegExp = new RegExp("^[0-9]{1,2}(\/|\-)[0-9]{1,2}(\/|\-)[0-9]{4}$");
				return objRegExp.test(sInput);
			},
			ErrorMessage : "must be a valid date in MM/DD/YYYY format"
		});
		objValidator.AddField({ID : "Schedule1", Name : "Schedule Option 1 - Date", Format : iDateFormat, Required : true});
		objValidator.AddField({ID : "Schedule1Time", Name : "Schedule Option 1 - Time", Required : true});
		objValidator.AddField({ID : "Schedule2", Name : "Schedule Option 2 - Date", Format : iDateFormat, Required : true});
		objValidator.AddField({ID : "Schedule2Time", Name : "Schedule Option 2 - Time", Required : true});
		objValidator.AddField({ID : "Schedule3", Name : "Schedule Option 3 - Date", Format : iDateFormat, Required : true});
		objValidator.AddField({ID : "Schedule3Time", Name : "Schedule Option 3 - Time", Required : true});
	}
	
	if($F("ScheduleVsEstimate") != "Schedule"){
		if($("ServiceResidentialCarpetCleaning").checked){
			if($F("ResidentialQuoteBasedOn") == "combined"){
				objValidator.AddField({ID : "Residential_CombinedSquareFeet", Name : "Residential Carpet Cleaning: Combined Square Feet", Required : true});
			}
			else if($F("ResidentialQuoteBasedOn") == "perroom"){
				objValidator.AddField({ID : "Residential_NumberOfAreas", Name : "Residential Carpet Cleaning: Number of Areas", Format : F_NUMBER, Required : true});
				objValidator.AddField({ID : "Residential_StairNumber", Name : "Residential Carpet Cleaning: Number of Stairs", Format : F_NUMBER, Required : true});
			}
		}
		
		if($("ServiceUpholsteryCleaning").checked){
			objValidator.AddField({ID : "Upholstery_Pieces", Name : "Upholstery Cleaning - Number of Pieces", Format : F_NUMBER, Required : true});
		}
		
		if($("ServiceAreaRugCleaning").checked){
			objValidator.AddField({ID : "AreaRugs_NumberOfRugs", Name : "Area Rug Cleaning - Number of Rugs", Format : F_NUMBER, Required : true});
			objValidator.AddField({ID : "AreaRugs_Pickup", Name : "Area Rug Cleaning - Pickup or Drop Off", Required : true});
		}
		
		if($("ServiceCommercialCarpetCleaning").checked){
			if($F("CommercialQuoteBasedOn") == "combined"){
				objValidator.AddField({ID : "Commercial_CombinedSquareFeet", Name : "Commercial Carpet Cleaning: Combined Square Feet", Required : true});
			}
			else if($F("CommercialQuoteBasedOn") == "perroom"){
				objValidator.AddField({ID : "Commercial_NumberOfAreas", Name : "Commercial Carpet Cleaning: Number of Areas", Format : F_NUMBER, Required : true});
				objValidator.AddField({ID : "Commercial_StairNumber", Name : "Commercial Carpet Cleaning: Number of Stairs", Format : F_NUMBER, Required : true});
			}
		}
	}
	
	if(!$("frmQuote").IsPreviousClient[0].checked && !$("frmQuote").IsPreviousClient[1].checked){
		alert("Please let us know if we've had the privilege of cleaning for you previously.");
		$("frmQuote").IsPreviousClient[0].focus();
		return;
	}
	
	if($("frmQuote").IsPreviousClient[1].checked){
		objValidator.AddField({ID : "HearAboutUs", Name : "How did you hear about us?", Required : true});
		objValidator.AddField({ID : "LastCleaning", Name : "When was the last time you had a professionally cleaning?", Required : true});
	}

	objValidator.Run();
	
	if(objValidator.Valid){
		$("frmQuote").btnSubmit.value = "Processing...";
		$("frmQuote").btnSubmit.style.background = "#5C8ACC url('/images/loading.gif') no-repeat 2px 3px";
		$("frmQuote").btnSubmit.style.padding = "2px 2px 2px 18px";
		$("frmQuote").btnSubmit.disabled = true;
		var sParameters = $("frmQuote").serialize(true);
		new Ajax.Request(location.pathname, {
			method : "post",
			parameters : sParameters,
			onSuccess : function(objRequest){
				var objResponse;
				try{
					objResponse = eval(objRequest.responseText);
				}
				catch(e){
					alert("Sorry, we encountered a technical error and your request couldn't be sent. Please try again in a few moments.");
				}
				if(objResponse){
					if(objResponse.success){
						$("divMessage").show();
						$("divMessage").scrollTo();
						$("QuoteBox").hide();
						setTimeout(function(){
							Effect.BlindUp("divForm");
						}, 200);
					}
					else{
						$("frmQuote").btnSubmit.value = "Submit Request";
						$("frmQuote").btnSubmit.style.background = "#5C8ACC";
						$("frmQuote").btnSubmit.style.padding = "2px";
						$("frmQuote").btnSubmit.disabled = false;
						alert(objResponse.error);
					}
				}
			},
			onFailure : function(){
				$("frmQuote").btnSubmit.value = "Submit Request";
				$("frmQuote").btnSubmit.style.background = "#5C8ACC";
				$("frmQuote").btnSubmit.style.padding = "2px";
				$("frmQuote").btnSubmit.disabled = false;
				alert("Sorry, we encountered a technical error and your request couldn't be sent. Please try again in a few moments.");
			}
		});
	}
	else{
		var aErrors = [];
		var aRequired = [];
		for(sField in objValidator.Fields){
			if(objValidator.Fields[sField].Valid == false) aErrors.push("- " + objValidator.Fields[sField].Error);
			if(objValidator.Fields[sField].Required) aRequired.push(sField);
		}
		alert("Sorry, we encountered the following problems when trying to process the form:\n\n" + aErrors.join("\n") + "\n\nPlease see if you can fix them and try again.");
	}
}

Event.observe(window, "load", function(){
	Event.observe($("frmQuote"), "submit", function(event){
		if(fBaseRate == 0){
			CheckAvailability();
		}
		else{
			SubmitRequest();
		}
		Event.stop(event);
	});
});