// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ========================================================================== /** @class Allows for easier handling of the document.cookie object. To create a cookie, simply call SC.Cookie.create. To retrieve a cookie, use SC.Cookie.find. Cookies are not added to document.cookie, which SC.Cookie.find uses, until you have called SC.Cookie#write. Heavy inspiration from the {@link jQuery cookie plugin}. @extends SC.Object @since Sproutcore 1.0 @author Colin Campbell */ SC.Cookie = SC.Object.extend( /** @scope SC.Cookie.prototype */{ // .......................................................... // PROPERTIES // /** @type String @default null */ name: null, /** @type String @default '' */ value: '', /** Amount of time until the cookie expires. Set to -1 in order to delete the cookie. If passing an Integer, it is interpreted as a number of days. @type Integer|SC.DateTime|Date @default null */ expires: null, /** @type String @deafult null */ path: null, /** @type String @default null */ domain: null, /** If true, the secure attribute of the cookie will be set and the cookie transmission will require a secure protocol (like HTTPS). @type Boolean @default NO */ secure: NO, /** Walk like a duck @type Boolean @default YES @readOnly */ isCookie: YES, // .......................................................... // METHODS // /** Sets SC.Cookie#expires to -1, which destroys the cookie. */ destroy: function() { this.set('expires', -1); this.write(); sc_super(); }, /** Writes this SC.Cookie to document.cookie and adds it to SC.Cookie collection. To find this cookie later, or on reload, use SC.Cookie.find. @see SC.Cookie.find */ write: function() { var name = this.get('name'), value = this.get('value'), expires = this.get('expires'), path = this.get('path'), domain = this.get('domain'), secure = this.get('secure'), output = '', date; if (expires) { if (typeof expires === SC.T_NUMBER) { date = new Date(); date.setTime(date.getTime() + (expires*24*60*60*1000)); } else if (SC.DateTime && expires.get && expires.get('milliseconds')) { date = new Date(expires.get('milliseconds')); } else if (expires.toUTCString && expires.toUTCString.apply) { date = expires; } if (date) output = "; expires=" + date.toUTCString(); } if (!SC.none(path)) output += '; path=' + path; if (!SC.none(domain)) output += '; domain=' + domain; if (secure === YES) output += '; secure'; document.cookie = name + "=" + encodeURIComponent(value) + output; return this; } }); SC.Cookie.mixin( /** @scope SC.Cookie */ { /** Finds a cookie that has been stored @param {String} name The name of the cookie @returns SC.Cookie object containing name and value of cookie */ find: function(name) { if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = SC.String.trim(String(cookies[i])); if (cookie.substring(0, name.length + 1) === (name + "=")) { return SC.Cookie.create({ name: name, value: decodeURIComponent(cookie.substring(name.length + 1)) }); } } } return null; } }); SC.CookieMonster = { nomNomNom: function(cookie) { var isCookie = SC.kindOf(cookie, SC.Cookie); if (isCookie) { SC.Logger.log("YUM!"); return cookie.destroy(); } SC.Logger.error("Y U PASS ME NO COOKIE? %@", cookie); return NO; } };