// MHRCLASS.FGL - Main MHRAter Library - FGL/VM3.6
// (c) 2000 by West Coast Web Adventures, Inc., All Rights Reserved
//
// Classes:
//	QuoteData		new( filename, AgencyId, Agent )
//


CLASS QuoteData
  PUBLIC:
  	local name, age, county, zip, deductible, claims, LienFree
  	local YearBuilt, InPark, TtlSpaces, width, length, manufacturer, model, aStructValue
  	local mhValue, grc, ProtectionClass
  	local oQuake, oNatural, oSecured, oLiability, oGolfCart, oWoodStove, oWorkersComp
  	local oLoss, oMedical, oSewer, oFlood, oWind, oAnimal, oLienFree
  	local oNaturalP, oSecuredP, oLiabilityP, oGolfCartP, oWoodStoveP, oWorkersCompP
  	local oLossP, oMedicalP, oSewerP, oFloodP, oWindP, oAnimalP, oLienFreeP
  	local BrokerFee, oDeductibleP
	local aAntenna, aUnStructValue, aPersonal, aLiability, IsPrimary, IsSeasonal, IsRental, IsTenant
	local aAntennaP, aUnStructValueP, aPersonalP, aLiabilityP
	local p1, p2, p3, p4

	local sCamera, sArts, sArts2, sGolf, sGuns, sMusic, sPC, sSilver, sJewel, sFurs
	local sStamps, sCoins, sAntiques, sOther
	local sCameraP, sArtsP, sArts2P, sGolfP, sGunsP, sMusicP, sPCP, sSilverP, sJewelP, sFursP
	local sStampsP, sCoinsP, sAntiquesP, sOtherP
	
	local address, city, state, phone, dob, sName, sAge, sDOB
	local aName, aAddress, aCity, aState, aZip
	local mAddress, mCity, mState, mZip, mCounty, mPhone
	local a2name, a2address, a2city, a2state, a2zip, a2county, a2phone
	local lname, laddress, lcity, lstate, lzip, lcounty, lphone, lloan
	local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, u1, u2
	local from, to, PriorCarrier, tenant
	local LandIsOwned, ParkName, space, FireDept, HydrantDistance, FireDistance
	local sn, bracing, skirted, heat, AuxHeat
	local aPorch, aDeck, aOther, aDesc, aUsage, aWidth, aLength, aYearBuilt, aBuilt, aAuxHeat
	local oDesc, oUsage, oWidth, oLength, oYearBuilt, oBuilt, oAuxHeat
	
	local AgencyId, Agent, filename, data, errmsg, CreateDate
	local ConstructionCode, ConstructionGrade, Territory, FloodRestriction, area
	local ReplacementCost, CostPerSF, CoverageAmount, ParkType
	local ProtectionDeviceCredit, FloodDeductible, BasePremium, PremiumFee
	local UnStructLimit, LossOfUseLimit, PersonalEffectsLimit, PersonalPropertyLimit, PersonalLiabilityLimit
	local eqBand, eqRate, eqPremium, PersonalMedicalLimit, IsFlood, OtherP
	local PEGuarantee

  	METHOD new( filename, AgencyId, Agent )
  		::init( )
  		::filename = filename
  		::data = ""
  		::errmsg = ""
  		::AgencyId = AgencyId
  		::Agent = Agent
  		::CreateDate = ""
  		return( 1 )
  	END


	METHOD ListFloodParks( vname, ParkName )
		return( ListFloodParks( vname, ParkName, fileFullPath( ::filename ) + '\data.dat' ) )
	END


	METHOD Calculate( )
		local datafile, eqDatafile, jrate, frate, p

		datafile = fileFullPath( ::filename ) + '\data.dat'
		eqDatafile = fileFullPath( ::filename ) + '\quake.dat'

		::ConstructionCode = DetermineConstructionCode( ::manufacturer, datafile )
		::ConstructionGrade = ConstructionGrade( ::ConstructionCode )
		::Territory = DetermineTerritory( ::county, datafile )
		::eqBand = DetermineEarthquakeBand( ::zip, eqDatafile )
		::FloodRestriction = DetermineFloodRestriction( ::zip, ::ParkName, datafile )

		::area = int( ::width * ::length )
		::ReplacementCost = DetermineReplacementCost( ::ConstructionCode, ::area )
		::CostPerSF = ::ReplacementCost / ::area

		if ( ::grc )
			::mhValue = DollarRoundUp( ( ::mhValue > ::ReplacementCost ) ? ::mhValue : ::ReplacementCost )
		end
		::CoverageAmount = DollarRoundUp( ::mhValue + ::aStructValue )

		if ( ::IsTenant || ::IsRental )
			::ParkType = "Standard"
		else
			::ParkType = DeterminePark( ::InPark, ::age, ::CoverageAmount, ::claims, ::TtlSpaces, ::Area )
		end

		// Earthquake
		if ( ::oQuake )
			::eqRate = QuakeRate( ::eqBand, 1 )
			::eqPremium = DollarRoundUp( QuakePremium( ::CoverageAmount / 1000, ::eqRate, ::YearBuilt ) )
		else
			::eqRate = 0
			::eqPremium = 0
		end

		// Premium Data
		p =  new( "PremiumData", ::territory, ::ParkType, ::YearBuilt, ::CoverageAmount, fileFullPath( ::filename ), ::InPark, ::IsRental, ::IsTenant, ::aUnStructValue )
		if ( ! p.LoadData( ) )
			::errmsg = p.errmsg
			return( 0 )
		end

		// Scheduled Personal Property
		switch ( upper( ::county ) )
		  case "LOS ANGELES"
		  	jRate = 2.40
		  	fRate = 0.95
		  	break
		  case "SAN FRANCISCO"
		  	jRate = 1.35
		  	fRate = 0.60
		  	break
		  case "ALAMEDA"
		  case "CONTRA COSTA"
		  case "MARIN"
		  case "SAN MATEO"
		  	jRate = 1.45
		  	fRate = 0.50
		  	break
		  default
		  	jRate = 1.85
		  	fRate = 0.55
		  	break
		end

		::sCameraP = DollarRoundUp( 1.85 * ( ::sCamera / 100 ) )
		::sArtsP = DollarRoundUp( 0.40 * ( ::sArts / 100 ) )
		::sArts2P = DollarRoundUp( 0.55 * ( ::sArts2 / 100 ) )
		::sGolfP = DollarRoundUp( 1.00 * ( ::sGolf / 100 ) )
		::sGunsP = DollarRoundUp( 2.00 * ( ::sGuns / 100 ) )
		::sMusicP = DollarRoundUp( 0.55 * ( ::sMusic / 100 ) )
		::sPCP = DollarRoundUp( 0.35 * ( ::sPC / 100 ) )
		::sSilverP = DollarRoundUp( 0.50 * ( ::sSilver / 100 ) )
		::sJewelP = DollarRoundUp( jRate * ( ::sJewel / 100 ) )
		::sFursP = DollarRoundUp( fRate * ( ::sFurs / 100 ) )
		::sStampsP = DollarRoundUp( 0.45 * ( ::sStamps / 100 ) )
		::sCoinsP = DollarRoundUp( 1.85 * ( ::sCoins / 100 ) )
		::sAntiquesP = DollarRoundUp( 2.00 * ( ::sAntiques / 100 ) )
		::sOtherP = DollarRoundUp( 1.50 * ( ::sOther / 100 ) )

		// Optional Coverages
		::oNaturalP = ::oNatural ? 3 : 0
		::oSecuredP = ::oSecured ? 15 : 0
		::oLiabilityP = ::oLiability ? 30 : 0
		::oGolfCartP = ::oGolfCart ? 35 : 0
		::oWoodStoveP = ::oWoodStove ? 35 : 0
		::oWorkersCompP = ::oWorkersComp ? 130 : 0
		::oLossP = ::oLoss ? 10 : 0

		if ( ::IsRental )
			::oMedicalP = 0
		else
			::oMedicalP = ::oMedical ? ( ::IsTenant ||  ? 5 : 0 ) : 0
		end

		::oSewerP = ::oSewer ? 30 : 0
		::oFloodP = ::oFlood ? ( strempty( ::FloodRestriction ) ? 25 : 0 ) : 0
		::oWindP = ::oWind ? -25 : 0
		::oAnimalP = ::oAnimal ? -25 : 0
		::oLienFreeP = -1 * ( ::oLienFree ? ( int( p.PremiumAmount * .05 ) ) : 0 )
		if ( ! ::IsSeasonal )
			if ( ::deductible == 100 )
				::oDeductibleP = 25
			elseif ( ::deductible == 500 )
				::oDeductibleP = -25
			else
				::oDeductibleP = 0
			end
		else
			::oDeductibleP = 0
		end

		::ProtectionDeviceCredit = DetermineProtectionDeviceCredit( self )

		::aAntennaP = DollarRoundUp( 5.00 * ( ::aAntenna / 100 ) )
		::aUnStructValueP = DollarRoundUp( ( ::aUnStructValue > p.UnattachedStructureLimit ) ? ( ( ( ::aUnStructValue - p.UnattachedStructureLimit ) / 100 ) * p.IncreaseUnattachedStructuresRate ) : 0 )
		::aPersonalP = DollarRoundUp( ( ::aPersonal > p.PersonalEffectsLimit ) ? ( ( ( ::aPersonal - p.PersonalEffectsLimit ) / 100 ) * p.IncreasePersonalEffectsRate ) : 0 )

		::aLiabilityP = DollarRoundUp( ( ::aLiability > p.PersonalLiabilityLimit ) ? ( ( ( ::aLiability - p.PersonalLiabilityLimit ) / 1000 ) * p.IncreasePersonalLiabilityRate ) : 0 )

		if ( ! ::InPark )
			if ( ! ::IsRental )
				::UnStructLimit = DollarRoundUp( ::CoverageAmount * .10 )
			else
				::UnStructLimit = DollarRoundUp( ( ::aUnStructValue > p.UnattachedStructureLimit ) ? ::aUnStructValue : p.UnattachedStructureLimit )
			end
			::LossOfUseLimit = DollarRoundUp( ::CoverageAmount * .20 )
			::PersonalEffectsLimit = DollarRoundUp( ::CoverageAmount * .50 )
			::PersonalLiabilityLimit = 25000
		else
			::UnStructLimit = DollarRoundUp( ( ::aUnStructValue > p.UnattachedStructureLimit ) ? ::aUnStructValue : p.UnattachedStructureLimit )
			::LossOfUseLimit = DollarRoundUp( p.LossOfUseLimit )
			::PersonalEffectsLimit = DollarRoundUp( ( ::aPersonal > p.PersonalEffectsLimit ) ? ::aPersonal : p.PersonalEffectsLimit )
			::PersonalLiabilityLimit = DollarRoundUp( ( ::aLiability > p.PersonalLiabilityLimit ) ? ::aLiability : p.PersonalLiabilityLimit )
		end
		::PersonalPropertyLimit = DollarRoundUp( ::TotalScheduledPropertyCoverage( ) )
		
		::FloodDeductible = ::oFlood ? 250 : 500
		
		::BasePremium = DollarRoundUp( p.PremiumAmount )
		
		::PremiumFee = DollarRoundUp( p.PremiumFee )
		if ( ::oQuake )
			::PremiumFee += 15
		end

        if ( ::IsSeasonal || ::IsRental || ::IsTenant )
			::LossOfUseLimit = 0
		end

		if ( :: IsRental )
			::PersonalMedicalLimit = 0
		else
		 	::PersonalMedicalLimit = ( ::IsTenant ? ( ::oMedical ? 1000 : 500 ) : 1000 )
		end


		if ( ::IsRental )
			CalculateRentalApplication( self )
		elseif ( ::IsTenant )
			CalculateTenantApplication( self )
		end

		if ( ::IsTenant )
			if ( ::BasePremium > 0 && ::BasePremium < 75 )
				::BasePremium = 75
			end
		else
			if ( ::BasePremium > 0 && ::BasePremium < 100 )
				::BasePRemium = 100
			end
		end
		
		return( 1 )
	END

	METHOD TotalPolicyExpenses( )
		return( ::BasePremium + ::TotalOptionalCoverages( ) + ::TotalCreditsAndDebits( ) + ::eqPremium + ::PremiumFee + ::BrokerFee )
	END

	METHOD TotalOptionalCoverages( )
		return( ::oNaturalP + ::oSecuredP + ::oLiabilityP + ::oGolfCartP + ::oWoodStoveP + ::oWorkersCompP + ::oLossP + ::aAntennaP + ::aUnStructValueP + ::aPersonalP + ::aLiabilityP + ::oMedicalP + ::oSewerP + ::TotalScheduledPropertyPremium( ) )
	END
	
	METHOD TotalCreditsAndDebits( )
		return( ::oLienFreeP + ::oFloodP + ::oWindP + ::oAnimalP + ::oDeductibleP + ::ProtectionDeviceCredit + ::OtherP )
	END

	METHOD TotalScheduledPropertyCoverage( )
		return( ::sCamera + ::sArts + ::sArts2 + ::sGolf + ::sGuns + ::sMusic + ::sPC + ::sSilver + ::sJewel + ::sFurs + ::sStamps + ::sCoins + ::sAntiques + ::sOther )
	END

	METHOD TotalScheduledPropertyPremium( )
		return( ::sCameraP + ::sArtsP + ::sArts2P + ::sGolfP + ::sGunsP + ::sMusicP + ::sPCP + ::sSilverP + ::sJewelP + ::sFursP + ::sStampsP + ::sCoinsP + ::sAntiquesP + ::sOtherP )
	END

	METHOD ListQuotes( vname )
		local s, curAgency
		
		curAgency = upper( untrim( ::AgencyId, 10 ) )
		
		rater->dbSeek( curAgency )		
		if ( ! rater->dbFound( ) )
			return( "<select name=\"" + vname + "\" style=\"width:100%;\" size=15><option>No Quotes Currently On File...</select>\r\n " )
		end

		s = "<select name=\"" + vname + "\" style=\"width:100%;\" size=15>\r\n"
		while ( ! rater->dbEOF( ) )
			if ( rater->dbIsDeleted( ) )
				rater->dbSkip( )
				continue
			end
			
			if ( upper( rater->AgencyId ) != curAgency )
				break
			end

			s += "<option>" + alltrim( rater->Applicant ) + " ( Age " + rater->age + ", " + alltrim( rater->county ) + " County, " + alltrim( rater->zip ) + " )\r\n"
						
			rater->dbSkip( )
		end
		s += "</select>\r\n"

		return( s )
	END


	METHOD GetKey( )
		if ( strempty( ::AgencyId ) || strempty( ::name ) || ( ::age < 1 ) || strempty( ::county ) || strempty( ::zip ) )
			::errmsg = "Invalid KEY element."
			return( "" )
		end
		return( upper( untrim( ::AgencyId, 10 ) + untrim( GetLastNameKey( ::name ), 40 ) + right( "000" + ::Age, 3 ) + untrim( ::county, 20 ) + untrim( ::zip, 10 ) ) )
	END


	METHOD OpenData( session )
		::data = new( "objRaterData", session )
		if ( type( ::data ) != "O" )
			return( 0 )
		end
		return( ::data.open( ) )
	END


	METHOD CloseData( )
		if ( type( ::data ) == "O" )
			::data.close( )
		end
		return( 1 )
	END


	METHOD PutData( AppendFlag, user )
		local key, str
		key = ::GetKey( )
		if ( strempty( key ) )
			return( 0 )
		end

		if ( ! ::data.seek( key ) )
			if ( ! AppendFlag )
				return( 0 )
			end
			rater->dbAppend( )
			rater->AgencyId = ::AgencyId
			rater->Agent = ::Agent
			rater->Applicant = GetLastNameKey( ::name )
			rater->age = ::age
			rater->county = ::county
			rater->zip = ::zip
			
			if ( type( user ) == "O" )
				user.IncrementQuote( )
			end
		else
			if ( ! rater->dbRlock( ) )
				::errmsg( "ERROR: Unable top lock database record." )
				return( 0 )
			end
		end

		if ( strempty( ::CreateDate ) )
			::CreateDate = date( "MM-DD-YYYY " ) + time( )
		end

		str = ::name + "\n" + ::deductible + "\n" + ::claims + "\n" + ::LienFree + "\n" + ::YearBuilt
		str += "\n" + ::InPark + "\n" + ::TtlSpaces + "\n" + ::width + "\n" + ::length + "\n" + ::manufacturer
		str += "\n" + ::IsPrimary + "\n" + ::IsSeasonal + "\n" + ::IsRental + "\n" + ::IsTenant
		str += "\n" + ::oQuake + "\n" + ::oNatural + "\n" + ::oSecured + "\n" + ::oLiability + "\n" + ::oGolfCart
		str += "\n" + ::oWoodStove + "\n" + ::oWorkersComp + "\n" + ::oLoss + "\n" + ::oMedical
		str += "\n" + ::oSewer + "\n" + ::oFlood + "\n" + ::oWind + "\n" + ::oAnimal + "\n" + ::oLienFree
		str += "\n" + ::grc + "\n" + ::mhValue + "\n" + ::aStructValue + "\n" + ::aUnstructValue
		str += "\n" + ::CreateDate + "\n" + ::aAntenna + "\n" + ::aPersonal + "\n" + ::aLiability
		str += "\n" + ::sCamera + "\n" + ::sArts + "\n" + ::sArts2 + "\n" + ::sGolf + "\n" + ::sGuns
		str += "\n" + ::sMusic + "\n" + ::sPC + "\n" + ::sSilver + "\n" + ::sJewel + "\n" + ::sFurs
		str += "\n" + ::sStamps + "\n" + ::sCoins + "\n" + ::sAntiques + "\n" + ::sOther
		str += "\n" + ::p1 + "\n" + ::p2 + "\n" + ::p3 + "\n" + ::p4 + "\n" + ::BrokerFee
		str += "\n" + ::from + "\n" + ::to + "\n" + ::PriorCarrier
		str += "\n" + ::address + "\n" + ::city + "\n" + ::state + "\n" + ::phone + "\n" + ::dob
		str += "\n" + ::sName + "\n" + ::sAge + "\n" + ::sDob
		str += "\n" + ::aName + "\n" + ::aAddress + "\n" + ::aCity + "\n" + ::aState + "\n" + ::aZip
		str += "\n" + ::mAddress + "\n" + ::mCity + "\n" + ::mState + "\n" + ::mZip + "\n" + ::mCounty + "\n" + ::mPhone
		str += "\n" + ::a2name + "\n" + ::a2address + "\n" + ::a2city + "\n" + ::a2state + "\n" + ::a2zip + "\n" + ::a2county + "\n" + ::a2phone
		str += "\n" + ::lname + "\n" + ::laddress + "\n" + ::lcity + "\n" + ::lstate + "\n" + ::lzip + "\n" + ::lcounty + "\n" + ::lphone + "\n" + ::lloan
		str += "\n" + ::r1 + "\n" + ::r2 + "\n" + ::r3 + "\n" + ::r4 + "\n" + ::r5 + "\n" + ::r6 + "\n" + ::r7 + "\n" + ::r8 + "\n" + ::r9 + "\n" + ::r10
		str += "\n" + ::u1 + "\n" + ::u2 + "\n" + ::tenant
		str += "\n" + ::LandIsOwned + "\n" + ::ParkName + "\n" + ::space + "\n" + ::FireDept + "\n" + ::HydrantDistance + "\n" + ::FireDistance
		str += "\n" + ::sn + "\n" + ::bracing + "\n" + ::skirted + "\n" + ::heat + "\n" + ::AuxHeat
		str += "\n" + ::aPorch + "\n" + ::aDeck + "\n" + ::aOther + "\n" + ::aDesc + "\n" + ::aUsage + "\n" + ::aWidth + "\n" + ::aLength + "\n" + ::aYearBuilt + "\n" + ::aBuilt + "\n" + ::aAuxHeat
		str += "\n" + ::oDesc + "\n" + ::oUsage + "\n" + ::oWidth + "\n" + ::oLength + "\n" + ::oYearBuilt + "\n" + ::oBuilt + "\n" + ::oAuxHeat
		str += "\n" + ::ProtectionClass + "\n" + ::IsFlood + "\n" + ::PEGuarantee

		rater->data = str
		
		rater->dbUnlock( )
		
		return( 1 )
	END
		

	METHOD GetData( key )
		local str
		
		if ( ! ::data.seek( key ) )
			return( 0 )
		end

		str = rater->data

		::agent = alltrim( rater->agent )

		::name = strextract( str, "\n", 1 )
		::age = rater->age
		::county = alltrim( rater->county )
		::zip = alltrim( rater->zip )
		::deductible = 0 + strextract( str, "\n", 2 )
		::claims = 0 + strextract( str, "\n", 3 )
		::LienFree = 0 + strextract( str, "\n", 4 )
		
		::YearBuilt = 0 + strextract( str, "\n", 5 )
		::InPark = 0 + strextract( str, "\n", 6 )
		::TtlSpaces = 0 + strextract( str, "\n", 7 )
		::width = 0 + strextract( str, "\n", 8 )
		::length = 0 + strextract( str, "\n", 9 )
		::manufacturer = strextract( str, "\n", 10 )
		::IsPrimary = 0 + strextract( str, "\n", 11 )
		::IsSeasonal = 0 + strextract( str, "\n", 12 )
		::IsRental = 0 + strextract( str, "\n", 13 )
		::IsTenant = 0 + strextract( str, "\n", 14 )

  		::oQuake = 0 + strextract( str, "\n", 15 )
		::oNatural = 0 + strextract( str, "\n", 16 )
		::oSecured = 0 + strextract( str, "\n", 17 )
		::oLiability = 0 + strextract( str, "\n", 18 )
		::oGolfCart = 0 + strextract( str, "\n", 19 )
		::oWoodStove = 0 + strextract( str, "\n", 20 )
		::oWorkersComp = 0 + strextract( str, "\n", 21 )
		::oLoss = 0 + strextract( str, "\n", 22 )
		::oMedical = 0 + strextract( str, "\n", 23 )
		::oSewer = 0 + strextract( str, "\n", 24 )
		::oFlood = 0 + strextract( str, "\n", 25 )
		::oWind = 0 + strextract( str, "\n", 26 )
		::oAnimal = 0 + strextract( str, "\n", 27 )
		::oLienFree = 0 + strextract( str, "\n", 28 )

		::grc = 0 + strextract( str, "\n", 29 )
		::mhValue = 0 + strextract( str, "\n", 30 )
		::aStructValue = 0 + strextract( str, "\n", 31 )
		::aUnStructValue = 0 + strextract( str, "\n", 32 )
		
		::CreateDate = strextract( str, "\n", 33 )

		::aAntenna = 0 + strextract( str, "\n", 34 )
		::aPersonal = 0 + strextract( str, "\n", 35 )
		::aLiability = 0 + strextract( str, "\n", 36 )

		::sCamera = 0 + strextract( str, "\n", 37 )
		::sArts = 0 + strextract( str, "\n", 38 )
		::sArts2 = 0 + strextract( str, "\n", 39 )
		::sGolf = 0 + strextract( str, "\n", 40 )
		::sGuns = 0 + strextract( str, "\n", 41 )
		::sMusic = 0 + strextract( str, "\n", 42 )
		::sPC = 0 + strextract( str, "\n", 43 )
		::sSilver = 0 + strextract( str, "\n", 44 )
		::sJewel = 0 + strextract( str, "\n", 45 )
		::sFurs = 0 + strextract( str, "\n", 46 )
		::sStamps = 0 + strextract( str, "\n", 47 )
		::sCoins = 0 + strextract( str, "\n", 48 )
		::sAntiques = 0 + strextract( str, "\n", 49 )
		::sOther = 0 + strextract( str, "\n", 50 )

		::p1 = 0 + strextract( str, "\n", 51 )
		::p2 = 0 + strextract( str, "\n", 52 )
		::p3 = 0 + strextract( str, "\n", 53 )
		::p4 = 0 + strextract( str, "\n", 54 )

		::BrokerFee = 0 + strextract( str, "\n", 55 )

		::from = strextract( str, "\n", 56 )
		::to = strextract( str, "\n", 57 )
		::PriorCarrier = strextract( str, "\n", 58 )

		::address = strextract( str, "\n", 59 )
		::city = strextract( str, "\n", 60 )
		::state = strextract( str, "\n", 61 )
		::phone = strextract( str, "\n", 62 )
		::dob = strextract( str, "\n", 63 )

		::sName = strextract( str, "\n", 64 )
		::sAge = 0 + strextract( str, "\n", 65 )
		::sDob = strextract( str, "\n", 66 )

		::aName = strextract( str, "\n", 67 )
		::aAddress = strextract( str, "\n", 68 )
		::aCity = strextract( str, "\n", 69 )
		::aState = strextract( str, "\n", 70 )
		::aZip = strextract( str, "\n", 71 )
		
		::mAddress = strextract( str, "\n", 72 )
		::mCity = strextract( str, "\n", 73 )
		::mState = strextract( str, "\n", 74 )
		::mZip = strextract( str, "\n", 75 )
		::mCounty = strextract( str, "\n", 76 )
		::mPhone = strextract( str, "\n", 77 )

		::a2Name = strextract( str, "\n", 78 )
		::a2Address = strextract( str, "\n", 79 )
		::a2City = strextract( str, "\n", 80 )
		::a2State = strextract( str, "\n", 81 )
		::a2Zip = strextract( str, "\n", 82 )
		::a2County = strextract( str, "\n", 83 )
		::a2Phone = strextract( str, "\n", 84 )

		::lName = strextract( str, "\n", 85 )
		::lAddress = strextract( str, "\n", 86 )
		::lCity = strextract( str, "\n", 87 )
		::lState = strextract( str, "\n", 88 )
		::lZip = strextract( str, "\n", 89 )
		::lCounty = strextract( str, "\n", 90 )
		::lPhone = strextract( str, "\n", 91 )
		::lLoan = strextract( str, "\n", 92 )

		::r1 = 0 + strextract( str, "\n", 93 )
		::r2 = 0 + strextract( str, "\n", 94 )
		::r3 = 0 + strextract( str, "\n", 95 )
		::r4 = 0 + strextract( str, "\n", 96 )
		::r5 = 0 + strextract( str, "\n", 97 )
		::r6 = 0 + strextract( str, "\n", 98 )
		::r7 = 0 + strextract( str, "\n", 99 )
		::r8 = 0 + strextract( str, "\n", 100 )
		::r9 = 0 + strextract( str, "\n", 101 )
		::r10 = 0 + strextract( str, "\n", 102 )

		::u1 = 0 + strextract( str, "\n", 103 )
		::u2 = 0 + strextract( str, "\n", 104 )
		
		::tenant = strextract( str, "\n", 105 )

		::LandIsOwned = 0 + strextract( str, "\n", 106 )
		::ParkName = strextract( str, "\n", 107 )
		::space = strextract( str, "\n", 108 )
		::FireDept = strextract( str, "\n", 109 )
		::HydrantDistance = strextract( str, "\n", 110 )
		::FireDistance = strextract( str, "\n", 111 )

		::sn = strextract( str, "\n", 112 )
		::bracing = 0 + strextract( str, "\n", 113 )
		::skirted = 0 + strextract( str, "\n", 114 )
		::heat = strextract( str, "\n", 115 )
		::AuxHeat = strextract( str, "\n", 116 )

		::aPorch = 0 + strextract( str, "\n", 117 )
		::aDeck = 0 + strextract( str, "\n", 118 )
		::aOther = 0 + strextract( str, "\n", 119 )
		::aDesc = strextract( str, "\n", 120 )
		::aUsage = strextract( str, "\n", 121 )
		::aWidth = 0 + strextract( str, "\n", 122 )
		::aLength = 0 + strextract( str, "\n", 123 )
		::aYearBuilt = 0 + strextract( str, "\n", 124 )
		::aBuilt = 0 + strextract( str, "\n", 125 )
		::aAuxHeat = strextract( str, "\n", 126 )

		::oDesc = strextract( str, "\n", 127 )
		::oUsage = strextract( str, "\n", 128 )
		::oWidth = 0 + strextract( str, "\n", 129 )
		::oLength = 0 + strextract( str, "\n", 130 )
		::oYearBuilt = 0 + strextract( str, "\n", 131 )
		::oBuilt = 0 + strextract( str, "\n", 132 )
		::oAuxHeat = strextract( str, "\n", 133 )
		
		::ProtectionClass = 0 + strextract( str, "\n", 134 )
		::IsFlood = 0 + strextract( str, "\n", 135 )
		::PEGuarantee = 0 + strextract( str, "\n", 136 )

		return( 1 )
	END


	METHOD UpdateFromForm( session, page, _CreateFlag )
		local CreateFlag, s

		CreateFlag = ( type( _CreateFlag ) != "N" ) ? 0 : _CreateFlag

		switch ( page )
		  case 1
			if ( CreateFlag ) 
				::name = session.var( "name" )
				::age = 0 + session.var( "age" )
				::county = session.var( "county" )
				::zip = session.var( "zip" )
			end
			::deductible = 0 + session.var( "deductible" )
			::claims = 0 + session.var( "claims" )
			::LienFree = cbIsSelected( session.var( "LienFree" ) )
			::YearBuilt = 0 + session.var( "YearBuilt" )
			::InPark = cbIsSelected( session.var( "InPark" ) )
			::TtlSpaces = 0 + session.var( "TtlSpaces" )
			::width = 0 + session.var( "width" )
			::length = 0 + session.var( "length" )
			::manufacturer = session.var( "manu" )
			::IsPrimary = cbIsSelected( session.var( "IsPrimary" ) )
			::IsSeasonal = cbIsSelected( session.var( "IsSeasonal" ) )
//			::IsRental = cbIsSelected( session.var( "IsRental" ) )
//			::IsTenant = cbIsSelected( session.var( "IsTenant" ) )
			::IsFlood = cbIsSelected( session.var( "IsFlood" ) )
			::PEGuarantee = cbIsSelected( session.var( "PEGuarantee" ) )

  			::oQuake = cbIsSelected( session.var( "oQuake" ) )
			::oNatural = cbIsSelected( session.var( "oNatural" ) )
			::oSecured = cbIsSelected( session.var( "oSecured" ) )
			::oLiability = cbIsSelected( session.var( "oLiability" ) )
			::oGolfCart = cbIsSelected( session.var( "oGolfCart" ) )
			::oWoodStove = cbIsSelected( session.var( "oWoodStove" ) )
			::oWorkersComp = cbIsSelected( session.var( "oWorkersComp" ) )
			::oLoss = cbIsSelected( session.var( "oLoss" ) )
			::oMedical = cbIsSelected( session.var( "oMedical" ) )
			::oSewer = cbIsSelected( session.var( "oSewer" ) )
			::oFlood = cbIsSelected( session.var( "oFlood" ) )
			::oWind = cbIsSelected( session.var( "oWind" ) )
			::oAnimal = cbIsSelected( session.var( "oAnimal" ) )
			::oLienFree = cbIsSelected( session.var( "oLienFree" ) )

			s = session.var( "ParkName" )
			if ( s != "--- NOT LISTED ---" )
				::ParkName = s
			end

			::mhValue = 0 + session.var( "mhValue" )
			::grc = cbIsSelected( session.var( "grc" ) )
			::aStructValue = 0 + session.var( "aStructValue" )
			::aUnStructValue = 0 + session.var( "aUnStructValue" )

			if ( ::IsRental )
				::tenant = session.var( "tenant" )
			end
			if ( ::IsTenant )
				::aPersonal = 0 + session.var( "aPersonal" )
				::aLiability = 0 + session.var( "aLiability" )
			end
			break
			
		  case 2
			::aAntenna = 0 + session.var( "aAntenna" )
			::aPersonal = 0 + session.var( "aPersonal" )
			::aLiability = 0 + session.var( "aLiability" )

			::sCamera = 0 + session.var( "sCamera" )
			::sArts = 0 + session.var( "sArts" )
			::sArts2 = 0 + session.var( "sArts2" )
			::sGolf = 0 + session.var( "sGolf" )
			::sGuns = 0 + session.var( "sGuns" )
			::sMusic = 0 + session.var( "sMusic" )
			::sPC = 0 + session.var( "sPC" )
			::sSilver = 0 + session.var( "sSilver" )
			::sJewel = 0 + session.var( "sJewel" )
			::sFurs = 0 + session.var( "sFurs" )
			::sStamps = 0 + session.var( "sStamps" )
			::sCoins = 0 + session.var( "sCoins" )
			::sAntiques = 0 + session.var( "sAntiques" )
			::sOther = 0 + session.var( "sOther" )
			
			::p1 = cbIsSelected( session.var( "p1" ) )
			::p2 = cbIsSelected( session.var( "p2" ) )
			::p3 = cbIsSelected( session.var( "p3" ) )
			::p4 = cbIsSelected( session.var( "p4" ) )

			::BrokerFee = 0 + session.var( "BrokerFee" )
		  	break
		  	
		  case 3
		  	::from = session.var( "from" )
		  	::to = session.var( "to" )
			::PriorCarrier = session.var( "PriorCarrier" )

			::address = session.var( "address" )
			::city = session.var( "city" )
			::state = session.var( "state" )
			::phone = session.var( "phone" )
			::dob = session.var( "dob" )

			::sName = session.var( "sName" )
			::sAge = 0 + session.var( "sAge" )
			::sDob = session.var( "sDob" )

			::aName = session.var( "aName" )
			::aAddress = session.var( "aAddress" )
			::aCity = session.var( "aCity" )
			::aState = session.var( "aState" )
			::aZip = session.var( "aZip" )

			::mAddress = session.var( "mAddress" )
			::mCity = session.var( "mCity" )
			::mState = session.var( "mState" )
			::mZip = session.var( "mZip" )
			::mCounty = session.var( "mCounty" )
			::mPhone = session.var( "mPhone" )
		  	
			::a2Name = session.var( "a2Name" )
			::a2Address = session.var( "a2Address" )
			::a2City = session.var( "a2City" )
			::a2State = session.var( "a2State" )
			::a2Zip = session.var( "a2Zip" )
			::a2County = session.var( "a2County" )
			::a2Phone = session.var( "a2Phone" )

			::lName = session.var( "lName" )
			::lAddress = session.var( "lAddress" )
			::lCity = session.var( "lCity" )
			::lState = session.var( "lState" )
			::lZip = session.var( "lZip" )
			::lCounty = session.var( "lCounty" )
			::lPhone = session.var( "lPhone" )
			::lLoan = session.var( "lLoan" )
			break
		
		  case 4
			::r1 = cbIsSelected( session.var( "r1" ) )
			::r2 = cbIsSelected( session.var( "r2" ) )
			::r3 = cbIsSelected( session.var( "r3" ) )
			::r4 = cbIsSelected( session.var( "r4" ) )
			::r5 = cbIsSelected( session.var( "r5" ) )
			::r6 = cbIsSelected( session.var( "r6" ) )
			::r7 = cbIsSelected( session.var( "r7" ) )
			::r8 = cbIsSelected( session.var( "r8" ) )
			::r9 = cbIsSelected( session.var( "r9" ) )
			::r10 = cbIsSelected( session.var( "r10" ) )
			::u1 = cbIsSelected( session.var( "u1" ) )
			::u2 = cbIsSelected( session.var( "u2" ) )
			break

		  case 5
			::LandIsOwned = cbIsSelected( session.var( "LandIsOwned" ) )
			::ParkName = session.var( "ParkName" )
			::space = session.var( "space" )
			::ProtectionClass = 0 + session.var( "ProtectionClass" )
			::FireDept = session.var( "FireDept" )
			::HydrantDistance = session.var( "HydrantDistance" )
			::FireDistance = session.var( "FireDistance" )

			::sn = session.var( "sn" )
			::bracing = cbIsSelected( session.var( "bracing" ) )
			::skirted = cbIsSelected( session.var( "skirted" ) )
			::heat = session.var( "heat" )
			::AuxHeat = session.var( "AuxHeat" )

			::aPorch = cbIsSelected( session.var( "aPorch" ) )
			::aDeck = cbIsSelected( session.var( "aDeck" ) )
			::aOther = cbIsSelected( session.var( "aOther" ) )
			::aDesc = session.var( "aDesc" )
			::aUsage = session.var( "aUsage" )
			::aWidth = 0 + session.var( "aWidth" )
			::aLength = 0 + session.var( "aLength" )
			::aYearBuilt = 0 + session.var( "aYearBuilt" )
			::aBuilt = cbIsSelected( session.var( "aBuilt" ) )
			::aAuxHeat = session.var( "aAuxHeat" )
			
			::oDesc = session.var( "oDesc" )
			::oUsage = session.var( "oUsage" )
			::oWidth = 0 + session.var( "oWidth" )
			::oLength = 0 + session.var( "oLength" )
			::oYearBuilt = 0 + session.var( "oYearBuilt" )
			::oBuilt = cbIsSelected( session.var( "oBuilt" ) )
			::oAuxHeat = session.var( "oAuxHeat" )

			::TtlSpaces = 0 + session.var( "TtlSpaces" )
			::aStructValue = 0 + session.var( "aStructValue" )
			::aUnStructValue = 0 + session.var( "aUnStructValue" )

		  	break
		  	
		end
		
		return( 1 )	
	END


  	METHOD init( )
  		::name = ""
  		::age = 0
  		::county = "Orange"
  		::zip = ""
  		::deductible = 250
  		::claims = 0
  		::LienFree = 0

		::YearBuilt = 1998
		::InPark = 1
		::TtlSpaces = 1
		::width = 24
		::length = 60
		::manufacturer = ""
		::model = ""
		::aStructValue = 0

		::mhValue = 0
		::grc = 1

  		::oQuake = 0
  		::oNatural = 0
  		::oSecured = 0
  		::oLiability = 0
  		::oGolfCart = 0
  		::oWoodStove = 0
  		::oWorkersComp = 0
  		::oLoss = 0
  		::oMedical = 0
  		::oSewer = 0
  		::oFlood = 0
  		::oWind = 0
  		::oAnimal = 0
  		::oLienFree = 0

		::BrokerFee = 0

		::aAntenna = 0
		::aUnStructValue = 0
		::aPersonal = 0
		::aLiability = 0
		::IsPrimary = 1
		::IsSeasonal = 0
		::IsRental = 0
		::IsTenant = 0
		
		::p1 = 0
		::p2 = 0
		::p3 = 0
		::p4 = 0

		::sCamera = 0
		::sArts = 0
		::sArts2 = 0
		::sGolf = 0
		::sGuns = 0
		::sMusic = 0
		::sPC = 0
		::sSilver = 0
		::sJewel = 0
		::sFurs = 0
		::sStamps = 0
		::sCoins = 0
		::sAntiques = 0
		::sOther = 0

		::address = ""
		::city = ""
		::state = "CA"
		::phone = ""
		::dob = ""

		::sName = ""
		::sAge = 0
		::sDOB = ""

		::aName = ""
		::aAddress = ""
		::aCity = ""
		::aState = ""
		::aZip = ""

		::mAddress = ""
		::mCity = ""
		::mState = ""
		::mZip = ""
		::mCounty = ""
		::mPhone = ""

		::a2name = ""
		::a2address = ""
		::a2city = ""
		::a2state = ""
		::a2zip = ""
		::a2county = ""
		::a2phone = ""

		::lname = ""
		::laddress = ""
		::lcity = ""
		::lstate = ""
		::lzip = ""
		::lcounty = ""
		::lphone = ""
		::lloan = ""

		::r1 = 0
		::r2 = 0
		::r3 = 0
		::r4 = 0
		::r5 = 0
		::r6 = 0
		::r7 = 0
		::r8 = 0
		::r9 = 0
		::r10 = 0

		::u1 = 0
		::u2 = 0
		
		::from = date( "MM/DD/YY" )
		::to = dateAddYear( ::from )
		
		::PriorCarrier = ""
		::tenant = ""

		::LandIsOwned = 0
		::ParkName = ""
		::space = ""
		::FireDept = ""
		::HydrantDistance = 0
		::FireDistance = 0

		::sn = ""
		::bracing = 0
		::skirted = 0
		::heat = "Gas"
		::AuxHeat = "None"

		::aPorch = 0
		::aDeck = 0
		::aOther = 0
		::aDesc = ""
		::aUsage = "Residential"
		::aWidth = 0
		::aLength = 0
		::aYearBuilt = 0
		::aBuilt = 1
		::aAuxHeat = "None"
		
		::oDesc = ""
		::oUsage = "Residential"
		::oWidth = 0
		::oLength = 0
		::oYearBuilt = 0
		::oBuilt = 1
		::oAuxHeat = "None"

		::ProtectionClass = 0
		::IsFlood = 0
		::OtherP = 0
		::PEGuarantee = 0

  		return( 1 )
  	END

	
	METHOD ValidateData( )
		local s
		
		s = ""
		
		if ( strempty( ::name ) )
			s += "ERROR - Must specify a NAME!<br>"
		end

		if ( ::Age < 18 )
			s += "ERROR - Specified AGE must be at least 18 years old!<br>"
		end
	
		if ( strempty( ::county ) )
			s += "ERROR - Must specify a COUNTY!<br>"
		end
	
		if ( strempty( ::zip ) )
			s += "ERROR - Must specify a ZIP code!<br>"
		end

		if ( ::YearBuilt < 1920 )
			s += "ERROR - Mobile Home YEAR BUILT too old to rate!<br>"
		end

		if ( ::width < 1 )
			s += "ERROR - Must specify a WIDTH greater than 0!<br>"
		end
		if ( ::length < 1 )
			s += "ERROR - Must specify a LENGTH greater than 0!<br>"
		end

		if ( ::InPark )
			if ( ::ttlSpaces < 1 )
				s += "ERROR - Too few SPACES specified!<br>"
			end
		end

		if ( ! ::grc )
			if ( ! ( ::IsTenant || ::IsRental ) )
				if ( ::mhValue < 1 )
					s += "ERROR - Must specify a COVERAGE amount!<br>"
				end
			end
		end

		::errmsg = s

		return( strempty( s ) ? 1 : 0 )
	END


	METHOD ListManufacturers( vname )
		local s, datafile, akey, i, j, keys, key, mname

		akey = { "Manufacturers", "Manufacturers2", "Manufacturers3" }
		mname = upper( ::manufacturer )
		
		datafile = fileFullPath( ::filename ) + '\data.dat'
		
		s = "<select name=\"" + vname + "\">\r\n"

		for ( i=1; i<=len( akey ); i++ )
			keys = iniGetKeys( datafile, akey[i] )
			j=1
			while ( 1 )
				key = strextract( keys, ";", j++ )
				if ( strempty( key ) )
					break
				end
				if ( upper( key ) == mname )
					s += "<option selected>" + key + "\r\n"
				else
					s += "<option>" + key + "\r\n"
				end
			end
		end
		
		s += "</select>\r\n"
		
		return( s )		
	END


	METHOD ListDeductibles( vname )
		local data, s, i
		
		data = { 100, 250, 500 }

		s = "<select name=\"" + vname + "\">\r\n"
		for ( i=1; i<=len(data); i++ )
			if ( data[i] == ::deductible )
				s += " <option selected>" + data[i] + "\r\n"
			else
				s += " <option>" + data[i] + "\r\n"
			end
		end
		s += "</select>\r\n"
		
		return( s )		
	END


	METHOD ListPrimaryHeatSource( vname )
		local data, s, i
		
		data = { "Gas", "Electric", "Woodburning" }

		s = "<select name=\"" + vname + "\">\r\n"
		for ( i=1; i<=len(data); i++ )
			if ( data[i] == ::heat )
				s += " <option selected>" + data[i] + "\r\n"
			else
				s += " <option>" + data[i] + "\r\n"
			end
		end
		s += "</select>\r\n"
		
		return( s )		
	END


	METHOD ListUsages( vname, curuse )
		local data, s, i
		
		data = { "Residential", "Commercial" }

		s = "<select name=\"" + vname + "\">\r\n"
		for ( i=1; i<=len(data); i++ )
			if ( data[i] == curuse )
				s += " <option selected>" + data[i] + "\r\n"
			else
				s += " <option>" + data[i] + "\r\n"
			end
		end
		s += "</select>\r\n"
		
		return( s )		
	END


	METHOD ListAuxHeatSource( vname, var )
		local data, s, i
		
		data = { "None", "Factory Installed", "Commercially Installed", "Self-Installed" }

		s = "<select name=\"" + vname + "\">\r\n"
		for ( i=1; i<=len(data); i++ )
			if ( data[i] == var )
				s += " <option selected>" + data[i] + "\r\n"
			else
				s += " <option>" + data[i] + "\r\n"
			end
		end
		s += "</select>\r\n"
		
		return( s )		
	END


	METHOD ListCounties( vname, curcounty )
		local data, s, i
		
		data = { "Alameda", "Alpine", "Amador", "Butte", "Calaveras", "Colusa", 
			     "Contra", "Costa", "Del Norte", "El Dorado", "Fresno", "Glenn", 
			     "Humboldt", "Imperial", "Inyo", "Kern", "Kings", "Lake", "Lassen", 
			     "Los Angeles", "Madera", "Marin", "Mariposa", "Mendocino", "Merced", 
			     "Modoc", "Mono", "Monterey", "Napa", "Nevada", "Orange", "Placer", 
			     "Plumas", "Riverside", "Sacramento", "San Benito", "San Bernardino", 
			     "San Diego", "San Francisco", "San Joaquin", "San Luis Obispo", 
			     "San Mateo", "Santa Barbara", "Santa Clara", "Santa Cruz", "Shasta", 
			     "Sierra", "Siskiyou", "Solano", "Sonoma", "Stanislaus", "Sutter", 
			     "Tehama", "Trinity", "Tulare", "Tuolumne", "Ventura", "Yolo", 
				 "Yuba" 
			 	}
				 
		s = "<select name=\"" + vname + "\">\r\n"
		for ( i=1; i<=len(data); i++ )
			if ( data[i] == curcounty )
				s += " <option selected>" + data[i] + "\r\n"
			else
				s += " <option>" + data[i] + "\r\n"
			end
		end
		s += "</select>\r\n"
		
		return( s )		
	END


	METHOD ListYearBuilt( vname, yr )
		local data, s, i
		
		data = { 1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001 }

		s = "<select name=\"" + vname + "\">\r\n"
		for ( i=1; i<=len(data); i++ )
			if ( data[i] == yr )
				s += " <option selected>" + data[i] + "\r\n"
			else
				s += " <option>" + data[i] + "\r\n"
			end
		end
		s += "</select>\r\n"
		
		return( s )		
	END

END