const checkForTracking = () => {
    const mainDiv = document.getElementById("main");
    const searchBar = document.getElementById("search-bar");
    // some pages (e.g. images) do not have these
    if (!mainDiv || !searchBar)
        return;
    const query = searchBar.value.replace(/\s+/g, '');

    // Note: regex functions for checking for tracking queries were derived
    // from here -- https://stackoverflow.com/questions/619977
    const matchTracking = {
        "ups": {
            "link": `https://www.ups.com/track?tracknum=${query}`,
            "expr": [
                /\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b/
            ]
        },
        "usps": {
            "link": `https://tools.usps.com/go/TrackConfirmAction_input?origTrackNum=${query}`,
            "expr": [
                /(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)/,
                /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/,
                /^91[0-9]+$/,
                /^[A-Za-z]{2}[0-9]+US$/
            ]
        },
        "fedex": {
            "link": `https://www.fedex.com/apps/fedextrack/?tracknumbers=${query}`,
            "expr": [
                /(\b96\d{20}\b)|(\b\d{15}\b)|(\b\d{12}\b)/,
                /\b((98\d\d\d\d\d?\d\d\d\d|98\d\d) ?\d\d\d\d ?\d\d\d\d( ?\d\d\d)?)\b/,
                /^[0-9]{15}$/
            ]
        }
    };
    
    // Creates a link to a UPS/USPS/FedEx tracking page
    const createTrackingLink = href => {
        let link = document.createElement("a");
        link.className = "tracking-link";
        link.innerHTML = "View Tracking Info";
        link.href = href;
        mainDiv.prepend(link);
    };

    // Compares the query against a set of regex patterns
    // for tracking numbers
    const compareQuery = provider => {
        provider.expr.some(regex => {
            if (query.match(regex)) {
                createTrackingLink(provider.link);
                return true;
            }
        });
    };

    for (const key of Object.keys(matchTracking)) {
        compareQuery(matchTracking[key]);
    }
};

document.addEventListener("DOMContentLoaded", function() {
    checkForTracking();

    // Clear input if reset button tapped
    const searchBar = document.getElementById("search-bar");
    const resetBtn = document.getElementById("search-reset");
    // some pages (e.g. images) do not have these
    if (!searchBar || !resetBtn)
        return;
    resetBtn.addEventListener("click", event => {
        event.preventDefault();
        searchBar.value = "";
        searchBar.focus();
    });
});
