/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml */ dojo.provide("dojo.io.cookie"); dojo.io.cookie.setCookie = function(name, value, days, path, domain, secure) { var expires = -1; if(typeof days == "number" && days >= 0) { var d = new Date(); d.setTime(d.getTime()+(days*24*60*60*1000)); expires = d.toGMTString(); } value = escape(value); document.cookie = name + "=" + value + ";" + (expires != -1 ? " expires=" + expires + ";" : "") + (path ? "path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "; secure" : ""); } dojo.io.cookie.set = dojo.io.cookie.setCookie; dojo.io.cookie.getCookie = function(name) { // FIXME: Which cookie should we return? // If there are cookies set for different sub domains in the current // scope there could be more than one cookie with the same name. // I think taking the last one in the list takes the one from the // deepest subdomain, which is what we're doing here. var idx = document.cookie.lastIndexOf(name+'='); if(idx == -1) { return null; } var value = document.cookie.substring(idx+name.length+1); var end = value.indexOf(';'); if(end == -1) { end = value.length; } value = value.substring(0, end); value = unescape(value); return value; } dojo.io.cookie.get = dojo.io.cookie.getCookie; dojo.io.cookie.deleteCookie = function(name) { dojo.io.cookie.setCookie(name, "-", 0); } dojo.io.cookie.setObjectCookie = function(name, obj, days, path, domain, secure, clearCurrent) { if(arguments.length == 5) { // for backwards compat clearCurrent = domain; domain = null; secure = null; } var pairs = [], cookie, value = ""; if(!clearCurrent) { cookie = dojo.io.cookie.getObjectCookie(name); } if(days >= 0) { if(!cookie) { cookie = {}; } for(var prop in obj) { if(prop == null) { delete cookie[prop]; } else if(typeof obj[prop] == "string" || typeof obj[prop] == "number") { cookie[prop] = obj[prop]; } } prop = null; for(var prop in cookie) { pairs.push(escape(prop) + "=" + escape(cookie[prop])); } value = pairs.join("&"); } dojo.io.cookie.setCookie(name, value, days, path, domain, secure); } dojo.io.cookie.getObjectCookie = function(name) { var values = null, cookie = dojo.io.cookie.getCookie(name); if(cookie) { values = {}; var pairs = cookie.split("&"); for(var i = 0; i < pairs.length; i++) { var pair = pairs[i].split("="); var value = pair[1]; if( isNaN(value) ) { value = unescape(pair[1]); } values[ unescape(pair[0]) ] = value; } } return values; } dojo.io.cookie.isSupported = function() { if(typeof navigator.cookieEnabled != "boolean") { dojo.io.cookie.setCookie("__TestingYourBrowserForCookieSupport__", "CookiesAllowed", 90, null); var cookieVal = dojo.io.cookie.getCookie("__TestingYourBrowserForCookieSupport__"); navigator.cookieEnabled = (cookieVal == "CookiesAllowed"); if(navigator.cookieEnabled) { // FIXME: should we leave this around? this.deleteCookie("__TestingYourBrowserForCookieSupport__"); } } return navigator.cookieEnabled; } // need to leave this in for backwards-compat from 0.1 for when it gets pulled in by dojo.io.* if(!dojo.io.cookies) { dojo.io.cookies = dojo.io.cookie; }