CINXE.COM
Bergen County, NJ
<!DOCTYPE html> <html lang=en> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="referrer" content="origin"> <title>Bergen County, NJ</title> <link rel="shortcut icon" href="https://assets.bonfirehub.com/17437/img/favicon.ico"> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/reset.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/common.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/public.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/datatables/jquery.dataTables.css" > <link rel='stylesheet' type='text/css' href="https://assets.bonfirehub.com/17437/css/jqmodal.css" /> <link rel='stylesheet' type='text/css' href="https://assets.bonfirehub.com/17437/css/bonfire/bfModal.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/node_modules/fullcalendar/dist/fullcalendar.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/fullcalendar/fullcalendar_portal.css" /> <link rel='stylesheet' type='text/css' href="https://assets.bonfirehub.com/17437/css/readmore.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/node_modules/tooltipster/dist/css/tooltipster.bundle.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/dropit/dropit.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/node_modules/select2/dist/css/select2.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/bootstrap-tabs/bootstrap-tabs.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/font-awesome/css/fontawesome.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/font-awesome/css/regular.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/font-awesome/css/solid.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/font-awesome/css/v4-shims.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/font-awesome/css/v4-font-face.min.css" /> <link rel="stylesheet" type="text/css" href="https://assets.bonfirehub.com/17437/css/bonfire/custom.css" /> <link rel="stylesheet" href="https://assets.bonfirehub.com/17437/dist/top-bar-app/css/app.css"> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/jquery/dist/jquery.min.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/jquery-migrate/dist/jquery-migrate.min.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/jquery-ui-dist/jquery-ui.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/jqModal.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/moment/min/moment.min.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/moment/min/moment-with-locales.min.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/moment-timezone/builds/moment-timezone-with-data.min.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/fullcalendar/dist/fullcalendar.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/fullcalendar/dist/lang-all.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/datatables.net/js/jquery.dataTables.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/datatables.net-plugins/sorting/natural.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/readmore-js/readmore.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/tooltipster/dist/js/tooltipster.bundle.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/dropit/dropit.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/sortablejs/Sortable.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/underscore/underscore-min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/select2/dist/js/select2.full.min.js" ></script> <script> var Bonfire = (function (bonfire) { var timezone = "America\/New_York"; // -- Public Api bonfire.timezone = timezone; return bonfire; }(Bonfire || {})); </script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/dist/bonfire-common/lang/en.js" ></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/bonfire/app.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/bonfire/bonfireConstants.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/bonfire/bonfireUtil.js"></script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/bonfire/bonfireDataTables.js" ></script> <script type="text/javascript"> // may be null var userId = null; if (userId === null) { userId = 'User is not logged in'; } // make sure userId is a string userId = userId.toString(); window._trackJs = { enabled: true, token: "a4685d9ee05041ab9c406ca68838f561" || '', application: "us-production" || 'dev', userId: userId, onError: function (payload, error) { // Add the error's name if present to the metadata array payload.metadata.push({ key: 'Error Name', value: error.name || 'Not Defined' }); // Ensure error is sent return true; } }; </script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/node_modules/trackjs/tracker.js" ></script> <script type="text/javascript"> window.addEventListener('securitypolicyviolation', function(event) { var reportError = new Error(JSON.stringify(event, [ 'blockedURI', 'columnNumber', 'disposition', 'documentURI', 'effectiveDirective', 'lineNumber', 'referrer', 'sample', 'sourceFile', 'statusCode', 'violatedDirective' ])); reportError.name = "CSP Violation" if (window.trackJs) { trackJs.track(reportError); } }); </script> <script> // analyticsSettings may be undefined/null. (function(analyticsSettings) { if (typeof analyticsSettings === 'undefined' || analyticsSettings === null) { return; } var apiKey = analyticsSettings.pendoApiKey; (function(p,e,n,d,o){var v,w,x,y,z;o=p[d]=p[d]||{};o._q=[]; v=['initialize','identify','updateOptions','pageLoad'];for(w=0,x=v.length;w<x;++w)(function(m){ o[m]=o[m]||function(){o._q[m===v[0]?'unshift':'push']([m].concat([].slice.call(arguments,0)));};})(v[w]); y=e.createElement(n);y.async=!0;y.src='https://cdn.pendo.io/agent/static/'+apiKey+'/pendo.js'; z=e.getElementsByTagName(n)[0];z.parentNode.insertBefore(y,z); })(window,document,'script','pendo'); var options = { account: { id: analyticsSettings.organization.name, bonfireOrganizationId: analyticsSettings.organization.id, database: analyticsSettings.database.name } }; if (analyticsSettings.user !== null) { options.visitor = { id: analyticsSettings.user.email, bonfireUserId: analyticsSettings.user.id, dateCreated: analyticsSettings.user.dateCreated, isBuyer: analyticsSettings.user.isBuyer, isVendor: analyticsSettings.user.isVendor, isPremiumVendor: analyticsSettings.user.isPremiumVendor, isSeatHolder: analyticsSettings.user.isSeatHolder, isEvaluator: analyticsSettings.user.isEvaluator, isContractManager: analyticsSettings.user.isContractManager, page: window.location.href }; } pendo.initialize(options); })({"pendoApiKey":"3f89d56c-d478-489b-7c4c-2c0fde02765f","organization":{"id":"471","name":"Bergen County, NJ"},"user":null,"database":{"name":"us-production"}}); </script> <script type="text/javascript" src="https://play.vidyard.com/embed/v4.js"></script> </head> <body> <dialog id="masterLoading" style="padding: 0; margin: 0;"> <div style="height: 100%; width: 100%; position: fixed; left: 0px; top: 0px; z-index: 99999; opacity: 0.2; -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(opacity=20)';" class="jqmOverlay"></div> <div id="loading"><span id="masterLoadingText">Working</span>...<br><img src="/img/spinner.gif" class="loading_img" alt="loading" /> </div> </dialog> <div id="masterSuccess" class="pageNotificationStrip reversed-green bold"> </div> <div id="masterFail" class="pageNotificationStrip reversed-orange bold"> </div> <noscript> <div class="badBrowserOverlay"></div> <div class="badBrowserMessageBox"> <div id="noScript"> <p><strong>WARNING:</strong>This site was designed to use Javascript, which has been disabled in your browser</p> <br> <p><strong>Enabling Javascript is easy: <a href="http://support.google.com/bin/answer.py?hl=en&answer=23852" target="_blank" rel="noopener noreferrer">refer to these instructions.</a></strong></p> <br> <p>If you require assistance or think this is an error please contact us at <a href='mailto:Support@GoBonfire.com?subject=No%20Javascript%20Warning%20Message%20-%20Bergen%20County%2C%20NJ&body=%0D%0A%20UserAgent%3A%20Mozilla%2F4.0%20%28compatible%3B%20MSIE%207.0%3B%20Windows%20NT%206.0%3B%20SLCC1%3B%20.NET%20CLR%202.0.50727%3B%20.NET%20CLR%203.0.04506%3B%20.NET%20CLR%203.5.21022%3B%20.NET%20CLR%201.0.3705%3B%20.NET%20CLR%201.1.4322%29%0D%0A%20URL%3A%20bonfirehub.com%2Fportal%2F%3Ftab%3DopenOpportunities'>Support@GoBonfire.com</a>.</p> <br> <p>For more technical details regarding the requirements please see the <em>'Minimum System Requirements'</em> on our <a href='/portal/support#requirements'>support page</a></p> </div> </div> </noscript> <dialog class="jqmWindow" id="modal_AccountAccess"></dialog> <dialog class="jqmWindow" id="modal_ApproveProposal"></dialog> <dialog class="jqmWindow" id="modal_CancelProject"></dialog> <dialog class="jqmWindow" id="modal_ChangeUserDepartment"></dialog> <dialog class="jqmWindow" id="modal_CompleteProject"></dialog> <dialog class="jqmWindow" id="modal_ConsensusScorecard"></dialog> <dialog class="jqmWindow" id="modal_CreateAgent"></dialog> <dialog class="jqmWindow" id="modal_CreateASubmission"></dialog> <dialog class="jqmWindow" id="modal_DisqualifyProposal"></dialog> <dialog class="jqmWindow" id="modal_EditUserRoles"></dialog> <dialog class="jqmWindow" id="modal_ImportCriteria"></dialog> <dialog class="jqmWindow" id="modal_ImportQuestionnaire"></dialog> <dialog class="jqmWindow" id="modal_Register"></dialog> <dialog class="jqmWindow" id="modal_ManageAdvisors"></dialog> <dialog class="jqmWindow" id="modal_ManageCriteria"></dialog> <dialog class="jqmWindow" id="modal_ManageEditors"></dialog> <dialog class="jqmWindow" id="modal_ManageEvaluationGroups"></dialog> <dialog class="jqmWindow" id="modal_ManageObservers"></dialog> <dialog class="jqmWindow" id="modal_ManageReviewers"></dialog> <dialog class="jqmWindow" id="modal_ManageSlots"></dialog> <dialog class="jqmWindow" id="modal_Notes"></dialog> <dialog class="jqmWindow" id="modal_PrivateProjectLink"></dialog> <dialog class="jqmWindow" id="modal_ProjectDeclarations"></dialog> <dialog class="jqmWindow" id="modal_ResumeProject"></dialog> <dialog class="jqmWindow" id="modal_RFxWording"></dialog> <dialog class="jqmWindow" id="modal_Scorecard"></dialog> <dialog class="jqmWindow" id="modal_CompleteProjects"></dialog> <dialog class="jqmWindow" id="modal_WelcomeReviewers"></dialog> <dialog class="modalWrapper" id="modal_AmendSubmission"></dialog> <dialog class="modalWrapper" id="modal_CreateEditCategory"></dialog> <dialog class="modalWrapper" id="modal_CreateEditCategoryItem"></dialog> <dialog class="modalWrapper" id="modal_CreateEditDecision"></dialog> <dialog class="modalWrapper" id="modal_CreateEditRequestedDocumentOrData"></dialog> <dialog class="modalWrapper" id="modal_CreateEditRequestedQuestionnaire"></dialog> <dialog class="modalWrapper" id="modal_ProjectAddenda"></dialog> <dialog class="modalWrapper" id="modal_QuestionSetScoringSummary"></dialog> <dialog class="modalWrapper" id="modal_CreateEditContractDocument"></dialog> <dialog class="modalWrapper" id="modal_CreateEditContractRole"></dialog> <dialog class="modalWrapper" id="modal_CreateEditContractReminder"></dialog> <dialog class="modalWrapper" id="modal_CreateEditContractContact"></dialog> <dialog class="modalWrapper" id="modal_CreateTerminatedContract"></dialog> <dialog class="modalWrapper" id="modal_AddEditOrgPrimaryContact"></dialog> <dialog class="modalWrapper" id="modal_EditDepartment"></dialog> <dialog class="modalWrapper" id="modal_CreateDepartment"></dialog> <dialog class="modalWrapper" id="modal_DocusignFileSizeError"></dialog> <dialog class="modalWrapper" id="modal_DocusignFileTypeError"></dialog> <dialog class="modalWrapper" id="modal_AdobesignFileSizeError"></dialog> <dialog class="modalWrapper" id="modal_AdobesignFileTypeError"></dialog> <dialog class="modalWrapper" id="modal_ESignatureRemoveLink"></dialog> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/dist/bonfire-common/lang/en.js" ></script> <div ng-app="TopBarApp" ng-controller="MainCtrl as main" ng-init="main.init({"commonViewData":{"timezone":"America\/New_York","organizationId":"471","organization":{"OrganizationID":"471","OrganizationUUID":"bbfdf77d-756b-4fe0-ba03-af0d70b9673c","OrganizationName":"Bergen County, NJ","OrganizationPortalTitle":null,"OrganizationLogoBucket":"bonfirehub-us-org-logos","OrganizationLogoURL":"\/organizations\/OrganizationID-471\/logos\/OrganizationID-471-Timestamp-1606162892.jpg","OrganizationShortName":"co-bergen-nj","OrganizationIndustryID":null,"OrganizationSubIndustryID":null,"OrganizationLevelOfGovernanceID":null,"VerticalDeprecated":"Municipal","Domain":"co-bergen-nj.bonfirehub.com","Timezone":"America\/New_York","LanguageID":"1","RubricID":"1","CurrencyID":"109","FiscalYearStartMonth":"1","FiscalYearStartDay":"1","DefaultDepartmentID":null,"DefaultModule":"projects","ProjectReferenceNumberAutoIncrement":"1","ProjectReferenceNumberFormula":"","WorkOSOrganizationID":null,"StartDateOrganizationContractKeyID":"3654","EndDateOrganizationContractKeyID":"3655","ValueOrganizationContractKeyID":"3656","OrganizationVendorPerformanceAtRiskThreshold":"70.0000","OrganizationVendorPerformanceMaxAgeOfResponse":"90","DateCreated":"2020-06-15 15:28:02","DateModified":"2025-02-22 02:17:48","IsDeleted":"0","CommodityCodeSetID":"5000000","RegionData":"{\"regions\":[],\"subregions\":[44]}","CustomTranslations":null},"featurePreferences":{"DecisionSensitivityAnalysis":"0","NewCustomEvents":"0","ProposalAnalysisSensitivityAgGrid":"0","DocumentDrafting":"0","McdSplitToExternalSubmissions":"0","ProjectDetailsLeftNav":"1","ProjectIndexLeftNav":"1","Approvals":"1","ApprovalsRevisions":"1","Auctions":"1","Benchmarking":"1","CustomTranslations":"0","DocumentDownloadWarnings":"1","BulkImportUsers":"0","CanadaEuropeFreeTradeAgreement":"0","CanadianFreeTradeAgreementCompliance":"0","AllowMsgContractFiles":"0","ClauseLibrary":"1","ContractManagement":"1","ContractsSideNavigation":"1","eSignature":"0","VendorOnboarding":"0","DataHub":"0","ShowSupportEmailAddresses":"0","AdvancedAlgorithms":"1","AlternateOptions":"1","AnonymousSubmissions":"1","AutoScoreQuestionnaires":"1","BoxProxy":"0","ConsensusScoring":"1","Criteria":"1","DuplicateProject":"1","EmailVendorsSurveyLink":"1","Evaluation":"1","EvaluationGroup":"1","InternalSubmission":"1","Library":"0","MergeApiProjects":"0","PricingSheet":"1","ProjectVendorFields":"1","ProtectedProjects":"0","RatedInputOutOfTenCriteria":"0","ShowDraftRefNumber":"0","SimpleBidding":"1","ViewDocumentsDuringOpenStage":"0","BestValue":"0","BidTables":"1","PartialBidTables":"0","ProjectDeclarations":"1","MultiCategoryDecisions":"1","Questionnaires":"1","ForumConsentVisible":"1","GlobalOpportunities":"1","MySupplierHubLink":"0","CustomIntakeFieldsForm":"1","Intake":"1","IntakeRequesterEdit":"1","BonfireAcademy":"1","BafoViaMessages":"1","CommodityCodes":"1","CommunityProjects":"1","CommunityProjectsVisible":"1","DocumentTakers":"1","InAppPublishingErrorChecking":"1","NigpCommodityCodesSevenDigit":"0","OpenAccessCommunityProject":"0","OpportunityIntentToBid":"1","OpportunityNonDisclosureAgreements":"0","OpportunityQAndA":"1","PortalDepartmentFiltering":"1","PublicAwardNotices":"1","PublicContracts":"1","PublicDocumentTakers":"0","PublicFiles":"1","PublicFilesUnauthenticatedDownloading":"0","PublicPortal":"1","PublicPortalArchives":"1","PublicQAndA":"1","PublicQAndADefaultToPublic":"0","PublicVendorFields":"1","SubcontractorListing":"0","VendorDiscussions":"1","VendorPerformance":"1","VpmWeighting":"1","FullTextSearch":"1","BrowserSubmission":"1","PremiumVendorSignupStep":"1","VendorRegistrationAddressIsMandatory":"0"},"featureFlags":{"FF_88_RELEASE_TOGGLE_PROJECT_TASKS_FRAMEWORK":true,"FF_117_CONTRACT_OWNER_ON_CONTRACTS":false},"featuresAvailability":{"EvaluationGroup":true,"Criteria":true,"Evaluation":true,"ExcelReport":true},"organizationLogoUrl":"https:\/\/bonfirehub-us-org-logos.s3.amazonaws.com\/organizations\/OrganizationID-471\/logos\/OrganizationID-471-Timestamp-1606162892.jpg","language":"en","languageId":"1","userId":null,"user":null,"isAuthenticated":false,"organizationPermissions":[],"allDepartmentPermissions":[],"allContractPermissions":[],"profilePicUrl":"\/img\/no_pic.png","globalVendorForUser":null,"organizationVendorForUser":null,"totangoSettings":false,"analyticsSettings":{"pendoApiKey":"3f89d56c-d478-489b-7c4c-2c0fde02765f","organization":{"id":"471","name":"Bergen County, NJ"},"user":null,"database":{"name":"us-production"}},"bonfireAcademyUrl":null,"bonfireApiBaseUrl":"https:\/\/us-production-api-internal.bonfirehub.com\/v1.0","pvUrl":"https:\/\/vendor.bonfirehub.com"},"pageName":"portal"})"> <bf-top-bar feature-preferences="main.featurePreferences" feature-flags="main.featureFlags" organization-logo-url="{{main.organizationLogoUrl}}" organization="main.organization" user="main.user" is-authenticated="main.isAuthenticated" organization-permissions="main.organizationPermissions" all-department-permissions="main.allDepartmentPermissions" all-contract-permissions="main.allContractPermissions" all-project-permissions="main.allProjectPermissions" profile-pic-url="{{main.profilePicUrl}}" pv-url="main.pvUrl" page-name="main.pageName" bonfire-academy-url="main.bonfireAcademyUrl" is-login-modal="main.isLoginModal" has-vendors="!!main.organizationVendorForUser" ></bf-top-bar> </div><div id="publicBox"> <div id="publicContent"> <div id="publicHeader"> <div id="publicTitle"> <h1>Procurement Portal</h1> <p> <b>Bergen County, NJ</b> </p> </div> <a href="https://co-bergen-nj.bonfirehub.com/portal/"><img src="https://bonfirehub-us-org-logos.s3.amazonaws.com/organizations/OrganizationID-471/logos/OrganizationID-471-Timestamp-1606162892.jpg" id="publicLogo" alt="Organization logo"></a> </div> <div id="publicList"> <script type="text/javascript"> $(document).ready(function () { // May be [] if user is not logged in. var organizationPermissions = []; // May be null if user is not logged in. var organizationVendorForUser = null; var hasVendors = !!organizationVendorForUser; var featurePreferences = {"DecisionSensitivityAnalysis":"0","NewCustomEvents":"0","ProposalAnalysisSensitivityAgGrid":"0","DocumentDrafting":"0","McdSplitToExternalSubmissions":"0","ProjectDetailsLeftNav":"1","ProjectIndexLeftNav":"1","Approvals":"1","ApprovalsRevisions":"1","Auctions":"1","Benchmarking":"1","CustomTranslations":"0","DocumentDownloadWarnings":"1","BulkImportUsers":"0","CanadaEuropeFreeTradeAgreement":"0","CanadianFreeTradeAgreementCompliance":"0","AllowMsgContractFiles":"0","ClauseLibrary":"1","ContractManagement":"1","ContractsSideNavigation":"1","eSignature":"0","VendorOnboarding":"0","DataHub":"0","ShowSupportEmailAddresses":"0","AdvancedAlgorithms":"1","AlternateOptions":"1","AnonymousSubmissions":"1","AutoScoreQuestionnaires":"1","BoxProxy":"0","ConsensusScoring":"1","Criteria":"1","DuplicateProject":"1","EmailVendorsSurveyLink":"1","Evaluation":"1","EvaluationGroup":"1","InternalSubmission":"1","Library":"0","MergeApiProjects":"0","PricingSheet":"1","ProjectVendorFields":"1","ProtectedProjects":"0","RatedInputOutOfTenCriteria":"0","ShowDraftRefNumber":"0","SimpleBidding":"1","ViewDocumentsDuringOpenStage":"0","BestValue":"0","BidTables":"1","PartialBidTables":"0","ProjectDeclarations":"1","MultiCategoryDecisions":"1","Questionnaires":"1","ForumConsentVisible":"1","GlobalOpportunities":"1","MySupplierHubLink":"0","CustomIntakeFieldsForm":"1","Intake":"1","IntakeRequesterEdit":"1","BonfireAcademy":"1","BafoViaMessages":"1","CommodityCodes":"1","CommunityProjects":"1","CommunityProjectsVisible":"1","DocumentTakers":"1","InAppPublishingErrorChecking":"1","NigpCommodityCodesSevenDigit":"0","OpenAccessCommunityProject":"0","OpportunityIntentToBid":"1","OpportunityNonDisclosureAgreements":"0","OpportunityQAndA":"1","PortalDepartmentFiltering":"1","PublicAwardNotices":"1","PublicContracts":"1","PublicDocumentTakers":"0","PublicFiles":"1","PublicFilesUnauthenticatedDownloading":"0","PublicPortal":"1","PublicPortalArchives":"1","PublicQAndA":"1","PublicQAndADefaultToPublic":"0","PublicVendorFields":"1","SubcontractorListing":"0","VendorDiscussions":"1","VendorPerformance":"1","VpmWeighting":"1","FullTextSearch":"1","BrowserSubmission":"1","PremiumVendorSignupStep":"1","VendorRegistrationAddressIsMandatory":"0"}; var isConfirmed = parseInt('0', 10); var departments = {"2487":{"DepartmentID":"2487","OrganizationID":"471","DepartmentName":"Allendale, Borough of","Abbreviation":"All-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:05:58","DateModified":"2020-10-01 20:26:26"},"2488":{"DepartmentID":"2488","OrganizationID":"471","DepartmentName":"Alpine, Borough of","Abbreviation":"Alp-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:06:22","DateModified":"2020-10-01 20:26:26"},"2484":{"DepartmentID":"2484","OrganizationID":"471","DepartmentName":"BC Board of Social Services","Abbreviation":"BC-BSS","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:04:11","DateModified":"2020-10-01 20:26:26"},"2480":{"DepartmentID":"2480","OrganizationID":"471","DepartmentName":"BC Improvement Authority","Abbreviation":"BC-IA","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:01:53","DateModified":"2020-10-01 20:26:26"},"2308":{"DepartmentID":"2308","OrganizationID":"471","DepartmentName":"BC Purchasing","Abbreviation":"","IsInPortalFilter":"1","DateCreated":"2020-06-15 15:28:02","DateModified":"2020-09-02 01:18:29"},"2481":{"DepartmentID":"2481","OrganizationID":"471","DepartmentName":"BC Utilities Authority","Abbreviation":"BC-UA","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:02:17","DateModified":"2020-10-01 20:26:26"},"9996":{"DepartmentID":"9996","OrganizationID":"471","DepartmentName":"Bergen Community College","Abbreviation":"BCC","IsInPortalFilter":"1","DateCreated":"2024-02-01 21:42:19","DateModified":"2024-02-14 17:00:27"},"2489":{"DepartmentID":"2489","OrganizationID":"471","DepartmentName":"Bergenfield, Borough of","Abbreviation":"Ber-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:06:58","DateModified":"2020-10-01 20:26:26"},"2490":{"DepartmentID":"2490","OrganizationID":"471","DepartmentName":"Bogota, Borough of","Abbreviation":"Bog-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:07:48","DateModified":"2020-10-01 20:26:26"},"2491":{"DepartmentID":"2491","OrganizationID":"471","DepartmentName":"Carlstadt, Borough of","Abbreviation":"Car-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:08:11","DateModified":"2020-10-01 20:26:26"},"2492":{"DepartmentID":"2492","OrganizationID":"471","DepartmentName":"Cliffside Park, Borough of","Abbreviation":"Cli-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:08:41","DateModified":"2020-10-01 20:26:26"},"2494":{"DepartmentID":"2494","OrganizationID":"471","DepartmentName":"Closter, Borough of","Abbreviation":"Clo-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:09:00","DateModified":"2020-10-01 20:26:26"},"2495":{"DepartmentID":"2495","OrganizationID":"471","DepartmentName":"Cresskill, Borough of","Abbreviation":"Cre-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:09:31","DateModified":"2020-10-01 20:26:26"},"2500":{"DepartmentID":"2500","OrganizationID":"471","DepartmentName":"Demarest, Borough of","Abbreviation":"Dem-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:10:00","DateModified":"2020-10-01 20:26:26"},"2504":{"DepartmentID":"2504","OrganizationID":"471","DepartmentName":"Dumont, Borough of","Abbreviation":"Dum-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:10:27","DateModified":"2020-10-01 20:26:26"},"2513":{"DepartmentID":"2513","OrganizationID":"471","DepartmentName":"East Rutherford, Borough of","Abbreviation":"Eas-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:11:17","DateModified":"2020-10-01 20:26:26"},"2518":{"DepartmentID":"2518","OrganizationID":"471","DepartmentName":"Edgewater, Borough of","Abbreviation":"Edg-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:11:51","DateModified":"2020-10-01 20:26:26"},"2522":{"DepartmentID":"2522","OrganizationID":"471","DepartmentName":"Elmwood Park, Borough of","Abbreviation":"Elm-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:12:13","DateModified":"2020-10-01 20:26:26"},"2527":{"DepartmentID":"2527","OrganizationID":"471","DepartmentName":"Emerson, Borough of","Abbreviation":"Eme-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:12:42","DateModified":"2020-10-01 20:26:26"},"2539":{"DepartmentID":"2539","OrganizationID":"471","DepartmentName":"Englewood Cliffs, Borough of","Abbreviation":"Eng-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:13:49","DateModified":"2020-10-01 20:26:26"},"2534":{"DepartmentID":"2534","OrganizationID":"471","DepartmentName":"Englewood, City of","Abbreviation":"Eng-Co","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:13:26","DateModified":"2020-10-01 20:26:26"},"2540":{"DepartmentID":"2540","OrganizationID":"471","DepartmentName":"Fair Lawn, Borough of","Abbreviation":"FLawn-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:14:40","DateModified":"2020-10-01 20:26:26"},"2541":{"DepartmentID":"2541","OrganizationID":"471","DepartmentName":"Fairview, Borough of","Abbreviation":"Fview-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:15:00","DateModified":"2020-10-01 20:26:26"},"2542":{"DepartmentID":"2542","OrganizationID":"471","DepartmentName":"Fort Lee, Borough of","Abbreviation":"For-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:15:16","DateModified":"2020-10-01 20:26:26"},"2543":{"DepartmentID":"2543","OrganizationID":"471","DepartmentName":"Franklin Lakes, Borough of","Abbreviation":"Fra-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:15:32","DateModified":"2020-10-01 20:26:26"},"2544":{"DepartmentID":"2544","OrganizationID":"471","DepartmentName":"Garfield, City of","Abbreviation":"Gar-Co","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:15:53","DateModified":"2020-10-01 20:26:26"},"2545":{"DepartmentID":"2545","OrganizationID":"471","DepartmentName":"Glen Rock, Borough of","Abbreviation":"Gle-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:17:38","DateModified":"2020-10-01 20:26:26"},"2546":{"DepartmentID":"2546","OrganizationID":"471","DepartmentName":"Hackensack, City of","Abbreviation":"Hac-Co","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:17:52","DateModified":"2020-10-01 20:26:26"},"2547":{"DepartmentID":"2547","OrganizationID":"471","DepartmentName":"Harrington Park, Borough of","Abbreviation":"Har-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:18:06","DateModified":"2020-10-01 20:26:26"},"2548":{"DepartmentID":"2548","OrganizationID":"471","DepartmentName":"Hasbrouck Heights, Borough of","Abbreviation":"Has-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:18:22","DateModified":"2020-10-01 20:26:26"},"2549":{"DepartmentID":"2549","OrganizationID":"471","DepartmentName":"Haworth, Borough of","Abbreviation":"Haw-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:18:41","DateModified":"2020-10-01 20:26:26"},"2550":{"DepartmentID":"2550","OrganizationID":"471","DepartmentName":"Hillsdale, Borough of","Abbreviation":"Hil-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:19:04","DateModified":"2020-10-01 20:26:26"},"2551":{"DepartmentID":"2551","OrganizationID":"471","DepartmentName":"Ho Ho Kus, Borough of","Abbreviation":"HoH-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:19:27","DateModified":"2020-10-01 20:26:26"},"2552":{"DepartmentID":"2552","OrganizationID":"471","DepartmentName":"Leonia, Borough of","Abbreviation":"Leo-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:19:48","DateModified":"2020-10-01 20:26:26"},"2553":{"DepartmentID":"2553","OrganizationID":"471","DepartmentName":"Little Ferry, Borough of","Abbreviation":"Lit-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:20:46","DateModified":"2020-10-01 20:26:26"},"2554":{"DepartmentID":"2554","OrganizationID":"471","DepartmentName":"Lodi, Borough of","Abbreviation":"Lod-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:21:11","DateModified":"2020-10-01 20:26:26"},"2555":{"DepartmentID":"2555","OrganizationID":"471","DepartmentName":"Lyndhurst, Township of","Abbreviation":"Lyn-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:21:28","DateModified":"2020-10-01 20:26:26"},"2556":{"DepartmentID":"2556","OrganizationID":"471","DepartmentName":"Mahwah, Township of","Abbreviation":"Mah-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:21:45","DateModified":"2020-10-01 20:26:26"},"2557":{"DepartmentID":"2557","OrganizationID":"471","DepartmentName":"Maywood, Borough of","Abbreviation":"May-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:22:03","DateModified":"2020-10-01 20:26:26"},"2558":{"DepartmentID":"2558","OrganizationID":"471","DepartmentName":"Midland Park, Borough of","Abbreviation":"Mid-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:22:17","DateModified":"2020-10-01 20:26:26"},"2559":{"DepartmentID":"2559","OrganizationID":"471","DepartmentName":"Montvale, Borough of","Abbreviation":"Mon-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:22:32","DateModified":"2020-10-01 20:26:26"},"2560":{"DepartmentID":"2560","OrganizationID":"471","DepartmentName":"Moonachie, Borough of","Abbreviation":"Moo-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:22:46","DateModified":"2020-10-01 20:26:26"},"2483":{"DepartmentID":"2483","OrganizationID":"471","DepartmentName":"New Milford, Borough of","Abbreviation":"New-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:03:47","DateModified":"2020-10-01 20:26:26"},"2561":{"DepartmentID":"2561","OrganizationID":"471","DepartmentName":"North Arlington, Borough of","Abbreviation":"NArl-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:23:40","DateModified":"2020-10-01 20:26:26"},"2562":{"DepartmentID":"2562","OrganizationID":"471","DepartmentName":"Northvale, Borough of","Abbreviation":"NVale-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:24:45","DateModified":"2020-10-01 20:26:26"},"2563":{"DepartmentID":"2563","OrganizationID":"471","DepartmentName":"Norwood, Borough of","Abbreviation":"NWood-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:25:06","DateModified":"2020-10-01 20:26:26"},"2482":{"DepartmentID":"2482","OrganizationID":"471","DepartmentName":"NW BC Utilities Authority","Abbreviation":"NW-BC-UA","IsInPortalFilter":"1","DateCreated":"2020-09-15 13:02:56","DateModified":"2020-10-01 20:26:26"},"2564":{"DepartmentID":"2564","OrganizationID":"471","DepartmentName":"Oakland, Borough of","Abbreviation":"Oak-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:25:21","DateModified":"2020-10-01 20:26:26"},"2565":{"DepartmentID":"2565","OrganizationID":"471","DepartmentName":"Old Tappan, Borough of","Abbreviation":"Old-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:25:37","DateModified":"2020-10-01 20:26:26"},"2566":{"DepartmentID":"2566","OrganizationID":"471","DepartmentName":"Oradell, Borough of","Abbreviation":"Ora-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:25:51","DateModified":"2020-10-01 20:26:26"},"2567":{"DepartmentID":"2567","OrganizationID":"471","DepartmentName":"Palisades Park, Borough of","Abbreviation":"Pal-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:26:08","DateModified":"2020-10-01 20:26:26"},"2568":{"DepartmentID":"2568","OrganizationID":"471","DepartmentName":"Paramus, Borough of","Abbreviation":"Para-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:26:35","DateModified":"2020-10-01 20:26:26"},"2569":{"DepartmentID":"2569","OrganizationID":"471","DepartmentName":"Park Ridge, Borough of","Abbreviation":"Park-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:26:50","DateModified":"2020-10-01 20:26:26"},"2570":{"DepartmentID":"2570","OrganizationID":"471","DepartmentName":"Ramsey, Borough of","Abbreviation":"Ram-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:27:07","DateModified":"2020-10-01 20:26:26"},"2571":{"DepartmentID":"2571","OrganizationID":"471","DepartmentName":"Ridgefield, Borough of","Abbreviation":"Rid-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:27:21","DateModified":"2020-10-01 20:26:26"},"2572":{"DepartmentID":"2572","OrganizationID":"471","DepartmentName":"Ridgefield, Park Village of","Abbreviation":"Rid-PVo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:28:12","DateModified":"2020-10-01 20:26:26"},"2573":{"DepartmentID":"2573","OrganizationID":"471","DepartmentName":"Ridgewood, Village of","Abbreviation":"Rid-Vo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:28:35","DateModified":"2020-10-01 20:26:26"},"2574":{"DepartmentID":"2574","OrganizationID":"471","DepartmentName":"River Edge, Borough of","Abbreviation":"REdg-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:29:00","DateModified":"2020-10-01 20:26:26"},"2575":{"DepartmentID":"2575","OrganizationID":"471","DepartmentName":"River Vale, Township of","Abbreviation":"RVal-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:29:25","DateModified":"2020-10-01 20:26:26"},"2576":{"DepartmentID":"2576","OrganizationID":"471","DepartmentName":"Rochelle Park, Township of","Abbreviation":"Roc-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:29:42","DateModified":"2020-10-01 20:26:26"},"2577":{"DepartmentID":"2577","OrganizationID":"471","DepartmentName":"Rutherford, Borough of","Abbreviation":"Rut-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:29:57","DateModified":"2020-10-01 20:26:26"},"2578":{"DepartmentID":"2578","OrganizationID":"471","DepartmentName":"Saddle Brook, Township of","Abbreviation":"SBro-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:30:47","DateModified":"2020-10-01 20:26:26"},"2579":{"DepartmentID":"2579","OrganizationID":"471","DepartmentName":"Saddle River, Borough of","Abbreviation":"SRiv-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:31:05","DateModified":"2020-10-01 20:26:26"},"2580":{"DepartmentID":"2580","OrganizationID":"471","DepartmentName":"South Hackensack, Township of","Abbreviation":"Sou-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:31:29","DateModified":"2020-10-01 20:26:26"},"2581":{"DepartmentID":"2581","OrganizationID":"471","DepartmentName":"Teaneck, Township of","Abbreviation":"Tea-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:31:43","DateModified":"2020-10-01 20:26:26"},"2582":{"DepartmentID":"2582","OrganizationID":"471","DepartmentName":"Tenafly, Borough of","Abbreviation":"Ten-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:31:58","DateModified":"2020-10-01 20:26:26"},"2583":{"DepartmentID":"2583","OrganizationID":"471","DepartmentName":"Teterboro, Borough of","Abbreviation":"Tet-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:32:11","DateModified":"2020-10-01 20:26:26"},"2584":{"DepartmentID":"2584","OrganizationID":"471","DepartmentName":"Upper Saddle River, Borough of","Abbreviation":"Upp-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:32:27","DateModified":"2020-10-01 20:26:26"},"2585":{"DepartmentID":"2585","OrganizationID":"471","DepartmentName":"Waldwick, Borough of","Abbreviation":"Wald-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:32:49","DateModified":"2020-10-01 20:26:26"},"2586":{"DepartmentID":"2586","OrganizationID":"471","DepartmentName":"Wallington, Borough of","Abbreviation":"Wall-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:33:02","DateModified":"2020-10-01 20:26:26"},"2587":{"DepartmentID":"2587","OrganizationID":"471","DepartmentName":"Washington, Township of","Abbreviation":"Was-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:33:17","DateModified":"2020-10-01 20:26:26"},"2588":{"DepartmentID":"2588","OrganizationID":"471","DepartmentName":"Westwood, Borough of","Abbreviation":"Wes-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:33:29","DateModified":"2020-10-01 20:26:26"},"2590":{"DepartmentID":"2590","OrganizationID":"471","DepartmentName":"Wood-Ridge, Borough of","Abbreviation":"WRid-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:34:23","DateModified":"2020-10-01 20:26:26"},"2589":{"DepartmentID":"2589","OrganizationID":"471","DepartmentName":"Woodcliff Lake, Borough of","Abbreviation":"WCli-Bo","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:33:47","DateModified":"2020-10-01 20:26:26"},"2591":{"DepartmentID":"2591","OrganizationID":"471","DepartmentName":"Wyckoff, Township of","Abbreviation":"Wyc-To","IsInPortalFilter":"1","DateCreated":"2020-09-15 19:34:38","DateModified":"2020-10-01 20:26:26"}}; var defaultSectionData = {}; var projectsGroupedByDepartmentGroup = {}; var isMyOpportunities = false; $('#departmentFilterSelect').select2(); var filterOptions = {} $('#departmentFilterSelect').find('option').each(function (e) { filterOptions[$(this).val()] = true; }); var departmentFilter = { departmentGroup: 'noGroup', DepartmentID: '-1' }; // -- Event Handlers $('#portalIndexTabs').on('click', 'a', function (e) { e.preventDefault(); $(this).tab('show'); }); $('a[href$="#openOpportunitiesTabPane"]').one('click', function() { initOpenOpportunitiesTab(); }); $('a[href$="#pastOpportunitiesTabPane"]').one('click', function() { initPastOpportunitiesTab(); }); $('a[href$="#publicContractsTabPane"]').one('click', function() { initPublicContractsTab(); }); $(document).on('change', '#departmentFilterSelect', function () { // Validate value (could be from url) var isValidOption = isDepartmentFilterValid($(this).val()); if (!isValidOption) { $(this).val('noGroup.-1'); $(this).trigger('change'); } var groupAndDepartmentId = $(this).val().split('.'); var group = groupAndDepartmentId[0]; var departmentId = groupAndDepartmentId[1]; departmentFilter = { departmentGroup: group, DepartmentID: departmentId }; if (defaultSectionData.openOpportunities !== undefined) { defaultSectionData.openOpportunities.projects = getFilteredOpportunities( defaultSectionData.openOpportunities.allProjects); loadOpportunitiesTable( 'openOpportunitiesTabPane', 'opportunitiesTableTemplate', defaultSectionData.openOpportunities ); } if (defaultSectionData.pastOpportunities !== undefined) { defaultSectionData.pastOpportunities.projects = getFilteredOpportunities( defaultSectionData.pastOpportunities.allProjects); loadOpportunitiesTable( 'pastOpportunitiesTabPane', 'opportunitiesTableTemplate', defaultSectionData.pastOpportunities, false ); } if (defaultSectionData.myOpportunities !== undefined) { defaultSectionData.myOpportunities.projects = getFilteredOpportunities( defaultSectionData.myOpportunities.allProjects); loadOpportunitiesTable( 'myOpportunitiesTabPane', 'opportunitiesTableTemplate', defaultSectionData.myOpportunities ); } if (defaultSectionData.auctions !== undefined) { defaultSectionData.auctions.auctions = getFilteredOpportunities( defaultSectionData.auctions.allAuctions); loadAuctionsTable( 'auctionsTabPane', 'auctionsTableTemplate', defaultSectionData.auctions ); } // Update URL var newHash = '#'; if (departmentFilter.DepartmentID !== '-1') { newHash += 'department=' + departments[departmentFilter.DepartmentID].DepartmentName; } else if (departmentFilter.departmentGroup !== 'noGroup') { newHash += 'department=' + departmentFilter.departmentGroup + ' - All'; } window.location.hash = newHash; }); // Note: This method does not support multiple URL search parameters $('a[href$="TabPane"]').on('click', function () { // Get the tab name and remove "TabPane" so the link is more human readable // this.href does not include department filtering, so splitting on "#" works var tabPaneName = this.href.split('#')[1].slice(0, -7); var departmentFilter = location.hash; var departmentFilterPieces = departmentFilter.split('='); if (departmentFilterPieces.length < 2 || departmentFilterPieces[0] !== '#department' || !isDepartmentFilterValid(departmentFilterPieces[1])) { departmentFilter = ''; } history.replaceState('', '', '/portal/?tab=' + tabPaneName + departmentFilter); }) var isDepartmentFilterValid = function (departmentFilter) { return filterOptions[departmentFilter] || false; }; var getFilteredOpportunities = function (opportunities) { var filteredOpportunities = _.filter(opportunities, function (opportunity) { // ie: 'All' if (departmentFilter.departmentGroup === 'noGroup' && departmentFilter.DepartmentID === '-1') { return true; // ie: {Group} - All } else if (departmentFilter.DepartmentID === '-1') { if (departments[opportunity.DepartmentID] === undefined) { return false; } var groupAndDepartment = departments[opportunity.DepartmentID].DepartmentName.split(' - '); // ie: the project's department has no group. if (groupAndDepartment.length === 1) { return false; } return groupAndDepartment[0] === departmentFilter.departmentGroup; } return opportunity.DepartmentID === departmentFilter.DepartmentID; }); return filteredOpportunities; }; // -- Init Section var initDepartmentFilter = function () { // Default to All var departmentFilter = { departmentGroup: 'noGroup', DepartmentID: '-1' }; var urlDecoded = decodeURIComponent(window.location.hash.split('#')[1]); var variableNameAndValue = urlDecoded.split('='); if (variableNameAndValue.length === 2 && variableNameAndValue[0] === 'department') { var departmentName = variableNameAndValue[1]; var groupAndDepartment = departmentName.split(' - '); if (groupAndDepartment.length > 1) { departmentFilter.departmentGroup = groupAndDepartment[0]; } var correspondingDepartmentId = _.findKey(departments, function (department) { return department.DepartmentName === departmentName; }) || '-1'; departmentFilter.DepartmentID = correspondingDepartmentId; } $('#departmentFilterSelect').val(departmentFilter.departmentGroup + '.' + departmentFilter.DepartmentID); $('#departmentFilterSelect').trigger('change'); }(); var initOpportunitiesTable = function (tabPaneId) { var tableElem = $('#' + tabPaneId).find('table'); var table = BFDataTables.create( tableElem, { language: { emptyTable: "There are no open projects at this time." }, scrollX: true } ); return table; }; var initAuctionsTable = function (tableElem) { var table = BFDataTables.create( tableElem, { language: { emptyTable: 'There are no auctions to view at this time.' }, scrollX: true } ); return table; }; var initPublicContractsTable = function (tabPaneId) { var tableElem = $('#' + tabPaneId).find('table'); var table = BFDataTables.create( tableElem, { language: { emptyTable: 'There are no public contracts to view at this time.' }, scrollX: true } ); return table; }; // Get the data needed for the Status column (class, label). function getAuctionStatusData(auction) { var nowMoment = moment().tz(Bonfire.timezone); var startDateMoment = BFUtil.createMomentFromUtcDateString( auction.StartDate, BFConstants.DB_DATE_STRING ); var endDateMoment = BFUtil.createMomentFromUtcDateString( auction.EndDate, BFConstants.DB_DATE_STRING ); // Is now <= the start date? if (nowMoment.isBefore(startDateMoment)) { return { statusClass: 'statusPending', statusLabel: 'Pending' }; } // Is now <= the end date? if (endDateMoment.isAfter(nowMoment)) { return { statusClass: 'statusLive', statusLabel: 'Live' }; } // Closed. return { statusClass: 'statusClosed', statusLabel: 'Closed' }; } var loadAuctionsTable = function (tabPaneId, tableTemplateId, sectionData) { BFUtil.initContent( $('#' + tabPaneId), $('#' + tableTemplateId), _.extend({}, sectionData, { getAuctionStatusData: getAuctionStatusData }), function () { var table = initAuctionsTable( $('#' + tabPaneId).find('table') ); // Sort by DaysLeft ASC by default BFDataTables.sortByColumnIfExists(table, 3, 'asc'); BFApp.bootstrapDropit(); } ); }; var loadOpportunitiesTable = function (tabPaneId, tableTemplateId, sectionData, isDaysLeftColumn) { // The Past Public Opportunities table doesn't need a Days Left column. isDaysLeftColumn = (isDaysLeftColumn === false) ? false : true; // In order to sort the projects correctly in the My Opportunities tab, we need to know // what the latest DateClose is in the collection of projects (we don't need to factor // in pastScheduledProjectOpenPeriods here). var projectDateCloseTimestamps = _.map(sectionData.projects, function (project) { return BFUtil.createMomentFromUtcDateString( project.DateClose, BFConstants.DB_DATE_STRING ).unix(); }); // Unix timestamp var latestProjectDateCloseTimestamp = _.max(projectDateCloseTimestamps); BFUtil.initContent( $('#' + tabPaneId), $('#' + tableTemplateId), _.extend( { proposalsForVendorForOrganization: [], pastScheduledProjectOpenPeriodsWhereNotIsReopen: [] }, sectionData, { isDaysLeftColumn: isDaysLeftColumn, latestProjectDateCloseTimestamp: latestProjectDateCloseTimestamp, getProjectUrl: getProjectUrl, getProjectStatusData: getProjectStatusData } ), function () { var table = initOpportunitiesTable(tabPaneId); // Sort by Status ASC by default BFDataTables.sortByColumnIfExists(table, 0, 'asc'); BFApp.bootstrapDropit(); } ); }; // Get the data needed for the Contract Status column (class, label). function getPublicContractStatus(publicContract) { var statusClass; var statusLabel; var statudId = parseInt(publicContract.ContractStatusID, 10); switch(statudId) { case BFConstants.CONTRACT_STATUS_PENDING: statusClass = 'contractStatusPending'; statusLabel = 'Pending'; break; case BFConstants.CONTRACT_STATUS_ACTIVE: statusClass = 'contractStatusActive'; statusLabel = 'Active'; break; case BFConstants.CONTRACT_STATUS_EXPIRED: statusClass = 'contractStatusExpired'; statusLabel = 'Closed'; break; case BFConstants.CONTRACT_STATUS_TERMINATED: statusClass = 'contractStatusTerminated'; statusLabel = 'Terminated'; break; case BFConstants.CONTRACT_STATUS_TERM_EXPIRED: statusClass = 'contractStatusTermExpired'; statusLabel = 'Term Expired'; break; default: break; } return { statusClass: statusClass, statusLabel: statusLabel, }; } // Determine whether to display green checker or red X based on value of IsExtendable function getPublicExtendableStatus(publicContract) { var extendable = parseInt(publicContract.IsExtendable, 10); var statusClass = (extendable === 0) ? 'fa-solid fa-times red' : 'fa-solid fa-check green'; var statusLabel = (extendable === 0) ? 'No' : 'Yes'; return { statusClass: statusClass, statusLabel: statusLabel }; } // get vendor's name. function getVendorName(publicContract, vendors) { return _.has(vendors, publicContract.VendorID) ? vendors[publicContract.VendorID].VendorContactOrganizationName : '{ Vendor not found }'; } var loadPublicContractsTable = function (tabPaneId, tableTemplateId, sectionData) { BFUtil.initContent( $('#' + tabPaneId), $('#' + tableTemplateId), _.extend( {}, sectionData, { getPublicContractStatus: getPublicContractStatus, getPublicExtendableStatus: getPublicExtendableStatus, getVendorName:getVendorName } ), function () { var table = initPublicContractsTable(tabPaneId); BFApp.bootstrapDropit(); } ); }; // Get the badge for the Days Left column. function getDaysLeftBadge(nowMoment, dateCloseMoment) { var defaultBadge = '<div class="alignCenter">-</div>'; if (!moment(nowMoment).isValid() || !moment(dateCloseMoment).isValid()) { return defaultBadge; } // dayDiff is not rounded since we are passing true as the 3rd argument. var dayDiff = dateCloseMoment.diff(nowMoment, 'days', true); // Project is closed? if (dayDiff < 0) { return defaultBadge; } var daysLeftBadgeContent = Math.ceil(dayDiff); if (dayDiff < 1) { daysLeftBadgeContent = '< 1'; } var classBadge = ''; if (dayDiff < 7) { classBadge = 'warning'; } return '<div class="alignCenter badgeDaysLeft ' + classBadge + '">' + daysLeftBadgeContent + '</div>'; } // Since private projects have special urls, this helper function can be used to easily get // the correct url. function getProjectUrl(project) { return (parseInt(project.ProjectVisibilityID, 10) === BFConstants.PROJECT_VISIBILITY_PRIVATE) ? '/opportunities/private/' + project.PrivateProjectID : '/opportunities/' + project.ProjectID; } // Get the data needed for the Status column (label, class, sort order, etc) as well as the // close date and the days left. function getProjectStatusData(project, proposalsForVendorForOrganizationGrouped, pastScheduledProjectOpenPeriodsWhereNotIsReopenGrouped, latestProjectDateCloseTimestamp) { var nowMoment = moment().tz(Bonfire.timezone); var dateClose = project.DateClose; // If a project is reopened but the user does not have a proposal for the project (the // proposalsForVendorForOrganizationGrouped collection does not contain proposals that // have been eliminated), then the project should appear as if it were closed to the // user. So we need to get the original DateClose, not the DateClose for the reopened // stage. if (parseInt(project.ProjectStatusID, 10) === BFConstants.STATE_REOPENED && !_.has(proposalsForVendorForOrganizationGrouped, project.ProjectID)) { // If the following condition fails, then the implementation is bad. But, since this // is the portal, the vendor may be constrained for time, so instead of throwing an // error and alerting the user, we will track this error in the background using // trackjs. if (_.has(pastScheduledProjectOpenPeriodsWhereNotIsReopenGrouped, project.ProjectID) && pastScheduledProjectOpenPeriodsWhereNotIsReopenGrouped[project.ProjectID].length) { // There should only ever be one PastScheduledProjectOpenPeriod for a project // where IsReopen = 0...so get the first element in the array. var pastScheduledProjectOpenPeriod = pastScheduledProjectOpenPeriodsWhereNotIsReopenGrouped[project.ProjectID][0]; dateClose = pastScheduledProjectOpenPeriod.DateClose; } else { if (window.trackJs) { trackJs.track('Bad pastScheduledProjectOpenPeriod data for ProjectID ' + project.ProjectID); } } } var dateCloseMoment = BFUtil.createMomentFromUtcDateString( dateClose, BFConstants.DB_DATE_STRING ); // Is now <= the date close? if (nowMoment.isValid() && dateCloseMoment.isValid() && dateCloseMoment.isAfter(nowMoment)) { if (parseInt(project.ProjectStatusID, 10) === BFConstants.STATE_OPEN) { return { statusClass: 'statusOpen', statusLabel: 'Open', statusSortOrder: dateCloseMoment.unix(), dateClose: dateClose, daysLeftBadge: getDaysLeftBadge(nowMoment, dateCloseMoment) }; } if (parseInt(project.ProjectStatusID, 10) === BFConstants.STATE_REOPENED && _.has(proposalsForVendorForOrganizationGrouped, project.ProjectID)) { return { statusClass: 'statusReopened', statusLabel: 'Reopened', statusSortOrder: dateCloseMoment.unix(), dateClose: dateClose, daysLeftBadge: getDaysLeftBadge(nowMoment, dateCloseMoment) }; } } // We sort the Status column as follows: // * Projects where now <= the date close come first, sorted by date close asc. // * Projects where now > the date close come next, sorted by date close desc. // default in case the data is bad var statusSortOrder = latestProjectDateCloseTimestamp; // Is now > the date close? if (nowMoment.isValid() && dateCloseMoment.isValid() && nowMoment.isAfter(dateCloseMoment)) { // Add the latestProjectDateCloseTimestamp to the difference b/w now and the date // close so that projects where now > date close come after projects where now <= // date close. statusSortOrder = (latestProjectDateCloseTimestamp + (nowMoment.unix() - dateCloseMoment.unix())); } var statusClass = 'statusClosed'; var statusLabel = 'Closed'; // If the project has been awarded publically and is Completed or Archived, then we show // an Awarded badge. var projectStatusId = parseInt(project.ProjectStatusID, 10); var projectSubStatusId = parseInt(project.ProjectSubStatusID, 10); if (project.IsPublicAward && (projectStatusId === BFConstants.STATE_COMPLETED || projectStatusId === BFConstants.STATE_ARCHIVED)) { var statusClass = 'statusAwarded'; var statusLabel = 'Awarded'; } if (projectSubStatusId === BFConstants.STATE_SUBSTATUS_CANCELLED) { statusClass = 'statusCancelled'; statusLabel = 'Cancelled'; dateClose = null; } return { statusClass: statusClass, statusLabel: statusLabel, statusSortOrder: statusSortOrder, dateClose: dateClose, daysLeftBadge: getDaysLeftBadge(null) }; } function changePanelAfterLoad () { // The logic below has a bit of a bad code smell since we're basically determine the state of the page based on // this call back since we implicitly do it all the time. // // A better solution would be to refactor the page such that it knows once all the callbacks have completed, // and can then determine which tab / content to display. // If there is a URL query parameter then load that tab if it exists, otherwise // If there are other tabs show one, otherwise show the placeholder content that there is nothing for you to see var query = location.search.substr(1); var result = {}; // url params look like 'field1=value1&field2=value2&field3=value3' // so splitting on '&' yields each key-value pair and then splitting on '=' separates them // with the key being item[0] and the value being item[1] _.forEach(query.split('&'), function(part) { var item = part.split('='); result[item[0]] = decodeURIComponent(item[1]); }); var tabLink = {}; // Limit linked tabs to alphabetic characters only if (result.tab && _.isString(result.tab) && result.tab.match(/^[a-zA-Z]+$/)) { tabLink = $('a[href$="#' + result.tab + 'TabPane"]'); } if($('#portalIndexTabs li').length) { // Default load the linked tab if it exists... if(tabLink.length) { tabLink.trigger('click'); // ...then try to load Open Opportunities if present... } else if ($('a[href$="#openOpportunitiesTabPane"]').length) { $('a[href$="#openOpportunitiesTabPane"]').trigger('click'); // ...then load the My Opportunities if present and there are opportunities... } else if ($('a[href$="#myOpportunitiesTabPane"]').length && isMyOpportunities) { $('a[href$="#myOpportunitiesTabPane"]').trigger('click'); // ...otherwise fall back on first tab } else { $('#portalIndexTabs li').first().show(); $('#portalIndexTabs a').first().trigger('click'); } } else { var content = "<br><br><br>" + "<p class='size14 alignCenter'>Welcome! It appears there isn't anything here for you to access.</p>" + "<br><br>" + "<p class='size14 alignCenter'>If you believe this message is in error, contact us at <a href='mailto:support@gobonfire.com'>Support@GoBonfire.com</a>.</p>" + "<br><br><br>"; $("#publicList .tab-Container").html(content); } } var initMyOpportunitiesTab = function () { if (!isConfirmed) { var containerElem = $('#myOpportunitiesTabPane'); var sectionContent = (hasVendors) ? '<div class="warning-notice size13 alignCenter"><span class="fa-solid fa-warning"></span> Additional information is required in order to complete your registration. <br><strong><a class="warning-link button radius" href="/registration">Complete Registration »</a></strong></div>' : '<div class="warning-notice size13 alignCenter"><span class="fa-solid fa-warning"></span> You must confirm your account before you can see your invited opportunities. Go to your Settings page to confirm your account. <br><strong><a class="warning-link button radius" href="/settings">Go to Settings »</a></strong></div>'; if ($(containerElem).is(':visible')) { $(containerElem).fadeTo(0, 0, function () { $(this).html(sectionContent); $(this).fadeTo(600, 100, 'easeOutExpo'); }); } else { $(containerElem).html(sectionContent); $('#myOpportunitiesTab').show(); } changePanelAfterLoad(); return; } BFUtil.loadSection( '/PublicPortal/getMyOpportunitiesSectionData', function (sectionData) { if (_.size(sectionData.projects) && hasVendors) { // Clone sectionData defaultSectionData.myOpportunities = JSON.parse(JSON.stringify(sectionData)); defaultSectionData.myOpportunities.allProjects = sectionData.projects; defaultSectionData.myOpportunities.projects = getFilteredOpportunities(sectionData.projects); isMyOpportunities = (sectionData.projects.length > 0); loadOpportunitiesTable( 'myOpportunitiesTabPane', 'opportunitiesTableTemplate', defaultSectionData.myOpportunities ); $("#myOpportunitiesTab").show(); } else { var sectionContent = '<div class="size13 alignCenter bf-dark-gray">' + 'There is currently nothing to display here.' + '</div>'; $('#myOpportunitiesTabPane').html(sectionContent); $('#myOpportunitiesTab').show(); changePanelAfterLoad(); return; } changePanelAfterLoad(); } ); }; var initOpenOpportunitiesTab = function () { BFUtil.loadSection( '/PublicPortal/getOpenPublicOpportunitiesSectionData', function (sectionData) { // Clone sectionData defaultSectionData.openOpportunities = JSON.parse(JSON.stringify(sectionData)); defaultSectionData.openOpportunities.allProjects = sectionData.projects; defaultSectionData.openOpportunities.projects = getFilteredOpportunities(sectionData.projects); loadOpportunitiesTable( 'openOpportunitiesTabPane', 'opportunitiesTableTemplate', defaultSectionData.openOpportunities ); } ); }; var initPublicContractsTab = function () { BFUtil.loadSection( '/PublicPortal/getPublicContractsSectionData', function (sectionData) { var vendors = _.indexBy(sectionData.vendors, 'VendorID'); // Clone sectionData defaultSectionData.publicContracts = JSON.parse(JSON.stringify(sectionData)); defaultSectionData.publicContracts.vendors = vendors; loadPublicContractsTable( 'publicContractsTabPane', 'publicContractsTableTemplate', defaultSectionData.publicContracts ); } ); }; var initPastOpportunitiesTab = function () { BFUtil.loadSection( '/PublicPortal/getPastPublicOpportunitiesSectionData', function (sectionData) { // Clone sectionData defaultSectionData.pastOpportunities = JSON.parse(JSON.stringify(sectionData)); defaultSectionData.pastOpportunities.allProjects = sectionData.projects; defaultSectionData.pastOpportunities.projects = getFilteredOpportunities(sectionData.projects); loadOpportunitiesTable( 'pastOpportunitiesTabPane', 'opportunitiesTableTemplate', defaultSectionData.pastOpportunities, false ); } ); }; var initAuctionsTab = function () { var userId = ''; if (userId === '') { return; } $.get( '/internalApi/users/' + userId + '/auctions', function (data) { // We hide the 'Auctions' tab if: // - data.auctions is undefined (not sure which scenario this is but it has happened) OR // - data.auctions is defined AND one of: there are no auctions OR the user is not a "vendor" if (!_.has(data, 'auctions') || !data.auctions.length || !hasVendors) { $('#auctionsTab').remove(); $('#auctionsTabPane').remove(); return; } defaultSectionData.auctions = { departments: data.departments }; defaultSectionData.auctions.allAuctions = data.auctions; defaultSectionData.auctions.auctions = getFilteredOpportunities(data.auctions); loadAuctionsTable( 'auctionsTabPane', 'auctionsTableTemplate', defaultSectionData.auctions ); $('#auctionsTab').show(); changePanelAfterLoad(); }, 'json' ); }; // My Opportunities is always hidden so fetch the data and show if you have any initMyOpportunitiesTab(); initAuctionsTab(); BFApp.bootstrapToolTips($('#portalIndexTabs')); }); </script> <script id="opportunitiesTableTemplate" type="text/template"> <% // Group the proposals by ProjectID so that if a project is reopened and the user has at least // one proposal for the project (the collection does not contain proposals that have been // eliminated), then the project will appear as Reopened to the user; otherwise, the project // will appear as closed to the user. var proposalsForVendorForOrganizationGrouped = _.groupBy( proposalsForVendorForOrganization, 'ProjectID' ); // If a project is reopened but appears to be closed to the user (see comment above), then we // need to get the original DateClose to display to the user. var pastScheduledProjectOpenPeriodsWhereNotIsReopenGrouped = _.groupBy( pastScheduledProjectOpenPeriodsWhereNotIsReopen, 'ProjectID' ); %> <table> <thead> <tr class="head"> <th class="sortme">Status</th> <th class="sortme table-html">Ref. #</th> <th class="sortme" width="35%">Project</th> <th class="sortme">Department</th> <th class="sortme datetime">Close Date</th> <% if (isDaysLeftColumn) { %> <th class="daysleftsort">Days Left</th> <% } %> <th class="nosort nosearch">Action</th> </tr> </thead> <tbody> <% _.each(projects, function (project) { %> <% var projectUrl = getProjectUrl(project); // Get the data needed for the status column (label, class, sort order, etc) as well // as the close date and the days left. var projectStatusData = getProjectStatusData( project, proposalsForVendorForOrganizationGrouped, pastScheduledProjectOpenPeriodsWhereNotIsReopenGrouped, latestProjectDateCloseTimestamp ); %> <tr> <td data-order="<%- projectStatusData.statusSortOrder %>"> <div class="statusTag <%- projectStatusData.statusClass %>"> <%- projectStatusData.statusLabel %> </div> </td> <td><%- project.ReferenceID %></td> <td id="projectNameId-<%- project.ReferenceID %>"><b><%- project.ProjectName %></b></td> <% if (departments[project.DepartmentID]) { %> <td><%- departments[project.DepartmentID].DepartmentName %></td> <% } else { %> <td> - </td> <% } %> <td><%- projectStatusData.dateClose %></td> <% if (isDaysLeftColumn) { %> <td><%= projectStatusData.daysLeftBadge %></td> <% } %> <td> <a class="btn bold box-sizing alignCenter" aria-describedby="projectNameId-<%- project.ReferenceID %>" style="font-size:12px" href="<%- projectUrl %>"> View Opportunity </a> </td> </tr> <% }); %> </tbody> </table> </script> <script id="auctionsTableTemplate" type="text/template"> <table id="live-auctions-table"> <thead> <tr class="head"> <th class="sortme" style="width: 10%;">Status</th> <th class="sortme" style="width: 13%;">Title</th> <th class="sortme" style="width: 20%;">Description</th> <th class="sortme">Department</th> <th class="sortme datetime" style="width: 20%;">Start Date</th> <th class="sortme datetime" style="width: 20%;">End Date</th> <th class="nosort nosearch" style="width: 12%;">Action</th> </tr> </thead> <tbody> <% _.each(auctions, function (auction) { %> <% // Get the data needed for the status column (class, label). var auctionStatusData = getAuctionStatusData(auction); %> <tr> <td> <div class="statusTag <%- auctionStatusData.statusClass %>"> <%- auctionStatusData.statusLabel %> </div> </td> <td><%- auction.Title %></td> <td><%- auction.Description %></td> <td class="sortme"><%- departments[auction.DepartmentID].DepartmentName %></td> <td><%- auction.StartDate %></td> <td><%- auction.EndDate %></td> <td> <a class="btn bold box-sizing alignCenter" style="font-size:12px" href="/opportunities/<%- auction.ProjectID %>/auctions/<%- auction.AuctionID %>/proposals/<%- auction.ProposalID %>"> View Auction </a> </td> </tr> <% }); %> </tbody> </table> </script> <script id="publicContractsTableTemplate" type="text/template"> <table> <thead> <tr class="head"> <th class="sortme">Status</th> <th class="sortme">Title</th> <th class="sortme">Vendor</th> <th class="sortme datetime">Start Date</th> <th class="sortme datetime">End Date</th> <th class="nosort nosearch">Extendable</th> <th class="nosort nosearch">Action</th> </tr> </thead> <tbody> <% _.each(publicContracts, function (publicContract) { %> <% // Get the data needed for the status column (class, label). var publicContractData = getPublicContractStatus(publicContract); var extendableChecker = getPublicExtendableStatus(publicContract); var vendorContactOrganizationName = getVendorName(publicContract, vendors); %> <tr> <td> <div class="statusTag <%- publicContractData.statusClass %>"> <%- publicContractData.statusLabel %> </div> </td> <td><%- publicContract.Name %></td> <td><%- vendorContactOrganizationName %></td> <td><%- publicContract.StartDate %></td> <td><%- publicContract.EndDate %></td> <td><span class="<%- extendableChecker.statusClass %>"><span class="sr-only"><%- extendableChecker.statusLabel %></span></span></td> <td> <a class="btn bold box-sizing alignCenter" style="font-size:12px" href="/publicContracts/<%- publicContract.ContractID %>"> View </a> </td> </tr> <% }); %> </tbody> </table> </script> <script type="text/javascript"> $(document).ready(function() { $('.departmentFilter .select2-selection__rendered').attr('aria-labelledby', 'departmentFilterSelectLabel'); $('.departmentFilter .select2-selection__rendered').attr('role', 'combobox'); }); </script> <div class="departmentFilter"> <label id="departmentFilterSelectLabel" for="departmentFilterSelect"><span style="font-weight:bold; font-size:14px;">Department: </span></label> <select id="departmentFilterSelect" name="departmentFilterSelect" style="min-width:300px;"> <option value="noGroup.-1">All</option> <option value="noGroup.2487"> Allendale, Borough of </option> <option value="noGroup.2488"> Alpine, Borough of </option> <option value="noGroup.2484"> BC Board of Social Services </option> <option value="noGroup.2480"> BC Improvement Authority </option> <option value="noGroup.2308"> BC Purchasing </option> <option value="noGroup.2481"> BC Utilities Authority </option> <option value="noGroup.9996"> Bergen Community College </option> <option value="noGroup.2489"> Bergenfield, Borough of </option> <option value="noGroup.2490"> Bogota, Borough of </option> <option value="noGroup.2491"> Carlstadt, Borough of </option> <option value="noGroup.2492"> Cliffside Park, Borough of </option> <option value="noGroup.2494"> Closter, Borough of </option> <option value="noGroup.2495"> Cresskill, Borough of </option> <option value="noGroup.2500"> Demarest, Borough of </option> <option value="noGroup.2504"> Dumont, Borough of </option> <option value="noGroup.2513"> East Rutherford, Borough of </option> <option value="noGroup.2518"> Edgewater, Borough of </option> <option value="noGroup.2522"> Elmwood Park, Borough of </option> <option value="noGroup.2527"> Emerson, Borough of </option> <option value="noGroup.2539"> Englewood Cliffs, Borough of </option> <option value="noGroup.2534"> Englewood, City of </option> <option value="noGroup.2540"> Fair Lawn, Borough of </option> <option value="noGroup.2541"> Fairview, Borough of </option> <option value="noGroup.2542"> Fort Lee, Borough of </option> <option value="noGroup.2543"> Franklin Lakes, Borough of </option> <option value="noGroup.2544"> Garfield, City of </option> <option value="noGroup.2545"> Glen Rock, Borough of </option> <option value="noGroup.2546"> Hackensack, City of </option> <option value="noGroup.2547"> Harrington Park, Borough of </option> <option value="noGroup.2548"> Hasbrouck Heights, Borough of </option> <option value="noGroup.2549"> Haworth, Borough of </option> <option value="noGroup.2550"> Hillsdale, Borough of </option> <option value="noGroup.2551"> Ho Ho Kus, Borough of </option> <option value="noGroup.2552"> Leonia, Borough of </option> <option value="noGroup.2553"> Little Ferry, Borough of </option> <option value="noGroup.2554"> Lodi, Borough of </option> <option value="noGroup.2555"> Lyndhurst, Township of </option> <option value="noGroup.2556"> Mahwah, Township of </option> <option value="noGroup.2557"> Maywood, Borough of </option> <option value="noGroup.2558"> Midland Park, Borough of </option> <option value="noGroup.2559"> Montvale, Borough of </option> <option value="noGroup.2560"> Moonachie, Borough of </option> <option value="noGroup.2483"> New Milford, Borough of </option> <option value="noGroup.2561"> North Arlington, Borough of </option> <option value="noGroup.2562"> Northvale, Borough of </option> <option value="noGroup.2563"> Norwood, Borough of </option> <option value="noGroup.2482"> NW BC Utilities Authority </option> <option value="noGroup.2564"> Oakland, Borough of </option> <option value="noGroup.2565"> Old Tappan, Borough of </option> <option value="noGroup.2566"> Oradell, Borough of </option> <option value="noGroup.2567"> Palisades Park, Borough of </option> <option value="noGroup.2568"> Paramus, Borough of </option> <option value="noGroup.2569"> Park Ridge, Borough of </option> <option value="noGroup.2570"> Ramsey, Borough of </option> <option value="noGroup.2571"> Ridgefield, Borough of </option> <option value="noGroup.2572"> Ridgefield, Park Village of </option> <option value="noGroup.2573"> Ridgewood, Village of </option> <option value="noGroup.2574"> River Edge, Borough of </option> <option value="noGroup.2575"> River Vale, Township of </option> <option value="noGroup.2576"> Rochelle Park, Township of </option> <option value="noGroup.2577"> Rutherford, Borough of </option> <option value="noGroup.2578"> Saddle Brook, Township of </option> <option value="noGroup.2579"> Saddle River, Borough of </option> <option value="noGroup.2580"> South Hackensack, Township of </option> <option value="noGroup.2581"> Teaneck, Township of </option> <option value="noGroup.2582"> Tenafly, Borough of </option> <option value="noGroup.2583"> Teterboro, Borough of </option> <option value="noGroup.2584"> Upper Saddle River, Borough of </option> <option value="noGroup.2585"> Waldwick, Borough of </option> <option value="noGroup.2586"> Wallington, Borough of </option> <option value="noGroup.2587"> Washington, Township of </option> <option value="noGroup.2588"> Westwood, Borough of </option> <option value="noGroup.2590"> Wood-Ridge, Borough of </option> <option value="noGroup.2589"> Woodcliff Lake, Borough of </option> <option value="noGroup.2591"> Wyckoff, Township of </option> </select> </div> <br> <div class="tab-Container"> <ul id="portalIndexTabs" class='nav nav-tabs'> <li id="openOpportunitiesTab"><a href="#openOpportunitiesTabPane" role="button"> <strong>Open Public Opportunities</strong> </a></li> <li id="pastOpportunitiesTab"><a href="#pastOpportunitiesTabPane" role="button"> <strong>Past Public Opportunities</strong> </a></li> <li id="publicContractsTab" ><a href="#publicContractsTabPane" role="button"> <strong>Public Contracts</strong> </a></li> </ul> <div class="tab-content"> <div class="tab-pane" id="openOpportunitiesTabPane"> <div style="width:100%; text-align:center; padding: 25px 0"><img src="/img/spinner.gif" alt="loading" /></div> </div> <div class="tab-pane" id="pastOpportunitiesTabPane"> <div style="width:100%; text-align:center; padding: 25px 0"><img src="/img/spinner.gif" alt="loading" /></div> </div> <div class="tab-pane" id="publicContractsTabPane"> <div style="width:100%; text-align:center; padding: 25px 0"><img src="/img/spinner.gif" alt="loading" /></div> </div> </div> </div> </div><!-- publicList --> <div id="publicFooter"> <div class="publicFooterItemLeft floatLeft"> <ul> <li><a href="/portal/support">Technical Support</a></li> <li><a href="/portal/security">Portal Security</a></li> <li><a href="https://gobonfire.com/terms-service" target="_blank" rel="noopener noreferrer">Terms of Service</a></li> <li><a href="https://eunasolutions.com/privacy-policy" target="_blank" rel="noopener noreferrer">Privacy Policy</a></li> <li><a href="/sitemap">Sitemap</a></li> <li id="footerToggleClosedProjectsTable" style="display:none"><a id="toggleClosedProjectsTable" class="saveSectionExpansion"><span id="closedProjectsTableLink">Show</span> Closed Projects</a></li> </ul> </div> <div class="publicFooterItem floatRight alignRight"> <div id="publicFooterPoweredBy">Powered by</div> <br> <a href="http://www.BonfireHub.com" target="_blank" rel="noopener noreferrer"><img src="/img/logo_poweredBy.jpg" alt="Powered by Bonfire"></a> </div> <br class="clear"> </div> </div><!-- publicContent --> </div><!-- publicBox --> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-36372450-1']); _gaq.push(['_setDomainName', 'bonfirehub.com']); _gaq.push(['_setAllowLinker', true]); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <script type="text/javascript" src="https://assets.bonfirehub.com/17437/js/bonfire/end.js" ></script> <script> var Bonfire = (function (bonfire) { var timezone = "America\/New_York"; // -- Public Api bonfire.timezone = timezone; return bonfire; }(Bonfire || {})); </script> <script> var Bonfire = (function (bonfire) { var bonfireApiBaseUrl = "https:\/\/us-production-api-internal.bonfirehub.com\/v1.0"; var organizationId = "471"; var agGridLicenseKey = "Using_this_{AG_Grid}_Enterprise_key_{AG-060159}_in_excess_of_the_licence_granted_is_not_permitted___Please_report_misuse_to_legal@ag-grid.com___For_help_with_changing_this_key_please_contact_info@ag-grid.com___{GTY_Software,_Inc.}_is_granted_a_{Single_Application}_Developer_License_for_the_application_{Bonfire_Core}_only_for_{6}_Front-End_JavaScript_developers___All_Front-End_JavaScript_developers_working_on_{Bonfire_Core}_need_to_be_licensed___{Bonfire_Core}_has_been_granted_a_Deployment_License_Add-on_for_{1}_Production_Environment___This_key_works_with_{AG_Grid}_Enterprise_versions_released_before_{15_September_2025}____[v3]_[01]_MTc1Nzg5MDgwMDAwMA==c9f11d69a175ccb7568453169ae5eeb2"; var googleMapsApiKey = "AIzaSyBByiy6KO1rIXkIPrapGgE_IFdpXkWNeUQ"; var recaptchaSiteKey = "6Lcr47oqAAAAACf-o8cP8E9785gYxyylUMk1rN4o"; var defaultRegionId = 2; var sendCredentialsCrossDomain = true; // -- Public Api bonfire.sendCredentialsCrossDomain = sendCredentialsCrossDomain; bonfire.bonfireApiBaseUrl = bonfireApiBaseUrl; bonfire.organizationId = organizationId; bonfire.agGridLicenseKey = agGridLicenseKey; bonfire.googleMapsApiKey = googleMapsApiKey; bonfire.recaptchaSiteKey = recaptchaSiteKey; bonfire.defaultRegionId = defaultRegionId; return bonfire; }(Bonfire || {})); </script> <script type="module" src="https://assets.bonfirehub.com/17437/dist/top-bar-app/app/app.js"></script> </body> </html>