fe682c88f8a4e754d086773c51dd59c32bb3f378
[WebKit-https.git] / Websites / browserbench.org / Speedometer2.0 / resources / todomvc / vanilla-examples / vanillajs / js / store.js
1 /*jshint eqeqeq:false */
2 (function (window) {
3     'use strict';
4
5     var MemoryStorage = {};
6     /**
7      * Creates a new client side storage object and will create an empty
8      * collection if no collection already exists.
9      *
10      * @param {string} name The name of our DB we want to use
11      * @param {function} callback Our fake DB uses callbacks because in
12      * real life you probably would be making AJAX calls
13      */
14     function Store(name, callback) {
15         callback = callback || function () {};
16
17         this._dbName = name;
18
19         if (!MemoryStorage[name]) {
20             var data = {
21                 todos: []
22             };
23
24             MemoryStorage[name] = JSON.stringify(data);
25         }
26
27         callback.call(this, JSON.parse(MemoryStorage[name]));
28     }
29
30     /**
31      * Finds items based on a query given as a JS object
32      *
33      * @param {object} query The query to match against (i.e. {foo: 'bar'})
34      * @param {function} callback     The callback to fire when the query has
35      * completed running
36      *
37      * @example
38      * db.find({foo: 'bar', hello: 'world'}, function (data) {
39      *     // data will return any items that have foo: bar and
40      *     // hello: world in their properties
41      * });
42      */
43     Store.prototype.find = function (query, callback) {
44         if (!callback) {
45             return;
46         }
47
48         var todos = JSON.parse(MemoryStorage[this._dbName]).todos;
49
50         callback.call(this, todos.filter(function (todo) {
51             for (var q in query) {
52                 if (query[q] !== todo[q]) {
53                     return false;
54                 }
55             }
56             return true;
57         }));
58     };
59
60     /**
61      * Will retrieve all data from the collection
62      *
63      * @param {function} callback The callback to fire upon retrieving data
64      */
65     Store.prototype.findAll = function (callback) {
66         callback = callback || function () {};
67         callback.call(this, JSON.parse(MemoryStorage[this._dbName]).todos);
68     };
69
70     /**
71      * Will save the given data to the DB. If no item exists it will create a new
72      * item, otherwise it'll simply update an existing item's properties
73      *
74      * @param {object} updateData The data to save back into the DB
75      * @param {function} callback The callback to fire after saving
76      * @param {number} id An optional param to enter an ID of an item to update
77      */
78     Store.prototype.save = function (updateData, callback, id) {
79         var data = JSON.parse(MemoryStorage[this._dbName]);
80         var todos = data.todos;
81
82         callback = callback || function () {};
83
84         // If an ID was actually given, find the item and update each property
85         if (id) {
86             for (var i = 0; i < todos.length; i++) {
87                 if (todos[i].id === id) {
88                     for (var key in updateData) {
89                         todos[i][key] = updateData[key];
90                     }
91                     break;
92                 }
93             }
94
95             MemoryStorage[this._dbName] = JSON.stringify(data);
96             callback.call(this, todos);
97         } else {
98             // Generate an ID
99             updateData.id = new Date().getTime();
100
101             todos.push(updateData);
102             MemoryStorage[this._dbName] = JSON.stringify(data);
103             callback.call(this, [updateData]);
104         }
105     };
106
107     /**
108      * Will remove an item from the Store based on its ID
109      *
110      * @param {number} id The ID of the item you want to remove
111      * @param {function} callback The callback to fire after saving
112      */
113     Store.prototype.remove = function (id, callback) {
114         var data = JSON.parse(MemoryStorage[this._dbName]);
115         var todos = data.todos;
116
117         for (var i = 0; i < todos.length; i++) {
118             if (todos[i].id == id) {
119                 todos.splice(i, 1);
120                 break;
121             }
122         }
123
124         MemoryStorage[this._dbName] = JSON.stringify(data);
125         callback.call(this, todos);
126     };
127
128     /**
129      * Will drop all storage and start fresh
130      *
131      * @param {function} callback The callback to fire after dropping the data
132      */
133     Store.prototype.drop = function (callback) {
134         var data = {todos: []};
135         MemoryStorage[this._dbName] = JSON.stringify(data);
136         callback.call(this, data.todos);
137     };
138
139     // Export to window
140     window.app = window.app || {};
141     window.app.Store = Store;
142 })(window);