logo_image
logo_image
logo_image
MLS# A11940540 - 3681 SW 21st St Miami, FL 33145
Charming move-in ready home located on a cul-de-sac in the quiet, centrally located and highly desirable Coral Gate neighborhood. Bright & renovated home features high-impact windows and doors, a 14-year-old roof, PVC plumbing, blackout curtains, ring cameras, HVAC anti bacterial blue light, high quality insulation and an EV Tesla charger. Enjoy a spacious terrace with ample green space, perfect for outdoor living, entertaining, or adding a pool. The backyard also includes a storage shed for added convenience. Situated on a low-traffic street with paved sidewalks and within walking distance to Miracle Mile shops and restaurants in Coral Gables. As per recent survey, the property offers 1,353 square feet of living area. Come see it!!

One Sotheby's International Realty is the brokerage office representing the owner for this listing.
© Copyright 2026 Miami Multiple Listing Service All Rights Reserved. The data relating to real estate for sale on this website comes in part from the participating Associations of the Miami Multiple Listing Service. The data relating to real estate for sale on this site comes in part from the broker reciprocity program of the Multiple Listing Service, Inc. real estate listings held by brokerage firms other than are marked with the Broker Reciprocity logo or the Broker reciprocity house icon and detailed information about them includes the names(s) of the listing brokers.
The MLS data provided for the property above is provided courtesy of AfterNorth and Miami Association of REALTORS® The information being provided is for consumers' personal, non-commercial use and may not be used for any purpose other than to identify prospective properties consumers may be interested in purchasing. Information is deemed reliable but not guaranteed. This website is a service of ALM Realty & Services, Inc., a broker participant of the Miami Association of REALTORS®. ALM Realty & Services, Inc. is not a Multiple Listing Service (MLS), nor does it offer MLS access. MiamiRE data last updated at 1/11/2026 8:50:00 AM.

Charming move-in ready home located on a cul-de-sac in the quiet, centrally located and highly desirable Coral Gate neighborhood. Bright & renovated home features high-impact windows and doors, a 14-year-old roof, PVC plumbing, blackout curtains, ring cameras, HVAC anti bacterial blue light, high quality insulation and an EV Tesla charger. Enjoy a spacious terrace with ample green space, perfect for outdoor living, entertaining, or adding a pool. The backyard also includes a storage shed for added convenience. Situated on a low-traffic street with paved sidewalks and within walking distance to Miracle Mile shops and restaurants in Coral Gables. As per recent survey, the property offers 1,353 square feet of living area. Come see it!!

One Sotheby's International Realty is the brokerage office representing the owner for this listing.
© Copyright 2026 Miami Multiple Listing Service All Rights Reserved. The data relating to real estate for sale on this website comes in part from the participating Associations of the Miami Multiple Listing Service. The data relating to real estate for sale on this site comes in part from the broker reciprocity program of the Multiple Listing Service, Inc. real estate listings held by brokerage firms other than are marked with the Broker Reciprocity logo or the Broker reciprocity house icon and detailed information about them includes the names(s) of the listing brokers.
The MLS data provided for the property above is provided courtesy of AfterNorth and Miami Association of REALTORS® The information being provided is for consumers' personal, non-commercial use and may not be used for any purpose other than to identify prospective properties consumers may be interested in purchasing. Information is deemed reliable but not guaranteed. This website is a service of ALM Realty & Services, Inc., a broker participant of the Miami Association of REALTORS®. ALM Realty & Services, Inc. is not a Multiple Listing Service (MLS), nor does it offer MLS access. MiamiRE data last updated at 1/11/2026 8:50:00 AM.

","HASOPENHOUSE":false,"PHOTOTIMESTAMP":"2026-01-08T18:33:00.52","PHOTOREMARKS":"[{\"Order\":3,\"Remarks\":\"Front Entry\"},{\"Order\":18,\"Remarks\":\"Virtually Staged\"},{\"Order\":23,\"Remarks\":\"Virtually Staged\"},{\"Order\":29,\"Remarks\":\"Virtually Staged\"}]","PHOTOORDER":"1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49","SOURCE":"MIAMIRE"}; var mls_full = {"StreetDirPrefix":"SW","PublicSurveyRange":"41","MIAMIRE_YearInstalled":"","LeaseAssignableYN":"","MIAMIRE_SubBoardID":"","LivingAreaUnits":"Square Feet","SeatingCapacity":"","MIAMIRE_AmtFinanced":"","MIAMIRE_ExpInclPropertyTaxYN":"","TaxLegalDescription":"CORAL GATE SEC D PB 50-34 LOT 417 BLK 18 73R 264054 LOT SIZE 61.050 X 102","YearEstablished":"","MIAMIRE_SeparateMeterYN":"","MIAMIRE_UnfurnSeasonalRent":"","ContingentDate":"","LaundryFeatures":"Utility Room/Laundry","Flooring":"Other","PhotosCount":"49","MIAMIRE_SubdivisionNumber":"12","AdditionalParcelsYN":"","WaterfrontFeatures":"","CoBuyerAgentDirectPhone":"","RoomBedroomFeatures":"Other","ViewYN":"False","SeniorCommunityYN":"","Cooling":"Central Air","ExteriorFeatures":"Lighting","CountryRegion":"","MIAMIRE_ImprovementHeightBUS":"","StatusChangeTimestamp":"2026-01-08T17:36:05.49Z","SecurityFeatures":"","BuyerAgentFullName":"","MIAMIRE_EnvironmentalAudit":"","DocumentsCount":"","MIAMIRE_NumMeters":"","MIAMIRE_InternationalArea":"","CancelationDate":"","MIAMIRE_NARRulesYN":"True","MIAMIRE_VacancyRate":"","MIAMIRE_TypeofAssociation":"None","TaxExemptions":"Tax Reflects Homestead Exemption","MIAMIRE_ParkingSpaceNumber":"","BuildingName":"CORAL GATE SEC D","AssociationFeeFrequency":"","MIAMIRE_ExcludeFromInventoryStats":"False","MIAMIRE_ExpInclLawnMaintenanceYN":"","MIAMIRE_AuctionType":"","MIAMIRE_CostofSales":"","HeatingYN":"True","CoBuyerAgentStateLicense":"","MIAMIRE_EaveHeight":"","MIAMIRE_ApproxSqftTotalArea":"","ManagerExpense":"","MIAMIRE_RentStatusOctober":"","MIAMIRE_ShowingSuiteEmailInfoYN":"","MIAMIRE_SupplementCount":"","MIAMIRE_AgentAlternatePhone":"786-326-5297","RoomDiningRoomFeatures":"","MajorChangeType":"New","ListingKeyNumeric":"425022180","MIAMIRE_ExpInclManagementYN":"","MIAMIRE_InventoryValue":"","Appliances":"Dishwasher,Dryer,Microwave,Electric Range,Refrigerator,Washer","MIAMIRE_RailDescription":"","MIAMIRE_GeographicArea":"","MLSAreaMajor":"Coral Gate Sec D","TaxAnnualAmount":"13843","MIAMIRE_BuyerCountryofResidence":"","MIAMIRE_MaintFeePaidPer":"","MIAMIRE_RATIO_CurrentPrice_By_SQFT":"856.7","LandLeaseAmount":"","MIAMIRE_USRegions":"","CurrentUse":"","OriginatingSystemKey":"miamire","CountyOrParish":"Miami-Dade County","PropertyType":"Residential","BathroomsTotalDecimal":"2","OriginatingSystemName":"Miami Association of REALTORS®","MIAMIRE_MultipleOffersAcceptedYN":"","AssociationYN":"False","MlsStatus":"Active","StreetNumber":"3681","GrossScheduledIncome":"","MIAMIRE_DenDimensions":"","LeaseTerm":"","ListingKey":"1fe8ad1cf21f6a1ad9a3127d8fe02c44","MIAMIRE_BalconyPorchandorPatioYN":"","MIAMIRE_RentStatusMay":"","MIAMIRE_SellerContributionsAmt":"","MIAMIRE_CountryCity":"","MIAMIRE_SprinklerDescription":"","CommonWalls":"","MIAMIRE_REOYN":"False","MIAMIRE_DockNumber":"","MIAMIRE_NumToilets":"","MIAMIRE_ExpInclGasOilYN":"","MIAMIRE_BonusAmount":"","MIAMIRE_ConvertibleBedroomYN":"","MIAMIRE_PoolYN":"False","ShowingContactType":"Agent","Vegetation":"","MIAMIRE_MainLivingArea":"","ElementarySchool":"Sunset","StreetDirSuffix":"","MIAMIRE_RentStatusDecember":"","MIAMIRE_GrossSales":"","CoBuyerOfficePhone":"","Directions":"","MIAMIRE_AddressInternetDisplay":"3681 SW 21st St","AttachedGarageYN":"","StandardStatus":"Active","MIAMIRE_AnnualBaseRate":"","Roof":"Barrel Roof","MIAMIRE_FurnAnnualRent":"","ParkingTotal":"","MIAMIRE_RoadTypeDescription":"","ListAgentOfficePhone":"305-666-0562","MIAMIRE_TermsAvailable":"","PoolPrivateYN":"False","ListingTerms":"All Cash,Conventional","MIAMIRE_DiningRoomDimensions":"","BuyerAgentStateLicense":"","MIAMIRE_LeaseTermRemaining":"","MIAMIRE_OccupancyPercentage":"","PropertySubType":"Single Family Residence","BuyerAgentDirectPhone":"","OtherExpense":"0","Possession":"Funding","MIAMIRE_Neighborhoods":"","CoListAgentOfficePhone":"","MIAMIRE_GlobalRegionalYN":"","WaterfrontYN":"False","BathroomsFull":"2","LotSizeAcres":"","SpecialLicenses":"","SubdivisionName":"CORAL GATE SEC D","MIAMIRE_ActiveOpenHouseCount":"1","MIAMIRE_MLSOnlyYN":"","Fencing":"","InternetAddressDisplayYN":"True","MIAMIRE_ConcessionInPriceType":"","WithdrawnDate":"","MIAMIRE_GuestHouseDescription":"","MIAMIRE_FolioNum2ndParcel":"","Contingency":"","MIAMIRE_ExpInclElectricYN":"","ListingService":"","Elevation":"","WaterSource":"Municipal Water","DoorFeatures":"High Impact Doors","MIAMIRE_FractionalShare":"","MIAMIRE_ApplicationFee":"","StoriesTotal":"","YearBuilt":"1950","ElectricOnPropertyYN":"","MIAMIRE_ExpInclExterminationYN":"","MIAMIRE_LeaseTerm":"","MIAMIRE_NumTimesLeasedYear":"","LandLeaseYN":"","PreviousListPrice":"","MIAMIRE_Restrictions":"Ok To Lease","MIAMIRE_AmtSellToBuyIncnt":"","PetsAllowed":"","DaysOnMarket":"0","MIAMIRE_HardshipPackage":"","MIAMIRE_VarDualRateCompYN":"","MIAMIRE_MaintenanceIncludes":"","MIAMIRE_LastUse":"","NetOperatingIncome":"","MIAMIRE_BrandName":"","MIAMIRE_BuildingAreaAlternative":"","MIAMIRE_PoolDimensions":"","OtherStructures":"Shed(s)","AssociationAmenities":"","MIAMIRE_NumFloors":"","ClosePrice":"","VirtualTourURLZillow":"","MIAMIRE_EfficiencyYN":"","PendingTimestamp":"","StreetNumberNumeric":"3681","MIAMIRE_MinSFLivingAreaReqmt":"","MIAMIRE_CommonAreaMaintAmount":"","MIAMIRE_ForSaleMLSNumber":"","MIAMIRE_NumOffices":"","MIAMIRE_MunicipalCode":"1","LivingArea":"1284","MIAMIRE_UnfurnAnnualRent":"","MIAMIRE_RBApplyNowYN":"","CoListAgentStateLicense":"","ParkingFeatures":"Driveway","PostalCodePlus4":"1703","MIAMIRE_PriceAcre":"","MIAMIRE_CurrentPrice":"1100000","MIAMIRE_FurnSeasonalRent":"","MIAMIRE_CountryRegion":"","Supplements":"","PoolFeatures":"","NumberOfUnitsInCommunity":"","Heating":"Central","MIAMIRE_Area":"41","MIAMIRE_RentStatusAugust":"","StructureType":"R30-No Pool/No Water,House","BuildingAreaSource":"","BuilderModel":"","TrashExpense":"","TotalActualRent":"","CoListAgentMlsId":"","PublicSurveyTownship":"41","MIAMIRE_ExpInclAcctgLegalYN":"","MIAMIRE_YearofAddition":"","MIAMIRE_DaysOpen":"","BuyerOfficePhone":"","ListingAgreement":"Exclusive Right To Sell","RoadResponsibility":"","PublicSurveySection":"9","MIAMIRE_ClosedSellToBuyIncntYN":"","ListingId":"A11940540","MIAMIRE_TotalAssumableLoans":"","CommunityFeatures":"Paved Road","BathroomsTotalInteger":"2","RoomsTotal":"0","MIAMIRE_SqFtLAofGuestHouse":"","BuildingAreaUnits":"Square Feet","City":"Miami","MIAMIRE_PetFeeDesc":"","InternetEntireListingDisplayYN":"True","BuyerAgentOfficePhone":"","MIAMIRE_MinimumNumofDaysforLease":"","MIAMIRE_DeedRestrictions":"","InternetAutomatedValuationDisplayYN":"True","MIAMIRE_ExpInclTrashYN":"","MIAMIRE_TotalMortgage":"712000","TaxYear":"2025","MIAMIRE_ExpInclJanitorYN":"","MIAMIRE_ExpInclReplaceReserveYN":"","MIAMIRE_AdditionalFurnishedInfo":"","DirectionFaces":"South","MIAMIRE_ACPercentage":"","MIAMIRE_AssumableChattelBalance":"","MIAMIRE_NumBays":"","PossibleUse":"","Furnished":"","MIAMIRE_ShowingSuiteSettingYN":"","MIAMIRE_ParcelNumberMLX":"0360","ConstructionMaterials":"CBS Construction","MIAMIRE_RecLeaseMoFeePaidPer":"","MIAMIRE_SubdivisionInformation":"Paved Road","SuppliesExpense":"","ListOfficeURL":"
","Gas":"","CoListAgentEmail":"","MIAMIRE_TIConcessions":"","FrontageLength":"","MIAMIRE_TypeofGoverningBodies":"","MIAMIRE_PACEYN":"False","Disclosures":"","ListOfficeKey":"b66e8644e64b048d4c90cd786bde65d8","FireplaceYN":"","BridgeModificationTimestamp":"2026-01-08T18:33:00.565Z","EntryLevel":"","ListAgentFullName":"Cheila Gonzalez","MIAMIRE_StateUS":"","MIAMIRE_DadeMarketAmtAssessedAmt":"","PropertyCondition":"","FrontageType":"","MIAMIRE_NumCeilingFans":"","Stories":"","DevelopmentStatus":"","GrossIncome":"","ParcelNumber":"01-41-09-012-0360","MIAMIRE_USCity":"","MIAMIRE_ManagementCompanyPhone":"","MIAMIRE_DadeAssessedAmtSOHValue":"","View":"None","MIAMIRE_CommonAreaMaintIncludes":"","OperatingExpense":"","SignOnPropertyYN":"False","LeaseRenewalOptionYN":"","YearBuiltDetails":"Resale","MIAMIRE_RentStatusFebruary":"","HighSchool":"Coral Gables","MIAMIRE_RecLeaseMonth":"","LeaseConsideredYN":"","Levels":"","HomeWarrantyYN":"","MIAMIRE_BuyState":"","IDXParticipationYN":"True","OperatingExpenseIncludes":"","DistanceToFreewayNumeric":"","AttributionContact":"","InteriorFeatures":"First Floor Entry,Storage,Utility Room/Laundry","OffMarketDate":"","CoBuyerAgentMlsId":"","MIAMIRE_CableAvailableYN":"","MIAMIRE_StreetViewParam":"1$25.751914$-80.253852$148.27$13.33$1.00$pVjfvTTKoYqLxGOXv91t4Q","MIAMIRE_PetsAllowedYN":"","MIAMIRE_CAMFees":"","CloseDate":"","StreetSuffix":"","ApprovalStatus":"","HorseAmenities":"","ListAgentMlsId":"3303612","MIAMIRE_AssumableYN":"","MIAMIRE_FillDescription":"","MIAMIRE_ApprovalInformation":"","MIAMIRE_FeeDescription":"","LotSizeDimensions":"","MIAMIRE_TrainingAvailableYN":"","ModificationTimestamp":"2026-01-08T18:27:12.2Z","PropertyAttachedYN":"","MIAMIRE_MaximumCeilingHeight":"","BuyerAgentKey":"","TaxLot":"","MIAMIRE_PatioBalconyDimensions":"","MIAMIRE_SellConSellToBuyIncntYN":"","BusinessName":"","BuyerAgentEmail":"","MIAMIRE_NumLoadingDoors":"","MIAMIRE_ForLeaseYN":"False","MIAMIRE_ExpInclSuppliesYN":"","Coordinates":"-80.253905,25.7519074","MIAMIRE_RentStatusMarch":"","MIAMIRE_ShortSaleAddendumYN":"","MIAMIRE_ImprovementHeightCOM":"","CoBuyerOfficeMlsId":"","MIAMIRE_PropertyDescription":"","OriginatingSystemID":"miamire","MIAMIRE_BonusYN":"","HorseYN":"False","MIAMIRE_ColumnDescription":"","MIAMIRE_MinimumLeasePeriod":"","Country":"","MIAMIRE_FurnOffSeasonRent":"","UnitNumber":"","OpenParkingYN":"True","MIAMIRE_UtilityRoomDimension":"","MIAMIRE_ExpInclMiscellaneousYN":"","LeasableAreaUnits":"Square Feet","ListOfficeMlsId":"OSIR27","MIAMIRE_LastStatus":"","Inclusions":"","ListAgentDirectPhone":"786-326-5297","CoBuyerAgentOfficePhone":"","MIAMIRE_SupplementalRemarks":"","CoListAgentFullName":"","CoListAgentKey":"","MIAMIRE_AgeOfRoof":"","EntryLocation":"","MIAMIRE_MaintenanceFeeIncludes":"","SpaYN":"","SpaFeatures":"","MIAMIRE_ClosedSellToBuyIncntAmt":"","MIAMIRE_UnfurnOffSeasonRent":"","ExistingLeaseType":"","MIAMIRE_CountyLandCode":"","BathroomsHalf":"0","MIAMIRE_MilestoBeach":"","MIAMIRE_DockHeight":"","RoomLivingRoomFeatures":"Storage Room,Utility Room/Laundry","Sewer":"Public Sewer","ExpirationDate":"2026-07-04T05:00:00Z","SyndicationRemarks":"Charming move-in ready home located on a cul-de-sac in the quiet, centrally located and highly desirable Coral Gate neighborhood. Bright & renovated home features high-impact windows and doors, a 14-year-old roof, PVC plumbing, blackout curtains, ring cameras, HVAC anti bacterial blue light, high quality insulation and an EV Tesla charger. Enjoy a spacious terrace with ample green space, perfect for outdoor living, entertaining, or adding a pool. The backyard also includes a storage shed for added convenience. Situated on a low-traffic street with paved sidewalks and within walking distance to Miracle Mile shops and restaurants in Coral Gables. As per recent survey, the property offers 1,353 square feet of living area. Come see it!!","MIAMIRE_ExpInclAdvLicPermitYN":"","MIAMIRE_LPAmtSqFt":"856.6978","Model":"","MIAMIRE_FloodZone":"X","ListAgentStateLicense":"3303612","MIAMIRE_PreviousStatus":"","StreetName":"21st St","ListOfficeFax":"305-666-4187","PatioAndPorchFeatures":"Patio,Screened Porch","MIAMIRE_RentStatusJune":"","MIAMIRE_FillFromRecord_TableID":"","Utilities":"","MIAMIRE_FurnishedInfoList":"","FireplaceFeatures":"","MIAMIRE_AmtFinancedPct":"","WindowFeatures":"Blinds","SpecialListingConditions":"","NewConstructionYN":"False","MIAMIRE_ReimbursableSqFt":"","NumberOfBuildings":"","MIAMIRE_AddlMoveInCostYN":"","GarageSpaces":"0","OriginalListPrice":"1100000","MIAMIRE_ExpInclWaterSewerYN":"","GreenEnergyEfficient":"","Media":"[{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m1\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/83dcefb7.jpeg\",\"MediaObjectID\":\"425022180_1\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":1},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m2\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/1ad5be0d.jpeg\",\"MediaObjectID\":\"425022180_2\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":2},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m3\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/6dd28e9b.jpeg\",\"MediaObjectID\":\"425022180_3\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":\"Front Entry\",\"MimeType\":\"image/jpeg\",\"Order\":3},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m4\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/f3b61b38.jpeg\",\"MediaObjectID\":\"425022180_4\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":4},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m5\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/84b12bae.jpeg\",\"MediaObjectID\":\"425022180_5\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":5},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m6\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/1db87a14.jpeg\",\"MediaObjectID\":\"425022180_6\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":6},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m7\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/6abf4a82.jpeg\",\"MediaObjectID\":\"425022180_7\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":7},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m8\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/fa005713.jpeg\",\"MediaObjectID\":\"425022180_8\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":8},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m9\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/8d076785.jpeg\",\"MediaObjectID\":\"425022180_9\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":9},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m10\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/a15d25e1.jpeg\",\"MediaObjectID\":\"425022180_10\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":10},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m11\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/d65a1577.jpeg\",\"MediaObjectID\":\"425022180_11\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":11},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m12\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/4f5344cd.jpeg\",\"MediaObjectID\":\"425022180_12\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":12},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m13\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/3854745b.jpeg\",\"MediaObjectID\":\"425022180_13\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":13},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m14\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/a630e1f8.jpeg\",\"MediaObjectID\":\"425022180_14\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":14},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m15\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/d137d16e.jpeg\",\"MediaObjectID\":\"425022180_15\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":15},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m16\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/483e80d4.jpeg\",\"MediaObjectID\":\"425022180_16\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":16},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m17\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/3f39b042.jpeg\",\"MediaObjectID\":\"425022180_17\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":17},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m18\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/af86add3.jpeg\",\"MediaObjectID\":\"425022180_18\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":\"Virtually Staged\",\"MimeType\":\"image/jpeg\",\"Order\":18},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m19\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/d8819d45.jpeg\",\"MediaObjectID\":\"425022180_19\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":19},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m20\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/8a707622.jpeg\",\"MediaObjectID\":\"425022180_20\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":20},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m21\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/fd7746b4.jpeg\",\"MediaObjectID\":\"425022180_21\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":21},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m22\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/647e170e.jpeg\",\"MediaObjectID\":\"425022180_22\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":22},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m23\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/13792798.jpeg\",\"MediaObjectID\":\"425022180_23\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":\"Virtually Staged\",\"MimeType\":\"image/jpeg\",\"Order\":23},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m24\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/8d1db23b.jpeg\",\"MediaObjectID\":\"425022180_24\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":24},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m25\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/fa1a82ad.jpeg\",\"MediaObjectID\":\"425022180_25\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":25},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m26\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/6313d317.jpeg\",\"MediaObjectID\":\"425022180_26\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":26},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m27\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/1414e381.jpeg\",\"MediaObjectID\":\"425022180_27\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":27},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m28\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/84abfe10.jpeg\",\"MediaObjectID\":\"425022180_28\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":28},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m29\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/f3acce86.jpeg\",\"MediaObjectID\":\"425022180_29\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":\"Virtually Staged\",\"MimeType\":\"image/jpeg\",\"Order\":29},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m30\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/936b4763.jpeg\",\"MediaObjectID\":\"425022180_30\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":30},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m31\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/e46c77f5.jpeg\",\"MediaObjectID\":\"425022180_31\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":31},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m32\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/7d65264f.jpeg\",\"MediaObjectID\":\"425022180_32\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":32},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m33\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/a6216d9.jpeg\",\"MediaObjectID\":\"425022180_33\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":33},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m34\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/9406837a.jpeg\",\"MediaObjectID\":\"425022180_34\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":34},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m35\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/e301b3ec.jpeg\",\"MediaObjectID\":\"425022180_35\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":35},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m36\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/7a08e256.jpeg\",\"MediaObjectID\":\"425022180_36\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":36},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m37\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/d0fd2c0.jpeg\",\"MediaObjectID\":\"425022180_37\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":37},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m38\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/9db0cf51.jpeg\",\"MediaObjectID\":\"425022180_38\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":38},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m39\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/eab7ffc7.jpeg\",\"MediaObjectID\":\"425022180_39\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":39},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m40\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/dc2ad1a4.jpeg\",\"MediaObjectID\":\"425022180_40\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":40},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m41\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/ab2de132.jpeg\",\"MediaObjectID\":\"425022180_41\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":41},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m42\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/3224b088.jpeg\",\"MediaObjectID\":\"425022180_42\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":42},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m43\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/4523801e.jpeg\",\"MediaObjectID\":\"425022180_43\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":43},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m44\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/db4715bd.jpeg\",\"MediaObjectID\":\"425022180_44\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":44},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m45\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/ac40252b.jpeg\",\"MediaObjectID\":\"425022180_45\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":45},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m46\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/35497491.jpeg\",\"MediaObjectID\":\"425022180_46\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":46},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m47\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/424e4407.jpeg\",\"MediaObjectID\":\"425022180_47\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":47},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m48\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/d2f15996.jpeg\",\"MediaObjectID\":\"425022180_48\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":48},{\"MediaKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44-m49\",\"MediaCategory\":\"Photo\",\"MediaURL\":\"https://dvvjkgh94f2v6.cloudfront.net/523fa3e6/425022180/a5f66900.jpeg\",\"MediaObjectID\":\"425022180_49\",\"ResourceRecordKey\":\"1fe8ad1cf21f6a1ad9a3127d8fe02c44\",\"ResourceName\":\"Property\",\"ClassName\":\"Residential\",\"ShortDescription\":null,\"MimeType\":\"image/jpeg\",\"Order\":49}]","MIAMIRE_InteriorCeilingHeight":"","RentIncludes":"","MIAMIRE_DiningAreaDimensions":"","AccessibilityFeatures":"","MIAMIRE_CeilingHeight":"","MIAMIRE_RentStatusJuly":"","MIAMIRE_DepositInformation":"","OwnershipType":"","SourceSystemKey":"425022180","BuildingFeatures":"","OriginalEntryTimestamp":"2026-01-08T17:36:05.49Z","MIAMIRE_AttributionContact":"","Ownership":"","BuyerAgentMlsId":"","MIAMIRE_FurnishedInfoSold":"","LotFeatures":"Less Than 1/4 Acre Lot","PostalCode":"33145","MIAMIRE_OkToAdvertiseList":"No","BuyerOfficeMlsId":"","DocumentsAvailable":"","MIAMIRE_ExpInclRetaxYN":"","MIAMIRE_RentStatusApril":"","MIAMIRE_Style":"R30-No Pool/No Water","NumberOfUnitsTotal":"","BuyerOfficeName":"","AssociationFee":"","LeaseAmount":"","MIAMIRE_BoatDockAccommodates":"","LotSizeSquareFeet":"6227","MIAMIRE_BuildingNameNumber":"","CoBuyerAgentFullName":"","TenantPays":"","MIAMIRE_DockInformation":"","MIAMIRE_TotalMoveInDollars":"","Electric":"","NewTaxesExpense":"","ArchitecturalStyle":"Detached,One Story","RoomMasterBathroomFeatures":"","MIAMIRE_MembershipPurchRqdYN":"False","UnparsedAddress":"3681 SW 21st St, Miami FL 33145","MIAMIRE_Blogging":"False","CoListOfficePhone":"","MIAMIRE_RentStatusNovember":"","MIAMIRE_IsDeleted":"False","MIAMIRE_SpaFeatures":"","MIAMIRE_PropertySubType":"","MIAMIRE_ManagementCompany":"","MIAMIRE_AgentsOfficeExtension":"","MIAMIRE_LengthofRental":"","FeedTypes":"IDX","PhotoRemarks":"[{\"Order\":3,\"Remarks\":\"Front Entry\"},{\"Order\":18,\"Remarks\":\"Virtually Staged\"},{\"Order\":23,\"Remarks\":\"Virtually Staged\"},{\"Order\":29,\"Remarks\":\"Virtually Staged\"}]","PhotoOrder":"1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49","CustomVTourURL":""}; var mls_open_house = null; var mls_price_history = [{"PRICE":1100000.00,"TIMESTAMP":"2026-01-08T17:36:05.49"}]; var mls_status_history = [{"STATUS":"Active","TIMESTAMP":"2026-01-08T17:36:05.49"}]; var agency_offices = ("MFR279591115,ALMR01").split(","); var agency_logo_path = "/upload/7/agency_logos/1ffb6b9fadac8823c0bf5162a0f72354_almres.jpg"; var photo_interval_counter = 0; var sold_limited = false; var detail_template = ""; on_load(function() { parse_detail_data() && mls_property_detail(); if(getQueryString("print") == "yes") setTimeout(print_property, 5000); }); function mls_property_detail(type) { let content = document.getElementById("detail_content"); if(!content) return; type = type || get_global_config("mls_property_detail_type"); let func_name = "mls_property_detail_" + type; let template = document.getElementById(func_name); if(!template) return; content.appendChild(template); for(let i=0; i 1) mls_data.PHOTOCOUNT = 1; if(mls_data.PHOTOREMARKS) { if(mls_data.PHOTOREMARKS[0] == "'") mls_data.PHOTOREMARKS2 = mls_data.PHOTOREMARKS.substring(1, mls_data.PHOTOREMARKS.length-1); mls_data.PHOTOREMARKS2 = JSON.parse(mls_data.PHOTOREMARKS); } else mls_data.PHOTOREMARKS2 = []; if(mls_data.PHOTOORDER) { mls_data.PHOTOORDER2 = mls_data.PHOTOORDER.split(","); } else { mls_data.PHOTOORDER2 = []; for(let i=0; i= 2) show_dialog("", result[1], ["OK"]); else show_dialog("", result[0], ["OK"]); }, function (data) { if (on_error != undefined) on_error("Error in POST."); }, show_message("Sending...", -1)); //, ; } function get_detail_information() { let str = ""; if(sold_limited) { str += get_sold_summary_html(); } else { str += get_contact_form_html(); str += get_open_houses_html(); str += get_vtour_html(); str += get_summary_html(); str += get_room_data_html(); str += get_more_details_html(); str += get_property_waterfront_details_html(); str += get_others_html(); if(mls_data.MLSCLASS == "COM" || mls_data.MLSCLASS == "RNT") { str += get_unit_info_html(); if(get_str(mls_full.PropertyUnitTypes).startsWith("[{")) { mls_full.PropertyUnits = JSON.parse(mls_full.PropertyUnitTypes); for(let i=mls_full.PropertyUnits.length; i<4; i++) mls_full.PropertyUnits.push({}); } else if(get_str(mls_full.UnitTypes).startsWith("[{")) { mls_full.PropertyUnits = JSON.parse(mls_full.UnitTypes); for(let i=mls_full.PropertyUnits.length; i<4; i++) mls_full.PropertyUnits.push({}); } else mls_full.PropertyUnits = [{}, {}, {}, {}]; str += get_unit_html(1); str += get_unit_html(2); str += get_unit_html(3); str += get_unit_html(4); str += get_bmj_unit_html("Unit 1", mls_full.FEAT20110114205341292541000000, mls_full.FEAT20110114205341648345000000, mls_full.FEAT20110114205341031884000000, mls_full.FEAT20110114205341342554000000, mls_full.FEAT2011011420533980143800000, mls_full.FEAT20110114205341527656000000, mls_full.FEAT20110114205340480615000000, mls_full.GF20110114205248798385000000, mls_full.GF20110114205248901224000000, mls_full.GF20110114205248852390000000); str += get_bmj_unit_html("Unit 2", mls_full.FEAT20110114205343671412000000, mls_full.FEAT20110114205344095957000000, mls_full.FEAT20110114205343414619000000, mls_full.FEAT20110114205343723926000000, mls_full.FEAT20110114205342315282000000, mls_full.FEAT20110114205343937502000000, mls_full.FEAT20110114205342843861000000, mls_full.GF20110114205248952471000000, mls_full.GF20110114205249057201000000, mls_full.GF20110114205249005758000000); str += get_bmj_unit_html("Unit 3", mls_full.FEAT20110114205346564000000000, mls_full.FEAT20110114205347124248000000, mls_full.FEAT20110114205346255896000000, mls_full.FEAT20110114205346765720000000, mls_full.FEAT20110114205344908967000000, mls_full.FEAT20110114205346989087000000, mls_full.FEAT20110114205345540378000000, mls_full.GF20110114205249113238000000, mls_full.GF20110114205249209838000000, mls_full.GF20110114205249159858000000); str += get_bmj_unit_html("Unit 4", mls_full.FEAT20110114205349395052000000, mls_full.FEAT20110114205349803075000000, mls_full.FEAT20110114205349190784000000, mls_full.FEAT20110114205349469449000000, mls_full.FEAT20110114205347847597000000, mls_full.FEAT20110114205349652210000000, mls_full.FEAT20110114205348518369000000, mls_full.GF20110114205249251824000000, mls_full.GF20110114205249351978000000, mls_full.GF20110114205249301547000000); str += get_raor_unit_html("Unit 1", mls_full.LM_char5_12, mls_full.LM_char5_13, mls_full.LM_Int1_2, mls_full.LM_char10_42, mls_full.LM_char5_14, mls_full.LM_char5_15); str += get_raor_unit_html("Unit 2", mls_full.LM_char5_16, mls_full.LM_char5_17, mls_full.LM_Int1_3, mls_full.LM_char10_43, mls_full.LM_char5_18, mls_full.LM_char5_19); str += get_raor_unit_html("Unit 3", mls_full.LM_char5_20, mls_full.LM_char5_21, mls_full.LM_Int1_4, mls_full.LM_char10_44, mls_full.LM_char5_22, mls_full.LM_char5_23); str += get_raor_unit_html("Unit 4", mls_full.LM_char5_24, mls_full.LM_char5_25, mls_full.LM_Int1_5, mls_full.LM_char10_45, mls_full.LM_char5_26, mls_full.LM_char5_27); str += get_raor_unit_html("Unit 5", mls_full.LM_char5_28, mls_full.LM_char5_29, mls_full.LM_Int1_6, mls_full.LM_char10_46, mls_full.LM_char5_30, mls_full.LM_char5_31); } } return str; } function get_raor_unit_html(label, rooms, beds, baths, utils, appls, rent) { let t = get_element_html(detail_template + "_section"); let str = ""; if(rooms == 0) return ""; str += get_sub_section_html("Monthly Rent:", price_str(rent)).replaceAll(", ", ","); str += get_sub_section_html("Rooms:", rooms); str += get_sub_section_html("Bedrooms:", beds); str += get_sub_section_html("Bathrooms:", baths); str += get_sub_section_html("Appliances:", appls); str += get_sub_section_html("Utilities:", utils); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", label) .replaceAll("$CONTENT$", str); } function get_bmj_unit_html(label, rent, rooms, roomdesc, size, beds, baths, fires, airs, amms, apps) { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Monthly Rent:", price_str(rent)).replaceAll(", ", ","); str += get_sub_section_html("Rooms:", get_array_joined([rooms, roomdesc], ", ")); str += get_sub_section_html("Size:", get_num1(size), " sq ft"); str += get_sub_section_html("Bedrooms:", beds); str += get_sub_section_html("Bathrooms:", baths); str += get_sub_section_html("Fireplaces:", fires); str += get_sub_section_html("Air Conditiong:", airs); str += get_sub_section_html("Ammenities:", amms); str += get_sub_section_html("Appliances:", apps); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", label) .replaceAll("$CONTENT$", str); } function get_unit_html(i) { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Number of This Unit:", get_array_item([mls_full.PropertyUnits[i-1].UnitTypeUnitsTotal])); str += get_sub_section_html("Monthly Rent:", price_str(get_array_item([mls_full.PropertyUnits[i-1].NST_TotalRent]))).replaceAll(", ", ","); str += get_sub_section_html("Expenses:", price_str(get_array_item([mls_full.PropertyUnits[i-1].NST_UnitExp]))).replaceAll(", ", ","); str += get_sub_section_html("Rooms:", get_array_joined([get_array_item([mls_full.PropertyUnits[i-1].NST_UnitRoomsTotal], " rooms"), mls_full.PropertyUnits[i-1].NST_UnitRoomSpec], ", ")); str += get_sub_section_html("Bedrooms:", get_array_item([mls_full.PropertyUnits[i-1].UnitTypeBedsTotal])); str += get_sub_section_html("Bathrooms:", get_array_item([mls_full.PropertyUnits[i-1].UnitTypeBathsTotal])); str += get_sub_section_html("Size:", get_array_item([mls_full.PropertyUnits[i-1].NST_UnitSqFt]), " sqft"); str += get_sub_section_html("Amenities:", get_array_item([mls_full.PropertyUnits[i-1].NST_UnitAmenities])); str += get_sub_section_html("Annual Rent:", price_str(get_array_item([mls_full.PropertyUnits[i-1].NST_UnitAnnualRent]))).replaceAll(", ", ","); str += get_sub_section_html("Actual Rent:", price_str(get_array_item([mls_full.PropertyUnits[i-1].UnitTypeActualRent]))).replaceAll(", ", ","); str += get_sub_section_html("Appliances:", get_array_item([mls_full.PropertyUnits[i-1].NST_UnitAppl])); for(let j=1; j<=4; j++) { str += get_sub_section_html("Bedroom "+j+":", connect_data(get_array_item([mls_data["UNIT"+i+"_UNITB"+j+"DIM"], mls_full["NST_RoomUnit"+i+"Bedroom"+j+"Dimensions"]]), get_data_str(get_array_item([mls_data["UNIT"+i+"_UNITB"+j+"LEVEL"], mls_full["NST_RoomUnit"+i+"Bedroom"+j+"Level"]]), " Floor"), ", ")); } str += get_sub_section_html("AC/Cooling System:", get_array_item([mls_full.PropertyUnits[i-1].NST_UnitCoolSystem])); str += get_sub_section_html("Dining Room:", get_array_joined([get_array_joined([get_array_item([mls_data["UNIT"+i+"_UNITDRDIM"], mls_full["NST_RoomUnit"+i+"DiningRoomDimensions"]]), get_array_item([mls_data["UNIT"+i+"_UNITDR"], mls_full["NST_RoomUnit"+i+"DiningRoomFeatures"]])], ", "), get_array_item([mls_data["UNIT"+i+"_UNITDRLEVEL"], mls_full["NST_RoomUnit"+i+"DiningRoomLevel"]], " floor")], " on ")); for(let j=1; j<=6; j++) { str += get_sub_section_html(get_array_item([mls_data["UNIT"+i+"_UNITE"+j+"NAME"], mls_full["NST_RoomUnit"+i+"ExtraRoom"+j+"Description"]]) + ":", connect_data(get_array_item([mls_data["UNIT"+i+"_UNITE"+j+"DIM"], mls_full["NST_RoomUnit"+i+"ExtraRoom"+j+"Dimensions"]]), get_data_str(get_array_item([mls_data["UNIT"+i+"_UNITE"+j+"LEVEL"], mls_full["NST_RoomUnit"+i+"ExtraRoom"+j+"Level"]]), " floor"), " on ")); } str += get_sub_section_html("Family Room:", connect_data(connect_data(get_array_item([mls_data["UNIT"+i+"_UNITFRDIM"], mls_full["NST_RoomUnit"+i+"FamilyRoomDimensions"]]), get_array_item([mls_data["UNIT"+i+"_UNITFRCHAR"], mls_full["NST_RoomUnit"+i+"FamilyRoomFeatures"]]), ", "), get_data_str(get_array_item([mls_data["UNIT"+i+"_UNITFRLEVEL"], mls_full["NST_RoomUnit"+i+"FamilyRoomLevel"]]), " Floor"), " on ")); str += get_sub_section_html("Kitchen:", connect_data(get_array_item([mls_data["UNIT"+i+"_UNITKTDIM"], mls_full["NST_RoomUnit"+i+"KitchenDimensions"]]), get_data_str(get_array_item([mls_data["UNIT"+i+"_UNITKTLEVEL"], mls_full["NST_RoomUnit"+i+"KitchenLevel"]]), " Floor"), " on ")); str += get_sub_section_html("Living Room:", connect_data(get_array_item([mls_data["UNIT"+i+"_UNITLRDIM"], mls_full["NST_RoomUnit"+i+"LivingRoomDimensions"]]), get_data_str(get_array_item([mls_data["UNIT"+i+"_UNITLRLEVEL"], mls_full["NST_RoomUnit"+i+"LivingRoomLevel"]]), " floor"), " on ")); str += get_sub_section_html("Parking:", get_array_item([mls_full.PropertyUnits[i-1].NST_UnitParking])); str += get_sub_section_html("Fireplaces:", get_array_joined([get_array_item([mls_data["UNIT"+i+"_UNITFIREPLACENUM"], mls_full["NST_U"+i+"UnitFireplaceNum"]]), get_array_item([mls_full["NST_U"+i+"UnitFireplaceLocation"]])], ", ")); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Unit " + i) .replaceAll("$CONTENT$", str); } function get_unit_info_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_unit_summary_html(); str += get_unit_financials_html(); str += get_unit_expense_html(); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Unit Information") .replaceAll("$CONTENT$", str); } function get_unit_expense_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Land Lease Amount:", price_str(get_array_item([mls_full.LandLeaseAmount]))); str += get_sub_section_html("Electricity:", price_str(get_array_item([mls_data.EXPENSEELECTRIC, mls_full.ElectricExpense]))); str += get_sub_section_html("Gas/Fuel:", price_str(get_array_item([mls_data.EXPENSEFUEL, mls_full.FuelExpense]))); str += get_sub_section_html("Caretaker Cost:", price_str(get_array_item([mls_data.EXPENSECARETAKER]))); str += get_sub_section_html("Maintenance:", price_str(get_array_item([mls_data.EXPENSEMAINTENANCE, mls_full.MaintenanceExpense, mls_full.LM_char10_38]))); str += get_sub_section_html("Operating:", price_str(get_array_item([mls_full.OperatingExpense]))); str += get_sub_section_html("Trash:", price_str(get_array_item([mls_data.EXPENSETRASH, mls_full.TrashExpense]))); str += get_sub_section_html("Sewer:", price_str(get_array_item([mls_data.EXPENSEWATERSEWER, mls_full.WaterSewerExpense]))); str += get_sub_section_html("Insurance:", price_str(get_array_item([mls_full.InsuranceExpense, mls_full.LM_char10_37]))); str += get_sub_section_html("Manager:", price_str(get_array_item([mls_full.ManagerExpense, mls_full.LM_char10_36]))); str += get_sub_section_html("Utilities:", price_str(get_array_item([mls_full.LM_char10_39]))); str += get_sub_section_html("Other:", price_str(get_array_item([mls_full.OtherExpense, mls_full.LM_char10_41]))); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Expenses") .replaceAll("$CONTENT$", str.replaceAll(", ", ",")); } function get_unit_financials_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Total Yearly Income:", price_str(get_array_item([mls_data.GROSSINCOME, mls_full.GrossIncome, mls_full.FEAT20110114205331984825000000, mls_full.LM_char10_33]))).replaceAll(", ", ","); str += get_sub_section_html("Total Yearly Expenses:", price_str(get_array_item([mls_data.EXPENSETOTALANN, mls_full.NST_Expenses, mls_full.FEAT20110114205331883090000000, mls_full.LM_char10_34]))).replaceAll(", ", ","); str += get_sub_section_html("Owner Expenses:", get_array_item([mls_data.OWNERSEXPENSE, mls_full.OwnerPays, mls_full.GF20110204205632639460000000])); str += get_sub_section_html("Tenant Pays:", get_array_item([mls_data.TENANTEXPENSES, mls_full.TenantPays, mls_full.GF20110204205648709013000000])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Financials") .replaceAll("$CONTENT$", str); } function get_unit_summary_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Rental Units:", get_array_item([mls_data.TOTALUNITS, mls_full.NumberOfUnitsTotal, mls_full.LIST_65, mls_full.L_NumUnits])); str += get_sub_section_html("Shared Space:", get_array_item([mls_data.SHAREDROOMS, mls_full.NST_SharedRooms, mls_full.GF20110114205247594353000000])); str += get_sub_section_html("Bathrooms:", mls_data.TOTALBATHROOMS); str += get_sub_section_html("Bedrooms:", mls_data.TOTALBEDROOMS); str += get_sub_section_html("Stoves:", get_array_item([mls_data.RANGENUM, mls_full.NST_RangeNum])); str += get_sub_section_html("Refridgerators:", get_array_item([mls_data.REFRIGERATORNUM, mls_full.NST_RefrigeratorNum])); str += get_sub_section_html("Rental License:", get_array_item([mls_data.RENTALLICENSEYN, mls_full.NST_RentalLicenseYN]) ? get_array_item([mls_data.RENTALLICENSETYPE, mls_full.NST_RentalLicenseType]) : ""); str += get_sub_section_html("Rental License:", get_array_item([mls_full.LIST_97, mls_full.LFD_RENT_42])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Summary") .replaceAll("$CONTENT$", str); } function get_contact_form_html() { let t = get_element_html(detail_template + "_section"); return t .replaceAll("$CUSTOMCLS$", "fixed noprint") .replaceAll("$LABEL$", "Request Additional Details") .replaceAll("$CONTENT$", get_element_html(detail_template + "_request_form")); } function short_time_str(date) { let h = date.getHours(); let m = date.getMinutes(); if (m < 10) m = "0" + m; if (h == 0) return "12:" + m + "AM"; if (h < 12) return h + ":" + m + "AM"; if (h == 12) return "12:" + m + "PM"; return (h - 12) + ":" + m + "PM"; } function get_open_houses_html() { if (mls_data.OPENHOUSE == undefined && mls_open_house == null) return ""; let t = get_element_html(detail_template + "_section"); let str = ""; if(!is_null(mls_data.OPENHOUSE)) { str += get_sub_section_html("", mls_data.OPENHOUSE[0].Description); str += get_sub_section_html("", mls_data.OPENHOUSE[0].PublicRemarks); if (mls_data.OPENHOUSE[0].PublicRemarks != mls_data.OPENHOUSE[0].Remarks) str += get_sub_section_html("", mls_data.OPENHOUSE[0].Remarks); } if(!is_null(mls_open_house)) str += get_sub_section_html("", mls_open_house[0].PublicRemarks); let opens = []; let str2; if(!is_null(mls_data.OPENHOUSE)) mls_data.OPENHOUSE.forEach(function (o) { let start = new Date(o.StartDate + "Z"); let end = new Date(o.EndDate + "Z"); let start_date = start.toLocaleDateString(); let end_date = end.toLocaleDateString(); let start_time = short_time_str(start); let end_time = short_time_str(end); let str3 = start_date + " " + start_time + "-" + (start_date == end_date ? "" : end_date + " ") + end_time; if (str2 == str3) return; str2 = str3; opens.push(str3); }); if(!is_null(mls_open_house)) mls_open_house.forEach(function (o) { let start = new Date(o.StartDate + "Z"); let end = new Date(o.EndDate + "Z"); let start_date = start.toLocaleDateString(); let end_date = end.toLocaleDateString(); let start_time = short_time_str(start); let end_time = short_time_str(end); let str3 = start_date + " " + start_time + "-" + (start_date == end_date ? "" : end_date + " ") + end_time; if (str2 == str3) return; str2 = str3; opens.push(str3); }); str += get_sub_section_html("Open Date & Time:", opens.join(", ")); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Open House") .replaceAll("$CONTENT$", str); } function get_vtour_html() { let t = get_element_html(detail_template + "_section"); let str = ""; let tour1 = get_array_item([mls_full.CustomVTourURL, mls_data.VIRTUALTOUR_URL1]); let tour2 = get_array_item([mls_full.NST_VirtualTourURLUnbranded2, mls_data.VIRTUALTOUR_URL2]); if (tour1 != "") str += ""; if (tour2 != "") str += ""; if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Virtual Tours") .replaceAll("$CONTENT$", str); } function get_others_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_school_html(); str += get_finance_html(); str += get_listing_html(); str += get_special_html(); str += get_survey_html(); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Others") .replaceAll("$CONTENT$", str); } function get_survey_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Range:", get_array_item([mls_full.PublicSurveyRange])); str += get_sub_section_html("Section:", get_array_item([mls_full.PublicSurveySection])); str += get_sub_section_html("Township:", get_array_item([mls_full.PublicSurveyTownship])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Public Survey") .replaceAll("$CONTENT$", str); } function get_special_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Handicap Access:", mls_data.HANDICAPACCESS != "None" ? mls_data.HANDICAPACCESS : null); str += get_sub_section_html("Manufactured Home:", mls_data.IS_MANUFACTUREDHOME == 1 ? "Yes" : null); str += get_sub_section_html("Internet Options:", get_array_item([mls_full.NST_InternetOptions])); str += get_sub_section_html("Present Use:", get_array_item([mls_full.NST_PresentUse])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Special Notes") .replaceAll("$CONTENT$", str); } function get_listing_html() { let t = get_element_html(detail_template + "_section"); let days0 = get_array_item([mls_data.DAYSONMARKET, mls_full.DaysOnMarket, mls_full.LIST_137]); let days1 = get_array_item([mls_data.DAYSONMARKETCUMULATIVE, mls_full.CumulativeDaysOnMarket]); let str = ""; str += get_sub_section_html("Listed Price:", price_str(mls_data.LISTPRICE) + mls_hotdata_html(mls_data)).replaceAll(", ", ","); str += get_sub_section_html("Days on market:", days0, " days"); str += get_sub_section_html("First Listed at:", datetime_string(mls_data.LISTDATE)); str += get_sub_section_html("Last Updated at:", datetime_string(mls_data.MODIFICATIONTIMESTAMP)); str += get_sub_section_html("Total Days on Market:", days0 != days1 ? days1 : null, " days"); str += get_sub_section_html("Contingencies:", get_array_item([mls_data.CONTINGENCY, mls_full.Contingency, mls_full.LIST_19])); str += get_sub_section_html("Assessments:", get_array_item([mls_data.ASSESSMENTPENDING, mls_full.NST_AssessmentPending, mls_full.LIST_86, get_array_joined([mls_full.LM_Char25_2, mls_full.LM_Char25_30], ", ")])); str += get_sub_section_html("Association Fee:", get_array_item([mls_data.ASSOCFEEYN, mls_full.AssociationYN]) ? price_str(get_array_item([mls_data.ASSOCIATIONFEE, mls_full.AssociationFee, mls_full.FEAT20110114205321972555000000])) : null).replaceAll(", ", ","); str += get_sub_section_html("Foreclosure:", mls_data.FORECLOSURE); str += get_sub_section_html("Auction:", get_bit_item(mls_data.AUCTIONYN)); str += get_sub_section_html("Lender Owned:", get_array_item([mls_data.LENDEROWNED, mls_full.LIST_110])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Listing Data") .replaceAll("$CONTENT$", str); } function get_school_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("District Number:", mls_data.SCHOOLDISTRICTNUMBER); str += get_sub_section_html("District Phone:", mls_data.SCHOOLDISTRICTPHONE); str += get_sub_section_html("Elementry:", mls_data.SCHOOLELEMENTARY); str += get_sub_section_html("Middle:", mls_data.SCHOOLMIDDLE); str += get_sub_section_html("High:", mls_data.SCHOOLHIGH); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "School Information") .replaceAll("$CONTENT$", str); } function get_finance_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Tax Property ID:", get_array_item([mls_data.PID, mls_full.ParcelNumber, mls_full.LIST_80, mls_full.LM_Char25_4])); str += get_sub_section_html("Tax Amount:", get_array_joined([ price_str(get_array_item([mls_data.TAXES, mls_full.TaxAnnualAmount, mls_full.LIST_75])), get_array_item([mls_data.TAXYEAR, mls_full.TaxYear, mls_full.LIST_76]) ], " for ")).replaceAll(", ", ","); let asset = mls_data.TAXWITHASSESSMENTS - mls_data.TAXES; str += get_sub_section_html("Assessments:", asset > 0 ? price_str(asset) : null); str += get_sub_section_html("Homestead:", mls_data.HOMESTEADDESC); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Financial Considerations") .replaceAll("$CONTENT$", str); } function get_property_waterfront_details_html() { let t = get_element_html(detail_template + "_section"); let str1 = get_property_details_html(); let str2 = get_waterfront_details_html(); let str = str1 + str2; if (str == "") return ""; if (str1 == "") return str2; if (str2 == "") return str1; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Property / Waterfront") .replaceAll("$CONTENT$", str); } function get_property_details_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Description:", mls_data.LOTDESCRIPTION); str += get_sub_section_html("Frontage:", get_array_item([mls_data.FRONTAGEFEET, mls_full.RoadFrontageType, mls_full.GF20110114205235046167000000, mls_full.GF20110114205242291497000000, mls_full.GF20110114205242397400000000, mls_full.GF20110114205252026359000000, mls_full.GF20110114205252760386000000, mls_full.LFD_ROADFRONTAGE_31, mls_full.LFD_ROADFRONTAGE_31])); str += get_sub_section_html("Garage:", get_array_joined([ get_array_item([mls_data.PARKINGGARAGE, mls_full.GarageSpaces, mls_full.LIST_125, mls_full.L_Keyword3], " spaces"), get_array_item([mls_data.GARAGEDESCRIPTION, mls_full.ParkingFeatures, mls_full.GF20110114205248104656000000, mls_full.GF20110114205248104656000000, mls_full.GF20110114205250168635000000, get_array_joined([mls_full.LFD_GARAGE_4, mls_full.LFD_GARAGE_84, mls_full.LM_Char10_28, mls_full.LFD_PARKING_36, mls_full.LFD_PARKING_47], ",") ]) ], ", ")); str += get_sub_section_html("Pool Features:", get_array_item([mls_data.POOLDESCRIPTION, mls_full.PoolFeatures, mls_full.GF20110114205234991063000000, mls_full.GF20110114205248490668000000, mls_full.GF20110114205250361234000000])); str += get_sub_section_html("Lot Dimensions:", get_array_item([mls_data.LOTSIZEDIMENSIONS, mls_full.LotSizeDimensions, mls_full.LIST_56, get_array_joined([mls_full.LM_Dec_1, mls_full.LM_Dec_2], "x") ])); str += get_sub_section_html("Amentities Unit:", get_array_item([mls_data.AMENITIESUNIT, mls_full.NST_AmenitiesUnit, get_array_joined([ mls_full.GF20110114205246780767000000, mls_full.GF20110114205235074697000000, mls_full.GF20110114205246834821000000, mls_full.GF20110114205247524779000000, mls_full.GF20110114205247594353000000, mls_full.GF20110114205249559836000000, mls_full.GF20110114205249609327000000, mls_full.GF20110114205249712770000000, mls_full.GF20110114205251236902000000, mls_full.GF20110114205251344315000000 ], ", ") ])); str += get_sub_section_html("Out Building:", mls_data.OUTBUILDINGS); str += get_sub_section_html("Agent Owned:", mls_data.AGENTOWNER == 1 ? "Yes" : "No"); str += get_sub_section_html("Development Status:", get_array_item([mls_full.DevelopmentStatus])); str += get_sub_section_html("Utilities:", get_array_item([mls_full.Utilities])); str += get_sub_section_html("Improvements:", get_array_item([mls_full.NST_Improvements])); str += get_sub_section_html("Topography:", get_array_item([mls_full.Topography])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Property Details") .replaceAll("$CONTENT$", str); } function get_waterfront_details_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Body of Water:", mls_data.WATERFRONTNAME);// str += get_sub_section_html("DNR Lake ID:", get_str(mls_data.WATERFRONTNUM).trim() != "" ? "" + mls_data.WATERFRONTNUM + "" : null); str += get_sub_section_html("Type:", mls_data.LAKEWATERFRONT);// str += get_sub_section_html("Frontage:", get_array_item([mls_data.WATERFRONTFEET, mls_full.NST_WaterfrontFeet], " ft")); str += get_sub_section_html("Lake Acres:", get_num1(mls_data.LAKEACRES), " acres");// str += get_sub_section_html("Max Depth:", get_array_item([mls_data.LAKEDEPTH, mls_full.NST_LakeDepth], " ft")); str += get_sub_section_html("Bottom:", mls_data.LAKEBOTTOM);// str += get_sub_section_html("View:", mls_data.WATERFRONTVIEW);// str += get_sub_section_html("Elevation:", get_array_item([mls_data.WATERFRONTELEVATION, mls_full.NST_WaterfrontElevation])); str += get_sub_section_html("Slope:", get_array_item([mls_data.WATERFRONTSLOPE1, mls_full.NST_WaterfrontSlope])); str += get_sub_section_html("Lakechain:", mls_data.LAKECHAINNAME);// str += get_sub_section_html("Lakechain Acres:", get_num1(get_array_item([mls_data.LAKECHAINACREAGE, mls_full.NST_LakeChainAcreage], " acres"))); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Waterfront Details") .replaceAll("$CONTENT$", str); } function get_more_details_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_in_home_details_html(); str += get_home_details_html(); str += get_utilities_html(); if (str == "") return ""; let title = "Details"; if (mls_data.MLSCLASS == "RES") title = "Home Details"; if (mls_data.MLSCLASS == "COM") title = "Building Details"; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", title) .replaceAll("$CONTENT$", str); } function get_bathrooms_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Full Baths:", get_array_item([mls_data.BATHSFULL, mls_full.BathroomsFull, mls_full.LIST_68])); str += get_sub_section_html("3/4 Baths:", get_array_item([mls_data.BATHSTHREEQUARTER, mls_full.BathroomsThreeQuarter, mls_full.LIST_70])); str += get_sub_section_html("1/2 Baths:", get_array_item([mls_data.BATHSHALF, mls_full.BathroomsHalf, mls_full.LIST_69])); str += get_sub_section_html("1/4 Baths:", get_array_item([mls_data.BATHQUARTER, mls_full.BathroomsOneQuarter, mls_full.LIST_52])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Bathrooms") .replaceAll("$CONTENT$", str); } function get_more_room_details_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Family:", get_array_item([mls_data.ROOMFAMILYCHAR, mls_full.RoomFamilyRoomLevel])); str += get_sub_section_html("Dining:", get_array_item([mls_data.DININGROOMDESCRIPTION, mls_full.NST_DiningRoomDescription, mls_full.GF20110114205234915916000000, mls_full.GF20110114205250023636000000])); str += get_sub_section_html("Bath Details:", get_array_item([mls_data.BATHDESC, mls_full.NST_BathDesc, mls_full.GF20110114205240026562000000, mls_full.GF20110114205249813734000000])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "More Room Details") .replaceAll("$CONTENT$", str); } function get_in_home_details_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Sq Ft Above Ground:", get_num1(get_array_item([mls_data.SQFTABOVEGROUND, mls_full.AboveGradeFinishedArea, mls_full.LIST_49, mls_full.LM_Int4_5])), " sq ft"); str += get_sub_section_html("Sq Ft Below Ground:", get_num1(get_array_item([mls_data.SQFTBELOWGROUND, mls_full.BelowGradeFinishedArea, mls_full.LIST_51])), " sq ft"); str += get_sub_section_html("Appliances:", get_array_item([mls_data.APPLIANCES, mls_full.Appliances, mls_full.GF20110114205241624648000000, mls_full.GF20110114205249663353000000, mls_full.LFD_APPLIANCES_9, mls_full.LFD_APPLIANCES_89])); str += get_sub_section_html("Basement:", get_array_joined([mls_data.BASEMENT, mls_full.GF20110114205246881701000000, mls_full.GF20110114205241726341000000, mls_full.GF20110114205247744985000000, mls_full.GF20110114205242036915000000, mls_full.GF20110114205249867914000000, mls_full.GF20110114205249969258000000, mls_full.LFD_CONSTRUCTION_3, mls_full.LFD_CONSTRUCTION_27, mls_full.LFD_CONSTRUCTION_44, mls_full.LFD_CONSTRUCTION_83], ", ")); str += get_sub_section_html("Construction Material:", get_array_item([mls_full.ConstructionMaterials])); str += get_sub_section_html("Electric:", get_array_item([mls_full.Electric])); str += get_sub_section_html("Fireplaces:", get_array_joined([ get_array_item([mls_data.FIREPLACES, mls_full.FireplacesTotal, mls_full.LIST_111]), get_array_item([mls_data.FIREPLACELOC, mls_full.FireplaceFeatures, mls_full.GF20110114205241573426000000, mls_full.GF20110225234837634312000000, mls_full.LFD_FIREPLACE_11, mls_full.LFD_FIREPLACE_91]) ], ", ")); str += get_sub_section_html("Additional Details:", get_array_item([mls_data.AMENITIESUNIT, mls_full.NST_AmenitiesUnit, get_array_joined([ mls_full.GF20110114205246780767000000, mls_full.GF20110114205235074697000000, mls_full.GF20110114205246834821000000, mls_full.GF20110114205247524779000000, mls_full.GF20110114205247594353000000, mls_full.GF20110114205249559836000000, mls_full.GF20110114205249609327000000, mls_full.GF20110114205249712770000000, mls_full.GF20110114205251236902000000, mls_full.GF20110114205251344315000000 ], ", ") ])); str += get_sub_section_html("Patio/Deck:", get_array_item([mls_data.LFD_PATIOPORCH_8, mls_full.LFD_PATIOPORCH_88])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "In Home Details") .replaceAll("$CONTENT$", str); } function get_home_details_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Siding:", mls_data.EXTERIOR); str += get_sub_section_html("Roof:", mls_data.ROOF); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Exterior") .replaceAll("$CONTENT$", str); } function get_utilities_html() { let t = get_element_html(detail_template + "_section"); // let ar = []; // if (mls_data.HEATINGDESCRIPTION != undefined && mls_data.HEATINGDESCRIPTION != "") ar.push(mls_data.HEATINGDESCRIPTION); // if (mls_data.FUEL != undefined && mls_data.FUEL != "") ar.push(mls_data.FUEL); let str = ""; str += get_sub_section_html("Utilities: ", get_array_item([mls_full.LFD_UTILITIES_19, mls_full.LFD_UTILITIES_20, mls_full.LFD_UTILITIES_33, mls_full.LFD_UTILITIES_56, mls_full.LFD_UTILITIES_99])); str += get_sub_section_html("Water: ", mls_data.WATER); str += get_sub_section_html("Sewer: ", mls_data.SEWER); str += get_sub_section_html("Cooling: ", get_array_item([mls_data.COOLINGDESCRIPTION, mls_full.Cooling, mls_full.GF20110114205241522537000000, mls_full.GF20110114205249454979000000, mls_full.GF20110114205252095697000000, mls_full.LFD_COOLING_14, mls_full.LFD_COOLING_35, mls_full.LFD_COOLING_49, mls_full.LFD_COOLING_94])); str += get_sub_section_html("Heating: ", get_array_joined([ get_array_item([mls_data.HEATINGDESCRIPTION, mls_full.Heating, mls_full.GF20110114205234862544000000, mls_full.GF20110114205242239642000000, mls_full.GF20110114205250194654000000, mls_full.GF20110114205252684451000000, mls_full.LFD_HEAT_13, mls_full.LFD_HEAT_34, mls_full.LFD_HEATING_48, mls_full.LFD_HEAT_93]), get_array_item([mls_data.FUEL, mls_full.NST_Fuel, mls_full.GF20110114205246657128000000, mls_full.GF20110114205248055366000000, mls_full.GF20110114205250126446000000, mls_full.GF20110114205252559166000000]) ], ", ")); str += get_sub_section_html("Fence: ", get_array_item([mls_data.FENCE, mls_full.Fencing, mls_full.LFD_FENCING_12, mls_full.LFD_FENCING_92])); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Utilites") .replaceAll("$CONTENT$", str); } function get_room_data_html() { let t = get_element_html(detail_template + "_section"); let str = ""; if(get_str(mls_full.PropertyRooms).startsWith("[{")) mls_full.PropertyRoomsParsed = JSON.parse(mls_full.PropertyRooms); else if(get_str(mls_full.Rooms).startsWith("[{")) mls_full.PropertyRoomsParsed = JSON.parse(mls_full.Rooms); else mls_full.PropertyRoomsParsed = []; str += get_bedrooms_html(); str += get_bathrooms_html(); str += get_main_floor_html(); str += get_lower_level_html(); str += get_upper_level_html(); str += get_more_room_details_html(); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Rooms") .replaceAll("$CONTENT$", str); } // function get_mlsgrid2_room_data() { // if(get_str(mls_full.PropertyRooms).startsWith("[{")) return JSON.parse(mls_full.PropertyRooms); // return []; // } function get_bedrooms_html() { let t = get_element_html(detail_template + "_section"); let str = ""; for (let i = 0; i < 14; i++) { if (mls_data.ROOMTYPE[i] == undefined || mls_data.ROOMAREA[i] == undefined || mls_data.ROOMFLOOR[i] == undefined) continue; if (!mls_data.ROOMTYPE[i].includes("Bed")) continue; if (get_str(mls_data.ROOMTYPE[i]) == "") continue; str += get_sub_section_html(get_array_item([mls_data.ROOMTYPE[i]], ":"), mls_data.ROOMAREA[i]); } mls_full.PropertyRoomsParsed.forEach(function(room) { if(get_str(room.RoomDescription).includes("Bed") || get_str(room.RoomType).includes("Bed")) { str += get_sub_section_html(get_array_item([room.RoomType], ":"), get_array_joined([room.RoomLevel, room.RoomDimensions], " ")); } }); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Bedrooms") .replaceAll("$CONTENT$", str); } function get_main_floor_html() { let t = get_element_html(detail_template + "_section"); let str = ""; for (let i = 0; i < 14; i++) { if (mls_data.ROOMTYPE[i] == undefined || mls_data.ROOMAREA[i] == undefined || mls_data.ROOMFLOOR[i] == undefined) continue; if (mls_data.ROOMFLOOR[i] != "Main") continue; if (get_str(mls_data.ROOMTYPE[i]) == "") continue; str += get_sub_section_html(get_array_item([mls_data.ROOMTYPE[i]], ":"), mls_data.ROOMAREA[i]); } mls_full.PropertyRoomsParsed.forEach(function(room) { if(room.RoomLevel == "Main") { str += get_sub_section_html(get_array_item([room.RoomType], ":"), get_array_joined([get_array_item([room.RoomDescription, room.RoomType]), room.RoomFeatures, room.RoomDimensions], ", ")); } }); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Main Floor") .replaceAll("$CONTENT$", str); } function get_lower_level_html() { let t = get_element_html(detail_template + "_section"); let str = ""; for (let i = 0; i < 14; i++) { if (mls_data.ROOMTYPE[i] == undefined || mls_data.ROOMAREA[i] == undefined || mls_data.ROOMFLOOR[i] == undefined) continue; if (mls_data.ROOMFLOOR[i] != "Lower") continue; if (get_str(mls_data.ROOMTYPE[i]) == "") continue; str += get_sub_section_html(get_array_item([mls_data.ROOMTYPE[i]], ":"), mls_data.ROOMAREA[i]); } mls_full.PropertyRoomsParsed.forEach(function(room) { if(room.RoomLevel == "Lower") { str += get_sub_section_html(get_array_item([room.RoomType], ":"), get_array_joined([get_array_item([room.RoomDescription, room.RoomType]), room.RoomFeatures, room.RoomDimensions], ", ")); } }); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Lower Level") .replaceAll("$CONTENT$", str); } function get_upper_level_html() { let t = get_element_html(detail_template + "_section"); let str = ""; for (let i = 0; i < 14; i++) { if (mls_data.ROOMTYPE[i] == undefined || mls_data.ROOMAREA[i] == undefined || mls_data.ROOMFLOOR[i] == undefined) continue; if (mls_data.ROOMFLOOR[i] != "Upper") continue; if (get_str(mls_data.ROOMTYPE[i]) == "") continue; str += get_sub_section_html(get_array_item([mls_data.ROOMTYPE[i]], ":"), mls_data.ROOMAREA[i]); } mls_full.PropertyRoomsParsed.forEach(function(room) { if(room.RoomLevel == "Upper") { str += get_sub_section_html(get_array_item([room.RoomType], ":"), get_array_joined([get_array_item([room.RoomDescription, room.RoomType]), room.RoomFeatures, room.RoomDimensions], ", ")); } }); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Upper Level") .replaceAll("$CONTENT$", str); } function price_display() { let ar = []; ar.push(price_str(mls_data.LISTPRICE) + " " + mls_hotdata_html(mls_data)); if(mls_data.LIVINGAREA) ar.push("
" + price_str(mls_data.LISTPRICE / mls_data.LIVINGAREA) + "/sf" + "
"); if(mls_data.ACRES) ar.push("
" + price_str(mls_data.LISTPRICE / mls_data.ACRES) + "/acre" + "
"); //return ar.join(" • "); return ar.join(""); } function get_summary_html() { let t = get_element_html(detail_template + "_section"); let type = get_array_item([mls_full.PropertyType, mls_data.STYLE]); let subtype = get_array_item([mls_full.PropertySubType]); let str = ""; str += get_sub_section_html("Type:", get_str(mls_data.MLSCLASS) + (type ? " | " + type : "") + (subtype ? " - " + subtype : "")); str += get_sub_section_html("Price:", price_display()).replaceAll(", ", ","); str += get_sub_section_html("Transaction:", mls_data.TRANSACTIONTYPE); str += get_sub_section_html("Status:", get_property_status(true)); str += get_sub_section_html("Contingencies:", get_array_item([mls_data.CONTINGENCY, mls_full.Contingency, mls_full.LIST_19])); str += get_sub_section_html("Agent Owned:", get_array_item([mls_full.NST_AgentOwner])); str += get_sub_section_html("Lender Owned:", get_array_item([mls_full.NST_LenderOwned])); str += get_sub_section_html("Manufactured Home:", get_array_item([mls_full.NST_ManufacturedHome])); str += get_sub_section_html("Current Use:", mls_data.CURRENTUSE); str += get_sub_section_html("Zoning:", mls_data.ZONING); str += get_sub_section_html("Bedrooms:", mls_data.BEDROOMS); str += get_sub_section_html("Bathrooms:", mls_data.BATHSTOTAL); str += get_sub_section_html("Square Footage:", get_num1(mls_data.LIVINGAREA), " sq ft"); str += get_sub_section_html("Total Square Footage:", get_num1(mls_full.NST_SqFtTotal), " sq ft"); str += get_sub_section_html("Lot Size:", get_num1(mls_data.ACRES), " " + get_array_item([mls_full.LotSizeUnits, "Acres"])); str += get_sub_section_html("Year Built:", mls_data.YEARBUILT); str += get_sub_section_html("Foundation:", get_num1(get_array_item([mls_data.FOUNDATIONSIZE, mls_full.FoundationArea, mls_full.LIST_114])), " " + get_array_item([mls_full.LivingAreaUnits, "Square Feet"])); str += get_sub_section_html("Garage:", get_bit_item(get_array_item([mls_data.PARKINGGARAGE, mls_full.GarageSpaces, mls_full.LIST_125, mls_full.L_Keyword3]) > 0)); str += get_sub_section_html("Waterfront:", get_bit_item(mls_data.WATERFRONTPRESENT == 1)); str += get_sub_section_html("Stories:", get_array_item([mls_data.STORIES, mls_full.LIST_113, mls_full.LFD_STYLE_1, mls_full.LFD_STYLE_6, mls_full.Levels])); str += get_sub_section_html("New Construction:", get_bit_item(mls_full.NewConstructionYN)); str += get_sub_section_html("Listed at:", !mls_data.LISTDATE ? "Coming Soon" : datetime_string(get_array_item([mls_data.LISTDATE, mls_full.L_LvtDate]))); //str += get_sub_section_html("Listed by:", mls_data.OFFICE_OFFICENAME); // Hide because Listing data is already at the bottom str += get_sub_section_html("Listing Age:", !mls_data.LISTDATE ? "Coming Soon" : days_diff(new Date(get_array_item([mls_data.LISTDATE, mls_full.L_LvtDate])), new Date()) + " days"); str += get_sub_section_html("Construction Status:", get_array_item([mls_data.CONSTRUCTIONSTATUS, mls_full.LIST_112])); str += get_sub_section_html("School District:", get_str(mls_data.SCHOOLDISTRICTNUMBER) + (get_str(mls_data.SCHOOLDISTRICTPHONE) != "" ? " | " + get_str(mls_data.SCHOOLDISTRICTPHONE) : "")); str += get_sub_section_html("Neighborhoods:", get_str(mls_data.NEIGHBORHOOD)); str += get_sub_section_html("County:", mls_data.COUNTY); // str += get_sub_section_html("Map:", get_array_joined([ // get_array_item([mls_full.MapCoordinate]), // get_array_item([mls_full.MapCoordinateSource]), // ], ", ")); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Summary") .replaceAll("$CONTENT$", str); } function get_sold_summary_html() { let t = get_element_html(detail_template + "_section"); let str = ""; str += get_sub_section_html("Type:", get_str(mls_data.MLSCLASS) + (get_str(mls_data.STYLE) != "" ? " | " + get_str(mls_data.STYLE) : "")); str += get_sub_section_html("Price:", price_str(mls_data.LISTPRICE)).replaceAll(", ", ","); str += get_sub_section_html("Status:", get_property_status(true)); str += get_sub_section_html("Bedrooms:", mls_data.BEDROOMS); str += get_sub_section_html("Bathrooms:", mls_data.BATHSTOTAL); str += get_sub_section_html("Square Footage:", get_num1(mls_data.LIVINGAREA), " sq ft"); str += get_sub_section_html("Sold Price:", price_str(get_array_item([mls_full.SOLDPRICE, mls_full.ClosePrice, mls_full.L_SoldPrice]))).replaceAll(", ", ","); str += get_sub_section_html("Sold at:", datetime_string(get_array_item([mls_data.SOLDDATE, mls_full.CloseDate, mls_full.L_UpdateDate]))); if (str == "") return ""; return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", "Summary") .replaceAll("$CONTENT$", str); } function get_sub_section_html(label, data, suffix, prefix) { let str = get_str(data); if (str == "") return ""; if (typeof (str) == "string") str = str.replaceAll(",", ", ").replaceAll(":::", ","); let t = get_element_html(detail_template + "_sub_section"); return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", get_str(label)) .replaceAll("$CONTENT$", get_str(prefix) + str + get_str(suffix)); } function get_section_html(label, data) { let str = get_str(data); if (str == "") return ""; let t = get_element_html(detail_template + "_section"); return t .replaceAll("$CUSTOMCLS$", "") .replaceAll("$LABEL$", label) .replaceAll("$CONTENT$", str); } function print_property() { // hide_element("photo_counter_div"); // hide_element("photo_prev"); // hide_element("photo_next"); // hide_element("photo_full"); // hide_element("photo_desc_div"); // hide_element("favorite_mark"); // hide_element("type_status"); // hide_element("price"); // let info = document.getElementById("information"); // info.children[1].style.display = "none"; // let content = document.getElementById("print_content"); // let iframe = document.createElement("iframe"); // iframe.style.display = "none"; // document.body.appendChild(iframe); // iframe.contentDocument.write('' + document.title + ''); // iframe.contentDocument.write(''); // iframe.contentDocument.write(content.innerHTML); // iframe.contentDocument.write(''); // iframe.contentDocument.close(); // iframe.contentWindow.onload = function() { // setTimeout(function() { // iframe.contentWindow.print(); // document.body.removeChild(iframe); // }, 1000); // } // show_element("photo_counter_div"); // show_element("photo_prev"); // show_element("photo_next"); // show_element("photo_full"); // show_element("photo_desc_div"); // show_element("favorite_mark"); // show_element("type_status"); // show_element("price"); // info.children[1].style.display = "block"; window.print(); } function stylesheet_html() { let css = []; for (let sheeti = 0; sheeti < document.styleSheets.length; sheeti++) { let sheet = document.styleSheets[sheeti]; try { let rules = ('cssRules' in sheet) ? sheet.cssRules : sheet.rules; for (let rulei = 0; rulei < rules.length; rulei++) { let rule = rules[rulei]; if ('cssText' in rule) css.push(rule.cssText); else css.push(rule.selectorText + ' {\n' + rule.style.cssText + '\n}\n'); } } catch (ex) { } } return css.join('\n'); } function get_array_item(arr, suffix, prefix) { if(!arr) return ""; if(!suffix) suffix = ""; if(!prefix) prefix = ""; for(let i=0; i= hotdate) { let price = data.LISTPRICE-data.LASTPRICE; if(price < 0) { hotprice = "-" + price_short_str(-price); hotclass = "reduct"; } if(price > 0) { if(data.LASTPRICE == 0) { hotprice = "Repost"; hotclass = "repost"; } else { hotprice = "+" + price_short_str(price); hotclass = "rise"; } } if(price == 0) { hotprice = "New "; hotclass = "new"; let diff = Math.floor((new Date() - new Date(data.LASTPRICEDATE + "Z")) / 1000 / 60); if(diff < 60) { if(diff == 0) diff = 1; hotprice += diff + " Mins Ago"; } else { diff = Math.floor(diff / 60); if(diff < 24) { hotprice += diff + " Hrs Ago"; } else { diff = Math.floor(diff / 24); hotprice += Math.floor(diff) + " Days Ago"; } } } } return "" + hotprice + ""; } function push_in_array(ar, data) { let str = get_str(data); if (str != "") ar.push(str); } function get_data_str(data, suffix, prefix) { let str = get_str(data); if (suffix == undefined) suffix = ""; if (prefix == undefined) prefix = ""; if (str == "") return ""; return prefix + str + suffix; } function connect_data(data1, data2, joiner) { let ar = []; push_in_array(ar, data1); push_in_array(ar, data2); return ar.join(joiner); } function get_num1(data) { return get_num(data).replaceAll(",", ":::"); } function calc_compensation(price, comp) { return comp; // let percent = ''; // let dollar = ''; // if(comp.startsWith("$")) { // comp = comp.substring(1); // dollar = price_str(comp); // percent = Math.round(comp / price * 1000000) / 10000; // } else { // comp = comp.substring(0, comp.length - 1); // percent = comp; // dollar = price_str(price / 100 * percent); // } // return "" + dollar + " (" + percent + "%)"; } function mls_property_detail_fullwidth(element) {{ element.querySelector(".number").innerHTML = get_str(mls_data.MLSCLASS) + " • " + mls_listing_callback_numbershow(mls_data); element.querySelector(".address").innerHTML = mls_listing_address(mls_data); element.querySelector(".status").innerHTML = get_str(get_property_status()); element.querySelector(".status").className = "status " + get_str(mls_data.STATUS); element.querySelector(".price").innerHTML = price_str(mls_data.LISTPRICE) + mls_hotdata_html(mls_data); if(mls_data.PHOTOORDER2.length > 0) { let photo_path = "/Media/" + mls_data.SOURCE + "/" + mls_data.MLSNUMBER +"/" + mls_data.PHOTOORDER2[0]; element.querySelector(".photo").style.backgroundImage = "url(" + photo_path + ")"; mls_data.PHOTOINDEX = 0; } else { element.querySelector(".photo").style.backgroundImage = "url('/photo/coming_soon.jpg')"; element.querySelector(".photo").classList.add("coming_soon"); } if(!sold_limited) { element.querySelector(".remarks").innerHTML = get_str(mls_data.PUBLICREMARKS); element.querySelector(".direction").innerHTML = get_array_item([mls_data.DIRECTIONS, mls_full.Directions, mls_full.LIST_82, mls_full.LR_remarks11]); } else { element.querySelector(".remarks").style.display = "none"; element.querySelector(".direction").style.display = "none"; } element.querySelector(".information").innerHTML = get_detail_information(); element.querySelector(".office_info").innerHTML = element.querySelector(".office_info").innerHTML.replaceAll("One Sotheby's International Realty", get_str(mls_data.OFFICE_OFFICENAME)); element.querySelector(".office_logo").src = get_agency_logo_path(mls_data); if(check_prev_next_listings_flag(mls_data.MLSNUMBER) == false) { element.querySelector(".prev_property").style.display = "none"; element.querySelector(".next_property").style.display = "none"; } mls_search({ query: "STATUS=[Active,Coming Soon,Pending];RADIUS=10," + mls_data.LATITUDE + "," + mls_data.LONGITUDE + ";MLSNUMBER=!'" + mls_data.MLSNUMBER + "'", order: "!MODIFICATIONTIMESTAMP", offset: 0, size: 12 }, function (result, total_count) { if(result.length > 0) { element.querySelector(".neighbor_listings").innerHTML = mls_listing_html(result); element.querySelector(".neighbors").style.display = "block"; } else { element.querySelector(".neighbors").style.display = "none"; } return false; // }, function (error) { // if (error == "") { // } else show_message(error); }); if(mls_data.MLSCLASS != 'RNT') { let mort_form = init_mortgage_form(element.querySelector(".mortgage_calculator")); if(mort_form) { mort_form.querySelector(".total_amount").value = mls_data.LISTPRICE; mort_form.querySelector(".down_payment_amount").value = mls_data.LISTPRICE * 0.2; mort_form.querySelector(".down_payment_percent").value = 20; // Set default term to 30 years and corresponding rate mort_form.querySelector(".total_years").value = 30; mort_form.querySelector(".term_select").value = 30; mort_form.querySelector(".interest_rate").value = 6.125; // Add event listener to update hidden total_years and interest rate based on dropdown mort_form.querySelector(".term_select").addEventListener("change", function() { const term = parseInt(this.value); const rates = { 15: 5.375, 20: 6.000, 30: 6.125 }; mort_form.querySelector(".total_years").value = term; mort_form.querySelector(".interest_rate").value = rates[term]; mort_form.calc_mortgage(); }); mort_form.calc_mortgage(); } } else { element.querySelectorAll(".mortgage_calculator_element").forEach(function(e) { e.style.display = "none"; }); } if(!mls_full.BuyerCompensation && !mls_full.SellerCompensation) { element.querySelectorAll(".compensation_element").forEach(function(e) { e.style.display = "none"; }); } else { if(!mls_full.BuyerCompensation) { element.querySelectorAll(".buyer_compensation").forEach(function(e) { e.style.display = "none"; }); } else { element.querySelector(".buyer_compensation.value").innerHTML = calc_compensation(mls_data.LISTPRICE, mls_full.BuyerCompensation); } if(!mls_full.SellerCompensation) { element.querySelectorAll(".seller_compensation").forEach(function(e) { e.style.display = "none"; }); } else { element.querySelector(".seller_compensation.value").innerHTML = calc_compensation(mls_data.LISTPRICE, mls_full.SellerCompensation); } if(!mls_full.CompensationSource) { element.querySelectorAll(".compensation_source").forEach(function(e) { e.style.display = "none"; }); } else { element.querySelector(".compensation_source.value").innerHTML = get_str(mls_full.CompensationSource); } } }} function mls_property_detail_wrapper(element) { let photo_path = "/Media/" + mls_data.SOURCE + "/" + mls_data.MLSNUMBER +"/?"; // if(mls_data.ORGMARK != "MLSGrid") photo_path = "/Media/" + mls_data.ORGMARK + "/download/" + mls_data.ORGMARK + mls_data.ORGID + "/?"; if(mls_data.PHOTOCOUNT == 0) { element.querySelector(".photo").style.backgroundImage = "url('/photo/coming_soon.jpg')"; } else { let thumbs = element.querySelector(".thumbs"); mls_data.PHOTOORDER2.push(-100); if(mls_data.VIRTUALTOUR_URL1) { let t = document.createElement("div"); t.className = "thumb vtour"; // t.photo_path = photo_path.replaceAll("?", mls_data.PHOTOORDER2[0]) + "-320x180"; t.style.backgroundImage = "url('" + photo_path.replaceAll("?", mls_data.PHOTOORDER2[0]) + "-320x180')"; // if(index == 0) t.classList.add("show"); // t.index = -200; // t.order = order; // if(t.order == -100) { // t.remarks = get_array_item([mls_data.DIRECTIONS, mls_full.Directions, mls_full.LIST_82, mls_full.LR_remarks11]); // } else mls_data.PHOTOREMARKS2.forEach(function(p) { // if(p.Order == order) t.remarks = get_str(p.Remarks); // }); t.onclick = function() { window.open(mls_data.VIRTUALTOUR_URL1, "_blank"); } thumbs.appendChild(t); // if(index == 0) setTimeout(function() { t.click(); }, 0); } mls_data.PHOTOORDER2.forEach(function(order, index) { // for(let i=1; i<=mls_data.PHOTOCOUNT; i++) { let t = document.createElement("div"); t.className = "thumb"; t.photo_path = order != -100 ? photo_path.replaceAll("?", order) : "/MapCache/A11940540.jpg"; t.style.backgroundImage = "url('" + t.photo_path + (order != -100 ? "-320x180" : "") + "')"; if(index == 0) t.classList.add("show"); t.index = index; t.order = order; if(t.order == -100) { t.remarks = get_array_item([mls_data.DIRECTIONS, mls_full.Directions, mls_full.LIST_82, mls_full.LR_remarks11]); } else mls_data.PHOTOREMARKS2.forEach(function(p) { if(p.Order == order) t.remarks = get_str(p.Remarks); }); t.onclick = function() { let photo_element = element.querySelector(".photo"); if(isInViewport(thumbs)) t.scrollIntoView({ behavior: 'smooth', block: 'nearest'}); element.querySelector(".thumbs").querySelectorAll(".thumb").forEach(function(t1) { t1.classList.remove("show"); }); t.classList.add("show"); let path = t.photo_path; //photo_path.replaceAll("?", t.order); let img = document.createElement("img"); img.src = path; let loading = create_loading_progress(); img.onload = function() { photo_element.style.backgroundImage = "url('" + path + "')"; photo_element.removeChild(img); if(t.remarks) { element.querySelector(".photo_remarks").innerHTML = t.remarks; element.querySelector(".photo_remarks").style.display = "block"; } else element.querySelector(".photo_remarks").style.display = "none"; remove_loading_progress(loading); if(t.order == -100) photo_element.onclick = on_map_click; else photo_element.onclick = undefined; }; photo_element.appendChild(img); } thumbs.appendChild(t); if(index == 0) setTimeout(function() { t.click(); }, 0); }); element.querySelector(".photo").style.backgroundImage = "url('" + photo_path.replaceAll("?", mls_data.PHOTOORDER2[0]) + "')"; element.querySelector(".photo_prev").style.display = "block"; element.querySelector(".photo_prev").onclick = function() { event && event.stopPropagation(); let t = thumbs.querySelector(".thumb.show").previousElementSibling; if(!t) t = thumbs.lastElementChild; t.click(); } element.querySelector(".photo_next").style.display = "block"; element.querySelector(".photo_next").onclick = function() { event && event.stopPropagation(); let t = thumbs.querySelector(".thumb.show").nextElementSibling; if(!t) t = thumbs.firstElementChild; t.click(); } } if(!sold_limited) { element.querySelector(".remarks").innerHTML = get_str(mls_data.PUBLICREMARKS); // element.querySelector(".direction").innerHTML = get_array_item([mls_data.DIRECTIONS, mls_full.Directions, mls_full.LIST_82, mls_full.LR_remarks11]); } else { element.querySelector(".remarks").style.display = "none"; // element.querySelector(".direction").style.display = "none"; } element.querySelector(".information").innerHTML = get_detail_information(); element.querySelector(".office_info").innerHTML = element.querySelector(".office_info").innerHTML.replaceAll("One Sotheby's International Realty", get_str(mls_data.OFFICE_OFFICENAME)); element.querySelector(".office_logo").src = get_agency_logo_path(mls_data); if(check_prev_next_listings_flag(mls_data.MLSNUMBER) == false) { element.querySelector(".prev_property").style.display = "none"; element.querySelector(".next_property").style.display = "none"; } mls_search({ query: "STATUS=[Active,Coming Soon,Pending];RADIUS=10," + mls_data.LATITUDE + "," + mls_data.LONGITUDE + ";MLSNUMBER=!'" + mls_data.MLSNUMBER + "'", order: "!MODIFICATIONTIMESTAMP", offset: 0, size: 12 }, function (result, total_count) { if(result.length > 0) { element.querySelector(".neighbor_listings").innerHTML = mls_listing_html(result); element.querySelector(".neighbors").style.display = "block"; } else { element.querySelector(".neighbors").style.display = "none"; } return false; // }, function (error) { // if (error == "") { // } else show_message(error); }); if(mls_data.MLSCLASS != 'RNT') { let mort_form = init_mortgage_form(element.querySelector(".mortgage_calculator")); if(mort_form) { mort_form.querySelector(".total_amount").value = mls_data.LISTPRICE; mort_form.querySelector(".down_payment_amount").value = mls_data.LISTPRICE * 0.2; mort_form.querySelector(".down_payment_percent").value = 20; // Set default term to 30 years and corresponding rate mort_form.querySelector(".total_years").value = 30; mort_form.querySelector(".term_select").value = 30; mort_form.querySelector(".interest_rate").value = 6.125; // Add event listener to update hidden total_years and interest rate based on dropdown mort_form.querySelector(".term_select").addEventListener("change", function() { const term = parseInt(this.value); const rates = { 15: 5.375, 20: 6.000, 30: 6.125 }; mort_form.querySelector(".total_years").value = term; mort_form.querySelector(".interest_rate").value = rates[term]; mort_form.calc_mortgage(); }); mort_form.calc_mortgage(); } } else { element.querySelectorAll(".mortgage_calculator_element").forEach(function(e) { e.style.display = "none"; }); } if(!mls_full.BuyerCompensation && !mls_full.SellerCompensation) { element.querySelectorAll(".compensation_element").forEach(function(e) { e.style.display = "none"; }); } else { if(!mls_full.BuyerCompensation) { element.querySelectorAll(".buyer_compensation").forEach(function(e) { e.style.display = "none"; }); } else { element.querySelector(".buyer_compensation.value").innerHTML = calc_compensation(mls_data.LISTPRICE, mls_full.BuyerCompensation); } if(!mls_full.SellerCompensation) { element.querySelectorAll(".seller_compensation").forEach(function(e) { e.style.display = "none"; }); } else { element.querySelector(".seller_compensation.value").innerHTML = calc_compensation(mls_data.LISTPRICE, mls_full.SellerCompensation); } if(!mls_full.CompensationSource) { element.querySelectorAll(".compensation_source").forEach(function(e) { e.style.display = "none"; }); } else { element.querySelector(".compensation_source.value").innerHTML = get_str(mls_full.CompensationSource); } } } function template_repeat(array, template, options, reserve) { let str = ""; array.forEach(function(item) { str += template_replace(item, template, options, reserve); }); return str; } function template_html(template) { if(typeof template === "string") { if(template.startsWith("<")) return template; template = document.querySelector("template#"+template); } if(!template) return ""; return template.innerHTML; } function template_replace(item, template, options, reserve) { template = template_html(template); if(template == "") return ""; let v = get_str(reserve); let t = template.replaceAll("$RESERVE$", v).replaceAll("$SHOW_RESERVE$", v == "" ? "hide" : ""); if(options) { for(var p in options) { if(options[p]) { let v = ""; if(options[p] == "default") v = template_repeat_default_callback(item, p); else if(options[p] == "bool") v = template_repeat_bool_callback(item, p); else if(options[p] == "price") v = template_repeat_price_callback(item, p); else if(options[p] == "shortprice") v = template_repeat_shortprice_callback(item, p); else if(options[p] == "number") v = template_repeat_number_callback(item, p); else if(options[p] == "date") v = template_repeat_date_callback(item, p); else if(options[p] == "datetime") v = template_repeat_datetime_callback(item, p); else if(options[p] == "shortdate") v = template_repeat_shortdate_callback(item, p); else if(options[p] == "shortdatetime") v = template_repeat_shortdatetime_callback(item, p); else if(options[p] == "fulldata") v = template_repeat_fulldata_callback(item, p); else if(options[p] == "base64") v = template_repeat_base64_callback(item, p); else if(options[p] == "url") v = template_repeat_url_callback(item, p); else if(typeof options[p] === "function") v = options[p](item, p); t = t.replaceAll("$" + p + "$", v).replaceAll("$SHOW_" + p + "$", v == "" ? "hide" : ""); } } } for(var p in item) { let v = get_str(item[p]); if(!options || !options[p]) { t = t.replaceAll("$" + p + "$", v).replaceAll("$SHOW_" + p + "$", v == "" ? "hide" : ""); } } return t; } function template_repeat_default_callback(data, property) { return get_str(data[property]); } function template_repeat_bool_callback(data, property) { if(data[property]) return "Yes"; return "No"; } function template_repeat_price_callback(data, property) { let d = data[property]; if(!d) return ""; d = Number.parseFloat(d); let sign = ""; if(d < 0) { sign = "-"; d *= -1; } return sign + "$" + d.toLocaleString(); } function template_repeat_shortprice_callback(data, property) { return price_short_str(data[property]); } function template_repeat_number_callback(data, property) { return get_num(data[property]); } function template_repeat_date_callback(data, property) { return date_string(data[property]); } function template_repeat_datetime_callback(data, property) { return datetime_string(data[property]); } function template_repeat_shortdate_callback(data, property) { return date_str(data[property]); } function template_repeat_shortdatetime_callback(data, property) { let d = data[property]; if (!d) return ""; if (d[d.length-1] != "Z") d = d + "Z"; let t = new Date(d); return two_digits(t.getHours()) + ":" + two_digits(t.getMinutes()) + " " + (t.getMonth()+1) + "/" + t.getDate(); } function template_repeat_fulldata_callback(data, property) { return JSON.stringify(data); } function template_repeat_base64_callback(data, property) { return btoa(JSON.stringify(data)); } function template_repeat_url_callback(data, property) { return url_str(data[property]); } var QRCode; !function() { function a(a) { this.mode = c.MODE_8BIT_BYTE, this.data = a, this.parsedData = []; for (var b = [], d = 0, e = this.data.length; e > d; d++) { var f = this.data.charCodeAt(d); f > 65536 ? (b[0] = 240 | (1835008 & f) >>> 18, b[1] = 128 | (258048 & f) >>> 12, b[2] = 128 | (4032 & f) >>> 6, b[3] = 128 | 63 & f) : f > 2048 ? (b[0] = 224 | (61440 & f) >>> 12, b[1] = 128 | (4032 & f) >>> 6, b[2] = 128 | 63 & f) : f > 128 ? (b[0] = 192 | (1984 & f) >>> 6, b[1] = 128 | 63 & f) : b[0] = f, this.parsedData = this.parsedData.concat(b) } this.parsedData.length != this.data.length && (this.parsedData.unshift(191), this.parsedData.unshift(187), this.parsedData.unshift(239)) } function b(a, b) { this.typeNumber = a, this.errorCorrectLevel = b, this.modules = null, this.moduleCount = 0, this.dataCache = null, this.dataList = [] } function i(a, b) { if (void 0 == a.length) throw new Error(a.length + "/" + b); for (var c = 0; c < a.length && 0 == a[c]; ) c++; this.num = new Array(a.length - c + b); for (var d = 0; d < a.length - c; d++) this.num[d] = a[d + c] } function j(a, b) { this.totalCount = a, this.dataCount = b } function k() { this.buffer = [], this.length = 0 } function m() { return "undefined" != typeof CanvasRenderingContext2D } function n() { var a = !1 , b = navigator.userAgent; return /android/i.test(b) && (a = !0, aMat = b.toString().match(/android ([0-9]\.[0-9])/i), aMat && aMat[1] && (a = parseFloat(aMat[1]))), a } function r(a, b) { for (var c = 1, e = s(a), f = 0, g = l.length; g >= f; f++) { var h = 0; switch (b) { case d.L: h = l[f][0]; break; case d.M: h = l[f][1]; break; case d.Q: h = l[f][2]; break; case d.H: h = l[f][3] } if (h >= e) break; c++ } if (c > l.length) throw new Error("Too long data"); return c } function s(a) { var b = encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g, "a"); return b.length + (b.length != a ? 3 : 0) } a.prototype = { getLength: function() { return this.parsedData.length }, write: function(a) { for (var b = 0, c = this.parsedData.length; c > b; b++) a.put(this.parsedData[b], 8) } }, b.prototype = { addData: function(b) { var c = new a(b); this.dataList.push(c), this.dataCache = null }, isDark: function(a, b) { if (0 > a || this.moduleCount <= a || 0 > b || this.moduleCount <= b) throw new Error(a + "," + b); return this.modules[a][b] }, getModuleCount: function() { return this.moduleCount }, make: function() { this.makeImpl(!1, this.getBestMaskPattern()) }, makeImpl: function(a, c) { this.moduleCount = 4 * this.typeNumber + 17, this.modules = new Array(this.moduleCount); for (var d = 0; d < this.moduleCount; d++) { this.modules[d] = new Array(this.moduleCount); for (var e = 0; e < this.moduleCount; e++) this.modules[d][e] = null } this.setupPositionProbePattern(0, 0), this.setupPositionProbePattern(this.moduleCount - 7, 0), this.setupPositionProbePattern(0, this.moduleCount - 7), this.setupPositionAdjustPattern(), this.setupTimingPattern(), this.setupTypeInfo(a, c), this.typeNumber >= 7 && this.setupTypeNumber(a), null == this.dataCache && (this.dataCache = b.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)), this.mapData(this.dataCache, c) }, setupPositionProbePattern: function(a, b) { for (var c = -1; 7 >= c; c++) if (!(-1 >= a + c || this.moduleCount <= a + c)) for (var d = -1; 7 >= d; d++) -1 >= b + d || this.moduleCount <= b + d || (this.modules[a + c][b + d] = c >= 0 && 6 >= c && (0 == d || 6 == d) || d >= 0 && 6 >= d && (0 == c || 6 == c) || c >= 2 && 4 >= c && d >= 2 && 4 >= d ? !0 : !1) }, getBestMaskPattern: function() { for (var a = 0, b = 0, c = 0; 8 > c; c++) { this.makeImpl(!0, c); var d = f.getLostPoint(this); (0 == c || a > d) && (a = d, b = c) } return b }, createMovieClip: function(a, b, c) { var d = a.createEmptyMovieClip(b, c) , e = 1; this.make(); for (var f = 0; f < this.modules.length; f++) for (var g = f * e, h = 0; h < this.modules[f].length; h++) { var i = h * e , j = this.modules[f][h]; j && (d.beginFill(0, 100), d.moveTo(i, g), d.lineTo(i + e, g), d.lineTo(i + e, g + e), d.lineTo(i, g + e), d.endFill()) } return d }, setupTimingPattern: function() { for (var a = 8; a < this.moduleCount - 8; a++) null == this.modules[a][6] && (this.modules[a][6] = 0 == a % 2); for (var b = 8; b < this.moduleCount - 8; b++) null == this.modules[6][b] && (this.modules[6][b] = 0 == b % 2) }, setupPositionAdjustPattern: function() { for (var a = f.getPatternPosition(this.typeNumber), b = 0; b < a.length; b++) for (var c = 0; c < a.length; c++) { var d = a[b] , e = a[c]; if (null == this.modules[d][e]) for (var g = -2; 2 >= g; g++) for (var h = -2; 2 >= h; h++) this.modules[d + g][e + h] = -2 == g || 2 == g || -2 == h || 2 == h || 0 == g && 0 == h ? !0 : !1 } }, setupTypeNumber: function(a) { for (var b = f.getBCHTypeNumber(this.typeNumber), c = 0; 18 > c; c++) { var d = !a && 1 == (1 & b >> c); this.modules[Math.floor(c / 3)][c % 3 + this.moduleCount - 8 - 3] = d } for (var c = 0; 18 > c; c++) { var d = !a && 1 == (1 & b >> c); this.modules[c % 3 + this.moduleCount - 8 - 3][Math.floor(c / 3)] = d } }, setupTypeInfo: function(a, b) { for (var c = this.errorCorrectLevel << 3 | b, d = f.getBCHTypeInfo(c), e = 0; 15 > e; e++) { var g = !a && 1 == (1 & d >> e); 6 > e ? this.modules[e][8] = g : 8 > e ? this.modules[e + 1][8] = g : this.modules[this.moduleCount - 15 + e][8] = g } for (var e = 0; 15 > e; e++) { var g = !a && 1 == (1 & d >> e); 8 > e ? this.modules[8][this.moduleCount - e - 1] = g : 9 > e ? this.modules[8][15 - e - 1 + 1] = g : this.modules[8][15 - e - 1] = g } this.modules[this.moduleCount - 8][8] = !a }, mapData: function(a, b) { for (var c = -1, d = this.moduleCount - 1, e = 7, g = 0, h = this.moduleCount - 1; h > 0; h -= 2) for (6 == h && h--; ; ) { for (var i = 0; 2 > i; i++) if (null == this.modules[d][h - i]) { var j = !1; g < a.length && (j = 1 == (1 & a[g] >>> e)); var k = f.getMask(b, d, h - i); k && (j = !j), this.modules[d][h - i] = j, e--, -1 == e && (g++, e = 7) } if (d += c, 0 > d || this.moduleCount <= d) { d -= c, c = -c; break } } } }, b.PAD0 = 236, b.PAD1 = 17, b.createData = function(a, c, d) { for (var e = j.getRSBlocks(a, c), g = new k, h = 0; h < d.length; h++) { var i = d[h]; g.put(i.mode, 4), g.put(i.getLength(), f.getLengthInBits(i.mode, a)), i.write(g) } for (var l = 0, h = 0; h < e.length; h++) l += e[h].dataCount; // if (g.getLengthInBits() > 8 * l) // throw new Error("code length overflow. (" + g.getLengthInBits() + ">" + 8 * l + ")"); for (g.getLengthInBits() + 4 <= 8 * l && g.put(0, 4); 0 != g.getLengthInBits() % 8; ) g.putBit(!1); for (; ; ) { if (g.getLengthInBits() >= 8 * l) break; if (g.put(b.PAD0, 8), g.getLengthInBits() >= 8 * l) break; g.put(b.PAD1, 8) } return b.createBytes(g, e) } , b.createBytes = function(a, b) { for (var c = 0, d = 0, e = 0, g = new Array(b.length), h = new Array(b.length), j = 0; j < b.length; j++) { var k = b[j].dataCount , l = b[j].totalCount - k; d = Math.max(d, k), e = Math.max(e, l), g[j] = new Array(k); for (var m = 0; m < g[j].length; m++) g[j][m] = 255 & a.buffer[m + c]; c += k; var n = f.getErrorCorrectPolynomial(l) , o = new i(g[j],n.getLength() - 1) , p = o.mod(n); h[j] = new Array(n.getLength() - 1); for (var m = 0; m < h[j].length; m++) { var q = m + p.getLength() - h[j].length; h[j][m] = q >= 0 ? p.get(q) : 0 } } for (var r = 0, m = 0; m < b.length; m++) r += b[m].totalCount; for (var s = new Array(r), t = 0, m = 0; d > m; m++) for (var j = 0; j < b.length; j++) m < g[j].length && (s[t++] = g[j][m]); for (var m = 0; e > m; m++) for (var j = 0; j < b.length; j++) m < h[j].length && (s[t++] = h[j][m]); return s } ; for (var c = { MODE_NUMBER: 1, MODE_ALPHA_NUM: 2, MODE_8BIT_BYTE: 4, MODE_KANJI: 8 }, d = { L: 1, M: 0, Q: 3, H: 2 }, e = { PATTERN000: 0, PATTERN001: 1, PATTERN010: 2, PATTERN011: 3, PATTERN100: 4, PATTERN101: 5, PATTERN110: 6, PATTERN111: 7 }, f = { PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]], G15: 1335, G18: 7973, G15_MASK: 21522, getBCHTypeInfo: function(a) { for (var b = a << 10; f.getBCHDigit(b) - f.getBCHDigit(f.G15) >= 0; ) b ^= f.G15 << f.getBCHDigit(b) - f.getBCHDigit(f.G15); return (a << 10 | b) ^ f.G15_MASK }, getBCHTypeNumber: function(a) { for (var b = a << 12; f.getBCHDigit(b) - f.getBCHDigit(f.G18) >= 0; ) b ^= f.G18 << f.getBCHDigit(b) - f.getBCHDigit(f.G18); return a << 12 | b }, getBCHDigit: function(a) { for (var b = 0; 0 != a; ) b++, a >>>= 1; return b }, getPatternPosition: function(a) { return f.PATTERN_POSITION_TABLE[a - 1] }, getMask: function(a, b, c) { switch (a) { case e.PATTERN000: return 0 == (b + c) % 2; case e.PATTERN001: return 0 == b % 2; case e.PATTERN010: return 0 == c % 3; case e.PATTERN011: return 0 == (b + c) % 3; case e.PATTERN100: return 0 == (Math.floor(b / 2) + Math.floor(c / 3)) % 2; case e.PATTERN101: return 0 == b * c % 2 + b * c % 3; case e.PATTERN110: return 0 == (b * c % 2 + b * c % 3) % 2; case e.PATTERN111: return 0 == (b * c % 3 + (b + c) % 2) % 2; default: throw new Error("bad maskPattern:" + a) } }, getErrorCorrectPolynomial: function(a) { for (var b = new i([1],0), c = 0; a > c; c++) b = b.multiply(new i([1, g.gexp(c)],0)); return b }, getLengthInBits: function(a, b) { if (b >= 1 && 10 > b) switch (a) { case c.MODE_NUMBER: return 10; case c.MODE_ALPHA_NUM: return 9; case c.MODE_8BIT_BYTE: return 8; case c.MODE_KANJI: return 8; default: throw new Error("mode:" + a) } else if (27 > b) switch (a) { case c.MODE_NUMBER: return 12; case c.MODE_ALPHA_NUM: return 11; case c.MODE_8BIT_BYTE: return 16; case c.MODE_KANJI: return 10; default: throw new Error("mode:" + a) } else { if (!(41 > b)) throw new Error("type:" + b); switch (a) { case c.MODE_NUMBER: return 14; case c.MODE_ALPHA_NUM: return 13; case c.MODE_8BIT_BYTE: return 16; case c.MODE_KANJI: return 12; default: throw new Error("mode:" + a) } } }, getLostPoint: function(a) { for (var b = a.getModuleCount(), c = 0, d = 0; b > d; d++) for (var e = 0; b > e; e++) { for (var f = 0, g = a.isDark(d, e), h = -1; 1 >= h; h++) if (!(0 > d + h || d + h >= b)) for (var i = -1; 1 >= i; i++) 0 > e + i || e + i >= b || (0 != h || 0 != i) && g == a.isDark(d + h, e + i) && f++; f > 5 && (c += 3 + f - 5) } for (var d = 0; b - 1 > d; d++) for (var e = 0; b - 1 > e; e++) { var j = 0; a.isDark(d, e) && j++, a.isDark(d + 1, e) && j++, a.isDark(d, e + 1) && j++, a.isDark(d + 1, e + 1) && j++, (0 == j || 4 == j) && (c += 3) } for (var d = 0; b > d; d++) for (var e = 0; b - 6 > e; e++) a.isDark(d, e) && !a.isDark(d, e + 1) && a.isDark(d, e + 2) && a.isDark(d, e + 3) && a.isDark(d, e + 4) && !a.isDark(d, e + 5) && a.isDark(d, e + 6) && (c += 40); for (var e = 0; b > e; e++) for (var d = 0; b - 6 > d; d++) a.isDark(d, e) && !a.isDark(d + 1, e) && a.isDark(d + 2, e) && a.isDark(d + 3, e) && a.isDark(d + 4, e) && !a.isDark(d + 5, e) && a.isDark(d + 6, e) && (c += 40); for (var k = 0, e = 0; b > e; e++) for (var d = 0; b > d; d++) a.isDark(d, e) && k++; var l = Math.abs(100 * k / b / b - 50) / 5; return c += 10 * l } }, g = { glog: function(a) { if (1 > a) throw new Error("glog(" + a + ")"); return g.LOG_TABLE[a] }, gexp: function(a) { for (; 0 > a; ) a += 255; for (; a >= 256; ) a -= 255; return g.EXP_TABLE[a] }, EXP_TABLE: new Array(256), LOG_TABLE: new Array(256) }, h = 0; 8 > h; h++) g.EXP_TABLE[h] = 1 << h; for (var h = 8; 256 > h; h++) g.EXP_TABLE[h] = g.EXP_TABLE[h - 4] ^ g.EXP_TABLE[h - 5] ^ g.EXP_TABLE[h - 6] ^ g.EXP_TABLE[h - 8]; for (var h = 0; 255 > h; h++) g.LOG_TABLE[g.EXP_TABLE[h]] = h; i.prototype = { get: function(a) { return this.num[a] }, getLength: function() { return this.num.length }, multiply: function(a) { for (var b = new Array(this.getLength() + a.getLength() - 1), c = 0; c < this.getLength(); c++) for (var d = 0; d < a.getLength(); d++) b[c + d] ^= g.gexp(g.glog(this.get(c)) + g.glog(a.get(d))); return new i(b,0) }, mod: function(a) { if (this.getLength() - a.getLength() < 0) return this; for (var b = g.glog(this.get(0)) - g.glog(a.get(0)), c = new Array(this.getLength()), d = 0; d < this.getLength(); d++) c[d] = this.get(d); for (var d = 0; d < a.getLength(); d++) c[d] ^= g.gexp(g.glog(a.get(d)) + b); return new i(c,0).mod(a) } }, j.RS_BLOCK_TABLE = [[1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9], [1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16], [1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13], [1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9], [1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12], [2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15], [2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14], [2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15], [2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13], [2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16], [4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13], [2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15], [4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12], [3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13], [5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12], [5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16], [1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15], [5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15], [3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14], [3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16], [4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17], [2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13], [4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16], [6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17], [8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16], [10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17], [8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16], [3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16], [7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16], [5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16], [13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16], [17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16], [17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16], [13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17], [12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16], [6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16], [17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16], [4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16], [20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16], [19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]], j.getRSBlocks = function(a, b) { var c = j.getRsBlockTable(a, b); if (void 0 == c) throw new Error("bad rs block @ typeNumber:" + a + "/errorCorrectLevel:" + b); for (var d = c.length / 3, e = [], f = 0; d > f; f++) for (var g = c[3 * f + 0], h = c[3 * f + 1], i = c[3 * f + 2], k = 0; g > k; k++) e.push(new j(h,i)); return e } , j.getRsBlockTable = function(a, b) { switch (b) { case d.L: return j.RS_BLOCK_TABLE[4 * (a - 1) + 0]; case d.M: return j.RS_BLOCK_TABLE[4 * (a - 1) + 1]; case d.Q: return j.RS_BLOCK_TABLE[4 * (a - 1) + 2]; case d.H: return j.RS_BLOCK_TABLE[4 * (a - 1) + 3]; default: return void 0 } } , k.prototype = { get: function(a) { var b = Math.floor(a / 8); return 1 == (1 & this.buffer[b] >>> 7 - a % 8) }, put: function(a, b) { for (var c = 0; b > c; c++) this.putBit(1 == (1 & a >>> b - c - 1)) }, getLengthInBits: function() { return this.length }, putBit: function(a) { var b = Math.floor(this.length / 8); this.buffer.length <= b && this.buffer.push(0), a && (this.buffer[b] |= 128 >>> this.length % 8), this.length++ } }; var l = [[17, 14, 11, 7], [32, 26, 20, 14], [53, 42, 32, 24], [78, 62, 46, 34], [106, 84, 60, 44], [134, 106, 74, 58], [154, 122, 86, 64], [192, 152, 108, 84], [230, 180, 130, 98], [271, 213, 151, 119], [321, 251, 177, 137], [367, 287, 203, 155], [425, 331, 241, 177], [458, 362, 258, 194], [520, 412, 292, 220], [586, 450, 322, 250], [644, 504, 364, 280], [718, 560, 394, 310], [792, 624, 442, 338], [858, 666, 482, 382], [929, 711, 509, 403], [1003, 779, 565, 439], [1091, 857, 611, 461], [1171, 911, 661, 511], [1273, 997, 715, 535], [1367, 1059, 751, 593], [1465, 1125, 805, 625], [1528, 1190, 868, 658], [1628, 1264, 908, 698], [1732, 1370, 982, 742], [1840, 1452, 1030, 790], [1952, 1538, 1112, 842], [2068, 1628, 1168, 898], [2188, 1722, 1228, 958], [2303, 1809, 1283, 983], [2431, 1911, 1351, 1051], [2563, 1989, 1423, 1093], [2699, 2099, 1499, 1139], [2809, 2213, 1579, 1219], [2953, 2331, 1663, 1273]] , o = function() { var a = function(a, b) { this._el = a, this._htOption = b }; return a.prototype.draw = function(a) { function g(a, b) { var c = document.createElementNS("http://www.w3.org/2000/svg", a); for (var d in b) b.hasOwnProperty(d) && c.setAttribute(d, b[d]); return c } var b = this._htOption , c = this._el , d = a.getModuleCount(); Math.floor(b.width / d), Math.floor(b.height / d), this.clear(); var h = g("svg", { viewBox: "0 0 " + String(d) + " " + String(d), width: "100%", height: "100%", fill: b.colorLight }); h.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"), c.appendChild(h), h.appendChild(g("rect", { fill: b.colorDark, width: "1", height: "1", id: "template" })); for (var i = 0; d > i; i++) for (var j = 0; d > j; j++) if (a.isDark(i, j)) { var k = g("use", { x: String(i), y: String(j) }); k.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template"), h.appendChild(k) } } , a.prototype.clear = function() { for (; this._el.hasChildNodes(); ) this._el.removeChild(this._el.lastChild) } , a }() , p = "svg" === document.documentElement.tagName.toLowerCase() , q = p ? o : m() ? function() { function a() { this._elImage.src = this._elCanvas.toDataURL("image/png"), this._elImage.style.display = "block", this._elCanvas.style.display = "none" } function d(a, b) { var c = this; if (c._fFail = b, c._fSuccess = a, null === c._bSupportDataURI) { var d = document.createElement("img") , e = function() { c._bSupportDataURI = !1, c._fFail && _fFail.call(c) } , f = function() { c._bSupportDataURI = !0, c._fSuccess && c._fSuccess.call(c) }; return d.onabort = e, d.onerror = e, d.onload = f, d.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", void 0 } c._bSupportDataURI === !0 && c._fSuccess ? c._fSuccess.call(c) : c._bSupportDataURI === !1 && c._fFail && c._fFail.call(c) } if (this._android && this._android <= 2.1) { var b = 1 / window.devicePixelRatio , c = CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage = function(a, d, e, f, g, h, i, j) { if ("nodeName"in a && /img/i.test(a.nodeName)) for (var l = arguments.length - 1; l >= 1; l--) arguments[l] = arguments[l] * b; else "undefined" == typeof j && (arguments[1] *= b, arguments[2] *= b, arguments[3] *= b, arguments[4] *= b); c.apply(this, arguments) } } var e = function(a, b) { this._bIsPainted = !1, this._android = n(), this._htOption = b, this._elCanvas = document.createElement("canvas"), this._elCanvas.width = b.width, this._elCanvas.height = b.height, a.appendChild(this._elCanvas), this._el = a, this._oContext = this._elCanvas.getContext("2d"), this._bIsPainted = !1, this._elImage = document.createElement("img"), this._elImage.style.display = "none", this._el.appendChild(this._elImage), this._bSupportDataURI = null }; return e.prototype.draw = function(a) { var b = this._elImage , c = this._oContext , d = this._htOption , e = a.getModuleCount() , f = d.width / e , g = d.height / e , h = Math.round(f) , i = Math.round(g); b.style.display = "none", this.clear(); for (var j = 0; e > j; j++) for (var k = 0; e > k; k++) { var l = a.isDark(j, k) , m = k * f , n = j * g; c.strokeStyle = l ? d.colorDark : d.colorLight, c.lineWidth = 1, c.fillStyle = l ? d.colorDark : d.colorLight, c.fillRect(m, n, f, g), c.strokeRect(Math.floor(m) + .5, Math.floor(n) + .5, h, i), c.strokeRect(Math.ceil(m) - .5, Math.ceil(n) - .5, h, i) } this._bIsPainted = !0 } , e.prototype.makeImage = function() { this._bIsPainted && d.call(this, a) } , e.prototype.isPainted = function() { return this._bIsPainted } , e.prototype.clear = function() { this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height), this._bIsPainted = !1 } , e.prototype.round = function(a) { return a ? Math.floor(1e3 * a) / 1e3 : a } , e }() : function() { var a = function(a, b) { this._el = a, this._htOption = b }; return a.prototype.draw = function(a) { for (var b = this._htOption, c = this._el, d = a.getModuleCount(), e = Math.floor(b.width / d), f = Math.floor(b.height / d), g = [''], h = 0; d > h; h++) { g.push(""); for (var i = 0; d > i; i++) g.push(''); g.push("") } g.push("
"), c.innerHTML = g.join(""); var j = c.childNodes[0] , k = (b.width - j.offsetWidth) / 2 , l = (b.height - j.offsetHeight) / 2; k > 0 && l > 0 && (j.style.margin = l + "px " + k + "px") } , a.prototype.clear = function() { this._el.innerHTML = "" } , a }(); QRCode = function(a, b) { if (this._htOption = { width: 256, height: 256, typeNumber: 4, colorDark: "#000000", colorLight: "#ffffff", correctLevel: d.H }, "string" == typeof b && (b = { text: b }), b) for (var c in b) this._htOption[c] = b[c]; "string" == typeof a && (a = document.getElementById(a)), this._android = n(), this._el = a, this._oQRCode = null, this._oDrawing = new q(this._el,this._htOption), this._htOption.text && this.makeCode(this._htOption.text) } , QRCode.prototype.makeCode = function(a) { this._oQRCode = new b(r(a, this._htOption.correctLevel),this._htOption.correctLevel), this._oQRCode.addData(a), this._oQRCode.make(), this._el.title = a, this._oDrawing.draw(this._oQRCode), this.makeImage() } , QRCode.prototype.makeImage = function() { "function" == typeof this._oDrawing.makeImage && (!this._android || this._android >= 3) && this._oDrawing.makeImage() } , QRCode.prototype.clear = function() { this._oDrawing.clear() } , QRCode.CorrectLevel = d }(); /* $A(url, param, callback, prg) - make an AJAX call $AE(e) - create email anchor html $AP(p) - create phone anchor html $ASK(message, buttons) - open ask dialog $C(tag, html, cls, parent) - create new element with tag, html and cls $CK(array, cls) - check elements in array with empty value $CKEM(array, cls) - check elements in array with vaild email $CLA(ele, cls) - add css class for element $CLR(ele, cls) - remove css class for element $CLT(ele, cls) - toggle css class for element $DLG(title, message, buttons) - show dialog $E(ele) - get or query element using ID or Query Selector $EM(ele) - check if email is vaild $ERR(message) - show error $H(ele) - hide element $HTML(ele, html) - get or set HTML of element $INPUT(label, value, type, callback) - open input dialog $K(ele) - get checked of element $JSON(data) - JSON parse or stringify $MSG(message) - show message $N(type, id, cls) - create new element with type, id and cls $Q(parent, query) - query element for parent $QA(parent, query) - query all element for parent $S(ele, disp) - show element with disp $SELECT(label, ar, value, callback) - open select dialog $STO(key, value) - get or set storage data $STR(data) - get string data $T(ele) - toggle element with disp $TEXT(label, value, callback) - open text dialog $TMPL(ele) - get template html content $U(url) - create URL string from url $V(ele, value) - get or set value of element */ function $C(tag, html, cls, parent) { if(!tag) tag = 'div'; let e = document.createElement(tag); if(html) e.innerHTML = html; if(cls) e.className = cls; parent = $E(parent); if(parent) parent.appendChild(e); return e; } function $R(ele) { if(ele && ele.parentElement) return ele.parentElement.removeChild(ele); } function $E(ele) { let e = ele; if(typeof ele === "object") return ele; if(typeof ele === "string") { e = document.getElementById(ele); if(!e) e = document.querySelector(ele); } return e; } function $V(ele, value) { ele = $E(ele); if(!ele) return; if(value) ele.value = value; else return ele.value; } function $K(ele, value) { ele = $E(ele); if(!ele) return; if(value) ele.checked = value; else return ele.checked; } function $S(ele, disp) { if(Array.isArray(ele)) ele.forEach(function(e) { $S(e) }); else { ele = $E(ele); if(!ele) return; if(!disp) disp = "block"; ele.style.display = disp; } } function $H(ele) { if(Array.isArray(ele)) ele.forEach(function(e) { $H(e) }); else { ele = $E(ele); if(!ele) return; ele.style.display = "none"; } } function $T(ele, disp) { if(Array.isArray(ele)) ele.forEach(function(e) { $T(e) }); else { ele = $E(ele); if(!ele) return; if(!disp) disp = "block"; if(ele.style.display == "none") ele.style.display = disp; else ele.style.display ="none"; } } function $CLA(ele, cls) { let e = $E(ele); if(!e) return; e.classList.add(cls); } function $CLR(ele, cls) { let e = $E(ele); if(!e) return; e.classList.remove(cls); } function $CLT(ele, cls) { let e = $E(ele); if(!e) return; e.classList.toggle(cls); } function $MSG(message) { return show_message(message); } function $ERR(message) { return show_error(message); } function $EM(ele) { return valid_email($V(ele)); } function $CKEM(array, cls, animation, msg) { if(!msg) msg = "Input vaild email address."; return $CK(array, cls, animation, $EM, msg); } function $N(type, id, cls) { if(!type) type = "div"; let ele = document.createElement(type); if(cls) ele.className = cls; if(id) ele.id = id; return ele; } function $STO(key, value) { if(value) localStorage.setItem(key, value); else return localStorage.getItem(key); } function $STR(data) { return data ? data.toString() : ''; } function $HTML(ele, html) { let e = $E(ele); if(!e) return ""; if(html || html == "") e.innerHTML = html; else return e.innerHTML; } function $JSON(data) { if(typeof data === "string") { if(!data.startsWith("[{") && !data.startsWith("{")) return null; return JSON.parse(data); } return JSON.stringify(data); } function $Q(parent, query) { if(!parent) parent = document; if(typeof parent == "string") parent = $E(parent); if(!parent) return []; if(!query) return null; return parent.querySelector(query); } function $QA(parent, query) { if(!parent) parent = document; if(typeof parent == "string") parent = $E(parent); if(!parent) return []; if(!query) return null; let ar = []; let qa = parent.querySelectorAll(query); qa.forEach(function(e) { ar.push(e); }); return ar; } function $CK(array, cls, animation, check, msg) { if(!Array.isArray(array)) array = [array]; if(!cls) cls = "missed"; if(!animation) animation = animate_missed; if(!check) check = $V; if(!msg) msg = "Input all required fields."; let p = true; for(let i=0; i" + e + ""; return ""; } function $AP(e) { if(e) return "" + e + ""; return ""; } function $U(u) { return $STR(u).replace(/\W+/g, "-").toLowerCase(); } function $F(v) { if(!v) return 0; v = Number.parseFloat(v); return Math.round(v * 1000) / 1000; } /*** function on_submit() { let fields = [ { name: "name", label: "Full Name", required: true, forname: true }, { name: "phone", label: "Phone Number", required: true }, { name: "email", label: "Email Address", required: true, email: true, foremail: true }, { name: "picture", file: true }, { name: "detail", label: "Detail", fordetail: true }, ]; xmj_form_submit(".form", fields, function (param, name, email, detail, images) { $A("/Api2/SendRequest", { fullname: name, email: email, detail: detail, // images: images, fields: param }, function (data) { console.log(data); data = data.split(":"); $ERR(data.length > 1 ? data[1] : data[0]); }, "Please wait..."); }); } ***/ function xmj_form_submit(form, field_list, callback) { { form = $E(form); if (!form || !Array.isArray(field_list)) return; let param = []; let passed = false; let elements1 = []; let elements2 = []; let uploads = []; let names = []; let emails = []; let details = []; let images = []; field_list.forEach(function (f) { let ele = $Q(form, "." + f.name); let val = f.value ? f.value : (ele ? ele.value : null); !(f.upload || f.file) && val && param.push({ name: f.name.replaceAll("_", ""), label: f.label ? f.label : f.name, value: val, }); if ((f.upload || f.file) && ele.files.length > 0) { uploads.push({ field: f, files: [...ele.files] }); } if (f.required) elements1.push(ele); if (f.email) elements2.push(ele); if (f.forname) names.push(val); if (f.foremail) emails.push(val); if (f.fordetail) details.push(val); }); if (!$CK(elements1)) return; if (!$CKEM(elements2)) return; upload_files(); function upload_files() { if (uploads.length == 0) { callback && callback(param, names.join(' '), emails.join(","), details.join("\n"), images); return; } let u = uploads[0]; uploads = uploads.slice(1); upload_file(u); function upload_file(u) { if (u.files.length == 0) { if (u.field.value) { param.push({ name: u.field.name.replaceAll("_", ""), label: u.field.label ? u.field.label : u.field.name, value: u.field.value.join(","), file: true, }); } upload_files(); return; } let f = u.files[0]; u.files = u.files.slice(1); upload_file_simple(f, u.field.name + "_", function (upload_path) { images.push(upload_path); if (!u.field.value) u.field.value = []; u.field.value.push(upload_path); upload_file(u); } ); } } return form; } } function xmj_get_param_field(param, field) { if (!param || !field) return null; for (let i = 0; i < param.length; i++) { if (param[i].name == field) return param[i]; } return null; } function xmj_get_param_value(param, field) { field = xmj_get_param_field(param, field); if (field) return field.value; return null; } function toggle_element(element) { if (typeof element === "string") element = document.getElementById(element); if (!element) return; element.style.display = element.style.display !== "block" ? "block" : "none"; } // show_dialog("sample", "dialog", null, -1); // show_dialog("sample", "dialog", "OK", 5000); // show_dialog("sample", "dialog", ["Yes", function (button) { alert(button); }, "No", "Cancel"], 1500); function getBrowserVersion() { const ua = navigator.userAgent; let tem; let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; if (/trident/i.test(M[1])) { tem = /\brv[ :]+(\d+)/g.exec(ua) || []; return 'IE ' + (tem[1] || ''); } if (M[1] === 'Chrome') { tem = ua.match(/\b(OPR|Edge)\/(\d+)/); if (tem != null) return tem.slice(1).join(' ').replace(/OPR/g, 'Opera'); } M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']; if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]); return M.join(' '); } function goback() { window.history.back(); } function hash(data) { return Sha256.hash(data); } function set_editor_content(content) { editor.setValue(get_str(content)); editor.setScrollPosition({ scrollTop: 0 }); editor.setPosition({ lineNumber: 0, column: 0 }); editor.focus(); } function start_heart_beat(interval) { if (interval == null) interval = 60000; setInterval(function () { ajax("POST", "/Api/HeartBeat", null, function (data) { console.log(data); }); }, interval); } function start_auto_login(interval) { if (interval == null) interval = 60000; const uuid = get_uuid(); if (uuid !== "") { setInterval(function () { ajax("POST", "/Manager/Login/Api/AutoLogin", { uuid: uuid }); }, interval); } } function create_editor(id, lang) { if (lang == null || lang === "") lang = "html"; return monaco.editor.create(document.getElementById(id), { value: "", automaticLayout: true, language: lang, quickSuggestions: false, wordWrap: "bounded", wordWrapColumn: 1000, wrappingIndent: "indent" }); } function get_uuid() { let uuid = get_storage("REC_MANAGER_UUID"); if (uuid == null || uuid === "") { uuid = generate_uuid(); set_storage("REC_MANAGER_UUID", uuid); } return uuid; } function generate_uuid() { if (crypto && crypto.randomUUID) { return crypto.randomUUID(); } return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } function get_storage(key) { return localStorage.getItem(key); } function set_storage(key, value) { localStorage.setItem(key, value); } function switch_elements(elements, index) { elements.forEach((el, i) => { if (i === index) show_element(el); else hide_element(el); }); } function format_money(amount, decimalCount = 2, decimal = ".", thousands = ",") { try { decimalCount = Math.abs(decimalCount); decimalCount = isNaN(decimalCount) ? 2 : decimalCount; const negativeSign = amount < 0 ? "-" : ""; const i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString(); const j = (i.length > 3) ? i.length % 3 : 0; return negativeSign + (j ? i.slice(0, j) + thousands : '') + i.slice(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : ""); } catch (e) { console.log(e); } } function init_checkboxes() { const elements = document.querySelectorAll(".checkbox"); elements.forEach(el => { const label = el.getAttribute("label") || ""; const checked = el.getAttribute("checked") ? "checked" : ""; el.innerHTML = generate_checkbox_string(label, checked); el.isChecked = function () { return this.querySelector("input").checked; }; el.setCheck = function (checked) { this.querySelector("input").checked = checked; }; }); } function create_checkbox(label, checked) { const div_checkbox = document.createElement("div"); div_checkbox.className = "checkbox"; const checkedAttr = checked ? "checked" : ""; div_checkbox.innerHTML = generate_checkbox_string(label, checkedAttr); div_checkbox.isChecked = function () { return this.querySelector("input").checked; }; div_checkbox.setCheck = function (checked) { this.querySelector("input").checked = checked; }; return div_checkbox; } function generate_checkbox_string(label, checked) { return ``; } function get_element_attr_value(element, attr) { return element.getAttribute(attr) || ""; } function init_links(query) { const elements = document.querySelectorAll(query); elements.forEach(el => { const href = el.getAttribute("href"); let target = el.getAttribute("target") || "_current"; if (!href) return; el.addEventListener("click", () => { window.open(href, target); }); }); } function init_filter_inputs() { const inputs = document.querySelectorAll("input[filter]"); inputs.forEach(input => { const filter = input.getAttribute("filter"); const targets = document.querySelectorAll(`[name="${filter}"]`); if (targets.length === 0) return; input.filter_target = targets; input.addEventListener("keyup", function () { const key = this.value.toLowerCase(); this.filter_target.forEach(target => { const options = target.querySelectorAll("option"); options.forEach(option => { option.style.display = option.innerHTML.toLowerCase().includes(key) ? "block" : "none"; }); }); }); }); } function show_dialog(title, body, buttons, timeout, onclose) { const div_dialog = document.createElement("div"); div_dialog.className = "my_dialog"; const div_content = document.createElement("div"); div_content.className = "dlg_content"; div_dialog.appendChild(div_content); if (title != null && title !== "") { const div_title = document.createElement("div"); div_title.className = "dlg_title"; div_title.innerHTML = title; div_content.appendChild(div_title); } if (body != null && body !== "") { const div_message = document.createElement("div"); div_message.className = "dlg_message"; if (typeof body === "string") div_message.innerHTML = body; else if (typeof body === "object" && body.nodeType) div_message.appendChild(body); div_content.appendChild(div_message); } if (buttons != null && buttons.length > 0) { const div_buttons = document.createElement("div"); div_buttons.className = "dlg_buttons"; const fragment = document.createDocumentFragment(); if (typeof buttons === "string") { const button = document.createElement("button"); button.innerHTML = buttons; button.addEventListener("click", () => { div_dialog.selected_button = button; close_dialog(div_dialog, onclose); }); fragment.appendChild(button); } else { for (let i = 0; i < buttons.length; i++) { if (typeof buttons[i] !== "string") continue; const button = document.createElement("button"); button.innerHTML = buttons[i]; if (i < buttons.length - 1 && typeof buttons[i + 1] === "function") { button.addEventListener("click", () => { div_dialog.selected_button = button; if (buttons[i + 1](button) !== false) close_dialog(div_dialog, onclose); }); } else { button.addEventListener("click", () => { div_dialog.selected_button = button; close_dialog(div_dialog, onclose); }); } fragment.appendChild(button); } } div_buttons.appendChild(fragment); div_content.appendChild(div_buttons); } if (timeout > 0) setTimeout(() => { close_dialog(div_dialog, onclose); }, timeout); open_dialog(div_dialog); return div_dialog; } // let old_body_overflow_for_dialog = null; function open_dialog(dialog) { // old_body_overflow_for_dialog = document.body.style.overflow; // document.body.style.overflow = "hidden"; document.body.appendChild(dialog); } function close_dialog(dialog, onclose) { if (onclose != null && onclose(dialog.selected_button) === false) return; if (document.body.contains(dialog)) document.body.removeChild(dialog); // document.body.style.overflow = old_body_overflow_for_dialog; } function show_message(message, timeout = 1000, onclose) { return show_dialog(null, message, null, timeout, onclose); } function show_error(error, onclose) { return show_dialog(null, error, "OK", -1, onclose); } function show_dialog_for_design(title, design, buttons, timeout, onclose) { const div_design = document.querySelector(`[name="${design}"]`); if (!div_design) return; return show_dialog(title, div_design, buttons, timeout, onclose); } function get_dialog_element_value(dialog, element_id) { const element = dialog.querySelector("#" + element_id); return element ? element.value : null; } function set_dialog_element_value(dialog, element_id, value) { const element = dialog.querySelector("#" + element_id); if (element) element.value = value; } function get_dialog_element_checked(dialog, element_id) { const element = dialog.querySelector("#" + element_id); return element ? element.checked : null; } function set_dialog_element_checked(dialog, element_id, val) { const element = dialog.querySelector("#" + element_id); if (element) element.checked = val; } function dialog_element(dialog, element_id) { return dialog.querySelector("#" + element_id); } // Replace name with class function get_string(data) { return data == null ? "" : data; } function add_str(arr, str) { if (str == null) return; str = str.trim(); if (str === "") return; arr.push(str); } function get_addr_str(addr, city, state, zip) { const data = []; add_str(data, addr); add_str(data, city); add_str(data, state); add_str(data, zip); return data.join(","); } function is_null(data) { return data == null; } function get_email_atag(email, prefix) { if (is_null(email) || email === "") return ""; return get_str(prefix) + `${email}`; } function get_phone_atag(data, prefix) { if (is_null(data) || data === "") return ""; return get_str(prefix) + `${data}`; } function get_http_atag(data, prefix) { if (is_null(data) || data === "") return ""; return get_str(prefix) + `[${data}]`; } function get_agency_atag(data) { if (is_null(data)) return ""; return `${get_string(data.Name)}`; } function get_domain_atag(domain) { if (is_null(domain) || domain === "") return ""; return `[${domain}]`; } function get_domain_atag_v2(domain) { if (is_null(domain) || is_null(domain.Domain) || domain.Domain === "") return ""; return `[dev] [${domain.Domain}]`; } function get_dev_domain_atag(domain) { if (is_null(domain) || domain === "") return ""; return `[dev]`; } function get_http_url(url) { if (is_null(url) || url === "") return ""; return url.startsWith("http") ? url : "http://" + url; } if (typeof on_start === "function") window.addEventListener('load', on_start, false); if (typeof on_keyup === "function") window.addEventListener('keyup', on_keyup, false); if (typeof on_keydown === "function") window.addEventListener('keydown', on_keydown, false); if (typeof on_keypress === "function") window.addEventListener('keypress', on_keypress, false); function ismobile() { return screen.width < 900 || window.innerWidth < 900; } function on_load(callback) { if (callback && typeof callback === "function") window.addEventListener('load', callback, false); } function get_design_form_text(design_name, params) { const div_design = document.querySelector(`[name="${design_name}"]`); if (!div_design) return ""; let str = div_design.innerText; if (params && params.length > 0) { for (let i = 0; i < params.length; i += 2) { if (i < params.length - 1) { str = str.replace(new RegExp(params[i], 'g'), params[i + 1]); } } } return str; } function get_class_form_html(design_id, params) { const div_design = document.getElementById(design_id); if (!div_design) return ""; let str = div_design.innerHTML; if (params && params.length > 0) { for (let i = 0; i < params.length; i += 2) { if (i < params.length - 1) { str = str.replace(new RegExp(params[i], 'g'), params[i + 1]); } } } return str; } function get_class_form_text(design_id, params) { const div_design = document.getElementById(design_id); if (!div_design) return ""; let str = div_design.innerText; if (params && params.length > 0) { for (let i = 0; i < params.length; i += 2) { if (i < params.length - 1) { str = str.replace(new RegExp(params[i], 'g'), params[i + 1]); } } } return str; } function get_template_html(template) { if (typeof template === "string") template = document.querySelector("template#" + template); return template ? template.innerHTML : ""; } function getQueryString(key) { const res = {}; const qs = location.search.substring(1); const pattern = /([^&=]+)=([^&]*)/g; let itm; while (itm = pattern.exec(qs)) { const k = decodeURIComponent(itm[1]); const v = decodeURIComponent(itm[2]); if (key && k === key) return v; res[k] = v; } return key ? null : res; } function isInViewport(element) { if (typeof element === "string") element = document.getElementById(element); if (!element) return false; const rect = element.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } function to_param_value(val) { const v = val.trim(); return v ? v : null; } function valid_email(email) { const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(email); } function ajax(method, url, param, callback, failed, prg) { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4) { if (prg) close_dialog(prg); if (this.status === 200) { if (callback) callback(this.responseText); } else { if (failed) failed(this.responseText); } } }; xhttp.open(method, url, true); if (param) { xhttp.setRequestHeader("Content-type", "application/json"); xhttp.send(JSON.stringify(param)); } else xhttp.send(); } function ajax_xml(method, url, param, callback, failed) { const xhttp = new XMLHttpRequest(); xhttp.onload = function () { if (callback) callback(xhttp.responseXML); }; xhttp.onerror = function () { if (failed) failed(xhttp.statusText); }; xhttp.open(method, url, true); if (param) { xhttp.setRequestHeader("Content-type", "application/json"); xhttp.send(JSON.stringify(param)); } else xhttp.send(); } function add_css_class(element, css_class) { if (!css_class) return; if (typeof element === "string") element = document.getElementById(element); if (!element) return; element.classList.add(css_class); } function remove_css_class(element, css_class) { if (!css_class) return; if (typeof element === "string") element = document.getElementById(element); if (!element) return; element.classList.remove(css_class); } function toggle_css_class(element, css_class) { if (!css_class) return; if (typeof element === "string") element = document.getElementById(element); if (!element) return; element.classList.toggle(css_class); } function add_css_class_by_id(element_id, css_class, parent = document) { const element = parent.getElementById(element_id); add_css_class(element, css_class); } function remove_css_class_by_id(element_id, css_class, parent = document) { const element = parent.getElementById(element_id); remove_css_class(element, css_class); } function toggle_menu() { } function sticky_check() { if (isInViewport("sticky_checker")) remove_css_class_by_id("header_sticky", "sticky"); else add_css_class_by_id("header_sticky", "sticky"); } window.addEventListener("scroll", sticky_check); sticky_check(); if (window["mls_init_source_select"]) mls_init_source_select("select_source"); let auto_testimonial_dialog_show = false; const new_testimonial_path = "/TestimonialAdd"; var global_config = { mls_agents_template: "card_small", mls_agent_profile_page: "/AgentPage", mls_listing_template: "card_modern", mls_photo_gallery_type: "vertical", mls_property_detail_show: "_self", mls_property_detail_type: "fullwidth", mls_map_search_type: "wrapper", mls_map_color_theme: "color", mls_map_listing_template: "card_modern_with_contact", mls_map_center: { lat: 26.1037391, lng: -80.4475053}, // mls_map_restricted_area: { // north: 48.754995, // west: -128.284486, // south: 21.461609, // east: -62.366525}, mls_map_default_zoom: 8, mls_map_minimal_zoom: 1, mls_map_remember_last_area: true, mls_map_remember_last_query: true, mls_map_search_timer: 4000, mls_map_drag_timer: 2000, mls_map_marker_html_callback: "my_mls_map_marker", mls_popup_listing_template: "card_mini", mls_no_listings_message: "", hide_create_alert_link: false, mls_map_search_init_query: "STATUS=[Active,Coming Soon]", mls_search_form_init_param: { order: "!MODIFICATIONTIMESTAMP", query: "STATUS=[Active,Coming Soon]" }, mls_advanced_search_timer: eval("1000"), mls_advanced_search_type: "stack", } function on_type_change() { mls_property_detail(get_element_val("select_type")); } document.addEventListener('DOMContentLoaded', function () { const retryInterval = 200; // Interval in milliseconds const maxRetries = 50; // Maximum retries (10 seconds) let attempts = 0; const parsePrice = (priceStr) => parseFloat(priceStr.replace(/[^0-9.]/g, '')); const processPriceACRE = (dataElement) => { const mainPriceText = dataElement.childNodes[0]?.nodeValue?.trim(); if (!mainPriceText) { console.warn('Main price not found in .data element:', dataElement); return; } const mainPrice = parsePrice(mainPriceText); const priceACREElement = dataElement.querySelector('.PriceACRE'); if (priceACREElement) { const priceACREText = priceACREElement.textContent.trim(); const priceACRE = parsePrice(priceACREText); if (priceACRE > mainPrice) { priceACREElement.style.display = 'none'; console.log('PriceACRE hidden for element:', dataElement); } } else { console.warn('PriceACRE element not found in:', dataElement); } }; const processAllDataElements = () => { const dataElements = document.querySelectorAll('.data'); if (dataElements.length === 0) return false; console.log(`Processing ${dataElements.length} .data element(s).`); dataElements.forEach(processPriceACRE); return true; }; const timer = setInterval(() => { if (processAllDataElements() || ++attempts >= maxRetries) { console.log('Stopping retries.'); clearInterval(timer); } }, retryInterval); });