diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15812b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +build +.sizecache.json +*.log* diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 0000000..e3fbd98 --- /dev/null +++ b/.jshintignore @@ -0,0 +1,2 @@ +build +node_modules diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..fd016db --- /dev/null +++ b/.jshintrc @@ -0,0 +1,12 @@ +{ + "curly": true, + "eqeqeq": true, + "expr": true, + // "maxlen": 130, + "newcap": true, + "noarg": true, + "nonbsp": true, + "trailing": true, + "undef": true, + "unused": true +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..bfd8ca1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +language: node_js +node_js: + - 0.10 +before_script: + - npm install -g grunt-cli +script: grunt ci --verbose +env: + global: + - secure: HRae0kyIDDuhonvMi2SfEl1WJb4K/wX8WmzT9YkxFbmWwLjiOMkmqyuEyi76DbTC1cb9o7WwGVgbP1DhSm6n6m0Lz+PSzpprBN4QZuJc56jcc+tBA6gM81hyUufaTT0yUWz112Bu06kWIAs44w5PtG0FYZR0CuIN8fQvZi8fXCQ= + - secure: c+M5ECIfxDcVrr+ZlqgpGjv8kVM/hxiz3ACMCn4ZkDiaeq4Rw0wWIGZYL6aV5fhsoHgzEQ/XQPca8xKs3Umr7R3b6Vr3AEyFnW+LP67K/1Qbz4Pi3PvhDH/h4rvK7fOoTqTDCVVDEH3v4pefsz2VaKemG4iBKxrcof5aR4Rjopk= diff --git a/CHANGELOG.md b/CHANGELOG.md index b780a29..59d868f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,73 @@ +HEAD +----- + +1.4.1 +----- +- Added support for CommonJS. + +- Added support for package managers: Jam (http://jamjs.org), volo (http://volojs.org), Component (http://component.io), jspm (http://jspm.io). + +- The expires option now interpretes fractions of numbers (e.g. days) correctly. + +1.4.0 +----- +- Support for AMD. + +- Removed deprecated method `$.cookie('name', null)` for deleting a cookie, + use `$.removeCookie('name')`. + +- `$.cookie('name')` now returns `undefined` in case such cookie does not exist + (was `null`). Because the return value is still falsy, testing for existence + of a cookie like `if ( $.cookie('foo') )` keeps working without change. + +- Renamed bower package definition (component.json -> bower.json) for usage + with up-to-date bower. + +- Badly encoded cookies no longer throw exception upon reading but do return + undefined (similar to how we handle JSON parse errors with json = true). + +- Added conversion function as optional last argument for reading, + so that values can be changed to a different representation easily on the fly. + Useful for parsing numbers for instance: + + ```javascript + $.cookie('foo', '42'); + $.cookie('foo', Number); // => 42 + ``` + +1.3.1 +----- +- Fixed issue where it was no longer possible to check for an arbitrary cookie, + while json is set to true, there was a SyntaxError thrown from JSON.parse. + +- Fixed issue where RFC 2068 decoded cookies were not properly read. + +1.3.0 +----- +- Configuration options: `raw`, `json`. Replaces raw option, becomes config: + + ```javascript + $.cookie.raw = true; // bypass encoding/decoding the cookie value + $.cookie.json = true; // automatically JSON stringify/parse value + ``` + + Thus the default options now cleanly contain cookie attributes only. + +- Removing licensing under GPL Version 2, the plugin is now released under MIT License only +(keeping it simple and following the jQuery library itself here). + +- Bugfix: Properly handle RFC 2068 quoted cookie values. + +- Added component.json for bower. + +- Added jQuery plugin package manifest. + +- `$.cookie()` returns all available cookies. + +1.2.0 +----- +- Adding `$.removeCookie('foo')` for deleting a cookie, using `$.cookie('foo', null)` is now deprecated. + 1.1 --- -- Default options. +- Adding default options. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..608c33e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,51 @@ +##Issues + +- Report issues or feature requests on [GitHub Issues](https://github.com/carhartl/jquery-cookie/issues). +- If reporting a bug, please add a [simplified example](http://sscce.org/). + +##Pull requests +- Create a new topic branch for every separate change you make. +- Create a test case if you are fixing a bug or implementing an important feature. +- Make sure the build runs successfully. + +## Development + +###Tools +We use the following tools for development: + +- [Qunit](http://qunitjs.com/) for tests. +- [NodeJS](http://nodejs.org/download/) required to run grunt. +- [Grunt](http://gruntjs.com/getting-started) for task management. + +###Getting started +Install [NodeJS](http://nodejs.org/). +Install globally grunt-cli using the following command: + + $ npm install -g grunt-cli + +Browse to the project root directory and install the dev dependencies: + + $ npm install -d + +To execute the build and tests run the following command in the root of the project: + + $ grunt + +You should see a green message in the console: + + Done, without errors. + +###Tests +You can also run the tests in the browser. +Start a test server from the project root: + + $ grunt connect:tests + +This will automatically open the test suite at http://127.0.0.1:9998 in the default browser, with livereload enabled. + +_Note: we recommend cleaning all the browser cookies before running the tests, that can avoid false positive failures._ + +###Automatic build +You can build automatically after a file change using the following command: + + $ grunt watch diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..5ac9db5 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,168 @@ +/*jshint node:true, quotmark:single */ +'use strict'; + +module.exports = function (grunt) { + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + qunit: { + all: 'test/index.html' + }, + jshint: { + options: { + jshintrc: true + }, + grunt: 'Gruntfile.js', + source: 'src/**/*.js', + tests: 'test/**/*.js' + }, + uglify: { + options: { + banner: '/*! <%= pkg.name %> v<%= pkg.version %> | <%= pkg.license %> */\n' + }, + build: { + files: { + 'build/jquery.cookie-<%= pkg.version %>.min.js': 'src/jquery.cookie.js' + } + } + }, + watch: { + options: { + livereload: true + }, + files: '{src,test}/**/*.js', + tasks: 'default' + }, + compare_size: { + files: [ + 'build/jquery.cookie-<%= pkg.version %>.min.js', + 'src/jquery.cookie.js' + ], + options: { + compress: { + gz: function (fileContents) { + return require('gzip-js').zip(fileContents, {}).length; + } + } + } + }, + connect: { + saucelabs: { + options: { + port: 9999, + base: ['.', 'test'] + } + }, + tests: { + options: { + port: 9998, + base: ['.', 'test'], + open: 'http://127.0.0.1:9998', + keepalive: true, + livereload: true + } + } + }, + 'saucelabs-qunit': { + all: { + options: { + urls: ['http://127.0.0.1:9999'], + build: process.env.TRAVIS_JOB_ID, + browsers: [ + // iOS + { + browserName: 'iphone', + platform: 'OS X 10.9', + version: '7.1' + }, + { + browserName: 'ipad', + platform: 'OS X 10.9', + version: '7.1' + }, + // Android + { + browserName: 'android', + platform: 'Linux', + version: '4.3' + }, + // OS X + { + browserName: 'safari', + platform: 'OS X 10.9', + version: '7' + }, + { + browserName: 'safari', + platform: 'OS X 10.8', + version: '6' + }, + { + browserName: 'firefox', + platform: 'OS X 10.9', + version: '28' + }, + // Windows + { + browserName: 'internet explorer', + platform: 'Windows 8.1', + version: '11' + }, + { + browserName: 'internet explorer', + platform: 'Windows 8', + version: '10' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '11' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '10' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '9' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '8' + }, + { + browserName: 'firefox', + platform: 'Windows 7', + version: '29' + }, + { + browserName: 'chrome', + platform: 'Windows 7', + version: '34' + }, + // Linux + { + browserName: 'firefox', + platform: 'Linux', + version: '29' + } + ] + } + } + } + }); + + // Loading dependencies + for (var key in grunt.file.readJSON('package.json').devDependencies) { + if (key !== 'grunt' && key.indexOf('grunt') === 0) { + grunt.loadNpmTasks(key); + } + } + + grunt.registerTask('default', ['jshint', 'qunit', 'uglify', 'compare_size']); + grunt.registerTask('saucelabs', ['connect:saucelabs', 'saucelabs-qunit']); + grunt.registerTask('ci', ['jshint', 'qunit', 'saucelabs']); +}; diff --git a/MIT-LICENSE.txt b/MIT-LICENSE.txt new file mode 100644 index 0000000..7a631e8 --- /dev/null +++ b/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright 2014 Klaus Hartl + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 55f2a8b..3100800 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,161 @@ -# jquery.cookie +# IMPORTANT! + +This project was moved to https://github.com/js-cookie/js-cookie, check [the discussion](https://github.com/carhartl/jquery-cookie/issues/349). + +New issues should be opened at https://github.com/js-cookie/js-cookie/issues + +# jquery.cookie [](https://travis-ci.org/carhartl/jquery-cookie) [](https://codeclimate.com/github/carhartl/jquery-cookie) A simple, lightweight jQuery plugin for reading, writing and deleting cookies. +**If you're viewing this, you're reading the documentation for the old repository. +[View documentation for the latest backwards compatible release (1.5.1).](https://github.com/js-cookie/js-cookie/tree/v1.5.1)** + +## Build Status Matrix + +[](https://saucelabs.com/u/jquery-cookie) + ## Installation Include script *after* the jQuery library (unless you are packaging scripts somehow else): - +```html + +``` + +**Do not include the script directly from GitHub (http://raw.github.com/...).** The file is being served as text/plain and as such being blocked +in Internet Explorer on Windows 7 for instance (because of the wrong MIME type). Bottom line: GitHub is not a CDN. + +The plugin can also be loaded as AMD or CommonJS module. ## Usage Create session cookie: - $.cookie('the_cookie', 'the_value'); +```javascript +$.cookie('name', 'value'); +``` Create expiring cookie, 7 days from then: - $.cookie('the_cookie', 'the_value', { expires: 7 }); +```javascript +$.cookie('name', 'value', { expires: 7 }); +``` Create expiring cookie, valid across entire site: - $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' }); +```javascript +$.cookie('name', 'value', { expires: 7, path: '/' }); +``` Read cookie: - $.cookie('the_cookie'); // => "the_value" - $.cookie('the_cookie', { raw: true }); // => "the_value" not URL decoded - $.cookie('not_existing'); // => null +```javascript +$.cookie('name'); // => "value" +$.cookie('nothing'); // => undefined +``` -Delete cookie by passing null as value: +Read all available cookies: - $.cookie('the_cookie', null); +```javascript +$.cookie(); // => { "name": "value" } +``` + +Delete cookie: + +```javascript +// Returns true when cookie was successfully deleted, otherwise false +$.removeCookie('name'); // => true +$.removeCookie('nothing'); // => false + +// Need to use the same attributes (path, domain) as what the cookie was written with +$.cookie('name', 'value', { path: '/' }); +// This won't work! +$.removeCookie('name'); // => false +// This will work! +$.removeCookie('name', { path: '/' }); // => true +``` *Note: when deleting a cookie, you must pass the exact same path, domain and secure options that were used to set the cookie, unless you're relying on the default options that is.* -## Options +## Configuration + +### raw + +By default the cookie value is encoded/decoded when writing/reading, using `encodeURIComponent`/`decodeURIComponent`. Bypass this by setting raw to true: + +```javascript +$.cookie.raw = true; +``` + +### json -Options can be set globally by setting properties of the `$.cookie.defaults` object or individually for each call to `$.cookie()` by passing a plain object to the options argument. Per-call options override the ones set by `$.cookie.defaults`. +Turn on automatic storage of JSON objects passed as the cookie value. Assumes `JSON.stringify` and `JSON.parse`: + +```javascript +$.cookie.json = true; +``` + +## Cookie Options + +Cookie attributes can be set globally by setting properties of the `$.cookie.defaults` object or individually for each call to `$.cookie()` by passing a plain object to the options argument. Per-call options override the default options. + +### expires expires: 365 Define lifetime of the cookie. Value can be a `Number` which will be interpreted as days from time of creation or a `Date` object. If omitted, the cookie becomes a session cookie. +### path + path: '/' Define the path where the cookie is valid. *By default the path of the cookie is the path of the page where the cookie was created (standard browser behavior).* If you want to make it available for instance across the entire domain use `path: '/'`. Default: path of page where the cookie was created. +**Note regarding Internet Explorer:** + +> Due to an obscure bug in the underlying WinINET InternetGetCookie implementation, IE’s document.cookie will not return a cookie if it was set with a path attribute containing a filename. + +(From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx)) + +This means one cannot set a path using `path: window.location.pathname` in case such pathname contains a filename like so: `/check.html` (or at least, such cookie cannot be read correctly). + +### domain + domain: 'example.com' Define the domain where the cookie is valid. Default: domain of page where the cookie was created. +### secure + secure: true If true, the cookie transmission requires a secure protocol (https). Default: `false`. - raw: true +## Converters + +Provide a conversion function as optional last argument for reading, in order to change the cookie's value +to a different representation on the fly. + +Example for parsing a value into a number: + +```javascript +$.cookie('foo', '42'); +$.cookie('foo', Number); // => 42 +``` -By default the cookie value is encoded/decoded when creating/reading, using `encodeURIComponent`/`decodeURIComponent`. Turn off by setting `raw: true`. Default: `false`. +Dealing with cookies that have been encoded using `escape` (3rd party cookies): -## Changelog +```javascript +$.cookie.raw = true; +$.cookie('foo', unescape); +``` -## Development +You can pass an arbitrary conversion function. -- Source hosted at [GitHub](https://github.com/carhartl/jquery-cookie) -- Report issues, questions, feature requests on [GitHub Issues](https://github.com/carhartl/jquery-cookie/issues) +## Contributing -Pull requests are very welcome! Make sure your patches are well tested. Please create a topic branch for every separate change you make. +Check out the [Contributing Guidelines](CONTRIBUTING.md) ## Authors diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..3862b74 --- /dev/null +++ b/bower.json @@ -0,0 +1,18 @@ +{ + "name": "jquery.cookie", + "version": "1.4.1", + "main": [ + "src/jquery.cookie.js" + ], + "dependencies": { + "jquery": ">=1.2" + }, + "ignore": [ + "test", + ".*", + "*.json", + "*.md", + "*.txt", + "Gruntfile.js" + ] +} diff --git a/component.json b/component.json new file mode 100644 index 0000000..0fad480 --- /dev/null +++ b/component.json @@ -0,0 +1,14 @@ +{ + "name": "jquery.cookie", + "repo": "carhartl/jquery-cookie", + "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies", + "version": "1.4.1", + "keywords": [], + "dependencies": {}, + "development": {}, + "license": "MIT", + "main": "src/jquery.cookie.js", + "scripts": [ + "src/jquery.cookie.js" + ] +} diff --git a/cookie.jquery.json b/cookie.jquery.json new file mode 100644 index 0000000..69d5748 --- /dev/null +++ b/cookie.jquery.json @@ -0,0 +1,32 @@ +{ + "name": "cookie", + "version": "1.4.1", + "title": "jQuery Cookie", + "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.", + "author": { + "name": "Klaus Hartl", + "url": "https://github.com/carhartl" + }, + "maintainers": [ + { + "name": "Klaus Hartl", + "url": "https://github.com/carhartl" + }, + { + "name": "Fagner Martins", + "url": "https://github.com/FagnerMartinsBrack" + } + ], + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/carhartl/jquery-cookie/master/MIT-LICENSE.txt" + } + ], + "dependencies": { + "jquery": ">=1.2" + }, + "bugs": "https://github.com/carhartl/jquery-cookie/issues", + "homepage": "https://github.com/carhartl/jquery-cookie", + "docs": "https://github.com/carhartl/jquery-cookie#readme" +} diff --git a/jquery.cookie.js b/jquery.cookie.js deleted file mode 100644 index 3e23eb0..0000000 --- a/jquery.cookie.js +++ /dev/null @@ -1,61 +0,0 @@ -/*jshint eqnull:true */ -/*! - * jQuery Cookie Plugin v1.1 - * https://github.com/carhartl/jquery-cookie - * - * Copyright 2011, Klaus Hartl - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://www.opensource.org/licenses/mit-license.php - * http://www.opensource.org/licenses/GPL-2.0 - */ -(function($, document) { - - var pluses = /\+/g; - function raw(s) { - return s; - } - function decoded(s) { - return decodeURIComponent(s.replace(pluses, ' ')); - } - - $.cookie = function(key, value, options) { - - // key and at least value given, set cookie... - if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value == null)) { - options = $.extend({}, $.cookie.defaults, options); - - if (value == null) { - options.expires = -1; - } - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = String(value); - - return (document.cookie = [ - encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // key and possibly options given, get cookie... - options = value || $.cookie.defaults || {}; - var decode = options.raw ? raw : decoded; - var cookies = document.cookie.split('; '); - for (var i = 0, parts; (parts = cookies[i] && cookies[i].split('=')); i++) { - if (decode(parts.shift()) === key) { - return decode(parts.join('=')); - } - } - return null; - }; - - $.cookie.defaults = {}; - -})(jQuery, document); diff --git a/package.json b/package.json new file mode 100644 index 0000000..38abffe --- /dev/null +++ b/package.json @@ -0,0 +1,50 @@ +{ + "name": "jquery.cookie", + "version": "1.4.1", + "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.", + "main": "src/jquery.cookie.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "grunt" + }, + "repository": { + "type": "git", + "url": "git://github.com/carhartl/jquery-cookie.git" + }, + "author": "Klaus Hartl", + "license": "MIT", + "gitHead": "bd3c9713222bace68d25fe2128c0f8633cad1269", + "readmeFilename": "README.md", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.10.0", + "grunt-contrib-uglify": "~0.2.0", + "grunt-contrib-qunit": "~0.2.0", + "grunt-contrib-watch": "~0.6.1", + "grunt-compare-size": "~0.4.0", + "grunt-saucelabs": "~7.0.0", + "grunt-contrib-connect": "~0.7.1", + "gzip-js": "~0.3.0" + }, + "volo": { + "url": "https://raw.github.com/carhartl/jquery-cookie/v{version}/src/jquery.cookie.js" + }, + "jspm": { + "main": "jquery.cookie", + "files": ["src/jquery.cookie.js"], + "buildConfig": { + "uglify": true + } + }, + "jam": { + "dependencies": { + "jquery": ">=1.2" + }, + "main": "src/jquery.cookie.js", + "include": [ + "src/jquery.cookie.js" + ] + } +} diff --git a/server.js b/server.js deleted file mode 100644 index f454999..0000000 --- a/server.js +++ /dev/null @@ -1,24 +0,0 @@ -var http = require('http'); -var url = require('url'); -var path = require('path'); -var fs = require('fs'); - -http.createServer(function(request, response) { - var uri = url.parse(request.url).pathname; - var filename = path.join(process.cwd(), uri); - - fs.readFile(filename, 'binary', function(err, file) { - if (err) { - response.writeHead(500, { 'Content-Type': 'text/plain' }); - response.write(err + '\n'); - response.end(); - return; - } - - response.writeHead(200); - response.write(file, 'utf-8'); - response.end(); - }); -}).listen(8124, '0.0.0.0'); - -console.log('Test suite at http://0.0.0.0:8124/test.html'); diff --git a/src/.jshintrc b/src/.jshintrc new file mode 100644 index 0000000..241dd9f --- /dev/null +++ b/src/.jshintrc @@ -0,0 +1,13 @@ +{ + "browser": true, + "camelcase": true, + "jquery": true, + "quotmark": "single", + "globals": { + "define": true, + "module": true, + "require": true + }, + + "extends": "../.jshintrc" +} diff --git a/src/jquery.cookie.js b/src/jquery.cookie.js new file mode 100644 index 0000000..8218817 --- /dev/null +++ b/src/jquery.cookie.js @@ -0,0 +1,114 @@ +/*! + * jQuery Cookie Plugin v1.4.1 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2006, 2014 Klaus Hartl + * Released under the MIT license + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD (Register as an anonymous module) + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var pluses = /\+/g; + + function encode(s) { + return config.raw ? s : encodeURIComponent(s); + } + + function decode(s) { + return config.raw ? s : decodeURIComponent(s); + } + + function stringifyCookieValue(value) { + return encode(config.json ? JSON.stringify(value) : String(value)); + } + + function parseCookieValue(s) { + if (s.indexOf('"') === 0) { + // This is a quoted cookie as according to RFC2068, unescape... + s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); + } + + try { + // Replace server-side written pluses with spaces. + // If we can't decode the cookie, ignore it, it's unusable. + // If we can't parse the cookie, ignore it, it's unusable. + s = decodeURIComponent(s.replace(pluses, ' ')); + return config.json ? JSON.parse(s) : s; + } catch(e) {} + } + + function read(s, converter) { + var value = config.raw ? s : parseCookieValue(s); + return $.isFunction(converter) ? converter(value) : value; + } + + var config = $.cookie = function (key, value, options) { + + // Write + + if (arguments.length > 1 && !$.isFunction(value)) { + options = $.extend({}, config.defaults, options); + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setMilliseconds(t.getMilliseconds() + days * 864e+5); + } + + return (document.cookie = [ + encode(key), '=', stringifyCookieValue(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // Read + + var result = key ? undefined : {}, + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + cookies = document.cookie ? document.cookie.split('; ') : [], + i = 0, + l = cookies.length; + + for (; i < l; i++) { + var parts = cookies[i].split('='), + name = decode(parts.shift()), + cookie = parts.join('='); + + if (key === name) { + // If second argument (value) is a function it's a converter... + result = read(cookie, value); + break; + } + + // Prevent storing a cookie that we couldn't decode. + if (!key && (cookie = read(cookie)) !== undefined) { + result[name] = cookie; + } + } + + return result; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + // Must not alter options, thus extending a fresh object... + $.cookie(key, '', $.extend({}, options, { expires: -1 })); + return !$.cookie(key); + }; + +})); diff --git a/test.html b/test.html deleted file mode 100644 index 90daad6..0000000 --- a/test.html +++ /dev/null @@ -1,19 +0,0 @@ - - -
- -