/** * 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); };