info343/lectures/cookies-session-data/files/Cookies.js

/**
 * Cookies utility class by Marty Stepp
 * Relies on Prototype framework being loaded on the current page.
 */


/** Cookie class stores things related to cookies. */
function Cookies() {}

/** Returns true if a cookie exists with the given name. */
Cookies.exists = function(name) {
    return Cookies.get(name) !== null;
};

/** Returns the value of the cookie with the given name (null if not found). */
Cookies.get = function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1, c.length);
        }
        if (c.indexOf(nameEQ) == 0) {
            return c.substring(nameEQ.length, c.length);
        }
    }
    return null;
};

/** Turns the given checkbox into one that will remember its checked-ness,
 *  using a client-side cookie with the given name.
 */
Cookies.makeCheckboxStateful = function(element, cookieName, expiration) {
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    
    element.cookieName = cookieName;
    if (Cookies.exists(cookieName) && !element.disabled) {
        var shouldBeChecked = (Cookies.get(cookieName) == "true");
        if (element.checked != shouldBeChecked) {
            if (element.onclick) {
                element.onclick();
            }
            if (element.onchange) {
                element.onchange();
            }
            element.checked = shouldBeChecked;
        }
    }
    element.observe("change", function(event) {
        Cookies.statefulCheckboxChange(element, cookieName, expiration);
    });
};

/** Turns the given radio into one that will remember its checked-ness,
 *  using a client-side cookie with the given name.
 *  Will also uncheck other radio buttons in the same name group.
 */
Cookies.makeRadioButtonStateful = function(element, cookieName, expiration) {
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    
    element.cookieName = cookieName;
    if (Cookies.exists(cookieName)) {
        var shouldBeChecked = (Cookies.get(cookieName) == "true");
        if (element.checked != shouldBeChecked) {
            if (!element.disabled) {
                if (element.onclick) {
                    element.onclick();
                }
                if (element.onchange) {
                    element.onchange();
                }
            }
            element.checked = shouldBeChecked;
        }
    }

    if (!element.disabled) {
        element.observe("change", function(event) {
            Cookies.statefulRadioButtonChange(element, cookieName, expiration);
        });
    }
};

/** Turns the given select box into one that will remember its selected value,
 *  using a client-side cookie with the given name.
 */
Cookies.makeSelectStateful = function(element, cookieName, expiration) {
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    
    element.cookieName = cookieName;
    if (Cookies.exists(cookieName)) {
        element.value = Cookies.get(cookieName);
    }
    element.observe("change", function(event) {
        Cookies.statefulSelectChange(element, cookieName, expiration);
    });
};

/** Turns the given input text box into one that will remember its selected value,
 *  using a client-side cookie with the given name.
 *  Basically identical code to makeSelectStateful...
 */
Cookies.makeTextBoxStateful = function(element, cookieName, expiration) {
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    
    element.cookieName = cookieName;
    if (Cookies.exists(cookieName)) {
        element.value = Cookies.get(cookieName);
        if (element.onchange) {
            element.onchange();
        }
    }
    element.observe("change", function(event) {
        Cookies.statefulSelectChange(element, cookieName, expiration);
    });
};

/** Removes the cookie with the given name. */
Cookies.remove = function(name) {
    Cookies.set(name, "", -1);
};

/** Sets the cookie with the given name to have the given value.
 *  Taken from http://www.quirksmode.org/js/cookies.html
 */
Cookies.set = function(name, value, days) {
    if (days && days > 0) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    } else {
        var expires = "";
    }
    document.cookie = name + "=" + value + expires + "; path=/";
};

// This function is called when a "stateful" checkbox's checked state
// changes, and stores that state in a cookie to be restored later.
Cookies.statefulCheckboxChange = function(element, cookieName, expiration) {
    if (!expiration) {
        expiration = 999;   // default 999 days
    }
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    Cookies.set(cookieName, element.checked ? "true" : "false", expiration);
};

// This function is called when a "stateful" checkbox's checked state
// changes, and stores that state in a cookie to be restored later.
Cookies.statefulRadioButtonChange = function(element, cookieName, expiration) {
    if (!expiration) {
        expiration = 999;   // default 999 days
    }
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    var radios = document.getElementsByName(element.name);
    for (var i = 0; i < radios.length; i++) {
        if (radios[i].cookieName) {
            Cookies.set(radios[i].cookieName, "false", expiration);
        }
    }
    Cookies.set(cookieName, element.checked ? "true" : "false", expiration);
};

// This function is called when a "stateful" select box's selected element
// changes, and stores that value in a cookie to be restored later.
Cookies.statefulSelectChange = function(element, cookieName, expiration) {
    if (!expiration) {
        expiration = 999;   // default 999 days
    }
    element = $(element);
    if (!cookieName) {
        cookieName = element.id;
    }
    if (!cookieName) {
        return;
    }
    Cookies.set(cookieName, element.value, expiration);
};