X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=index.html.in;h=411dc47680ca953b0dcc0a6a6eb60419778e121f;hb=a2aafa4477c1efd30b182e1f7ab73e71d815cb6f;hp=421fedaa72aa5eac6daf10046af4082a759e84f9;hpb=0e1b4682be6b08731bc5ed4c2a983602cbf1c98f;p=charm-bypass.git diff --git a/index.html.in b/index.html.in index 421feda..411dc47 100644 --- a/index.html.in +++ b/index.html.in @@ -2,35 +2,25 @@ + - CharmBypass. + CharmBypass: it's transit equity y'all @@ -314,28 +423,97 @@ function set_service_id() { const sid = document.getElementById("serviceid"); - /* Get the "serviceid" from the querystring if it's there */ - let params = new URLSearchParams(document.location.search); + /* Get the "serviceid" from the querystring if it's there */ + const params = new URLSearchParams(document.location.search); if (params.get("serviceid")) { sid.textContent = params.get("serviceid"); } - /* Otherwise, leave it at "F" */ + /* Otherwise, leave it at "F" */ } - /******************************/ + /************************/ /* Set the service name */ - /******************************/ + /************************/ function set_service_name() { const sid = document.getElementById("servicename"); - /* Get the "servicename" from the querystring if it's there */ - let params = new URLSearchParams(document.location.search); + /* Get the "servicename" from the querystring if it's there */ + const params = new URLSearchParams(document.location.search); if (params.get("servicename")) { sid.textContent = params.get("servicename"); } - /* Otherwise, leave it at "BaltimoreLink" */ + /* Otherwise, leave it at "BaltimoreLink" */ + } + + + /************************/ + /* Set the service zone */ + /************************/ + function set_service_zone(event, zone) { + /* We can take the zone as a parameter too; this allows us to + * use this function for the (computed) MARC Train zone and + * not just the querystring Commuter Bus zone. The extra + * "event" parameter is there for the event listener, which + * would otherwise stuff an onload event into the zone + * parameter. "Thankfully" javascript lets us call a + * two-argument function with one argument and thereby abuse + * the event handler for this. */ + const z = document.getElementById("zone"); + const params = new URLSearchParams(document.location.search); + + if (zone) { + z.textContent = zone; + z.style.display = "block"; /* It's hidden by default */ + } + else if (params.get("zone")) { + /* Get the "zone" from the querystring if it's there */ + z.textContent = params.get("zone"); + z.style.display = "block"; /* It's hidden by default */ + } + + /* Otherwise, leave it blank (and hidden) */ + } + + /***********************************************************/ + /* Resize the ticket background based on the service name */ + /***********************************************************/ + + function resize_ticket() { + /* Get the "servicename" from the querystring if it's there */ + const params = new URLSearchParams(document.location.search); + const tbg = document.getElementById("ticketbg"); + const t = document.getElementById("ticket"); + const sn = document.getElementById("servicename"); + + if (params.get("servicename") == "Commuter Bus") { + /* The top of the background is initially at y=246.859, and + * we scale it by a factor of 1.12 to y=276.482 for a change + * of 29.623. So after we scale it, we translate it upwards + * by that amount to put it back where it started. */ + tbg.setAttribute("transform", "translate(0 -29.623) scale(1 1.12)"); + + /* Now translate the entire ticket up by the magic amount, 1/5 + * of the size change we made to the background. This ratio + * was found by measuring pixels in side-by-side screenshots + * of BaltimoreLink and Commuter Bus tickets. */ + t.setAttribute("transform", "translate(0 -9.33)"); + + /* More magic numbers discovered by comparing the two + * tickets overlayed in inkscape */ + sn.setAttribute("transform", "translate(0 64.28)"); + } + else if (params.get("servicename") == "MARC Train") { + /* insane tricks are explained above */ + tbg.setAttribute("transform", + "translate(0 -72.378) scale(1 1.2932)"); + t.setAttribute("transform", "translate(0 -67.17)"); + sn.setAttribute("transform", "translate(0 131.0)"); + } + + /* Otherwise, leave it alone. The SVG was designed with the + * BaltimoreLink ticket in mind */ } /****************************************/ @@ -346,9 +524,9 @@ const ct = document.getElementById("codetext"); /* Get the "code" from the querystring if it's there */ - let params = new URLSearchParams(document.location.search); + const params = new URLSearchParams(document.location.search); if (params.get("code")) { - ct.textContent = params.get("code"); + ct.textContent = params.get("code").toUpperCase(); } else { /* Otherwise, use a random code */ @@ -383,7 +561,7 @@ /* What do we add to c2 to make it equal to c1? */ const hdelta = c1 - c2; - /* We've measured everything so far in "client rect" + /* We've measured everything so far in "client rect" * coordinates, because that's the only available measurement * we have for the width of the element after futzing * with its contents. But when we reposition that @@ -404,7 +582,7 @@ /* Since this element has an "x" attribute it's easier for * us to shift that than it is to mess with the "left" style. */ - ct.setAttribute("x", parseFloat(ct.getAttribute("x")) + svg_hdelta); + ct.setAttribute("x", parseFloat(ct.getAttribute("x")) + svg_hdelta); } /*****************************************/ @@ -419,8 +597,8 @@ const date = new Date(); /* BaltimoreLink and MARC Train are valid for an hour and a half */ - var minutes = 90; - let params = new URLSearchParams(document.location.search); + let minutes = 90; + const params = new URLSearchParams(document.location.search); if (params.get("servicename") == "Commuter Bus") { /* But commuter bus tickets are only valid for ten minutes */ minutes = 10; @@ -453,7 +631,7 @@ is_day = true; function set_day() { - sky.style.fill = "#efb02f"; + sky.style.fill = "#efb02f"; } function set_night() { @@ -471,11 +649,113 @@ } } + + /*******************************************************/ + /* Compute the MARC "zone" from its origin/destination */ + /*******************************************************/ + + /* Sorted on the first component, then the second */ + const zone_map = { + BAL_BWE: 2, + BAL_BWI: 1, + BAL_SEB: 3, + BAL_WAS: 4, + BAL_WBL: 1, + BCA_CPK_: 3, + BCA_WAS_: 4, + BWI_BWE: 1, + BWI_WAS: 3, + BWI_WBL: 1 + }; + + /* Compute the zone (string) for the given origin/destination pair. + * If we don't know it or if you chose in invalid pair (destination + * not on the same line as your origin?) then the empty string is + * returned. */ + function compute_marc_zone(src, dest) { + /* Forward direction key for zone_map */ + const fwd = src + "_" + dest; + + /* Reverse direction key for zone_map. The zone_map only + * has them listed in one direction, so we check both + * directions here. */ + const rev = dest + "_" + src; + + /* The default. Obviously wrong for when we don't + * have the necessary data. */ + let zone = -1; + + if (zone_map[fwd]) { + zone = zone_map[fwd]; + } + else if (zone_map[rev]) { + zone = zone_map[rev]; + } + + /* Convert the number to a string */ + switch (zone) { + case 1: + return "One Zone"; + case 2: + return "Two Zone"; + case 3: + return "Three Zone"; + case 4: + return "Four Zone"; + default: + return ""; + } + } + + function set_marc_zone() { + const params = new URLSearchParams(document.location.search); + if (params.get("origin") && params.get("destination")) { + const src = params.get("origin"); + const dest = params.get("destination"); + const zone = compute_marc_zone(src, dest); + + set_service_zone(null, zone); + } + } + + + /*****************************************************/ + /* Set the origin and destination for the MARC Train */ + /*****************************************************/ + + function set_marc_origin_destination() { + const params = new URLSearchParams(document.location.search); + if (!params.get("origin") || !params.get("destination")) { + return; + } + + const src = params.get("origin"); + const dest = params.get("destination"); + + /* origindest contains both the origin and destination */ + const origindest = document.getElementById("origindest"); + + const origin = document.getElementById("origin"); + const destination = document.getElementById("destination"); + + origin.textContent = params.get("origin"); + destination.textContent = params.get("destination"); + + origindest.style.display = "block"; /* It's hidden by default */ + } + /******************************************/ /* Display the ticket (and hide the menu) */ /******************************************/ function go() { + /* To create our "window" onto the scene, we're going to slide the + * SVG off the left-hand side of the screen, and we don't want + * scroll bars to appear. */ + document.body.style.overflow = "hidden"; + document.body.style.margin = "0"; + document.body.style.padding = "0"; + const svg = document.querySelector("svg"); const menu = document.getElementById("menu"); svg.style.display = "initial"; @@ -488,7 +768,7 @@ const params = new URLSearchParams(document.location.search); if (params.get("go")) { - /* First unhide the SVG (swap it with the form) */ + /* First unhide the SVG (swap it with the form) */ window.addEventListener("load", go); /* Center the ticket once when the page has loaded */ @@ -503,6 +783,12 @@ /* Set the service name when the page has loaded */ window.addEventListener("load", set_service_name); + /* Set the service zone when the page has loaded */ + window.addEventListener("load", set_service_zone); + + /* Resize the ticket background if necessary */ + window.addEventListener("load", resize_ticket); + /* Set the security code text when the page has loaded */ window.addEventListener("load", set_code); @@ -513,6 +799,12 @@ /* Set the ticket expiration date/time upon page load */ window.addEventListener("load", set_ticket_expiry); + /* Set the MARC Train origin and destination, if applicable */ + window.addEventListener("load", set_marc_origin_destination); + + /* Set the MARC Train zone, if applicable */ + window.addEventListener("load", set_marc_zone); + /* Swap colors when the screen is tapped */ document.body.addEventListener("click", swap_colors); }