{"id":383,"date":"2016-08-19T15:53:35","date_gmt":"2016-08-19T15:53:35","guid":{"rendered":"http:\/\/192.185.79.221\/~bscu\/?page_id=383"},"modified":"2025-03-12T23:05:13","modified_gmt":"2025-03-13T03:05:13","slug":"our-rates","status":"publish","type":"page","link":"https:\/\/demo2.mybscu.org\/es\/aboutus\/our-rates\/","title":{"rendered":"Nuestras Tarifas"},"content":{"rendered":"<div data-parent=\"true\" class=\"vc_row vc_custom_1734896839179 row-container\" style=\"padding-top: 40px ;padding-bottom: 40px ;\" id=\"row-unique-0\"><div class=\"row full-width row-parent\"><div class=\"wpb_row row-inner\"><div class=\"wpb_column pos-top pos-center align_left column_parent col-lg-12 single-internal-gutter\"><div class=\"uncol style-light\"  ><div class=\"uncoltable\"><div class=\"uncell no-block-padding\" ><div class=\"uncont\" ><div class=\"empty-space empty-single\" ><span class=\"empty-space-inner\"><\/span><\/div>\n\n\t<div class=\"wpb_raw_code wpb_content_element wpb_raw_html\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t\t<!-- WordPress HTML Container -->\n\t<div id=\"brightstar-rates\" class=\"wp-container\">\n\t\t<!-- Required CSS -->\n\t\t<style>\n\t\t\t.category-header {\n\t\t\t\tbackground-color: rgba(0, 71, 95, 0.1);\n\t\t\t\tfont-weight: bold;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.05em;\n\t\t\t}\n\t\t\t#brightstar-rates {\n\t\t\t \n\t\t\t\tbackground-color: #ffffff;\n\t\t\t}\n\t\t\t#brightstar-rates .wp-container {\n\t\t\t\twidth: 100%;\n\t \n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t\/* Explicit rounded corners styles *\/\n\t\t\t#brightstar-rates .rounded-lg {\n\t\t\t\tborder-radius: 0.5rem !important;\n\t\t\t}\n\t\t\t#brightstar-rates .rounded {\n\t\t\t\tborder-radius: 0.25rem !important;\n\t\t\t}\n\t\t\t\/* Ensure shadow is visible *\/\n\t\t\t#brightstar-rates .shadow-lg {\n\t\t\t\tbox-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important;\n\t\t\t}\n\t\t\t\/* Override any WordPress table styles *\/\n\t\t\t#brightstar-rates table {\n\t\t\t\tborder-collapse: separate !important;\n\t\t\t\tborder-spacing: 0 !important;\n\t\t\t\tborder-radius: 0.5rem !important;\n\t\t\t\toverflow: hidden !important;\n\t\t\t}\n\t\t<\/style>\n\t\n\t\t<!-- Load Required External Resources -->\n\t\t<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n\t\t<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.1\/css\/all.min.css\">\n\t\t<script src=\"https:\/\/unpkg.com\/react@17\/umd\/react.development.js\"><\/script>\n\t\t<script src=\"https:\/\/unpkg.com\/react-dom@17\/umd\/react-dom.development.js\"><\/script>\n\t\t<script src=\"https:\/\/unpkg.com\/babel-standalone@6\/babel.min.js\"><\/script>\n\t\t<script src=\"https:\/\/demo2.mybscu.org\/api\/rates\/jspdf.umd.min.js\"><\/script>\n\t\t<!-- Load rates data -->\n\t\t<script src=\"https:\/\/demo2.mybscu.org\/rates.js\"><\/script>\n\t\n\t\t<div class=\"p-4 max-w-7xl mx-auto\">\n\t\t\t<!-- Screen Header -->\n\t\t\t<div class=\"mb-8\">\n\t\t\t\t<h2 class=\"text-3xl font-bold text-[#00475f] mb-4\">Tarifas actuales<\/h2>\n\t\t\t\t<p class=\"text-gray-600\">Eficaz <span id=\"effectiveDate\"><\/span><\/p>\n\t\t\t<\/div>\n\t\n\t\t\t<!-- Controls -->\n\t\t\t<div class=\"mb-6 flex flex-col md:flex-row gap-4 items-start md:items-center justify-between\">\n\t\t\t\t<!-- Left side - Search and Filter -->\n\t\t\t\t<div class=\"flex flex-col md:flex-row gap-4 w-full md:w-auto\">\n\t\t\t\t\t<div class=\"relative w-full md:w-auto\">\n\t\t\t\t\t\t<i class=\"fas fa-search absolute left-3 top-1\/2 transform -translate-y-1\/2 text-gray-400\"><\/i>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tid=\"searchInput\"\n\t\t\t\t\t\t\tplaceholder=\"Buscar tarifas...\"\n\t\t\t\t\t\t\tclass=\"w-full md:w-auto pl-10 pr-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-[#00475f]\"\n\t\t\t\t\t\t\/>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<select\n\t\t\t\t\t\tid=\"categoryFilter\"\n\t\t\t\t\t\tclass=\"w-full md:w-auto px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-[#00475f]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"all\">Todos los productos<\/option>\n\t\t\t\t\t\t<option value=\"loan\">Pr\u00e9stamos<\/option>\n\t\t\t\t\t\t<option value=\"savings\">Ahorros<\/option>\n\t\t\t\t\t\t<option value=\"money_market\">Mercado de dinero<\/option>\n\t\t\t\t\t\t<option value=\"cd\">Certificados<\/option>\n\t\t\t\t\t<\/select>\n\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t<!-- Right side - Buttons in a flex container -->\n\t\t\t\t<div class=\"flex flex-col md:flex-row gap-2 w-full md:w-auto\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tonclick=\"generatePDF()\"\n\t\t\t\t\t\tclass=\"w-full md:w-auto flex items-center justify-center gap-2 px-4 py-2 bg-[#00475f] text-white rounded-lg hover:bg-[#003344] transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class=\"fas fa-file-pdf\"><\/i>\n\t\t\t\t\t\tDescargar PDF\n\t\t\t\t\t<\/button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonclick=\"openShareModal()\"\n\t\t\t\t\t\tclass=\"w-full md:w-auto flex items-center justify-center gap-2 px-4 py-2 bg-[#00475f] text-white rounded-lg hover:bg-[#003344] transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class=\"fas fa-share-alt\"><\/i>\n\t\t\t\t\t\tTasas de acciones\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t<!-- Updated Modal HTML -->\n\t\t\t<div id=\"shareModal\" class=\"hidden\">\n\t\t\t\t<div class=\"modal-content\">\n\t\t\t\t\t<div class=\"flex justify-between items-center mb-4\">\n\t\t\t\t\t\t<h3 class=\"!text-xl font-bold !text-[#00475f]\">Tasas de acciones<\/h3>\n\t\t\t\t\t\t<button onclick=\"closeShareModal()\" class=\"text-gray-400 hover:text-gray-600\">\n\t\t\t\t\t\t\t<i class=\"fas fa-times\"><\/i>\n\t\t\t\t\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"shareFormContent\">\n\t\t\t\t\t\t<p class=\"mb-4 text-gray-600\">Ingrese los datos del destinatario para compartir las tarifas actuales.<\/p>\n\t\t\t\t\t\t<form id=\"shareForm\" class=\"space-y-4\" action=\"\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label for=\"memberName\" class=\"block text-sm font-medium text-gray-700 mb-1\">Su nombre<\/label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tid=\"memberName\"\n\t\t\t\t\t\t\t\t\tname=\"memberName\"\n\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\tclass=\"w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-[#00475f]\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Introduce tu nombre\"\n\t\t\t\t\t\t\t\t\/>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label for=\"memberEmail\" class=\"block text-sm font-medium text-gray-700 mb-1\">Direcci\u00f3n de correo electr\u00f3nico<\/label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\t\tid=\"memberEmail\"\n\t\t\t\t\t\t\t\t\tname=\"memberEmail\"\n\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\tclass=\"w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 !focus:ring-[#00475f]\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Introduzca su direcci\u00f3n de correo electr\u00f3nico\"\n\t\t\t\t\t\t\t\t\/>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tclass=\"w-full flex items-center justify-center gap-2 px-4 py-2 !bg-[#00475f] !text-white rounded-lg !hover:bg-[#003344] transition-colors\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<i class=\"fas fa-paper-plane\"><\/i>\n\t\t\t\t\t\t\t\tEnviar tarifas\n\t\t\t\t\t\t\t<\/button>\n\t\t\t\t\t\t<input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"successMessage\" class=\"hidden text-center py-8\">\n\t\t\t\t\t\t<div class=\"text-green-500 text-5xl mb-4\">\n\t\t\t\t\t\t\t<i class=\"fas fa-check-circle\"><\/i>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<h4 class=\"text-xl font-bold text-gray-800 mb-2\">\u00a1Correo electr\u00f3nico enviado exitosamente!<\/h4>\n\t\t\t\t\t\t<p class=\"text-gray-600 mb-6\">Las tarifas se han compartido con el destinatario.<\/p>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonclick=\"closeShareModal()\"\n\t\t\t\t\t\t\tclass=\"px-4 py-2 bg-[#00475f] text-white rounded-lg hover:bg-[#003344] transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCerca\n\t\t\t\t\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\n\t\n\t\t\t<!-- Rates Table Container -->\n\t\t\t<div id=\"ratesContainer\"><\/div>\n\t\t<\/div>\n\t\n\t\t<!-- React Component -->\n\t\t<script type=\"text\/babel\">\n\tconst ResponsiveRates = () => {\n\t\tconst [isMobile, setIsMobile] = React.useState(false);\n\t\tconst [searchTerm, setSearchTerm] = React.useState('');\n\t\tconst [selectedCategory, setSelectedCategory] = React.useState('all');\n\t\n\t\t\/\/ Define headers for each product type\n\t\tconst typeHeaders = {\n\t\t\tloan: ['Product Name', 'APR', 'APR (PSM)', 'Action'],\n\t\t\tsavings: ['Product Name', 'APR', 'APY', 'Action'],\n\t\t\tmoney_market: ['Product Name', 'APR', 'APY', 'Action'],\n\t\t\tcd: ['Product Name', 'APR', 'APY', 'Action'],\n\t\t\t\/\/ Default fallback\n\t\t\tdefault: ['Product Name', 'Rate\/APR', 'APY\/PSM', 'Action']\n\t\t};\n\t\n\t\t\/\/ Define mobile labels for each product type\n\t\tconst typeLabels = {\n\t\t\tloan: ['APR', 'APR (PSM)'],\n\t\t\tsavings: ['APR', 'APY'],\n\t\t\tmoney_market: ['APR', 'APY'],\n\t\t\tcd: ['APR', 'APY'],\n\t\t\t\/\/ Default fallback\n\t\t\tdefault: ['Rate\/APR', 'APY\/PSM']\n\t\t};\n\t\n\t\tReact.useEffect(() => {\n\t\t\tconst checkIfMobile = () => setIsMobile(window.innerWidth < 768);\n\t\t\tcheckIfMobile();\n\t\t\twindow.addEventListener('resize', checkIfMobile);\n\t\t\treturn () => window.removeEventListener('resize', checkIfMobile);\n\t\t}, []);\n\t\n\t\tReact.useEffect(() => {\n\t\t\t\/\/ Sync with external controls\n\t\t\tconst searchInput = document.getElementById('searchInput');\n\t\t\tconst categoryFilter = document.getElementById('categoryFilter');\n\t\t\t\n\t\t\tsearchInput.addEventListener('input', (e) => setSearchTerm(e.target.value));\n\t\t\tcategoryFilter.addEventListener('change', (e) => setSelectedCategory(e.target.value));\n\t\t\t\n\t\t\treturn () => {\n\t\t\t\tsearchInput.removeEventListener('input', (e) => setSearchTerm(e.target.value));\n\t\t\t\tcategoryFilter.removeEventListener('change', (e) => setSelectedCategory(e.target.value));\n\t\t\t};\n\t\t}, []);\n\t\n\t\tconst filterProducts = () => {\n\t\t\tconst allProducts = [\n\t\t\t\t...ratesData.loanProducts,\n\t\t\t\t...ratesData.savingsProducts,\n\t\t\t\t...ratesData.moneyMarketProducts,\n\t\t\t\t...ratesData.certificateProducts\n\t\t\t];\n\t\n\t\t\treturn allProducts.filter(product => {\n\t\t\t\tconst matchesSearch = searchTerm === '' || \n\t\t\t\t\tproduct.name.toLowerCase().includes(searchTerm.toLowerCase()) ||\n\t\t\t\t\tproduct.category.toLowerCase().includes(searchTerm.toLowerCase());\n\t\t\t\tconst matchesType = selectedCategory === 'all' || product.type === selectedCategory;\n\t\t\t\treturn matchesSearch && matchesType;\n\t\t\t});\n\t\t};\n\t\n\t\tconst groupProducts = (products) => {\n\t\t\tconst grouped = {};\n\t\t\tproducts.forEach(product => {\n\t\t\t\tconst type = product.type;\n\t\t\t\tif (!grouped[type]) {\n\t\t\t\t\tgrouped[type] = [];\n\t\t\t\t}\n\t\t\t\tgrouped[type].push(product);\n\t\t\t});\n\t\t\treturn grouped;\n\t\t};\n\t\n\t\tconst renderMobileView = (groupedProducts) => (\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{Object.entries(groupedProducts).map(([type, products]) => (\n\t\t\t\t\t<div key={type} className=\"space-y-4\">\n\t\t\t\t\t\t<div className=\"bg-gray-100 px-4 py-2 font-bold text-gray-800\">\n\t\t\t\t\t\t\t{type.replace('_', ' ').toUpperCase()} PRODUCTS\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t{products.map((product, idx) => (\n\t\t\t\t\t\t\t<div key={idx} className=\"bg-white rounded-lg shadow p-4 space-y-3\">\n\t\t\t\t\t\t\t\t<h5 className=\"font-semibold text-lg !text-gray-900\">{product.name}<\/h5>\n\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm !text-gray-600\">{(typeLabels[type] && typeLabels[type][0]) || typeLabels.default[0]}<\/p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"font-medium\">{(product.apr || product.rate) === 'Call for rate' ? 'Call for rate' : `${product.apr || product.rate}%`}<\/p>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm !text-gray-600\">{(typeLabels[type] && typeLabels[type][1]) || typeLabels.default[1]}<\/p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"font-medium\">{product.apy || product.psm ? `${product.apy || product.psm}%` : '-'}<\/p>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref={productUrls[product.type]}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full mt-2 flex items-center justify-center gap-2 px-4 py-2 bg-[#00475f] !text-white rounded hover:bg-[#003344] transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLearn More\n\t\t\t\t\t\t\t\t\t<i className=\"fas fa-arrow-right\"><\/i>\n\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t<\/div>\n\t\t\t\t))}\n\t\t\t<\/div>\n\t\t);\n\t\n\/\/ Update the renderDesktopView function in your React component\n\t\tconst renderDesktopView = (groupedProducts) => (\n\t\t\t<div className=\"overflow-x-auto space-y-8\">\n\t\t\t\t{Object.entries(groupedProducts).map(([type, products]) => (\n\t\t\t\t\t<div key={type} className=\"shadow-lg rounded-lg bg-white overflow-hidden\">\n\t\t\t\t\t\t<table className=\"w-full table-fixed\">\n\t\t\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t\t\t<col style={{ width: '40%' }} \/> {\/* Product Name column *\/}\n\t\t\t\t\t\t\t\t<col style={{ width: '20%' }} \/> {\/* Rate\/APR column *\/}\n\t\t\t\t\t\t\t\t<col style={{ width: '20%' }} \/> {\/* APY column *\/}\n\t\t\t\t\t\t\t\t<col style={{ width: '20%' }} \/> {\/* Action column *\/}\n\t\t\t\t\t\t\t<\/colgroup>\n\t\t\t\t\t\t\t<thead className=\"bg-[#00475f] !text-white\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t{\/* Use the specific headers for this product type *\/}\n\t\t\t\t\t\t\t\t\t{(typeHeaders[type] ? typeHeaders[type] : typeHeaders.default).map((header, idx) => (\n\t\t\t\t\t\t\t\t\t\t<th key={idx} className={`px-6 py-3 text-left ${idx === 3 ? 'text-center' : ''}`}>\n\t\t\t\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t\t\t\t<\/th>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t<\/thead>\n\t\t\t\t\t\t\t<tbody className=\"divide-y divide-gray-200\">\n\t\t\t\t\t\t\t\t<tr className=\"bg-gray-50\">\n\t\t\t\t\t\t\t\t\t<td colSpan=\"4\" className=\"px-6 py-3 font-bold\">\n\t\t\t\t\t\t\t\t\t\t{type.replace('_', ' ').toUpperCase()} PRODUCTS\n\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t\t{products.map((product, idx) => (\n\t\t\t\t\t\t\t\t\t<tr key={idx} className=\"hover:bg-gray-50\">\n\t\t\t\t\t\t\t\t\t\t<td className=\"px-6 py-4\">{product.name}<\/td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"px-6 py-4\">\n\t\t\t\t\t\t\t\t\t\t\t{(product.apr || product.rate) === 'Call for rate' ? 'Call for rate' : `${product.apr || product.rate}%`}\n\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"px-6 py-4\">{product.apy || product.psm ? `${product.apy || product.psm}%` : '-'}<\/td>\n\t\t\t\t\t\t\t\t\t\t<td className=\"px-6 py-4 text-center\">\n\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\thref={productUrls[product.type]}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-2 px-4 py-2 bg-[#00475f] !text-white rounded hover:bg-[#003344] transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tLearn More\n\t\t\t\t\t\t\t\t\t\t\t\t<i className=\"fas fa-arrow-right\"><\/i>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t<\/td>\n\t\t\t\t\t\t\t\t\t<\/tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t<\/tbody>\n\t\t\t\t\t\t<\/table>\n\t\t\t\t\t<\/div>\n\t\t\t\t))}\n\t\t\t<\/div>\n\t\t);\n\t\n\t\tconst filteredProducts = filterProducts();\n\t\tconst groupedProducts = groupProducts(filteredProducts);\n\t\n\t\treturn isMobile ? renderMobileView(groupedProducts) : renderDesktopView(groupedProducts);\n\t};\n\t\n\t\/\/ Mount React component\n\tReactDOM.render(\n\t\t<ResponsiveRates \/>,\n\t\tdocument.getElementById('ratesContainer')\n\t);\n\t\t<\/script>\n\t\n\t\t<!-- PDF Generation Script -->\n\t<script>\n\t\t\nfunction generatePDF() {\n\t\tconst { jsPDF } = window.jspdf;\n\t\tconst doc = new jsPDF('p', 'pt', 'a4');\n\t\tconst pageWidth = doc.internal.pageSize.getWidth();\n\t\tconst pageHeight = doc.internal.pageSize.getHeight();\n\t\tconst margin = 40;\n\t\tlet currentY = margin;\n\t\n\t\t\/\/ Add header\n\t\tdoc.addImage('https:\/\/demo2.mybscu.org\/wp-content\/uploads\/2016\/07\/logo.png', 'PNG', margin, margin, 120, 40);\n\t\tdoc.setFontSize(16);\n\t\tdoc.setTextColor(0, 71, 95);\n\t\tdoc.text('Current Rates', pageWidth - 150, margin + 20);\n\t\tdoc.setFontSize(10);\n\t\tdoc.setTextColor(100);\n\t\tconst currentDate = new Date().toLocaleDateString();\n\t\tdoc.text(`Effective ${currentDate}`, pageWidth - 150, margin + 35);\n\t\n\t\t\/\/ Define headers for each product type\n\t\tconst typeHeaders = {\n\t\t\tloan: ['Product Name', 'APR', 'APR (PSM)'],\n\t\t\tsavings: ['Product Name', 'APR', 'APY'],\n\t\t\tmoney_market: ['Product Name', 'APR', 'APY'],\n\t\t\tcd: ['Product Name', 'APR', 'APY'],\n\t\t\tbusiness: ['Product Name', 'Rate\/APR', 'APY\/PSM'], \/\/ Add business type\n\t\t\t\/\/ Default fallback\n\t\t\tdefault: ['Product Name', 'Rate\/APR', 'APY\/PSM']\n\t\t};\n\t\n\t\t\/\/ Table settings\n\t\tconst startY = margin + 80;\n\t\tconst cellPadding = 10;\n\t\tcurrentY = startY;\n\t\tconst colWidths = [\n\t\t\t(pageWidth - 2 * margin) * 0.6, \/\/ Product Name column\n\t\t\t(pageWidth - 2 * margin) * 0.2, \/\/ Rate\/APR column\n\t\t\t(pageWidth - 2 * margin) * 0.2  \/\/ APY column\n\t\t];\n\t\n\t\t\/\/ Function to add new page\n\t\tfunction addNewPage() {\n\t\t\tdoc.addPage();\n\t\t\tcurrentY = margin;\n\t\t}\n\t\n\t\t\/\/ Get all products\n\t\tconst allProducts = [\n\t\t\t...ratesData.loanProducts,\n\t\t\t...ratesData.savingsProducts,\n\t\t\t...ratesData.moneyMarketProducts,\n\t\t\t...ratesData.businessProducts,\n\t\t\t...ratesData.certificateProducts\n\t\t];\n\t\n\t\t\/\/ Group products by type\n\t\tconst groupedProducts = {};\n\t\tallProducts.forEach(product => {\n\t\t\tif (!groupedProducts[product.type]) {\n\t\t\t\tgroupedProducts[product.type] = [];\n\t\t\t}\n\t\t\tgroupedProducts[product.type].push(product);\n\t\t});\n\t\n\t\t\/\/ Function to add fine print\n\t\tfunction addFineprint() {\n\t\t\t\/\/ [Fine print code remains unchanged]\n\t\t\tdoc.addPage();\n\t\t\tcurrentY = margin;\n\t\t\t\n\t\t\t\/\/ Savings Products section\n\t\t\tdoc.setFontSize(11);\n\t\t\tdoc.setTextColor(0);\n\t\t\tdoc.setFont(undefined, 'bold');\n\t\t\tdoc.text('Savings Products:', margin, currentY);\n\t\t\tcurrentY += 20;\n\t\t\t\n\t\t\tdoc.setFontSize(9);\n\t\t\tdoc.setFont(undefined, 'italic');\n\t\t\tdoc.text('APY = Annual Percentage Yield. Rate = Dividend Rate.', margin, currentY);\n\t\t\tdoc.setFont(undefined, 'normal');\n\t\t\tcurrentY += 20;\n\t\n\t\t\tconst savingsText = `All rates shown are our best rates; are correct as of the effective date shown and are subject to change or end without notice. Your actual rate(s) may vary depending upon a number of factors, including membership level and the product you select. Fees could reduce the earnings on your account(s), a penalty will or may be imposed for early withdrawals. See our Fee Schedule and Account Disclosures for complete details. For Money Market Accounts; certain limitations apply to the nature and number of monthly transactions;`;\n\t\t\t\n\t\t\tconst bulletPoints1 = [\n\t\t\t\t'A $10 monthly fee applies for balances under $2,500;',\n\t\t\t\t'A $12 per item fee applies when you have more than 6 checks or withdrawals in a month (Reg D).'\n\t\t\t];\n\t\t\t\n\t\t\tconst savingsText2 = `CD rates and terms apply to CDs as well as to IRA CDs. Some limitations may apply to IRA CD terms. For some accounts, such as a Wish Account, CDs, IRAs and IRA CDs, a penalty may be imposed for early withdrawal. Platinum Star Membership offers cannot be combined with other offers. You must maintain a minimum daily balance in your account(s) each day to obtain the disclosed APY;`;\n\t\t\t\n\t\t\tconst bulletPoints2 = [\n\t\t\t\t'Minimum for Savings and Wish accounts is $25;',\n\t\t\t\t'Minimum for Interest Checking is $1,000.'\n\t\t\t];\n\t\t\t\n\t\t\tconst savingsText3 = `There is a $5 monthly Savings Account participation fee if your Savings balance falls below $500 and you have no other accounts (i.e. checking) with BrightStar CU.`;\n\t\n\t\t\t\/\/ Add savings text with proper wrapping\n\t\t\tconst splitText = doc.splitTextToSize(savingsText, pageWidth - 2 * margin);\n\t\t\tdoc.text(splitText, margin, currentY);\n\t\t\tcurrentY += splitText.length * 12;\n\t\n\t\t\t\/\/ Add bullet points\n\t\t\tbulletPoints1.forEach(point => {\n\t\t\t\tdoc.text('\u00b7', margin, currentY);\n\t\t\t\tconst bulletText = doc.splitTextToSize(point, pageWidth - 2 * margin - 15);\n\t\t\t\tdoc.text(bulletText, margin + 15, currentY);\n\t\t\t\tcurrentY += bulletText.length * 12;\n\t\t\t});\n\t\t\t\n\t\t\tcurrentY += 10;\n\t\t\t\n\t\t\t\/\/ Add second paragraph\n\t\t\tconst splitText2 = doc.splitTextToSize(savingsText2, pageWidth - 2 * margin);\n\t\t\tdoc.text(splitText2, margin, currentY);\n\t\t\tcurrentY += splitText2.length * 12;\n\t\n\t\t\t\/\/ Add second set of bullet points\n\t\t\tbulletPoints2.forEach(point => {\n\t\t\t\tdoc.text('\u00b7', margin, currentY);\n\t\t\t\tconst bulletText = doc.splitTextToSize(point, pageWidth - 2 * margin - 15);\n\t\t\t\tdoc.text(bulletText, margin + 15, currentY);\n\t\t\t\tcurrentY += bulletText.length * 12;\n\t\t\t});\n\t\t\t\n\t\t\tcurrentY += 10;\n\t\t\t\n\t\t\tconst splitText3 = doc.splitTextToSize(savingsText3, pageWidth - 2 * margin);\n\t\t\tdoc.text(splitText3, margin, currentY);\n\t\t\tcurrentY += splitText3.length * 12 + 20;\n\t\n\t\t\t\/\/ Loan Products section\n\t\t\tdoc.setFontSize(11);\n\t\t\tdoc.setFont(undefined, 'bold');\n\t\t\tdoc.text('Loan Products:', margin, currentY);\n\t\t\tcurrentY += 20;\n\t\t\t\n\t\t\tdoc.setFontSize(9);\n\t\t\tdoc.setFont(undefined, 'italic');\n\t\t\tdoc.text('APR = Annual Percentage Rate.', margin, currentY);\n\t\t\tdoc.setFont(undefined, 'normal');\n\t\t\tcurrentY += 20;\n\t\n\t\t\tconst loanText1 = `Our Home Equity Lines of Credit (HELOC) have no annual fee and no application fee. Consult your tax adviser to determine tax benefits, if any.`;\n\t\t\t\n\t\t\tconst loanBullets = [\n\t\t\t\t'Members may be required to pay for an appraisal, which can range from $75 - $550.',\n\t\t\t\t'HELOC APR\\'s are variable and indexed to the Prime Rate as published in the Wall Street Journal.',\n\t\t\t\t'The maximum APR that may be imposed is 18%.'\n\t\t\t];\n\t\t\t\n\t\t\tconst loanText2 = `Auto Loans: Individuals who meet the lending and account criteria may qualify for rates as low as 5.25% APR* for Platinum Star Members utilizing our Auto Advisor Service for 36 months and as low as 5.50% APR* for non-Platinum Star Members for 36 months utilizing Auto Advisors. For all accounts and loans, conditions and credit approval apply.`;\n\t\t\t\n\t\t\tconst loanText3 = `Some rates displayed on this rate sheet are rounded. Membership eligibility is required. Ask a representative for complete details. Federally Insured by NCUA.`;\n\t\n\t\t\t\/\/ Add loan text with proper wrapping\n\t\t\tconst splitLoanText1 = doc.splitTextToSize(loanText1, pageWidth - 2 * margin);\n\t\t\tdoc.text(splitLoanText1, margin, currentY);\n\t\t\tcurrentY += splitLoanText1.length * 12;\n\t\n\t\t\t\/\/ Add loan bullet points\n\t\t\tloanBullets.forEach(point => {\n\t\t\t\tdoc.text('\u00b7', margin, currentY);\n\t\t\t\tconst bulletText = doc.splitTextToSize(point, pageWidth - 2 * margin - 15);\n\t\t\t\tdoc.text(bulletText, margin + 15, currentY);\n\t\t\t\tcurrentY += bulletText.length * 12;\n\t\t\t});\n\t\t\t\n\t\t\tcurrentY += 10;\n\t\t\t\n\t\t\tconst splitLoanText2 = doc.splitTextToSize(loanText2, pageWidth - 2 * margin);\n\t\t\tdoc.text(splitLoanText2, margin, currentY);\n\t\t\tcurrentY += splitLoanText2.length * 12 + 10;\n\t\t\t\n\t\t\tconst splitLoanText3 = doc.splitTextToSize(loanText3, pageWidth - 2 * margin);\n\t\t\tdoc.text(splitLoanText3, margin, currentY);\n\t\t}\n\t\n\t\t\/\/ Draw products\n\t\tObject.entries(groupedProducts).forEach(([type, products], typeIndex) => {\n\t\t\t\/\/ Check if we need a new page\n\t\t\tif (currentY + 100 > pageHeight - margin && typeIndex !== 0) {\n\t\t\t\taddNewPage();\n\t\t\t}\n\t\n\t\t\t\/\/ Draw section header with light gray background\n\t\t\tdoc.setFillColor(240, 240, 240);\n\t\t\tdoc.rect(margin, currentY, pageWidth - 2 * margin, 25, 'F');\n\t\t\tdoc.setTextColor(0);\n\t\t\tdoc.setFontSize(11);\n\t\t\tdoc.setFont('helvetica', 'bold');\n\t\t\tdoc.text(type.replace('_', ' ').toUpperCase() + ' PRODUCTS', margin + cellPadding, currentY + 17);\n\t\t\tcurrentY += 25;\n\t\n\t\t\t\/\/ Get the appropriate headers for this product type\n\t\t\tconst headers = typeHeaders[type] ? typeHeaders[type] : typeHeaders.default;\n\t\n\t\t\t\/\/ Draw column headers with dark blue background\n\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\tdoc.rect(margin, currentY, pageWidth - 2 * margin, 30, 'F');\n\t\t\tdoc.setTextColor(255);\n\t\t\tdoc.setFontSize(10);\n\t\t\tdoc.setFont('helvetica', 'bold');\n\t\t\t\n\t\t\t\/\/ Draw Product Name header\n\t\t\tdoc.text(headers[0], margin + cellPadding, currentY + 20);\n\t\n\t\t\t\/\/ Draw Rate\/APR and APY columns with appropriate labels\n\t\t\tconst columnWidth = (pageWidth - 2 * margin) \/ 3;\n\t\t\tlet x = margin + columnWidth * 2;\n\t\t\t\n\t\t\t\/\/ Draw the second column header (APR or Rate\/APR)\n\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\tdoc.text(headers[1], x + cellPadding, currentY + 20);\n\t\t\tx += columnWidth \/ 2;\n\t\t\t\n\t\t\t\/\/ Draw the third column header (APY, APR (PSM), or APY\/PSM)\n\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\tdoc.text(headers[2], x + cellPadding, currentY + 20);\n\t\t\t\n\t\t\tcurrentY += 30;\n\t\n\t\t\t\/\/ Draw rows\n\t\t\tproducts.forEach((product, index) => {\n\t\t\t\tif (currentY + 30 > pageHeight - margin) {\n\t\t\t\t\taddNewPage();\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Redraw headers on new page\n\t\t\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\t\t\tdoc.rect(margin, currentY, pageWidth - 2 * margin, 30, 'F');\n\t\t\t\t\tdoc.setTextColor(255);\n\t\t\t\t\tdoc.setFontSize(10);\n\t\t\t\t\tdoc.setFont('helvetica', 'bold');\n\t\t\t\t\tdoc.text(headers[0], margin + cellPadding, currentY + 20);\n\t\n\t\t\t\t\tx = margin + columnWidth * 2;\n\t\t\t\t\t\/\/ Second column header\n\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\t\t\tdoc.text(headers[1], x + cellPadding, currentY + 20);\n\t\t\t\t\tx += columnWidth \/ 2;\n\t\t\t\t\t\/\/ Third column header\n\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\t\t\tdoc.text(headers[2], x + cellPadding, currentY + 20);\n\t\t\t\t\t\n\t\t\t\t\tcurrentY += 30;\n\t\t\t\t}\n\t\n\t\t\t\t\/\/ Draw row\n\t\t\t\tx = margin;\n\t\t\t\tdoc.setDrawColor(200);\n\t\t\t\tdoc.setLineWidth(0.5);\n\t\t\t\tdoc.setTextColor(0);\n\t\t\t\tdoc.setFontSize(9);\n\t\t\t\tdoc.setFont('helvetica', 'normal');\n\t\n\t\t\t\t\/\/ Product Name\n\t\t\t\tdoc.rect(x, currentY, pageWidth - 2 * margin - columnWidth, 30);\n\t\t\t\tdoc.text(product.name, x + cellPadding, currentY + 20);\n\t\n\t\t\t\t\/\/ Rate\/APR and APY\n\t\t\t\tx = margin + (pageWidth - 2 * margin - columnWidth);\n\t\t\t\t[\n\t\t\t\t\t(product.apr || product.rate) === 'Call for rate' ? 'Call for rate' : (product.apr || product.rate) + '%',\n\t\t\t\t\t(product.apy || product.psm) ? (product.apy || product.psm) + '%' : '-'\n\t\t\t\t].forEach((text, i) => {\n\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30);\n\t\t\t\t\tdoc.text(text, x + cellPadding, currentY + 20);\n\t\t\t\t\tx += columnWidth \/ 2;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tcurrentY += 30;\n\t\t\t});\n\t\t\t\n\t\t\tcurrentY += 10; \/\/ Add spacing between sections\n\t\t});\n\t\n\t\t\/\/ Add footer on every page\n\t\tconst pageCount = doc.internal.getNumberOfPages();\n\t\tfor (let i = 1; i <= pageCount; i++) {\n\t\t\tdoc.setPage(i);\n\t\t\tconst footerY = pageHeight - margin;\n\t\t\tdoc.setFontSize(8);\n\t\t\tdoc.setTextColor(100);\n\t\t\tdoc.text('Federally insured by NCUA', pageWidth \/ 2, footerY, { align: 'center' });\n\t\t\t\n\t\t\t\/\/ Add logos only on the last page\n\t\t\tif (i === pageCount) {\n\t\t\t\tdoc.addImage('https:\/\/demo2.mybscu.org\/wp-content\/uploads\/2018\/02\/EHOLogo.png', 'PNG', margin, footerY - 30, 40, 40);\n\t\t\t\tdoc.addImage('https:\/\/demo2.mybscu.org\/wp-content\/uploads\/2018\/02\/NCUALogo.png', 'PNG', pageWidth - margin - 40, footerY - 30, 40, 40);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\t\/\/ Add fine print\n\t\taddFineprint();\n\t\n\t\t\/\/ Save the PDF\n\t\tdoc.save('BrightStar-Current-Rates.pdf');\n\t}\n\t\t<\/script>\n\t\t\n\t\t<script>\n\t\t\tdocument.addEventListener('DOMContentLoaded', function() {\n\t\t\t\t\/\/ Format today's date\n\t\t\t\tconst today = new Date();\n\t\t\t\tconst options = { year: 'numeric', month: 'long', day: 'numeric' };\n\t\t\t\tconst formattedDate = today.toLocaleDateString('en-US', options);\n\t\t\t\t\n\t\t\t\t\/\/ Set the formatted date to the span\n\t\t\t\tdocument.getElementById('effectiveDate').textContent = formattedDate;\n\t\t\t});\n\t\t<\/script>\n\t\t\n\t\t<script>\n\t\t\t\/\/ Modal functions\n\t\t\tfunction openShareModal() {\n\t\t\t\tdocument.getElementById('shareModal').classList.remove('hidden');\n\t\t\t\tdocument.getElementById('shareFormContent').classList.remove('hidden');\n\t\t\t\tdocument.getElementById('successMessage').classList.add('hidden');\n\t\t\t\tdocument.getElementById('shareForm').reset();\n\t\t\t}\n\t\t\t\n\t\t\tfunction closeShareModal() {\n\t\t\t\tdocument.getElementById('shareModal').classList.add('hidden');\n\t\t\t}\n\t\t\t\n\t\t\t\/\/ Initialize form submission handler\n\t\t\tdocument.addEventListener('DOMContentLoaded', function() {\n\t\t\t\tdocument.getElementById('shareForm').addEventListener('submit', handleShareFormSubmit);\n\t\t\t});\n\t\t\t\n\t\t\t\/\/ Form submission handler\n\t\tfunction handleShareFormSubmit(e) {\n\t\t\te.preventDefault();\n\t\t\t\n\t\t\t\/\/ Detect iOS\n\t\t\tconst isIOS = \/iPad|iPhone|iPod\/.test(navigator.userAgent) && !window.MSStream;\n\t\t\t\n\t\t\tconst memberName = document.getElementById('memberName').value;\n\t\t\tconst memberEmail = document.getElementById('memberEmail').value;\n\t\t\t\n\t\t\t\/\/ Show loading state\n\t\t\tconst submitButton = e.target.querySelector('button[type=\"submit\"]');\n\t\t\tconst originalButtonText = submitButton.innerHTML;\n\t\t\tsubmitButton.innerHTML = '<i class=\"fas fa-spinner fa-spin\"><\/i> Preparing...';\n\t\t\tsubmitButton.disabled = true;\n\t\t\t\n\t\t\t\/\/ For iOS, use a staged approach with multiple timeouts\n\t\t\tif (isIOS) {\n\t\t\t\tconsole.log(\"iOS detected - using staged approach\");\n\t\t\t\t\n\t\t\t\t\/\/ Stage 1: Small delay before PDF generation\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tsubmitButton.innerHTML = '<i class=\"fas fa-spinner fa-spin\"><\/i> Generating PDF...';\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Stage 2: Generate PDF with another delay\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst doc = generateRatesPDF();\n\t\t\t\t\t\t\tsubmitButton.innerHTML = '<i class=\"fas fa-spinner fa-spin\"><\/i> Processing...';\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/\/ Stage 3: Convert to base64 with another delay\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst pdfBase64 = doc.output('datauristring').split(',')[1];\n\t\t\t\t\t\t\t\t\tsubmitButton.innerHTML = '<i class=\"fas fa-spinner fa-spin\"><\/i> Sending...';\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\/\/ Stage 4: Send to server\n\t\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\t\tsendEmailWithIOSHandling(memberName, memberEmail, pdfBase64, function(success) {\n\t\t\t\t\t\t\t\t\t\t\tsubmitButton.innerHTML = originalButtonText;\n\t\t\t\t\t\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\t\t\t\t\t\tdocument.getElementById('shareFormContent').classList.add('hidden');\n\t\t\t\t\t\t\t\t\t\t\t\tdocument.getElementById('successMessage').classList.remove('hidden');\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\talert('There was an error sending the email. Please try again.');\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\tconsole.error(\"Error in base64 conversion:\", error);\n\t\t\t\t\t\t\t\t\tsubmitButton.innerHTML = originalButtonText;\n\t\t\t\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\t\t\t\talert(\"Error preparing document. Please try again.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error(\"Error generating PDF:\", error);\n\t\t\t\t\t\t\tsubmitButton.innerHTML = originalButtonText;\n\t\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\t\talert(\"Error generating document. Please try again.\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 500);\n\t\t\t\t}, 300);\n\t\t\t} else {\n\t\t\t\t\/\/ For non-iOS, use the normal approach\n\t\t\t\ttry {\n\t\t\t\t\tconst doc = generateRatesPDF();\n\t\t\t\t\tconst pdfBase64 = doc.output('datauristring').split(',')[1];\n\t\t\t\t\t\n\t\t\t\t\tsendEmailWithMailgun(memberName, memberEmail, pdfBase64, function(success) {\n\t\t\t\t\t\tsubmitButton.innerHTML = originalButtonText;\n\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\tdocument.getElementById('shareFormContent').classList.add('hidden');\n\t\t\t\t\t\t\tdocument.getElementById('successMessage').classList.remove('hidden');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert('There was an error sending the email. Please try again.');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"Error:\", error);\n\t\t\t\t\tsubmitButton.innerHTML = originalButtonText;\n\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\talert(\"An error occurred: \" + error.message);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\/\/ Special function for iOS with built-in retry\n\t\tfunction sendEmailWithIOSHandling(memberName, memberEmail, pdfBase64, callback, attempt = 1) {\n\t\t\tconst maxAttempts = 3;\n\t\t\t\n\t\t\tconsole.log(`iOS email sending attempt ${attempt} of ${maxAttempts}`);\n\t\t\t\n\t\t\tfetch('\/api\/rates\/send-rates-email.php', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application\/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmemberName: memberName,\n\t\t\t\t\tmemberEmail: memberEmail,\n\t\t\t\t\tpdfContent: pdfBase64\n\t\t\t\t})\n\t\t\t})\n\t\t\t.then(response => response.json().catch(() => ({ success: false })))\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tcallback(true);\n\t\t\t\t} else if (attempt < maxAttempts) {\n\t\t\t\t\tconsole.log(`iOS automatic retry ${attempt} of ${maxAttempts}`);\n\t\t\t\t\t\/\/ Auto-retry for iOS\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsendEmailWithIOSHandling(memberName, memberEmail, pdfBase64, callback, attempt + 1);\n\t\t\t\t\t}, 1000);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(false);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(\"iOS fetch error:\", error);\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tconsole.log(`iOS error retry ${attempt} of ${maxAttempts}`);\n\t\t\t\t\t\/\/ Auto-retry on error\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsendEmailWithIOSHandling(memberName, memberEmail, pdfBase64, callback, attempt + 1);\n\t\t\t\t\t}, 1000);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(false);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\t\n\t\t\t\/\/ Function to generate PDF and return the doc object instead of saving it\n\t\t\tfunction generateRatesPDF() {\n\t\t\t\tconst { jsPDF } = window.jspdf;\n\t\t\t\tconst doc = new jsPDF('p', 'pt', 'a4');\n\t\t\t\tconst pageWidth = doc.internal.pageSize.getWidth();\n\t\t\t\tconst pageHeight = doc.internal.pageSize.getHeight();\n\t\t\t\tconst margin = 40;\n\t\t\t\tlet currentY = margin;\n\t\t\t\t\n\t\t\t\t\/\/ Add header\n\t\t\t\tdoc.addImage('https:\/\/demo2.mybscu.org\/wp-content\/uploads\/2016\/07\/logo.png', 'PNG', margin, margin, 120, 40);\n\t\t\t\tdoc.setFontSize(16);\n\t\t\t\tdoc.setTextColor(0, 71, 95);\n\t\t\t\tdoc.text('Current Rates', pageWidth - 150, margin + 20);\n\t\t\t\tdoc.setFontSize(10);\n\t\t\t\tdoc.setTextColor(100);\n\t\t\t\tconst currentDate = new Date().toLocaleDateString();\n\t\t\t\tdoc.text(`Effective ${currentDate}`, pageWidth - 150, margin + 35);\n\t\t\t\t\n\t\t\t\t\/\/ Define headers for each product type\n\t\t\t\tconst typeHeaders = {\n\t\t\t\t\tloan: ['Product Name', 'APR', 'APR (PSM)'],\n\t\t\t\t\tsavings: ['Product Name', 'APR', 'APY'],\n\t\t\t\t\tmoney_market: ['Product Name', 'APR', 'APY'],\n\t\t\t\t\tcd: ['Product Name', 'APR', 'APY'],\n\t\t\t\t\tbusiness: ['Product Name', 'Rate\/APR', 'APY\/PSM'], \/\/ Add business type\n\t\t\t\t\t\/\/ Default fallback\n\t\t\t\t\tdefault: ['Product Name', 'Rate\/APR', 'APY\/PSM']\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\t\/\/ Table settings\n\t\t\t\tconst startY = margin + 80;\n\t\t\t\tconst cellPadding = 10;\n\t\t\t\tcurrentY = startY;\n\t\t\t\tconst colWidths = [\n\t\t\t\t\t(pageWidth - 2 * margin) * 0.6, \/\/ Product Name column\n\t\t\t\t\t(pageWidth - 2 * margin) * 0.2, \/\/ Rate\/APR column\n\t\t\t\t\t(pageWidth - 2 * margin) * 0.2  \/\/ APY column\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\t\/\/ Function to add new page\n\t\t\t\tfunction addNewPage() {\n\t\t\t\t\tdoc.addPage();\n\t\t\t\t\tcurrentY = margin;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/ Get all products\n\t\t\t\tconst allProducts = [\n\t\t\t\t\t...ratesData.loanProducts,\n\t\t\t\t\t...ratesData.savingsProducts,\n\t\t\t\t\t...ratesData.moneyMarketProducts,\n\t\t\t\t\t...ratesData.businessProducts,\n\t\t\t\t\t...ratesData.certificateProducts\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\t\/\/ Group products by type\n\t\t\t\tconst groupedProducts = {};\n\t\t\t\tallProducts.forEach(product => {\n\t\t\t\t\tif (!groupedProducts[product.type]) {\n\t\t\t\t\t\tgroupedProducts[product.type] = [];\n\t\t\t\t\t}\n\t\t\t\t\tgroupedProducts[product.type].push(product);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\/\/ Function to add fine print\n\t\t\t\tfunction addFineprint() {\n\t\t\t\t\t\/\/ [Fine print code remains unchanged]\n\t\t\t\t\tdoc.addPage();\n\t\t\t\t\tcurrentY = margin;\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Savings Products section\n\t\t\t\t\tdoc.setFontSize(11);\n\t\t\t\t\tdoc.setTextColor(0);\n\t\t\t\t\tdoc.setFont(undefined, 'bold');\n\t\t\t\t\tdoc.text('Savings Products:', margin, currentY);\n\t\t\t\t\tcurrentY += 20;\n\t\t\t\t\t\n\t\t\t\t\tdoc.setFontSize(9);\n\t\t\t\t\tdoc.setFont(undefined, 'italic');\n\t\t\t\t\tdoc.text('APY = Annual Percentage Yield. Rate = Dividend Rate.', margin, currentY);\n\t\t\t\t\tdoc.setFont(undefined, 'normal');\n\t\t\t\t\tcurrentY += 20;\n\t\t\t\t\n\t\t\t\t\tconst savingsText = `All rates shown are our best rates; are correct as of the effective date shown and are subject to change or end without notice. Your actual rate(s) may vary depending upon a number of factors, including membership level and the product you select. Fees could reduce the earnings on your account(s), a penalty will or may be imposed for early withdrawals. See our Fee Schedule and Account Disclosures for complete details. For Money Market Accounts; certain limitations apply to the nature and number of monthly transactions;`;\n\t\t\t\t\t\n\t\t\t\t\tconst bulletPoints1 = [\n\t\t\t\t\t\t'A $10 monthly fee applies for balances under $2,500;',\n\t\t\t\t\t\t'A $5 per item fee applies when you have more than 6 checks or withdrawals in a month (Reg D).'\n\t\t\t\t\t];\n\t\t\t\t\t\n\t\t\t\t\tconst savingsText2 = `CD rates and terms apply to CDs as well as to IRA CDs. Some limitations may apply to IRA CD terms. For some accounts, such as a Wish Account, CDs, IRAs and IRA CDs, a penalty may be imposed for early withdrawal. Platinum Star Membership offers cannot be combined with other offers. You must maintain a minimum daily balance in your account(s) each day to obtain the disclosed APY;`;\n\t\t\t\t\t\n\t\t\t\t\tconst bulletPoints2 = [\n\t\t\t\t\t\t'Minimum for Savings and Wish accounts is $25;',\n\t\t\t\t\t\t'Minimum for Interest Checking is $1,000.'\n\t\t\t\t\t];\n\t\t\t\t\t\n\t\t\t\t\tconst savingsText3 = `There is a $5 monthly Savings Account participation fee if your Savings balance falls below $500 and you have no other accounts (i.e. checking) with BrightStar CU.`;\n\t\t\t\t\n\t\t\t\t\t\/\/ Add savings text with proper wrapping\n\t\t\t\t\tconst splitText = doc.splitTextToSize(savingsText, pageWidth - 2 * margin);\n\t\t\t\t\tdoc.text(splitText, margin, currentY);\n\t\t\t\t\tcurrentY += splitText.length * 12;\n\t\t\t\t\n\t\t\t\t\t\/\/ Add bullet points\n\t\t\t\t\tbulletPoints1.forEach(point => {\n\t\t\t\t\t\tdoc.text('\u00b7', margin, currentY);\n\t\t\t\t\t\tconst bulletText = doc.splitTextToSize(point, pageWidth - 2 * margin - 15);\n\t\t\t\t\t\tdoc.text(bulletText, margin + 15, currentY);\n\t\t\t\t\t\tcurrentY += bulletText.length * 12;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tcurrentY += 10;\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Add second paragraph\n\t\t\t\t\tconst splitText2 = doc.splitTextToSize(savingsText2, pageWidth - 2 * margin);\n\t\t\t\t\tdoc.text(splitText2, margin, currentY);\n\t\t\t\t\tcurrentY += splitText2.length * 12;\n\t\t\t\t\n\t\t\t\t\t\/\/ Add second set of bullet points\n\t\t\t\t\tbulletPoints2.forEach(point => {\n\t\t\t\t\t\tdoc.text('\u00b7', margin, currentY);\n\t\t\t\t\t\tconst bulletText = doc.splitTextToSize(point, pageWidth - 2 * margin - 15);\n\t\t\t\t\t\tdoc.text(bulletText, margin + 15, currentY);\n\t\t\t\t\t\tcurrentY += bulletText.length * 12;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tcurrentY += 10;\n\t\t\t\t\t\n\t\t\t\t\tconst splitText3 = doc.splitTextToSize(savingsText3, pageWidth - 2 * margin);\n\t\t\t\t\tdoc.text(splitText3, margin, currentY);\n\t\t\t\t\tcurrentY += splitText3.length * 12 + 20;\n\t\t\t\t\n\t\t\t\t\t\/\/ Loan Products section\n\t\t\t\t\tdoc.setFontSize(11);\n\t\t\t\t\tdoc.setFont(undefined, 'bold');\n\t\t\t\t\tdoc.text('Loan Products:', margin, currentY);\n\t\t\t\t\tcurrentY += 20;\n\t\t\t\t\t\n\t\t\t\t\tdoc.setFontSize(9);\n\t\t\t\t\tdoc.setFont(undefined, 'italic');\n\t\t\t\t\tdoc.text('APR = Annual Percentage Rate.', margin, currentY);\n\t\t\t\t\tdoc.setFont(undefined, 'normal');\n\t\t\t\t\tcurrentY += 20;\n\t\t\t\t\n\t\t\t\t\tconst loanText1 = `Our Home Equity Lines of Credit (HELOC) have no annual fee and no application fee. Consult your tax adviser to determine tax benefits, if any.`;\n\t\t\t\t\t\n\t\t\t\t\tconst loanBullets = [\n\t\t\t\t\t\t'Members may be required to pay for an appraisal, which can range from $75 - $550.',\n\t\t\t\t\t\t'HELOC APR\\'s are variable and indexed to the Prime Rate as published in the Wall Street Journal.',\n\t\t\t\t\t\t'The maximum APR that may be imposed is 18%.'\n\t\t\t\t\t];\n\t\t\t\t\t\n\t\t\t\t\tconst loanText2 = `Auto Loans: Individuals who meet the lending and account criteria may qualify for rates as low as 5.25% APR* for Platinum Star Members utilizing our Auto Advisor Service for 36 months and as low as 5.50% APR* for non-Platinum Star Members for 36 months utilizing Auto Advisors. For all accounts and loans, conditions and credit approval apply.`;\n\t\t\t\t\t\n\t\t\t\t\tconst loanText3 = `Some rates displayed on this rate sheet are rounded. Membership eligibility is required. Ask a representative for complete details. Federally Insured by NCUA.`;\n\t\t\t\t\n\t\t\t\t\t\/\/ Add loan text with proper wrapping\n\t\t\t\t\tconst splitLoanText1 = doc.splitTextToSize(loanText1, pageWidth - 2 * margin);\n\t\t\t\t\tdoc.text(splitLoanText1, margin, currentY);\n\t\t\t\t\tcurrentY += splitLoanText1.length * 12;\n\t\t\t\t\n\t\t\t\t\t\/\/ Add loan bullet points\n\t\t\t\t\tloanBullets.forEach(point => {\n\t\t\t\t\t\tdoc.text('\u00b7', margin, currentY);\n\t\t\t\t\t\tconst bulletText = doc.splitTextToSize(point, pageWidth - 2 * margin - 15);\n\t\t\t\t\t\tdoc.text(bulletText, margin + 15, currentY);\n\t\t\t\t\t\tcurrentY += bulletText.length * 12;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tcurrentY += 10;\n\t\t\t\t\t\n\t\t\t\t\tconst splitLoanText2 = doc.splitTextToSize(loanText2, pageWidth - 2 * margin);\n\t\t\t\t\tdoc.text(splitLoanText2, margin, currentY);\n\t\t\t\t\tcurrentY += splitLoanText2.length * 12 + 10;\n\t\t\t\t\t\n\t\t\t\t\tconst splitLoanText3 = doc.splitTextToSize(loanText3, pageWidth - 2 * margin);\n\t\t\t\t\tdoc.text(splitLoanText3, margin, currentY);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\/\/ Draw products\n\t\t\t\tObject.entries(groupedProducts).forEach(([type, products], typeIndex) => {\n\t\t\t\t\t\/\/ Check if we need a new page\n\t\t\t\t\tif (currentY + 100 > pageHeight - margin && typeIndex !== 0) {\n\t\t\t\t\t\taddNewPage();\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\t\/\/ Draw section header with light gray background\n\t\t\t\t\tdoc.setFillColor(240, 240, 240);\n\t\t\t\t\tdoc.rect(margin, currentY, pageWidth - 2 * margin, 25, 'F');\n\t\t\t\t\tdoc.setTextColor(0);\n\t\t\t\t\tdoc.setFontSize(11);\n\t\t\t\t\tdoc.setFont('helvetica', 'bold');\n\t\t\t\t\tdoc.text(type.replace('_', ' ').toUpperCase() + ' PRODUCTS', margin + cellPadding, currentY + 17);\n\t\t\t\t\tcurrentY += 25;\n\t\t\t\t\n\t\t\t\t\t\/\/ Get the appropriate headers for this product type\n\t\t\t\t\tconst headers = typeHeaders[type] ? typeHeaders[type] : typeHeaders.default;\n\t\t\t\t\n\t\t\t\t\t\/\/ Draw column headers with dark blue background\n\t\t\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\t\t\tdoc.rect(margin, currentY, pageWidth - 2 * margin, 30, 'F');\n\t\t\t\t\tdoc.setTextColor(255);\n\t\t\t\t\tdoc.setFontSize(10);\n\t\t\t\t\tdoc.setFont('helvetica', 'bold');\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Draw Product Name header\n\t\t\t\t\tdoc.text(headers[0], margin + cellPadding, currentY + 20);\n\t\t\t\t\n\t\t\t\t\t\/\/ Draw Rate\/APR and APY columns with appropriate labels\n\t\t\t\t\tconst columnWidth = (pageWidth - 2 * margin) \/ 3;\n\t\t\t\t\tlet x = margin + columnWidth * 2;\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Draw the second column header (APR or Rate\/APR)\n\t\t\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\t\t\tdoc.text(headers[1], x + cellPadding, currentY + 20);\n\t\t\t\t\tx += columnWidth \/ 2;\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Draw the third column header (APY, APR (PSM), or APY\/PSM)\n\t\t\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\t\t\tdoc.text(headers[2], x + cellPadding, currentY + 20);\n\t\t\t\t\t\n\t\t\t\t\tcurrentY += 30;\n\t\t\t\t\n\t\t\t\t\t\/\/ Draw rows\n\t\t\t\t\tproducts.forEach((product, index) => {\n\t\t\t\t\t\tif (currentY + 30 > pageHeight - margin) {\n\t\t\t\t\t\t\taddNewPage();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/\/ Redraw headers on new page\n\t\t\t\t\t\t\tdoc.setFillColor(0, 71, 95);\n\t\t\t\t\t\t\tdoc.rect(margin, currentY, pageWidth - 2 * margin, 30, 'F');\n\t\t\t\t\t\t\tdoc.setTextColor(255);\n\t\t\t\t\t\t\tdoc.setFontSize(10);\n\t\t\t\t\t\t\tdoc.setFont('helvetica', 'bold');\n\t\t\t\t\t\t\tdoc.text(headers[0], margin + cellPadding, currentY + 20);\n\t\t\t\t\n\t\t\t\t\t\t\tx = margin + columnWidth * 2;\n\t\t\t\t\t\t\t\/\/ Second column header\n\t\t\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\t\t\t\t\tdoc.text(headers[1], x + cellPadding, currentY + 20);\n\t\t\t\t\t\t\tx += columnWidth \/ 2;\n\t\t\t\t\t\t\t\/\/ Third column header\n\t\t\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30, 'F');\n\t\t\t\t\t\t\tdoc.text(headers[2], x + cellPadding, currentY + 20);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcurrentY += 30;\n\t\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\t\t\/\/ Draw row\n\t\t\t\t\t\tx = margin;\n\t\t\t\t\t\tdoc.setDrawColor(200);\n\t\t\t\t\t\tdoc.setLineWidth(0.5);\n\t\t\t\t\t\tdoc.setTextColor(0);\n\t\t\t\t\t\tdoc.setFontSize(9);\n\t\t\t\t\t\tdoc.setFont('helvetica', 'normal');\n\t\t\t\t\n\t\t\t\t\t\t\/\/ Product Name\n\t\t\t\t\t\tdoc.rect(x, currentY, pageWidth - 2 * margin - columnWidth, 30);\n\t\t\t\t\t\tdoc.text(product.name, x + cellPadding, currentY + 20);\n\t\t\t\t\n\t\t\t\t\t\t\/\/ Rate\/APR and APY\n\t\t\t\t\t\tx = margin + (pageWidth - 2 * margin - columnWidth);\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t(product.apr || product.rate) === 'Call for rate' ? 'Call for rate' : (product.apr || product.rate) + '%',\n\t\t\t\t\t\t\t(product.apy || product.psm) ? (product.apy || product.psm) + '%' : '-'\n\t\t\t\t\t\t].forEach((text, i) => {\n\t\t\t\t\t\t\tdoc.rect(x, currentY, columnWidth \/ 2, 30);\n\t\t\t\t\t\t\tdoc.text(text, x + cellPadding, currentY + 20);\n\t\t\t\t\t\t\tx += columnWidth \/ 2;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\tcurrentY += 30;\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tcurrentY += 10; \/\/ Add spacing between sections\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\/\/ Add footer on every page\n\t\t\t\tconst pageCount = doc.internal.getNumberOfPages();\n\t\t\t\tfor (let i = 1; i <= pageCount; i++) {\n\t\t\t\t\tdoc.setPage(i);\n\t\t\t\t\tconst footerY = pageHeight - margin;\n\t\t\t\t\tdoc.setFontSize(8);\n\t\t\t\t\tdoc.setTextColor(100);\n\t\t\t\t\tdoc.text('Federally insured by NCUA', pageWidth \/ 2, footerY, { align: 'center' });\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Add logos only on the last page\n\t\t\t\t\tif (i === pageCount) {\n\t\t\t\t\t\tdoc.addImage('https:\/\/demo2.mybscu.org\/wp-content\/uploads\/2018\/02\/EHOLogo.png', 'PNG', margin, footerY - 30, 40, 40);\n\t\t\t\t\t\tdoc.addImage('https:\/\/demo2.mybscu.org\/wp-content\/uploads\/2018\/02\/NCUALogo.png', 'PNG', pageWidth - margin - 40, footerY - 30, 40, 40);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\/\/ Add fine print\n\t\t\t\taddFineprint();\n\t\t\t\treturn doc;\n\t\t\t}\n\t\t\t\n\/\/ Modified sendEmailWithMailgun function to handle missing callback\n\t\t\tfunction sendEmailWithMailgun(memberName, memberEmail, pdfBase64, callback) {\n\t\t\t\t\/\/ Make an AJAX request to the PHP endpoint\n\t\t\t\tfetch('\/api\/rates\/send-rates-email.php', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application\/json',\n\t\t\t\t\t},\n\t\t\t\t\tmode: 'cors', \/\/ Explicitly set CORS mode\n\t\t\t\t\tcredentials: 'same-origin', \/\/ Handles cookies if needed\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\tmemberName: memberName,\n\t\t\t\t\t\tmemberEmail: memberEmail,\n\t\t\t\t\t\tpdfContent: pdfBase64\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tconsole.log('Email sent successfully');\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Check if callback is a function before calling it\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback(data.success);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\/\/ If no callback provided, handle success UI updates here\n\t\t\t\t\t\tif (data.success) {\n\t\t\t\t\t\t\tdocument.getElementById('shareFormContent').classList.add('hidden');\n\t\t\t\t\t\t\tdocument.getElementById('successMessage').classList.remove('hidden');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert('There was an error sending the email. Please try again.');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tconsole.error('Error sending email:', error);\n\t\t\t\t\t\n\t\t\t\t\t\/\/ Check if callback is a function before calling it\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback(false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\/\/ If no callback provided, handle error UI updates here\n\t\t\t\t\t\talert('There was an error sending the email. Please try again.');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t<\/script>\n\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><\/div><script id=\"script-row-unique-0\" data-row=\"script-row-unique-0\" type=\"text\/javascript\" class=\"vc_controls\">UNCODE.initRow(document.getElementById(\"row-unique-0\"));<\/script><\/div><\/div><\/div><div data-parent=\"true\" class=\"vc_row row-container\" id=\"row-unique-1\"><div class=\"row limit-width row-parent\"><div class=\"wpb_row row-inner\"><div class=\"wpb_column pos-middle pos-center align_left column_parent col-lg-12 single-internal-gutter\"><div class=\"uncol style-light\"  ><div class=\"uncoltable\"><div class=\"uncell no-block-padding\" ><div class=\"uncont\" >\n\t<div class=\"wpb_raw_code wpb_content_element wpb_raw_html\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<!-- Financial Disclosures Container -->\n<div class=\"brightstar-disclosures\" style=\"font-family: inherit !important; font-size: 0.9em !important; line-height: 1.5 !important; color: #000 !important; background: transparent !important; padding: 20px !important; margin: 20px 0 !important; max-width: 100% !important;\">\n    <div style=\"margin-bottom: 15px !important;\">\n        <strong style=\"font-weight: bold !important; background: transparent !important; color: #000 !important;\">Productos de ahorro:<\/strong>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: #000 !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            APY = Rendimiento porcentual anual. Tasa = Tasa de dividendos.\n        <\/p>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            Todas las tarifas que se muestran son nuestras mejores tarifas; son correctas a partir de la fecha de vigencia que se muestra y est\u00e1n sujetas a cambios o finalizaci\u00f3n sin previo aviso. Sus tarifas reales pueden variar seg\u00fan una serie de factores, incluido el nivel de membres\u00eda y el producto que seleccione. Las tarifas podr\u00edan reducir las ganancias de su(s) cuenta(s), se impondr\u00e1 o se podr\u00e1 imponer una penalidad por retiros anticipados. Consulte nuestra Tabla de tarifas y Divulgaciones de la cuenta para obtener detalles completos. Para las cuentas del mercado monetario; se aplican ciertas limitaciones a la naturaleza y la cantidad de transacciones mensuales;\n        <\/p>\n        <ul style=\"margin: 5px 0 10px 20px !important; padding: 0 !important; list-style-type: none !important; background: transparent !important; list-style: none !important;\">\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; padding-bottom: 0px !important; background: transparent !important; color: #000 !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important; list-style: none !important; list-style-type: none !important;\">\u00b7 Se aplica una tarifa mensual de $10 para saldos inferiores a $2,500;<\/li>\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\u00b7 Se aplica una tarifa de $12 por art\u00edculo cuando tenga m\u00e1s de 6 cheques o retiros en un mes (Reg D).<\/li>\n        <\/ul>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            Las tasas y los t\u00e9rminos de los CD se aplican tanto a los CD como a los CD de IRA. Es posible que se apliquen algunas limitaciones a los t\u00e9rminos de los CD de IRA. En el caso de algunas cuentas, como la cuenta Wish, los CD, las IRA y los CD de IRA, se puede imponer una penalidad por retiro anticipado. Las ofertas de membres\u00eda Platinum Star no se pueden combinar con otras ofertas. Debe mantener un saldo diario m\u00ednimo en su(s) cuenta(s) todos los d\u00edas para obtener la APY divulgada;\n        <\/p>\n        <ul style=\"margin: 5px 0 10px 20px !important; padding: 0 !important; list-style-type: none !important; background: transparent !important;\">\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\u00b7 El m\u00ednimo para las cuentas de Ahorro y Wish es $25;<\/li>\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\u00b7 El m\u00ednimo para la cuenta corriente con intereses es de $1,000.<\/li>\n        <\/ul>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            Hay una tarifa de participaci\u00f3n en la cuenta de ahorros mensual de $5 si el saldo de su ahorro cae por debajo de $500 y no tiene otras cuentas (es decir, corrientes) con BrightStar CU.\n        <\/p>\n    <\/div>\n    \n    <div style=\"background: transparent !important;\">\n        <strong style=\"font-weight: bold !important; background: transparent !important; color: inherit !important;\">Productos de pr\u00e9stamo:<\/strong>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            APR = Tasa de Porcentaje Anual.\n        <\/p>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            Nuestras l\u00edneas de cr\u00e9dito con garant\u00eda hipotecaria (HELOC) no tienen cuota anual ni cuota de solicitud. Consulte a su asesor fiscal para determinar los beneficios fiscales, si los hubiera.\n        <\/p>\n        <ul style=\"margin: 5px 0 10px 20px !important; padding: 0 !important; list-style-type: none !important; background: transparent !important;\">\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\u00b7 Es posible que se requiera que los miembros paguen una tasaci\u00f3n, que puede oscilar entre $75 y $550.<\/li>\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\u00b7 Las APR de HELOC son variables e indexadas a la tasa preferencial publicada en el Wall Street Journal.<\/li>\n            <li style=\"margin: 5px 0 !important; text-indent: -15px !important; padding-left: 15px !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\u00b7 La TAE m\u00e1xima que se puede imponer es 18%.<\/li>\n        <\/ul>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            Pr\u00e9stamos para autom\u00f3viles: las personas que cumplan con los criterios de pr\u00e9stamo y de cuenta pueden calificar para tasas tan bajas como 5.25% APR* para miembros Platinum Star que utilicen nuestro servicio Auto Advisor durante 36 meses y tan bajas como 5.50% APR* para miembros que no sean Platinum Star que utilicen Auto Advisors durante 36 meses. Para todas las cuentas y pr\u00e9stamos, se aplican condiciones y aprobaci\u00f3n de cr\u00e9dito.\n        <\/p>\n        <p style=\"margin: 5px 0 !important; padding: 0 !important; background: transparent !important; color: inherit !important; font-family: inherit !important; font-size: inherit !important; line-height: inherit !important;\">\n            Algunas tarifas que se muestran en esta hoja de tarifas est\u00e1n redondeadas. Se requiere ser miembro. Pregunte a un representante para obtener detalles completos. Asegurado federalmente por NCUA.\n        <\/p>\n    <\/div>\n<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><\/div><script id=\"script-row-unique-1\" data-row=\"script-row-unique-1\" type=\"text\/javascript\" class=\"vc_controls\">UNCODE.initRow(document.getElementById(\"row-unique-1\"));<\/script><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"Current Rates Effective All Products Loans Savings Money Market Certificates Download PDF Share Rates Share Rates Enter the recipient's information [...]","protected":false},"author":8,"featured_media":0,"parent":208,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-383","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/pages\/383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/comments?post=383"}],"version-history":[{"count":4,"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/pages\/383\/revisions"}],"predecessor-version":[{"id":17356,"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/pages\/383\/revisions\/17356"}],"up":[{"embeddable":true,"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/pages\/208"}],"wp:attachment":[{"href":"https:\/\/demo2.mybscu.org\/es\/wp-json\/wp\/v2\/media?parent=383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}