PageSourceSearch

https://pecosleague.com/about-pecos.js

js pecosleague.com collected 2026-10-02 11:01:08 UTC 75,234 bytes, 918 lines download raw bytes

1// ============================================================
2//  about-pecos.js  –  Data layer + renderer
3//  Mirrors source: about-pecos__2_.html (pecosleague.com/about-pecos)
4//  All DATA matches source HTML exactly:
5//    - All 2026 current teams (Mountain + Pacific)
6//    - Full season history 2011–2026
7//    - Season narratives
8//    - Timeline table
9//    - MLB alumni (source exact list)
10//    - Former teams
11// ============================================================
12
13// ── CURRENT TEAMS (from source HTML, exact match) ─────────────────────────────
14const MOUNTAIN_TEAMS = [
15  {
16    id: 3,  name: "Roswell Invaders",
17    ballpark: "Joe Bauman Park",          address: "100 E Poe",  city: "Roswell",      state: "NM", zip: "88203",
18    website:  "https://www.RoswellInvaders.com",
19    phone: "575-838-2667",  founded: 2011,
20    logo: "https://www.pecosleague.com/images/roswell.png",
21    fb:   "http://www.facebook.com/RoswellInvaders",
22    ig:   "https://www.instagram.com/roswell_invaders/?hl=en",
23    tv:   "https://pecosleague.vhx.tv/roswell-invaders",
24    yt:   "https://www.youtube.com/@roswellinvaders",
25    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/3.png",
26  },
27  {
28    id: 4,  name: "Alpine Cowboys",
29    ballpark: "Kokernot Field",            address: "400 Loop Road", city: "Alpine",     state: "TX", zip: "79830",
30    website:  "https://Alpine.PecosLeague.com",
31    phone: "432-386-3402",  founded: 2009,
32    logo: "https://www.pecosleague.com/images/alpine.png",
33    fb:   "https://www.facebook.com/AlpineCowboys",
34    ig:   "https://www.instagram.com/alpinecowboyso6/?hl=en",
35    tv:   "https://pecosleague.vhx.tv/alpine-cowboys",
36    yt:   "https://www.youtube.com/@06AlpineCowboys",
37    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/4.png",
38  },
39  {
40    id: 5,  name: "Pecos Bills",
41    ballpark: "Martinez Field",            address: "66 Co Rd 118", city: "Pecos",       state: "TX", zip: "79772",
42    website:  "https://www.PecosBills.com",
43    phone: "432-400-1298",  founded: 2024,
44    logo: "https://www.pecosleague.com/images/5.png",
45    fb:   "https://www.facebook.com/PecosBillsBaseball",
46    ig:   "https://www.instagram.com/pecosbillsbaseball",
47    tv:   "https://pecosleague.vhx.tv/pecos-bills",
48    yt:   "https://www.youtube.com/@pecosbills",
49    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/5.png",
50  },
51  {
52    id: 13, name: "Santa Fe Fuego",
53    ballpark: "Fort Marcy Park",           address: "Murales", city: "Santa Fe",     state: "NM", zip: "87504",
54    website:  "https://www.SantaFeFuego.com",
55    phone: "505-428-5715",  founded: 2012,
56    logo: "https://www.pecosleague.com/images/sf.png",
57    fb:   "https://www.facebook.com/fuegobaseball",
58    ig:   "https://www.instagram.com/santafefuego/?hl=en",
59    tv:   "https://pecosleague.vhx.tv/santa-fe-fuego",
60    yt:   "https://www.youtube.com/@santafefuegobaseball",
61    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/13.png",
62  },
63  {
64    id: 9,  name: "Blackwell FlyCatchers",
65    ballpark: "Morgan Field",              address: "800 South Main Street", city: "Blackwell", state: "OK", zip: "74631",
66    website:  "https://www.BlackwellFlycatchers.com",
67    phone: "580-606-6722",  founded: 2023,
68    logo: "https://www.pecosleague.com/images/flycatchers.png",
69    fb:   "https://www.facebook.com/BlackwellFlycatchers",
70    ig:   "https://www.instagram.com/blackwellflycatchers/",
71    tv:   "https://pecosleague.vhx.tv/blackwell-flycatchers",
72    yt:   "https://www.youtube.com/@blackwellflycatchers",
73    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/9.png",
74  },
75  {
76    id: 15, name: "Trinidad Triggers",
77    ballpark: "Central Park",              address: "700 Smith", city: "Trinidad",   state: "CO", zip: "81082",
78    website:  "https://www.TrinidadTriggers.com",
79    phone: "719-679-5954",  founded: 2012,
80    logo: "https://www.pecosleague.com/images/trinidad.png",
81    fb:   "https://www.facebook.com/triggersbaseball",
82    ig:   "https://www.instagram.com/triggersbaseball/",
83    tv:   "https://pecosleague.vhx.tv/trinidad-triggers",
84    yt:   "https://www.youtube.com/@trinidadtriggers",
85    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/15.png",
86  },
87  {
88    id: 17, name: "Garden City Wind",
89    ballpark: "Clint Lightner",            address: "706 E Maple", city: "Garden City", state: "KS", zip: "67846",
90    website:  "https://www.GardenCityWind.com",
91    phone: "620-937-8838",  founded: 2015,
92    logo: "https://www.pecosleague.com/images/gc.png",
93    fb:   "http://www.facebook.com/gardencitywind",
94    ig:   "",
95    tv:   "https://pecosleague.vhx.tv/garden-city-wind",
96    yt:   "https://www.youtube.com/@gardencitywind",
97    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/17.png",
98  },
99];
100
101const PACIFIC_TEAMS = [
102  {
103    id: 26, name: "Bakersfield Train Robbers",
104    ballpark: "Sam Lynn Ballpark",         address: "4009 Chester Ave", city: "Bakersfield", state: "CA", zip: "93301",
105    website:  "https://www.BakersfieldTrainRobbers.com",
106    phone: "661-520-1714",  founded: 2013,
107    logo: "https://www.pecosleague.com/images/bakersfield.png",
108    fb:   "https://www.facebook.com/bakersfieldtrainrobbers",
109    ig:   "https://www.instagram.com/bakersfieldtrainrobbers661/",
110    tv:   "https://pecosleague.vhx.tv/bakersfield-train-robbers",
111    yt:   "https://www.youtube.com/@trainrobbers",
112    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/26.png",
113  },
114  {
115    id: 8,  name: "Tucson Saguaros",
116    ballpark: "Kino Stadium",              address: "2500 E Ajo Way", city: "Tucson",   state: "AZ", zip: "85713",
117    website:  "https://www.SaguarosBaseball.com",
118    phone: "520-829-5687",  founded: 2016,
119    logo: "https://www.pecosleague.com/images/tucson.png",
120    fb:   "https://www.facebook.com/SaguarosBaseball",
121    ig:   "https://www.instagram.com/tucsonsaguaros520/",
122    tv:   "https://pecosleague.vhx.tv/tucson-saguaros",
123    yt:   "https://www.youtube.com/@saguarosbaseball",
124    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/8.png",
125  },
126  
127  {
128    id: 28, name: "Martinez Sturgeon",
129    ballpark: "Waterfront Park",           address: "1204 Joe DiMaggio Drive", city: "Martinez", state: "CA", zip: "94553",
130    website:  "https://www.MartinezSturgeon.com/",
131    phone: "925-372-5265",  founded: 2020,
132    logo: "https://www.pecosleague.com/images/martinez.png",
133    fb:   "https://www.facebook.com/MtzSturgeon",
134    ig:   "https://www.instagram.com/martinezsturgeon/",
135    tv:   "https://pecosleague.vhx.tv/martinez-sturgeon",
136    yt:   "https://www.youtube.com/@martinezsturgeon",
137    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/28.png",
138  },
139  {
140    id: 801, name: "San Rafael Pacifics",
141    ballpark: "Albert Park",               address: "100 Albert Park Ln", city: "San Rafael", state: "CA", zip: "94901",
142    website:  "https://www.PacificsBaseball.com",
143    phone: "415-726-2044",  founded: 2012,
144    logo: "https://www.pecosleague.com/images/801.png",
145    fb:   "https://www.facebook.com/SanRafaelPacifics",
146    ig:   "https://www.instagram.com/srpacifics/",
147    tv:   "https://pecosleague.vhx.tv/san-rafael-pacifics",
148    yt:   "https://www.youtube.com/@SanRafaelPacifics",
149    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/801.png",
150  },
151    {
152    id: 14, name: "Grand Junction Razorback Suckers",
153    ballpark: "Suplizio Field",            address: "1315 North Ave", city: "Grand Junction", state: "CO", zip: "81501",
154    website:  "https://www.razorbacksuckers.com",
155    phone: "970-315-5183",  founded: 2026,
156    logo: "https://www.pecosleague.com/images/14.png",
157    fb:   "https://www.facebook.com/profile.php?id=61582001350228",
158    ig:   "https://www.instagram.com/grandjunctionrazorbacksuckers/",
159    tv:   "https://pecosleague.vhx.tv/grand-junction-razorback-suckers",
160    yt:   "https://www.youtube.com/@pecosleague",
161    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/14.png",
162  },
163
164  
165  {
166    id: 6,  name: "Austin Weirdos",
167    ballpark: "Weirdos Park",              address: "4009 Chester Ave", city: "Bakersfield", state: "CA", zip: "93301",
168    website:  "https://www.WeirdosBaseball.com",
169    phone: "512-649-5418",  founded: 2022,
170    logo: "https://www.pecosleague.com/images/6.png",
171    fb:   "https://www.facebook.com/AustinWeirdos",
172    ig:   "https://www.instagram.com/austin_weirdos/",
173    tv:   "",
174    yt:   "https://www.youtube.com/@weirdosbaseball",
175    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/6.png",
176  },
177  {
178    id: 33, name: "Dublin Leprechauns",
179    ballpark: "Fallon Sports Park",        address: "2605 Central Parkway", city: "Dublin",   state: "CA", zip: "94568",
180    website:  "https://www.DublinLeprechauns.com",
181    phone: "(925) 434-5160",  founded: 2023,
182    logo: "https://www.pecosleague.com/images/33.png",
183    fb:   "https://www.facebook.com/dublinleprechauns",
184    ig:   "https://www.instagram.com/dublinleprechauns/",
185    tv:   "https://pecosleague.vhx.tv/dublin-leprechauns",
186    yt:   "https://www.youtube.com/@dublinleprechauns",
187    record: "0-0", illus: "https://www.pecosleague.com/images/illustrations/33.png",
188  },
189];
190
191// ── SEASON HISTORY DATA (exact from source HTML) ──────────────────────────────
192// Format: { year, teams: [{img, name, record, isChamp, tid, prefix, baseUrl}] }
193// tid + prefix mirror the ASP page links in source exactly
194const SEASONS = [
195  {
196    year: 2026,
197    champion: "Garden City Wind",
198    narrative: "Garden City Wind defeated Martinez Sturgeon for first ever Pecos League Championship. The Pecos League moved to Grand Junction Colorado.  The Pecos League moved to Presto Sports and Vimeo Streaming Platform.  A major rule change after 10 innings games were ended in a tie.",
199    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2025.png",
200    photos: [
201      "https://www.pecosleague.com/images/mediaupload/4283.jpg",
202      "https://www.pecosleague.com/images/mediaupload/GardenCityWind2026ChampionsPicture.jpg",
203      "https://www.pecosleague.com/images/mediaupload/3765.jpg",
204      "https://www.pecosleague.com/images/mediaupload/7673.jpg",
205    ],
206    teams: [
207      { img:"17.png",  name:"Garden City Wind",        record:"40-11-1",  isChamp:true, tid:17,  prefix:"wind",      baseUrl:"https://www.GardenCityWind.com",champFlag:"https://www.pecosleague.com/images/flags/2026new.png" },
208      { img:"28.png",  name:"Martinez Sturgeon",        record:"24-23-1", isChamp:false, tid:28,  prefix:"martinez",  baseUrl:"https://www.MartinezSturgeon.com/",champFlag:"https://www.pecosleague.com/images/flags/2026PacificChamps.png"  },
209	  { img:"3.png",   name:"Roswell Invaders",         record:"29-17",  isChamp:false, tid:3,   prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com" },
210	  { img:"8.png",   name:"Tucson Saguaros",          record:"21-27-1",  isChamp:false,  tid:8,   prefix:"tucson",    baseUrl:"https://www.SaguarosBaseball.com",  },
211      { img:"14.png",  name:"Grand Junction",      record:"30-23-1", isChamp:false, tid:14,  prefix:"grandjunction",  baseUrl:"https://www.razorbacksuckers.com" },
212	  { img:"801.png", name:"San Rafael Pacifics",      record:"26-19-2", isChamp:false, tid:801, prefix:"pacifics",  baseUrl:"https://www.PacificsBaseball.com"},
213      { img:"15.png",  name:"Trinidad Triggers",        record:"36-16-1", isChamp:false, tid:15,  prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
214	  { img:"26.png",  name:"Bakersfield Train Robbers",record:"29-20-1", isChamp:false, tid:26,  prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
215      { img:"33.png",  name:"Dublin Leprechauns",       record:"30-13-4", isChamp:false, tid:33,  prefix:"dublin",    baseUrl:"https://www.DublinLeprechauns.com" },
216      { img:"18.png",  name:"North Platte 80s",         record:"16-35-1", isChamp:false, tid:18,  prefix:"platte",    baseUrl:"https://www.NorthPlatte80s.com" },
217      { img:"4.png",   name:"Alpine Cowboys",           record:"28-21-1", isChamp:false, tid:4,   prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com" },
218      { img:"9.png",   name:"Blackwell FlyCatchers",    record:"14-34-1", isChamp:false, tid:9,   prefix:"blackwell", baseUrl:"https://www.BlackwellFlycatchers.com" },
219      { img:"5.png",   name:"Pecos Bills",              record:"21-29", isChamp:false, tid:5,   prefix:"bills",     baseUrl:"https://www.PecosBills.com" },
220	  { img:"13.png",  name:"Santa Fe Fuego",           record:"15-37-1", isChamp:false, tid:13,  prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
221      { img:"6.png",   name:"Austin Weirdos",         record:"6-42",  isChamp:false, tid:6,   prefix:"austin",   baseUrl:"https://www.weirdosbaseball.com" },
222    ]
223  },
224
225
226
227  {
228    year: 2025,
229    champion: "Tucson Saguaros",
230    narrative: "Sean McNeill became the Pecos League's all time winningest manager, winning his 275th game and third championship. The Pecos League broadcasts were outstanding across most of the league. <a href='https://ca.news.yaho
230o.com/baseball-youtube-sensation-marika-lyszczyk-175147427.html'>Marika Lyszczyk</a> became the first female to ever play in Pecos League.",
231    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2025.png",
232    photos: [
233      "https://www.pecosleague.com/images/mediaupload/4097.jpg",
234      "https://www.pecosleague.com/images/mediaupload/8923.jpg",
235      "https://www.pecosleague.com/images/mediaupload/7850.jpg",
236      "https://www.pecosleague.com/images/mediaupload/7673.jpg",
237    ],
238    teams: [
239      { img:"17.png",  name:"Garden City Wind",        record:"44-7",  isChamp:false, tid:17,  prefix:"wind",      baseUrl:"https://www.GardenCityWind.com" },
240      { img:"8.png",   name:"Tucson Saguaros",          record:"43-9",  isChamp:true,  tid:8,   prefix:"tucson",    baseUrl:"https://www.SaguarosBaseball.com", champFlag:"https://www.pecosleague.com/images/flags/2025new.png" },
241      { img:"801.png", name:"San Rafael Pacifics",      record:"38-16", isChamp:false, tid:801, prefix:"pacifics",  baseUrl:"https://www.PacificsBaseball.com", champFlag:"https://www.pacificsbaseball.com/images/champions/2025.png" },
242      { img:"26.png",  name:"Bakersfield Train Robbers",record:"35-19", isChamp:false, tid:26,  prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
243      { img:"33.png",  name:"Dublin Leprechauns",       record:"33-20", isChamp:false, tid:33,  prefix:"dublin",    baseUrl:"https://www.DublinLeprechauns.com" },
244      { img:"18.png",  name:"North Platte 80s",         record:"27-27", isChamp:false, tid:18,  prefix:"platte",    baseUrl:"https://www.NorthPlatte80s.com" },
245      { img:"4.png",   name:"Alpine Cowboys",           record:"28-22", isChamp:false, tid:4,   prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com" },
246      { img:"9.png",   name:"Blackwell FlyCatchers",    record:"23-23", isChamp:false, tid:9,   prefix:"blackwell", baseUrl:"https://www.BlackwellFlycatchers.com" },
247      { img:"5.png",   name:"Pecos Bills",              record:"25-25", isChamp:false, tid:5,   prefix:"bills",     baseUrl:"https://www.PecosBills.com" },
248      { img:"28.png",  name:"Martinez Sturgeon",        record:"25-29", isChamp:false, tid:28,  prefix:"martinez",  baseUrl:"https://www.MartinezSturgeon.com/" },
249      { img:"15.png",  name:"Trinidad Triggers",        record:"21-31", isChamp:false, tid:15,  prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
250      { img:"13.png",  name:"Santa Fe Fuego",           record:"16-34", isChamp:false, tid:13,  prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
251      { img:"11.png",  name:"Iola Hormigas",            record:"12-34", isChamp:false, tid:11,  prefix:"kansascity",baseUrl:"https://www.HormigasBaseball.com" },
252      { img:"32.png",  name:"Vallejo Seaweed",          record:"17-37", isChamp:false, tid:32,  prefix:"vallejo",   baseUrl:"https://www.VallejoSeaweed.com" },
253      { img:"23.png",  name:"Monterey Amberjacks",      record:"13-40", isChamp:false, tid:23,  prefix:"monterey",  baseUrl:"https://www.MontereyAmberJacks.com" },
254      { img:"3.png",   name:"Roswell Invaders",         record:"9-42",  isChamp:false, tid:3,   prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com" },
255    ]
256  },
257  {
258    year: 2024,
259    champion: "Alpine Cowboys",
260    narrative: "The day the season ended the Pecos League completed its goal of leaving Marysville and returning to Monterey for the 6th California Division Team. <a href='https://www.uscannenbergmedia.com/2024/04/10/oakland-athletics-to-move-to-sacramento-for-2025-season/'>The Oakland A's announced they were moving to Sacramento for the 2025 season</a>, just 31 minutes away from Marysville. The Pecos League accepted the offer from the City of Kansas City to occupy Satchel Paige Stadium.",
261    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2024.png",
262    photos: [
263      "https://www.pecosleague.com/images/mediaupload/9929.jpg",
264      "https://www.pecosleague.com/images/mediaupload/4126.jpg",
265    ],
266    teams: [
267      { img:"4.png",   name:"Alpine Cowboys",           record:"45-4",  isChamp:true,  tid:4,   prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com", champFlag:"https://www.pecosleague.com/images/flags/2024new.png" },
268      { img:"17.png",  name:"Garden City Wind",         record:"42-9",  isChamp:false, tid:17,  prefix:"wind",      baseUrl:"https://www.GardenCityWind.com" },
269      { img:"15.png",  name:"Trinidad Triggers",        record:"34-17", isChamp:false, tid:15,  prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
270      { img:"8.png",   name:"Tucson Saguaros",          record:"27-18", isChamp:false, tid:8,   prefix:"tucson",    baseUrl:"https://www.SaguarosBaseball.com" },
271      { img:"26.png",  name:"Bakersfield Train Robbers",record:"33-21", isChamp:false, tid:26,  prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
272      { img:"9.png",   name:"Blackwell FlyCatchers",    record:"27-22", isChamp:false, tid:9,   prefix:"blackwell", baseUrl:"https://www.BlackwellFlycatchers.com" },
273      { img:"801.png", name:"San Rafael Pacifics",      record:"31-23", isChamp:false, tid:801, prefix:"pacifics",  baseUrl:"https://www.PacificsBaseball.com", champFlag:"https://www.pacificsbaseball.com/images/champions/2024.png" },
274      { img:"30.png",  name:"Marysville Drakes",        record:"29-25", isChamp:false, tid:30,  prefix:"marysville",baseUrl:"https://www.marysvilledrakes.com" },
275      { img:"32.png",  name:"Vallejo Seaweed",          record:"25-29", isChamp:false, tid:32,  prefix:"vallejo",   baseUrl:"https://www.VallejoSeaweed.com" },
276      { img:"33.png",  name:"Dublin Leprechauns",       record:"24-30", isChamp:false, tid:33,  prefix:"dublin",    baseUrl:"https://www.DublinLeprechauns.com" },
277      { img:"3.png",   name:"Roswell Invaders",         record:"20-30", isChamp:false, tid:3,   prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com" },
278      { img:"18.png",  name:"North Platte 80s",         record:"16-33", isChamp:false, tid:18,  prefix:"platte",    baseUrl:"https://www.NorthPlatte80s.com" },
279      { img:"28.png",  name:"Martinez Sturgeon",        record:"20-34", isChamp:false, tid:28,  prefix:"martinez",  baseUrl:"https://www.MartinezSturgeon.com/" },
280      { img:"13.png",  name:"Santa Fe Fuego",           record:"16-35", isChamp:false, tid:13,  prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
281      { img:"5.png",   name:"Pecos Bills",              record:"14-38", isChamp:false, tid:5,   prefix:"bills",     baseUrl:"https://www.PecosBills.com" },
282      { img:"6.png",   name:"Austin Weirdos",           record:"8-43",  isChamp:false, tid:6,   prefix:"austin",    baseUrl:"https://www.WeirdosBaseball.com" },
283    ]
284  },
285  {
286    year: 2023,
287    champion: "San Rafael Pacifics",
288    narrative: "In 2022–2023 the Pecos League had its best offseason ever. The addition of Vallejo Seaweed, Lancaster Sound Breakers, Dublin Leprechauns, and Marysville Drakes cemented an eight team California only Pacific Division. The Austin Weirdos field was deemed unplayable after the 2nd series of the year which forced them on the road for the entire season. They responded with a 1-47 record. San Rafael defeated Tucson in the league finals.",
289    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2023.png",
290    photos: [
291      "https://www.pecosleague.com/images/mediaupload/3666.jpg",
292      "https://www.pecosleague.com/images/mediaupload/3610.jpg",
293    ],
294    teams: [
295      { img:"801.png", name:"San Rafael Pacifics",      record:"39-8",  isChamp:true,  tid:801, prefix:"pacifics",  baseUrl:"https://www.PacificsBaseball.com", champFlag:"https://www.pecosleague.com/images/flags/2023new.png" },
296      { img:"8.png",   name:"Tucson Saguaros",          record:"34-13", isChamp:false, tid:8,   prefix:"tucson",    baseUrl:"https://www.SaguarosBaseball.com" },
297      { img:"4.png",   name:"Alpine Cowboys",           record:"36-13", isChamp:false, tid:4,   prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com" },
298      { img:"23.png",  name:"Monterey Amberjacks",      record:"31-18", isChamp:false, tid:23,  prefix:"monterey",  baseUrl:"https://www.MontereyAmberJacks.com" },
299      { img:"26.png",  name:"Bakersfield Train Robbers",record:"29-18", isChamp:false, tid:26,  prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
300      { img:"15.png",  name:"Trinidad Triggers",        record:"30-19", isChamp:false, tid:15,  prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
301      { img:"17.png",  name:"Garden City Wind",         record:"30-20", isChamp:false, tid:17,  prefix:"wind",      baseUrl:"https://www.GardenCityWind.com" },
302      { img:"37.png",  name:"Lancaster Sound Breakers", record:"28-22", isChamp:false, tid:37,  prefix:"lancaster", baseUrl:"http://www.lancastersoundbreakers.com" },
303      { img:"30.png",  name:"Marysville Drakes",        record:"27-23", isChamp:false, tid:30,  prefix:"marysville",baseUrl:"https://www.marysvilledrakes.com" },
304      { img:"3.png",   name:"Roswell Invaders",         record:"29-23", isChamp:false, tid:3,   prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com" },
305      { img:"28.png",  name:"Martinez Sturgeon",        record:"25-24", isChamp:false, tid:28,  prefix:"martinez",  baseUrl:"https://www.MartinezSturgeon.com/" },
306      { img:"9.png",   name:"Blackwell FlyCatchers",    record:"17-25", isChamp:false, tid:9,   prefix:"blackwell", baseUrl:"https://www.BlackwellFlycatchers.com" },
307      { img:"13.png",  name:"Santa Fe Fuego",           record:"17-31", isChamp:false, tid:13,  prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
308      { img:"32.png",  name:"Vallejo Seaweed",          record:"12-37", isChamp:false, tid:32,  prefix:"vallejo",   baseUrl:"https://www.VallejoSeaweed.com" },
309      { img:"33.png",  name:"Dublin Leprechauns",       record:"4-44",  isChamp:false, tid:33,  prefix:"dublin",    baseUrl:"https://www.DublinLeprechauns.com" },
310      { img:"6.png",   name:"Austin Weirdos",           record:"1-47",  isChamp:false, tid:6,   prefix:"austin",    baseUrl:"https://www.WeirdosBaseball.com" },
311    ]
312  },
313  {
314    year: 2022,
315    champion: "Roswell Invaders",
316    narrative: "The offseason of 2022 only featured four changes: The Wasco Reserves became a travel team playing all their games in Bakersfield. Santa Rosa Scuba Divers were added to Pacific Division. Tucson went back to Pacific Division. The Mountain Division saw the addition of Weimar Hormigas and Austin Weirdos. Roswell defeated Tucson in the 2nd Pecos League Finals rematch.",
317    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2022.png",
318    photos: [
319      "https://www.pecosleague.com/images/mediaupload/2930.jpg",
320      "https://www.pecosleague.com/images/mediaupload/2826.jpg",
321    ],
322    teams: [
323      { img:"8.png",   name:"Tucson Saguaros",          record:"34-8",  isChamp:false, tid:8,   prefix:"tucson",    baseUrl:"https://www.SaguarosBaseball.com" },
324      { img:"801.png", name:"San Rafael Pacifics",      record:"41-9",  isChamp:false, tid:801, prefix:"pacifics",  baseUrl:"https://www.PacificsBaseball.com" },
325      { img:"17.png",  name:"Garden City Wind",         record:"36-10", isChamp:false, tid:17,  prefix:"wind",      baseUrl:"https://www.GardenCityWind.com" },
326      { img:"4.png",   name:"Alpine Cowboys",           record:"32-17", isChamp:false, tid:4,   prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com" },
327      { img:"15.png",  name:"Trinidad Triggers",        record:"25-18", isChamp:false, tid:15,  prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
328      { img:"26.png",  name:"Bakersfield Train Robbers",record:"31-18", isChamp:false, tid:26,  prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
329      { img:"3.png",   name:"Roswell Invaders",         record:"27-22", isChamp:true,  tid:3,   prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com", champFlag:"https://www.pecosleague.com/images/flags/2022new.png" },
330      { img:"13.png",  name:"Santa Fe Fuego",           record:"21-25", isChamp:false, tid:13,  prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
331      { img:"23.png",  name:"Monterey Amberjacks",      record:"21-29", isChamp:false, tid:23,  prefix:"monterey",  baseUrl:"https://www.MontereyAmberJacks.com" },
332      { img:"29.png",  name:"Santa Rosa Scuba Divers",  record:"22-29", isChamp:false, tid:29,  prefix:"santarosa", baseUrl:"https://www.santarosascubadivers.com" },
333      { img:"19.png",  name:"Colorado Springs Snow Sox",record:"14-31", isChamp:false, tid:19,  prefix:"snowsox",   baseUrl:"http://www.coloradospringssnowsox.com" },
334      { img:"57.png",  name:"Weimar Hormigas",          record:"16-31", isChamp:false, tid:57,  prefix:"weimar",    baseUrl:"http://www.weimarhormigas.com" },
335      { img:"6.png",   name:"Austin Weirdos",           record:"19-31", isChamp:false, tid:6,   prefix:"austin",    baseUrl:"https://www.WeirdosBaseball.com" },
336      { img:"28.png",  name:"Martinez Sturgeon",        record:"19-31", isChamp:false, tid:28,  prefix:"martinez",  baseUrl:"https://www.MartinezSturgeon.com/" },
337      { img:"31.png",  name:"Santa Cruz Seaweed",       record:"17-33", isChamp:false, tid:31,  prefix:"seaweed",   baseUrl:"http://www.SeaWeedBaseball.com" },
338      { img:"27.png",  name:"Wasco Reserve",            record:"7-40",  isChamp:false, tid:27,  prefix:"wasco",     baseUrl:"http://www.WascoReserves.com" },
339    ]
340  },
341  {
342    year: 2021,
343    champion: "Tucson Saguaros",
344    narrative: "The Pecos League moved into the Bay Area of California with the addition of the San Rafael Pacifics, Santa Cruz Seaweed and Martinez Sturgeon. The Pecos League replaced White Sands with Colorado Springs. Many teams set attendance records including Santa Fe and Garden City. Tucson was the first back to back Champion.",
345    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2021.png",
346    photos: [
347      "https://www.pecosleague.com/images/mediaupload/9529.jpg",
348      "https://www.pecosleague.com/images/mediaupload/9296.jpg",
349    ],
350    teams: [
351      { img:"26.png",  name:"Bakersfield Train Robbers",record:"33-5",  isChamp:false, tid:26,  prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
352      { img:"19.png",  name:"Colorado Springs Snow Sox",record:"29-14", isChamp:false, tid:19,  prefix:"snowsox",   baseUrl:"http://www.coloradospringssnowsox.com" },
353      { img:"28.png",  name:"Martinez Sturgeon",        record:"23-17", isChamp:false, tid:28,  prefix:"martinez",  baseUrl:"https://www.MartinezSturgeon.com/" },
354      { img:"801.png", name:"San Rafael Pacifics",      record:"21-18", isChamp:false, tid:801, prefix:"pacifics",  baseUrl:"https://www.PacificsBaseball.com", champFlag:"http://www.pacificsbaseball.com/images/champions/2021.png" },
355      { img:"17.png",  name:"Garden City Wind",         record:"20-16", isChamp:false, tid:17,  prefix:"wind",      baseUrl:"https://www.GardenCityWind.com" },
356      { img:"8.png",   name:"Tucson Saguaros",          record:"32-23", isChamp:true,  tid:8,   prefix:"tucson",    baseUrl:"https://www.SaguarosBaseball.com", champFlag:"https://www.pecosleague.com/images/flags/2021new.png" },
357      { img:"31.png",  name:"Santa Cruz Seaweed",       record:"16-24", isChamp:false, tid:31,  prefix:"seaweed",   baseUrl:"http://www.SeaWeedBaseball.com" },
358      { img:"23.png",  name:"Monterey Amberjacks",      record:"14-24", isChamp:false, tid:23,  prefix:"monterey",  baseUrl:"https://www.MontereyAmberJacks.com" },
359      { img:"4.png",   name:"Alpine Cowboys",           record:"30-25", isChamp:false, tid:4,   prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com" },
360      { img:"3.png",   name:"Roswell Invaders",         record:"30-26", isChamp:false, tid:3,   prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com" },
361      { img:"13.png",  name:"Santa Fe Fuego",           record:"27-28", isChamp:false, tid:13,  prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
362      { img:"27.png",  name:"Wasco Reserve",            record:"10-29", isChamp:false, tid:27,  prefix:"wasco",     baseUrl:"http://www.WascoReserves.com" },
363      { img:"15.png",  name:"Trinidad Triggers",        
363record:"19-31", isChamp:false, tid:15,  prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
364      { img:"16.png",  name:"Salina Stockade",          record:"10-41", isChamp:false, tid:16,  prefix:"salina",    baseUrl:"http://www.SalinaStockade.com" },
365    ]
366  },
367  {
368    year: 2020,
369    champion: "Tucson Saguaros",
370    narrative: "The Pecos League was not allowed to play any games in its regular cities with fans. The Pecos League played the entire season with four teams in Houston, Texas at Coastal Baseball Park. There were also no night games. The Tucson Saguaros completely dominated the league going 26-4 and sweeping the Championship Series over Salina.",
371    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2020.png",
372    photos: [
373      "https://www.pecosleague.com/images/mediaupload/9589.jpg",
374      "https://www.pecosleague.com/images/mediaupload/9462.jpg",
375    ],
376    teams: [
377      { img:"8.png",  name:"Tucson Saguaros",   record:"26-4",  isChamp:true,  tid:8,  prefix:"tucson",  baseUrl:"https://www.SaguarosBaseball.com", champFlag:"https://www.pecosleague.com/images/flags/2020new.png" },
378      { img:"16.png", name:"Salina Stockade",   record:"16-15", isChamp:false, tid:16, prefix:"salina",  baseUrl:"http://www.SalinaStockade.com" },
379      { img:"3.png",  name:"Roswell Invaders",  record:"10-19", isChamp:false, tid:3,  prefix:"roswell", baseUrl:"https://www.RoswellInvaders.com" },
380      { img:"21.png", name:"Houston Apollos",   record:"7-21",  isChamp:false, tid:21, prefix:"apollos", baseUrl:"https://www.HoustonApollos.com" },
381    ]
382  },
383  {
384    year: 2019,
385    champion: "Alpine Cowboys",
386    narrative: "The offseason of 2019 only featured one change: The Wasco Reserves replaced the Ruidoso Osos. The Pecos League went back to two divisions. The Salina Stockade served as a fulltime travel team in the Pacific Association. The Monterey Amberjacks qualified for the playoffs for the first time in team history. Alpine defeated Bakersfield in the first ever Pecos League Finals rematch.",
387    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2019.png",
388    photos: [
389      "https://www.pecosleague.com/images/mediaupload/7427.jpg",
390      "https://www.pecosleague.com/images/mediaupload/7465.jpg",
391    ],
392    teams: [
393      { img:"4.png",  name:"Alpine Cowboys",           record:"41-16", isChamp:true,  tid:4,  prefix:"cowboys",    baseUrl:"https://Alpine.PecosLeague.com", champFlag:"https://www.pecosleague.com/images/flags/2019new.png" },
394      { img:"24.png", name:"High Desert Yardbirds",    record:"46-18", isChamp:false, tid:24, prefix:"highdesert", baseUrl:"http://www.HighDesertYardBirds.com" },
395      { img:"3.png",  name:"Roswell Invaders",         record:"37-21", isChamp:false, tid:3,  prefix:"roswell",    baseUrl:"https://www.RoswellInvaders.com" },
396      { img:"23.png", name:"Monterey Amberjacks",      record:"36-25", isChamp:false, tid:23, prefix:"monterey",   baseUrl:"https://www.MontereyAmberJacks.com" },
397      { img:"26.png", name:"Bakersfield Train Robbers",record:"37-26", isChamp:false, tid:26, prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
398      { img:"8.png",  name:"Tucson Saguaros",          record:"30-30", isChamp:false, tid:8,  prefix:"tucson",     baseUrl:"https://www.SaguarosBaseball.com" },
399      { img:"13.png", name:"Santa Fe Fuego",           record:"27-31", isChamp:false, tid:13, prefix:"santafe",    baseUrl:"https://www.SantaFeFuego.com" },
400      { img:"15.png", name:"Trinidad Triggers",        record:"25-31", isChamp:false, tid:15, prefix:"trinidad",   baseUrl:"https://www.TrinidadTriggers.com" },
401      { img:"17.png", name:"Garden City Wind",         record:"42-40", isChamp:false, tid:17, prefix:"wind",       baseUrl:"https://www.GardenCityWind.com" },
402      { img:"27.png", name:"Wasco Reserve",            record:"19-43", isChamp:false, tid:27, prefix:"wasco",      baseUrl:"http://www.WascoReserves.com" },
403      { img:"22.png", name:"California City Whiptails",record:"12-47", isChamp:false, tid:22, prefix:"californiacity",baseUrl:"http://www.CaliforniaCityWhiptails.com" },
404      { img:"1.png",  name:"White Sands Pupfish",      record:"8-50",  isChamp:false, tid:1,  prefix:"pupfish",    baseUrl:"http://www.WhiteSandsPupfish.com" },
405    ]
406  },
407  {
408    year: 2018,
409    champion: "Bakersfield Train Robbers",
410    narrative: "The Pecos League's salary structure changed with the America's Pastime Act minimum wage passing right before the season. Teams now paid their players individually; the league no longer could pay players. In the playoffs it was Trinidad defeating Roswell and Bakersfield defeating California City in the first roun
410d. Bakersfield defeated Alpine in a great 3 game series in West Texas.",
411    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2018.png",
412    photos: [
413      "https://www.pecosleague.com/images/mediaupload/7119.jpg",
414      "https://www.pecosleague.com/images/mediaupload/7137.jpg",
415    ],
416    teams: [
417      { img:"4.png",  name:"Alpine Cowboys",           record:"47-15", isChamp:false, tid:4,  prefix:"cowboys",    baseUrl:"https://Alpine.PecosLeague.com" },
418      { img:"8.png",  name:"Tucson Saguaros",          record:"41-18", isChamp:false, tid:8,  prefix:"tucson",     baseUrl:"https://www.SaguarosBaseball.com" },
419      { img:"3.png",  name:"Roswell Invaders",         record:"41-19", isChamp:false, tid:3,  prefix:"roswell",    baseUrl:"https://www.RoswellInvaders.com" },
420      { img:"15.png", name:"Trinidad Triggers",        record:"41-21", isChamp:false, tid:15, prefix:"trinidad",   baseUrl:"https://www.TrinidadTriggers.com" },
421      { img:"26.png", name:"Bakersfield Train Robbers",record:"37-26", isChamp:true,  tid:26, prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com", champFlag:"https://www.pecosleague.com/images/flags/2018new.png" },
422      { img:"22.png", name:"California City Whiptails",record:"35-29", isChamp:false, tid:22, prefix:"californiacity",baseUrl:"http://www.CaliforniaCityWhiptails.com" },
423      { img:"13.png", name:"Santa Fe Fuego",           record:"31-30", isChamp:false, tid:13, prefix:"santafe",    baseUrl:"https://www.SantaFeFuego.com" },
424      { img:"24.png", name:"High Desert Yardbirds",    record:"30-31", isChamp:false, tid:24, prefix:"highdesert", baseUrl:"http://www.HighDesertYardBirds.com" },
425      { img:"10.png", name:"Ruidoso Osos",             record:"26-34", isChamp:false, tid:10, prefix:"osos",       baseUrl:"http://www.RuidosoOsos.com" },
426      { img:"23.png", name:"Monterey Amberjacks",      record:"19-43", isChamp:false, tid:23, prefix:"monterey",   baseUrl:"https://www.MontereyAmberJacks.com" },
427      { img:"17.png", name:"Garden City Wind",         record:"11-50", isChamp:false, tid:17, prefix:"wind",       baseUrl:"https://www.GardenCityWind.com" },
428      { img:"1.png",  name:"White Sands Pupfish",      record:"7-51",  isChamp:false, tid:1,  prefix:"pupfish",    baseUrl:"http://www.WhiteSandsPupfish.com" },
429    ]
430  },
431  {
432    year: 2017,
433    champion: "High Desert Yardbirds",
434    narrative: "The off season of 2017 changed the entire footprint and the future of the Pecos League forever. The Pecos League traded its Kansas identity for four teams in California, going from 10 teams to 12 and moving 4 teams into California. Once a desert league with mainly New Mexico Teams, the Pecos League now had teams in six states and three time zones.",
435    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2017.png",
436    photos: [
437      "https://www.pecosleague.com/images/mediaupload/6010.jpg",
438      "https://www.pecosleague.com/images/mediaupload/6192.jpg",
439    ],
440    teams: [
441      { img:"8.png",  name:"Tucson Saguaros",          record:"46-14", isChamp:false, tid:8,  prefix:"tucson",     baseUrl:"https://www.SaguarosBaseball.com" },
442      { img:"4.png",  name:"Alpine Cowboys",           record:"43-18", isChamp:false, tid:4,  prefix:"cowboys",    baseUrl:"https://Alpine.PecosLeague.com" },
443      { img:"3.png",  name:"Roswell Invaders",         record:"41-22", isChamp:false, tid:3,  prefix:"roswell",    baseUrl:"https://www.RoswellInvaders.com" },
444      { img:"15.png", name:"Trinidad Triggers",        record:"36-23", isChamp:false, tid:15, prefix:"trinidad",   baseUrl:"https://www.TrinidadTriggers.com" },
445      { img:"26.png", name:"Bakersfield Train Robbers",record:"36-25", isChamp:false, tid:26, prefix:"bakersfield",baseUrl:"https://www.BakersfieldTrainRobbers.com" },
446      { img:"13.png", name:"Santa Fe Fuego",           record:"32-26", isChamp:false, tid:13, prefix:"santafe",    baseUrl:"https://www.SantaFeFuego.com" },
447      { img:"24.png", name:"High Desert Yardbirds",    record:"35-27", isChamp:true,  tid:24, prefix:"highdesert", baseUrl:"http://www.HighDesertYardBirds.com", champFlag:"https://www.pecosleague.com/images/flags/2017new.png" },
448      { img:"22.png", name:"California City Whiptails",record:"28-35", isChamp:false, tid:22, prefix:"californiacity",baseUrl:"http://www.CaliforniaCityWhiptails.com" },
449      { img:"35.png", name:"Hollywood Stars",          record:"20-39", isChamp:false, tid:35, prefix:"hollywood",  baseUrl:"http://hollywood.pecosleague.com" },
450      { img:"17.png", name:"Garden City Wind",         record:"18-43", isChamp:false, tid:17, prefix:"wind",       baseUrl:"https://www.GardenCityWind.com" },
451      { img:"23.png", name:"Monterey Amberjacks",      record:"18-43", isChamp:false, tid:23, prefix:"monterey",   baseUrl:"https://www.MontereyAmberJacks.com" },
452      { img:"1.png",  name:"White Sands Pupfish",      record:"12-50", isChamp:false, tid:1,  prefix:"pupfish",    baseUrl:"http://www.WhiteSandsPupfish.com" },
453    ]
454  },
455  {
456    year: 2016,
457    champion: "Tucson Saguaros",
458    narrative: "In the offseason of 2016 the Pecos League finally added Tucson to the Pecos League. The Saguaros won the league championship and the Regular season t
458itle. Kino Sportsplex instantly became the GEM of the Pecos League. Tucson set the league record for wins with 51 and lead the league in attendance.",
459    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2016.png",
460    photos: [
461      "https://www.pecosleague.com/images/mediaupload/5505.jpg",
462      "https://www.pecosleague.com/images/mediaupload/5636.jpg",
463    ],
464    teams: [
465      { img:"8.png",  name:"Tucson Saguaros",      record:"51-14", isChamp:true,  tid:8,  prefix:"tucson",  baseUrl:"https://www.SaguarosBaseball.com", champFlag:"https://www.pecosleague.com/images/flags/2016new.png" },
466      { img:"3.png",  name:"Roswell Invaders",     record:"44-23", isChamp:false, tid:3,  prefix:"roswell", baseUrl:"https://www.RoswellInvaders.com" },
467      { img:"17.png", name:"Garden City Wind",     record:"38-26", isChamp:false, tid:17, prefix:"wind",    baseUrl:"https://www.GardenCityWind.com" },
468      { img:"15.png", name:"Trinidad Triggers",    record:"35-29", isChamp:false, tid:15, prefix:"trinidad",baseUrl:"https://www.TrinidadTriggers.com" },
469      { img:"4.png",  name:"Alpine Cowboys",       record:"32-32", isChamp:false, tid:4,  prefix:"cowboys", baseUrl:"https://Alpine.PecosLeague.com" },
470      { img:"82.png", name:"Topeka Train Robbers", record:"28-33", isChamp:false, tid:82, prefix:"topeka",  baseUrl:"http://www.topekarobbers.com" },
471      { img:"16.png", name:"Salina Stockade",      record:"29-36", isChamp:false, tid:16, prefix:"salina",  baseUrl:"http://www.SalinaStockade.com" },
472      { img:"1.png",  name:"White Sands Pupfish",  record:"28-39", isChamp:false, tid:1,  prefix:"pupfish", baseUrl:"http://www.WhiteSandsPupfish.com" },
473      { img:"92.png", name:"Great Bend Boom",      record:"19-43", isChamp:false, tid:92, prefix:"boom",    baseUrl:"http://www.greatbendboom.com" },
474      { img:"13.png", name:"Santa Fe Fuego",       record:"19-47", isChamp:false, tid:13, prefix:"santafe", baseUrl:"https://www.SantaFeFuego.com" },
475    ]
476  },
477  {
478    year: 2015,
479    champion: "Roswell Invaders",
480    narrative: "In 2015 the Pecos League really began to turn the corner. The league strictly enforced a 22 man paid roster. The League implemented a 25 and under age limit. The Roswell Invaders made the playoffs, beat Alpine in the first round and beat Santa Fe in the finals to win their 3rd championship in five years.",
481    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2015.png",
482    photos: [
483      "https://www.pecosleague.com/images/mediaupload/5493.jpg",
484      "https://www.pecosleague.com/images/mediaupload/5159.jpg",
485    ],
486    teams: [
487      { img:"15.png", name:"Trinidad Triggers",    record:"43-18", isChamp:false, tid:15, prefix:"trinidad",  baseUrl:"https://www.TrinidadTriggers.com" },
488      { img:"13.png", name:"Santa Fe Fuego",       record:"33-21", isChamp:false, tid:13, prefix:"santafe",   baseUrl:"https://www.SantaFeFuego.com" },
489      { img:"4.png",  name:"Alpine Cowboys",       record:"41-26", isChamp:false, tid:4,  prefix:"cowboys",   baseUrl:"https://Alpine.PecosLeague.com" },
490      { img:"1.png",  name:"White Sands Pupfish",  record:"37-28", isChamp:false, tid:1,  prefix:"pupfish",   baseUrl:"http://www.WhiteSandsPupfish.com" },
491      { img:"3.png",  name:"Roswell Invaders",     record:"40-28", isChamp:true,  tid:3,  prefix:"roswell",   baseUrl:"https://www.RoswellInvaders.com", champFlag:"https://www.pecosleague.com/images/flags/2015new.png" },
492      { img:"84.png", name:"Las Vegas Train Robbers",record:"23-41",isChamp:false,tid:84, prefix:"lasvegas",  baseUrl:"http://lasvegas.pecosleague.com" },
493      { img:"17.png", name:"Garden City Wind",     record:"21-43", isChamp:false, tid:17, prefix:"wind",      baseUrl:"https://www.GardenCityWind.com" },
494      { img:"2.png",  name:"Las Cruces Vaqueros",  record:"18-50", isChamp:false, tid:2,  prefix:"vaqueros",  baseUrl:"http://www.LasCrucesVaqueros.com" },
495    ]
496  },
497  {
498    year: 2014,
499    champion: "Santa Fe Fuego",
500    narrative: "The move of the Padres to El Paso happened and the Pecos League attempted to move to Tucson but instead had teams on border towns of Bisbee and Douglas. All teams from 2013 returned with the addition of two Arizona Teams. Future MLB Players Eric Yardley and Yermin Mercedes played the entire season. Santa Fe beat Alpine in tough three game series — this was the first road team to win the Pecos League Title.",
501    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2014.png",
502    photos: [
503      "https://www.pecosleague.com/images/mediaupload/4408.jpg",
504      "https://www.pecosleague.com/images/mediaupload/4415.jpg",
505    ],
506    teams: [
507      { img:"4.png",  name:"Alpine Cowboys",       record:"48-20", isChamp:false, tid:4,  prefix:"cowboys",  baseUrl:"https://Alpine.PecosLeague.com" },
508      { img:"13.png", name:"Santa Fe Fuego",       record:"48-24", isChamp:true,  tid:13, prefix:"santafe",  baseUrl:"https://www.SantaFeFuego.com", champFlag:"https://www.pecosleague.com/images/flags/2014new.png" },
509      { img:"3.png",  name:"Roswell Invaders",     record:"38-27", isChamp:false, tid:3,  prefix:"roswell",  baseUrl:"https://www.RoswellInvaders.com" },
510      { img:"15.png", name:"Trinidad Triggers",    record:"35-27", isChamp:false, tid:15, prefix:"trinidad", baseUrl:"https://www.TrinidadTriggers.com" },
511      { img:"7.png",  name:"Bisbee Blue",          record:"33-30", isChamp:false, tid:7,  prefix:"bisbee",   baseUrl:"http://bisbee.pecosleague.com" },
512      { img:"1.png",  name:"White Sands Pupfish",  record:"28-33", isChamp:false, tid:1,  prefix:"pupfish",  baseUrl:"http://www.WhiteSandsPupfish.com" },
513      { img:"67.png", name:"Douglas Diablos",      record:"28-36", isChamp:false, tid:67, prefix:"douglas",  baseUrl:"http://www.Douglasdiablos.com" },
514      { img:"12.png", name:"Raton Osos",           record:"23-38", isChamp:false, tid:12, prefix:"raton",    baseUrl:"http://www.ratonosos.com" },
515      { img:"20.png", name:"Taos Blizzard",        record:"22-40", isChamp:false, tid:20, prefix:"taos",     baseUrl:"http://www.taosblizzard.com" },
516      { img:"84.png", name:"Las Vegas Train Robbers",record:"16-42",isChamp:false,tid:84, prefix:"lasvegas", baseUrl:"http://lasvegas.pecosleague.com" },
517    ]
518  },
519  {
520    year: 2013,
521    champion: "Roswell Invaders",
522    narrative: "The 2013 Season will be the season always remembered for filming of the Pecos League TV Show. 2013 the league removed Taxi Players for good. 2013 also marked the first year of the Rawlings Baseball and no more composite bats were allowed. The DH was removed for good. The Roswell Invaders had the best season in Pecos League History with 50 regular season wins and did not lose a playoff game to win the Pecos League Title.",
523    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2013.png",
524    photos: [
525      "https://www.pecosleague.com/images/mediaupload/A_Kam_25-820.jpg",
526      "https://www.pecosleague.com/images/mediaupload/RosvsWS5-22-820-1.jpg",
527    ],
528    teams: [
529      { img:"3.png",  name:"Roswell Invaders",     record:"50-17", isChamp:true,  tid:3,  prefix:"roswell", baseUrl:"https://www.RoswellInvaders.com", champFlag:"https://www.pecosleague.com/images/flags/2013
529new.png" },
530      { img:"4.png",  name:"Alpine Cowboys",       record:"43-25", isChamp:false, tid:4,  prefix:"cowboys", baseUrl:"https://Alpine.PecosLeague.com" },
531      { img:"84.png", name:"Las Vegas Train Robbers",record:"41-27",isChamp:false,tid:84, prefix:"lasvegas",baseUrl:"http://lasvegas.pecosleague.com" },
532      { img:"15.png", name:"Trinidad Triggers",    record:"38-31", isChamp:false, tid:15, prefix:"trinidad",baseUrl:"https://www.TrinidadTriggers.com" },
533      { img:"13.png", name:"Santa Fe Fuego",       record:"36-31", isChamp:false, tid:13, prefix:"santafe", baseUrl:"https://www.SantaFeFuego.com" },
534      { img:"1.png",  name:"White Sands Pupfish",  record:"26-40", isChamp:false, tid:1,  prefix:"pupfish", baseUrl:"http://www.WhiteSandsPupfish.com" },
535      { img:"20.png", name:"Taos Blizzard",        record:"24-42", isChamp:false, tid:20, prefix:"taos",    baseUrl:"http://www.taosblizzard.com" },
536      { img:"12.png", name:"Raton Osos",           record:"13-54", isChamp:false, tid:12, prefix:"raton",   baseUrl:"http://www.ratonosos.com" },
537    ]
538  },
539  {
540    year: 2012,
541    champion: "Alpine Cowboys",
542    narrative: "The Pecos League took a major step forward in many areas. The league went with two full time umpire crews for the first time. The DH was added for this season. The Pecos League hired league umpires. The Pecos Spring League was formed as a source for players. The Alpine Cowboys beat the Las Cruces Vaqueros in the Championship Series.",
543    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2012.png",
544    photos: [
545      "https://www.pecosleague.com/images/mediaupload/J_Carranza_7-R_Normoyle_19-820.jpg",
546      "https://www.pecosleague.com/images/mediaupload/AlpvsRos5-25-Bell-820.jpg",
547    ],
548    teams: [
549      { img:"4.png",  name:"Alpine Cowboys",      record:"45-24", isChamp:true,  tid:4,  prefix:"cowboys", baseUrl:"https://Alpine.PecosLeague.com", champFlag:"https://www.pecosleague.com/images/flags/2012new.png" },
550      { img:"2.png",  name:"Las Cruces Vaqueros", record:"42-28", isChamp:false, tid:2,  prefix:"vaqueros",baseUrl:"http://www.LasCrucesVaqueros.com" },
551      { img:"3.png",  name:"Roswell Invaders",    record:"41-29", isChamp:false, tid:3,  prefix:"roswell", baseUrl:"https://www.RoswellInvaders.com" },
552      { img:"1.png",  name:"White Sands Pupfish", record:"28-33", isChamp:false, tid:1,  prefix:"pupfish", baseUrl:"http://www.WhiteSandsPupfish.com" },
553      { img:"15.png", name:"Trinidad Triggers",   record:"31-39", isChamp:false, tid:15, prefix:"trinidad",baseUrl:"https://www.TrinidadTriggers.com" },
554      { img:"13.png", name:"Santa Fe Fuego",      record:"23-47", isChamp:false, tid:13, prefix:"santafe", baseUrl:"https://www.SantaFeFuego.com" },
555    ]
556  },
557  {
558    year: 2011,
559    champion: "Roswell Invaders",
560    narrative: "The first ever Pecos League Game occurred in Cohen Stadium when the Roswell Invaders defeated the El Paso Diablos from the American Association 10-7. Two days later the Invaders played the first regular season game in Ruidoso and lost 18-13. The Roswell Invaders were the inaugural Pecos League Champions, defeating Ruidoso in a tight three game series.",
561    archiveImg: "https://www.pecosleague.com/images/archives/pecosarchiveaugust2011.png",
562    photos: [
563      "https://www.pecosleague.com/images/mediaupload/cohen_stadium_820.jpg",
564      "https://www.pecosleague.com/images/mediaupload/marvins-cowboys-sm-800x531.jpg",
565    ],
566    teams: [
567      { img:"3.png",   name:"Roswell Invaders",    record:"47-27", isChamp:true,  tid:3,   prefix:"roswell",  baseUrl:"https://www.RoswellInvaders.com", champFlag:"https://www.pecosleague.com/images/flags/2011new.png" },
568      { img:"1.png",   name:"White Sands Pupfish", record:"41-29", isChamp:false, tid:1,   prefix:"pupfish",  baseUrl:"http://www.WhiteSandsPupfish.com" },
569      { img:"10.png",  name:"Ruidoso Osos",        record:"38-29", isChamp:false, tid:10,  prefix:"osos",     baseUrl:"http://www.RuidosoOsos.com" },
570      { img:"4.png",   name:"Alpine Cowboys",      record:"39-31", isChamp:false, tid:4,   prefix:"cowboys",  baseUrl:"https://Alpine.PecosLeague.com" },
571      { img:"2.png",   name:"Las Cruces Vaqueros", record:"35-32", isChamp:false, tid:2,   prefix:"vaqueros", baseUrl:"http://www.LasCrucesVaqueros.com" },
572      { img:"112.png", name:"Carlsbad Bats",       record:"9-58",  isChamp:false, tid:112, prefix:"carlsbad", baseUrl:"http://carlsbad.pecosleague.com" },
573    ]
574  },
575];
576
577// ── FORMER TEAMS (from source HTML) ──────────────────────────────────────────
578const FORMER_TEAMS = [
579  { img:"images/mediaupload/kansascityhormigas2025.jpg", name:"Iola Hormigas",           city:"Iola/Kansas City", year:2025, record:"12-34", link:"https://www.pecosleague.com/pecosleague.asp?year=2025&page=2025" },
580  { img:"images/mediaupload/2025MontereyAmberjacks.jpg", name:"Monterey Amberjacks",      city:"Monterey, CA",     year:2025, record:"13
580-40", link:"https://www.pecosleague.com/pecosleague.asp?year=2025&page=2025" },
581  { img:"images/mediaupload/2024Drakes985.jpg",          name:"Marysville Drakes",        city:"Marysville, CA",   year:2024, record:"29-25", link:"https://www.pecosleague.com/pecosleague.asp?year=2024&page=2024" },
582  { img:"images/mediaupload/Lancaster2023SoundBreakers.jpg",name:"Lancaster Sound Breakers",city:"Lancaster, CA",  year:2023, record:"28-22", link:"https://www.pecosleague.com/pecosleague.asp?year=2023&page=2023" },
583  { img:"images/mediaupload/2022santarosa.jpg",          name:"Santa Rosa Scuba Divers",  city:"Santa Rosa, CA",   year:2022, record:"22-29", link:"https://www.pecosleague.com/pecosleague.asp?year=2022&page=2022" },
584  { img:"images/mediaupload/coloradospringsSnowSox2022.jpg",name:"Colorado Springs Snow Sox",city:"Colorado Springs, CO",year:2022,record:"14-31",link:"https://www.pecosleague.com/pecosleague.asp?year=2022&page=2022" },
585  { img:"images/mediaupload/2022weimarhormigas.jpg",     name:"Weimar Hormigas",          city:"Weimar, TX",       year:2022, record:"16-31", link:"https://www.pecosleague.com/pecosleague.asp?year=2022&page=2022" },
586  { img:"images/mediaupload/2022santaCruzSeaweed820.jpg",name:"Santa Cruz Seaweed",       city:"Santa Cruz, CA",   year:2022, record:"17-33", link:"https://www.pecosleague.com/pecosleague.asp?year=2022&page=2022" },
587  { img:"images/mediaupload/2022wascoreserve.jpg",       name:"Wasco Reserve",             city:"Wasco, CA",        year:2022, record:"7-40",  link:"https://www.pecosleague.com/pecosleague.asp?year=2022&page=2022" },
588  { img:"images/mediaupload/salina_stockade_2021.jpg",   name:"Salina Stockade",           city:"Salina, KS",       year:2021, record:"10-41", link:"https://www.pecosleague.com/pecosleague.asp?year=2021&page=2021" },
589  { img:"images/mediaupload/2017hollywoodstars.jpg",     name:"Hollywood Stars",           city:"Hollywood, CA",    year:2017, record:"20-39", link:"https://www.pecosleague.com/pecosleague.asp?year=2017&page=2017" },
590  { img:"images/mediaupload/high_desert2018.jpg",        name:"High Desert Yardbirds",     city:"Adelanto, CA",     year:2019, record:"46-18", link:"https://www.pecosleague.com/pecosleague.asp?year=2019&page=2019" },
591  { img:"images/mediaupload/2018californiacitywhiptails.jpg",name:"California City Whiptails",city:"California City, CA",year:2019,record:"12-47",link:"https://www.pecosleague.com/pecosleague.asp?year=2019&page=2019" },
592  { img:"images/mediaupload/2018osos.jpg",               name:"Ruidoso Osos",              city:"Ruidoso, NM",      year:2018, record:"26-34", link:"https://www.pecosleague.com/pecosleague.asp?year=2018&page=2018" },
593  { img:"images/mediaupload/2016_salina_stockade.jpg",   name:"Salina Stockade (2016)",    city:"Salina, KS",       year:2016, record:"29-36", link:"https://www.pecosleague.com/pecosleague.asp?year=2016&page=2016" },
594  { img:"images/mediaupload/greatbend_boom_2016.jpg",    name:"Great Bend Boom",           city:"Great Bend, KS",   year:2016, record:"19-43", link:"https://www.pecosleague.com/pecosleague.asp?year=2016&page=2016" },
595  { img:"images/mediaupload/2016_topeka_train_robbers.jpg",name:"Topeka Train Robbers",   city:"Topeka, KS",       year:2016, record:"28-33", link:"https://www.pecosleague.com/pecosleague.asp?year=2016&page=2016" },
596  { img:"images/2015pupfish.jpg",                        name:"White Sands Pupfish",       city:"Alamogordo, NM",   year:2015, record:"37-28", link:"https://www.pecosleague.com/pecosleague.asp?year=2015&page=2015" },
597  { img:"images/2015LasCrucesVaqueros.jpg",              name:"Las Cruces Vaqueros",       city:"Las Cruces, NM",   year:2015, record:"18-50", link:"https://www.pecosleague.com/pecosleague.asp?year=2015&page=2015" },
598  { img:"images/mediaupload/2014_douglas_diablos.jpg",   name:"Douglas Diablos",           city:"Douglas, AZ",      year:2014, record:"28-36", link:"https://www.pecosleague.com/pecosleague.asp?year=2014&page=2014" },
599  { img:"images/mediaupload/bisbee_blue.jpg",            name:"Bisbee Blue",               city:"Bisbee, AZ",       year:2014, record:"33-30", link:"https://www.pecosleague.com/pecosleague.asp?year=2014&page=2014" },
600  { img:"images/mediaupload/taos_blizzard4646.jpg",      name:"Taos Blizzard",             city:"Taos, NM",         year:2014, record:"22-40", link:"https://www.pecosleague.com/pecosleague.asp?year=2014&page=2014" },
601  { img:"images/mediaupload/2014_raton_osos.jpg",        name:"Raton Osos",                city:"Raton, NM",        year:2014, record:"23-38", link:"https://www.pecosleague.com/pecosleague.asp?year=2014&page=2014" },
602  { img:"images/mediaupload/osos_pink_820.jpg",          name:"Raton Osos (2013)",         city:"Raton, NM",        year:2013, record:"13
602-54", link:"https://www.pecosleague.com/pecosleague.asp?year=2013&page=2013" },
603  { img:"images/mediaupload/DSC_5202-820.jpg",           name:"Taos Blizzard (2013)",      city:"Taos, NM",         year:2013, record:"24-42", link:"https://www.pecosleague.com/pecosleague.asp?year=2013&page=2013" },
604  { img:"images/2011_ruidoso_osos.jpg",                  name:"Ruidoso Osos",              city:"Ruidoso, NM",      year:2011, record:"38-29", link:"https://www.pecosleague.com/pecosleague.asp?year=2011&page=2011" },
605  { img:"images/mediaupload/43AC_Rigby_makes_a_face.jpg",name:"Carlsbad Bats",            city:"Carlsbad, NM",     year:2011, record:"9-58",  link:"https://www.pecosleague.com/pecosleague.asp?year=2011&page=2011" },
606];
607
608// ── TIMELINE DATA (mirrors source HTML table exactly) ────────────────────────
609// Each row: { year, imgIds: [id|null, ...] } — null = blank cell, matching source columns
610const TIMELINE_YEARS = [2026,2025,2024,2023,2022,2021,2020,2019,2018,2017,2016,2015,2014,2013,2012,2011];
611// Image IDs per year (taken directly from source HTML timeline table columns)
612const TIMELINE_DATA = {
613  2026: [null,"3","4","5","6","9","13","14","15","26","17","18",null,"8",null,null,null,null,null,null,"33",null,null,null,null,null,null,null,"28","801",null],
614  2025: [null,"3","4","5",null,"9","13",null,"15","26","17","18",null,"8",null,"23",null,"11",null,null,"33",null,null,"32",null,null,null,null,"28","801",null],
615  2024: [null,"3","4","5","6","9","13",null,"15","26","17","18",null,"8",null,null,null,null,null,null,"33","30",null,"32",null,null,null,null,"28","801",null],
616  2023: [null,"3","4",null,"6","9","13",null,"15","26","17",null,null,"8",null,"23",null,null,null,null,"33","30",null,"32","37",null,null,null,"28","801",null],
617  2022: [null,"3","4",null,"6",null,"13",null,"15","26","17",null,null,"8",null,"23",null,null,null,null,null,null,"29",null,null,"19",null,"27","28","801","31"],
618  2021: [null,"3","4",null,null,null,"13",null,"15","26","17",null,"16","8",null,"23",null,null,null,null,null,null,null,null,null,"19",null,"27","28","801","31"],
619  2020: [null,"3",null,null,null,null,null,null,null,null,null,null,"16","8",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
620  2019: ["1","3","4",null,null,null,"13",null,"15","26","17",null,"16","8","22","23","24",null,null,null,null,null,null,null,null,null,null,"27",null,null,null],
621  2018: ["1","3","4",null,null,null,"13",null,"15","26","17",null,"16","8","22","23","24",null,"10",null,null,null,null,null,null,null,null,null,null,null,null],
622  2017: ["1","3","4",null,null,null,"13",null,"15","26","17",null,"16","8","22","23","24",null,null,null,null,null,null,null,null,null,null,null,null,null,null],
623  2016: ["1","3","4",null,null,null,"13",null,"15","26","17",null,"16","8",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
624  2015: ["1","3","4",null,null,null,"13",null,"15","26","17",null,null,null,null,null,null,null,null,"2",null,null,null,null,null,null,null,null,null,null,null],
625  2014: ["1","3","4",null,null,null,"13",null,"15","26",null,null,null,"7/67",null,null,null,"10",null,null,null,null,null,null,null,null,"20",null,null,null,null],
626  2013: ["1","3","4",null,null,null,"13",null,"15","26",null,null,null,null,null,null,null,"10",null,null,null,null,null,null,null,null,"20",null,null,null,null],
627  2012: ["1","3","4",null,null,null,"13",null,"15",null,null,null,null,null,null,null,null,null,null,"2",null,null,null,null,null,null,null,null,null,null,null],
628  2011: ["1","3","4",null,null,null,null,null,null,null,null,null,null,null,null,null,null,"10","2",null,null,null,null,null,null,null,null,null,null,null,null],
629};
630
631// ── UTILITY ──────────────────────────────────────────────────────────────────
632function esc(s) {
633  return String(s ?? '')
634    .replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
635}
636const curYear = new Date().getFullYear();
637
638function socialIcons(t) {
639  const icons = [];
640  if (t.fb) icons.push(`<a href="${esc(t.fb)}" class="soc-icon" title="Facebook"><i class="fab fa-facebook-f"></i></a>`);
641  if (t.ig) icons.push(`<a href="${esc(t.ig)}" class="soc-icon" title="Instagram"><i class="fab fa-instagram"></i></a>`);
642  if (t.tv) icons.push(`<a href="${esc(t.tv)}" class="soc-icon" title="Watch"><i class="fas fa-tv"></i></a>`);
643  if (t.yt) icons.push(`<a href="${esc(t.yt)}" class="soc-icon" title="YouTube"><i class="fab fa-youtube"></i></a>`);
644  return icons.join('');
645}
646
647// ── RENDER: TEAM CARD ─────────────────────────────────────────────────────────
648function renderTeamCard(t, delayClass = '') {
649  return `
650  <div class="team-card reveal ${delayClass} p-5 text-center">
651    <a href="${esc(t.website)}" class="block mb-3">
652      <img src="${esc(t.logo)}" alt="${esc(t.name)}" class="logo mx-auto"
653           onerror="this.src='https://www.pecosleague.com/images/0.png'">
654    </a>
655    <h4 style="font-family:'Oswald',sans-serif;font-weight:700;font-size:0.82rem;text-transform:uppercase;letter-spacing:0.06em;color:#fff;margin-bottom:4px;">
656      ${esc(t.name)}
657    </h4>
658    <p style="font-size:0.75rem;color:#6b7280;margin-bottom:2px;">
659      <a href="${esc(t.illus)}" style="color:#c9973a;">${esc(t.ballpark)}</a>
660    </p>
661    <p style="font-size:0.72rem;color:#6b7280;margin-bottom:2px;">${esc(t.address)}&nbsp;<br>${esc(t.city)}, ${esc(t.state)}&nbsp;${esc(t.zip)}</p>
662    <p style="font-size:0.72rem;margin-bottom:2px;">
663      <a href="${esc(t.website)}" style="color:#c9973a;font-size:0.7rem;">${esc(t.website)}</a>
664    </p>
665    <p style="font-size:0.72rem;color:#6b7280;margin-bottom:2px;">Year Founded: ${esc(t.founded)}</p>
666    <p style="font-size:0.72rem;color:#6b7280;margin-bottom:8px;">Phone: ${esc(t.phone)}</p>
667    <p style="font-size:0.72rem;color:#9ca3af;margin-bottom:8px;">${esc(t.record)}</p>
668    <div style="display:flex;justify-content:center;gap:6px;flex-wrap:wrap;">${socialIcons(t)}</div>
669  </div>`;
670}
671
672// ── RENDER: SEASON BLOCK (mirrors source table structure) ────────────────────
673function renderSeasonCard(entry, year) {
674  const champBadge = entry.isChamp
675    ? `<div style="margin-top:4px;"><span class="champ-badge">&#127942; CHAMPS</span></div>` : '';
676  const champImg = entry.champFlag
677    ? `<img src="${esc(entry.champFlag)}" alt="Champion" style="width:60px;height:60px;object-fit:contain;margin:4px auto 0;display:block;" onerror="this.style.display='none'">` : '';
678  const asp  = `${esc(entry.baseUrl)}/${esc(entry.prefix)}.asp`;
679  const tbl  = `pecos_players_${esc(year)}`;
680
681  return `
682  <div class="season-card reveal">
683    <div style="font-size:0.65rem;color:#6b7280;margin-bottom:3px;">${year}</div>
684    <a href="${esc(entry.baseUrl)}">
685      <img src="https://www.pecosleague.com/images/${esc(entry.img)}"
686           alt="${esc(entry.name)}" onerror="this.src='https://www.pecosleague.com/images/0.png'">
687    </a>
688    <div style="font-family:'Oswald',sans-serif;font-size:0.72rem;color:#fff;margin-top:4px;font-weight:600;">${esc(entry.name)}</div>
689    <div style="font-size:0.72rem;color:#c9973a;font-weight:700;">${esc(entry.record)}</div>
690    ${champBadge}
691    ${champImg}
692    <div style="display:flex;justify-content:center;gap:4px;margin-top:6px;flex-wrap:wrap;">
693      <a href="${asp}?page=11&team=${esc(entry.tid)}&year=${year}" style="font-size:0.6rem;color:#60a5fa;">Sched</a>
694      <span style="color:#374151;">·</span>
695      <a href="${asp}?page=3&team=${esc(entry.tid)}&year=${year}" style="font-size:0.6rem;color:#60a5fa;">Stats</a>
696      <span style="color:#374151;">·</span>
697      <a href="${asp}?page=4&tablename=${tbl}&team=${esc(entry.tid)}&year=${year}" style="font-size:0.6rem;color:#60a5fa;">Roster</a>
698    </div>
699  </div>`;
700}
701
702function renderSeasonBlock(season) {
703  const cards  = season.teams.map(t => renderSeasonCard(t, season.year)).join('');
704  const photos = season.photos.map(p =>
705    `<a href="${esc(p)}" class="arch-img">
706       <img src="${esc(p)}" alt="" style="width:100%;border-radius:8px;height:160px;object-fit:cover;"
707            onerror="this.style.display='none'">
708     </a>`
709  ).join('');
710  const photoCols = season.photos.length >= 4
711    ? 'grid-cols-2 sm:grid-cols-4'
712    : 'grid-cols-2 sm:grid-cols-2';
713
714  return `
715  <div class="mb-14 reveal">
716    <div style="display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap;">
717      <a href="pecosleague.asp?page=${season.year}&year=${season.year}">
718        <div class="year-header">${season.year}</div>
719      </a>
720      <a href="pecosleague.asp?page=${season.year}&year=${season.year}"
721         style="font-size:0.85rem;color:#9ca3af;text-decoration:underline;">
722        (Season Standings/Playoffs)
723      </a>
724      ${season.champion ? `<span style="font-family:'Oswald',sans-serif;font-size:0.75rem;color:#c9973a;font-weight:700;">&#127942; ${esc(season.champion)}</span>` : ''}
725    </div>
726    ${season.narrative ? `<p class="prose-pecos" style="font-size:0.88rem;margin-bottom:14px;">${season.narrative}</p>` : ''}
727    <div class="grid grid-cols-2 sm:grid-cols-4 md:grid-cols-6 lg:grid-cols-8 gap-2">
728      ${cards}
729    </div>
730    ${photos ? `<div class="grid ${photoCols} gap-3 mt-5">${photos}</div>` : ''}
731    <hr class="gold-divider">
732  </div>`;
733}
734
735// ── RENDER: TIMELINE TABLE ───────────────────────────────────────────────────
736function renderTimeline() {
737  let html = `<table style="border-collapse:collapse;width:100%;background:rgba(13,12,36,0.9);border:1px solid rgba(30,29,58,0.9);border-radius:8px;overflow:hidden;">`;
738  TIMELINE_YEARS.forEach(year => {
739    const cells = TIMELINE_DATA[year];
740    html += `<tr>
741      <td style="padding:4px 8px;font-family:'Oswald',sans-serif;font-weight:700;font-size:0.75rem;color:#c9973a;white-space:nowrap;border:1px solid rgba(30,29,58,0.6);background:rgba(0,0,0,0.3);">${year}</td>`;
742    cells.forEach(cell => {
743      if (!cell) {
744        html += `<td style="padding:3px;border:1px solid rgba(30,29,58,0.4);width:38px;">&nbsp;</td>`;
745      } else {
746        // Handle combined cells like "7/67"
747        const imgs = cell.split('/');
748        const content = imgs.map(id =>
749          `<img width="35" src="https://www.pecosleague.com/images/${id}.png"
750               onerror="this.style.display='none'">`
751        ).join('');
752        html += `<td style="padding:3px;text-align:center;border:1px solid rgba(30,29,58,0.4);width:38px;">${content}</td>`;
753      }
754    });
755    html += `</tr>`;
756  });
757  html += `</table>`;
758  return html;
759}
760
761// ── RENDER: FORMER TEAM CARD ──────────────────────────────────────────────────
762function renderFormerTeamCard(t) {
763  return `
764  <div class="season-card reveal" style="padding:10px;">
765    <a href="${esc(t.link)}">
766      <img src="https://www.pecosleague.com/${esc(t.img)}" alt="${esc(t.name)}"
767           style="width:80px;height:80px;object-fit:contain;margin:0 auto;display:block;"
768           onerror="this.src='https://www.pecosleague.com/images/0.png'">
769    </a>
770    <div style="font-family:'Oswald',sans-serif;font-size:0.72rem;color:#fff;margin-top:6px;font-weight:600;">${esc(t.name)}</div>
771    <div style="font-size:0.68rem;color:#9ca3af;">${esc(t.city)}</div>
772    <div style="font-size:0.68rem;color:#c9973a;">${esc(t.year)} · ${esc(t.record)}</div>
773  </div>`;
774}
775
776// ── RENDER: ARCHIVE YEAR BUTTONS ─────────────────────────────────────────────
777function renderArchiveYears() {
778  let html = '';
779  for (let y = 2022; y >= 2011; y--) {
780    html += `<a href="pecosleague.asp?page=${y}&year=${y}" class="btn-outline" style="font-size:0.75rem;padding:6px 14px;">${y}</a>\n`;
781  }
782  return html;
783}
784
785// ── MAIN PAGE INIT ────────────────────────────────────────────────────────────
786function initPage() {
787  // Hero stats
788  const totalSeasons = curYear - 2010;
789  
790  const statSeasonsEl = document.getElementById('stat-seasons');
791  if (statSeasonsEl) statSeasonsEl.textContent = totalSeasons;
792
793  const totalTeams = MOUNTAIN_TEAMS.length + PACIFIC_TEAMS.length;
794  const statTeamsEl = document.getElementById('stat-teams');
795  if (statTeamsEl) statTeamsEl.textContent = totalTeams;
796
797  // ── Mountain Division teams
798  const mDiv = document.getElementById('mountain-teams');
799  if (mDiv) {
800    mDiv.innerHTML = MOUNTAIN_TEAMS.map((t, i) => renderTeamCard(t, `d${(i % 5) + 1}`)).join('');
801  }
802
803  // ── Pacific Division teams
804  const pDiv = document.getElementById('pacific-teams');
805  if (pDiv) {
806    pDiv.innerHTML = PACIFIC_TEAMS.map((t, i) => renderTeamCard(t, `d${(i % 5) + 1}`)).join('');
807  }
808
809  // ── Season history blocks (all years from newest to oldest, grouped)
810  // 2025, 2024, 2023 get their own containers; rest go into history
811  const s2026 = document.getElementById('season-2026');
812  const s2025 = document.getElementById('season-2025');
813  const s2024 = document.getElementById('season-2024');
814  const s2023 = document.getElementById('season-2023');
815  const historyEl = document.getElementById('history');
816
817
818  if (s2026) s2026.innerHTML = renderSeasonBlock(SEASONS.find(s => s.year === 2026));
819  if (s2025) s2025.innerHTML = renderSeasonBlock(SEASONS.find(s => s.year === 2025));
820  if (s2024) s2024.innerHTML = renderSeasonBlock(SEASONS.find(s => s.year === 2024));
821  if (s2023) s2023.innerHTML = renderSeasonBlock(SEASONS.find(s => s.year === 2023));
822
823  // Build older seasons after archive-years div
824  const archiveYearsEl = document.getElementById('archive-years');
825  if (archiveYearsEl) {
826    archiveYearsEl.innerHTML = renderArchiveYears();
827
828    // Insert older seasons (2022–2011) immediately after archive-years section
829    const olderHtml = SEASONS
830      .filter(s => s.year <= 2022)
831      .map(renderSeasonBlock)
832      .join('');
833
834    const olderDiv = document.createElement('div');
835    olderDiv.id = 'older-seasons';
836    olderDiv.innerHTML = olderHtml;
837    archiveYearsEl.parentNode.insertAdjacentElement('afterend', olderDiv);
838  }
839
840  // ── Timeline
841  const tlEl = document.getElementById('timeline-table');
842  if (tlEl) tlEl.innerHTML = renderTimeline();
843
844  // ── Former teams
845  const ftEl = document.getElementById('former-teams');
846  if (ftEl) ftEl.innerHTML = FORMER_TEAMS.map(renderFormerTeamCard).join('');
847
848  // ── Footer dynamic links
849  const fyEl = document.getElementById('footer-year');
850  if (fyEl) fyEl.textContent = curYear;
851  const flEl = document.getElementById('footer-season-label');
852  if (flEl) flEl.textContent = `${curYear} Season Coming Soon`;
853  const fs1 = document.getElementById('footer-stats-y1');
854  if (fs1) { fs1.textContent = `${curYear - 1} Stats`; fs1.href = `pecosleague.asp?page=3&year=${curYear - 1}`; }
855  const fs2 = document.getElementById('footer-stats-y2');
856  if (fs2) { fs2.textContent = `${curYear - 2} Stats`; fs2.href = `pecosleague.asp?page=3&year=${curYear - 2}`; }
857  const fsc = document.getElementById('footer-schedule');
858  if (fsc) { fsc.textContent = `${curYear} Schedule`; fsc.href = `pecosleague.asp?page=68&date=${curYear}-5-1_schedule`; }
859  const ftg = document.getElementById('footer-todays-game');
860  if (ftg) {
861    const now = new Date();
862    ftg.href = `pecosleague.asp?page=195&cal_eventdate=${now.getMonth()+1}/${now.getDate()}/${curYear}`;
863  }
864
865  // ── Intersection Observer (reveal animations)
866  const obs = new IntersectionObserver(
867    entries => entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('visible'); }),
868    { threshold: 0.07, rootMargin: '0px 0px -40px 0px' }
869  );
870  document.querySelectorAll('.reveal,.reveal-l,.reveal-r').forEach(el => obs.observe(el));
871
872  // ── Smooth scroll for anchor links
873  document.querySelectorAll('a[href^="#"]').forEach(a => {
874    a.addEventListener('click', function(e) {
875      const target = document.querySelector(this.getAttribute('href'));
876      if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
877    });
878  });
879
880  // ── Navbar scroll effect (glass tint intensifies on scroll)
881  window.addEventListener('scroll', () => {
882    const n = document.getElementById('navbar');
883    if (n) n.style.background = window.scrollY > 20 ? 'rgba(6,5,24,0.97)' : 'rgba(6,5,24,0.92)';
884  });
885
886  // ── Mobile drawer
887  const toggle  = document.getElementById('mobileToggle');
888  const overlay = document.getElementById('mobileOverlay');
889  const drawer  = document.getElementById('mobileDrawer');
890  const closeBtn= document.getElementById('mobileClose');
891  const menuIcon= document.getElementById('menuIcon');
892
893  function openMenu() {
894    if (!overlay || !drawer) return;
895    overlay.classList.remove('opacity-0','pointer-events-none');
896    overlay.classList.add('opacity-100');
897    drawer.classList.remove('translate-x-full');
898    drawer.classList.add('translate-x-0');
899    if (menuIcon) { menuIcon.classList.remove('fa-bars'); menuIcon.classList.add('fa-times'); }
900    document.body.style.overflow = 'hidden';
901  }
902  function closeMenu() {
903    if (!overlay || !drawer) return;
904    overlay.classList.add('opacity-0','pointer-events-none');
905    overlay.classList.remove('opacity-100');
906    drawer.classList.add('translate-x-full');
907    drawer.classList.remove('translate-x-0');
908    if (menuIcon) { menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); }
909    document.body.style.overflow = '';
910  }
911
912  if (toggle)   toggle.addEventListener('click', () => drawer && drawer.classList.contains('translate-x-full') ? openMenu() : closeMenu());
913  if (closeBtn) closeBtn.addEventListener('click', closeMenu);
914  if (overlay)  overlay.addEventListener('click', closeMenu);
915  document.querySelectorAll('#mobileDrawer a').forEach(a => a.addEventListener('click', closeMenu));
916}
917
918document.addEventListener('DOMContentLoaded', initPage);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.