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