1 var $, SaveStateHandler, indexOf, isInt, util;
3 util = require('./util');
5 indexOf = util.indexOf;
11 SaveStateHandler = (function() {
12 function SaveStateHandler(tree_widget) {
13 this.tree_widget = tree_widget;
16 SaveStateHandler.prototype.saveState = function() {
18 state = JSON.stringify(this.getState());
19 if (this.tree_widget.options.onSetStateFromStorage) {
20 return this.tree_widget.options.onSetStateFromStorage(state);
21 } else if (this.supportsLocalStorage()) {
22 return localStorage.setItem(this.getCookieName(), state);
23 } else if ($.cookie) {
25 return $.cookie(this.getCookieName(), state, {
31 SaveStateHandler.prototype.getStateFromStorage = function() {
33 json_data = this._loadFromStorage();
35 return this._parseState(json_data);
41 SaveStateHandler.prototype._parseState = function(json_data) {
43 state = $.parseJSON(json_data);
44 if (state && state.selected_node && isInt(state.selected_node)) {
45 state.selected_node = [state.selected_node];
50 SaveStateHandler.prototype._loadFromStorage = function() {
51 if (this.tree_widget.options.onGetStateFromStorage) {
52 return this.tree_widget.options.onGetStateFromStorage();
53 } else if (this.supportsLocalStorage()) {
54 return localStorage.getItem(this.getCookieName());
55 } else if ($.cookie) {
57 return $.cookie(this.getCookieName());
63 SaveStateHandler.prototype.getState = function() {
64 var getOpenNodeIds, getSelectedNodeIds;
65 getOpenNodeIds = (function(_this) {
69 _this.tree_widget.tree.iterate(function(node) {
70 if (node.is_open && node.id && node.hasChildren()) {
71 open_nodes.push(node.id);
78 getSelectedNodeIds = (function(_this) {
82 var i, len, ref, results;
83 ref = this.tree_widget.getSelectedNodes();
85 for (i = 0, len = ref.length; i < len; i++) {
94 open_nodes: getOpenNodeIds(),
95 selected_node: getSelectedNodeIds()
99 SaveStateHandler.prototype.setInitialState = function(state) {
100 var must_load_on_demand;
104 must_load_on_demand = this._openInitialNodes(state.open_nodes);
105 this._selectInitialNodes(state.selected_node);
106 return must_load_on_demand;
110 SaveStateHandler.prototype._openInitialNodes = function(node_ids) {
111 var i, len, must_load_on_demand, node, node_id;
112 must_load_on_demand = false;
113 for (i = 0, len = node_ids.length; i < len; i++) {
114 node_id = node_ids[i];
115 node = this.tree_widget.getNodeById(node_id);
117 if (!node.load_on_demand) {
120 must_load_on_demand = true;
124 return must_load_on_demand;
127 SaveStateHandler.prototype._selectInitialNodes = function(node_ids) {
128 var i, len, node, node_id, select_count;
130 for (i = 0, len = node_ids.length; i < len; i++) {
131 node_id = node_ids[i];
132 node = this.tree_widget.getNodeById(node_id);
135 this.tree_widget.select_node_handler.addToSelection(node);
138 return select_count !== 0;
141 SaveStateHandler.prototype.setInitialStateOnDemand = function(state, cb_finished) {
143 return this._setInitialStateOnDemand(state.open_nodes, state.selected_node, cb_finished);
145 return cb_finished();
149 SaveStateHandler.prototype._setInitialStateOnDemand = function(node_ids, selected_nodes, cb_finished) {
150 var loadAndOpenNode, loading_count, openNodes;
152 openNodes = (function(_this) {
154 var i, len, new_nodes_ids, node, node_id;
156 for (i = 0, len = node_ids.length; i < len; i++) {
157 node_id = node_ids[i];
158 node = _this.tree_widget.getNodeById(node_id);
160 new_nodes_ids.push(node_id);
162 if (!node.is_loading) {
163 if (node.load_on_demand) {
164 loadAndOpenNode(node);
166 _this.tree_widget._openNode(node, false);
171 node_ids = new_nodes_ids;
172 if (_this._selectInitialNodes(selected_nodes)) {
173 _this.tree_widget._refreshElements();
175 if (loading_count === 0) {
176 return cb_finished();
180 loadAndOpenNode = (function(_this) {
181 return function(node) {
183 return _this.tree_widget._openNode(node, false, function() {
192 SaveStateHandler.prototype.getCookieName = function() {
193 if (typeof this.tree_widget.options.saveState === 'string') {
194 return this.tree_widget.options.saveState;
200 SaveStateHandler.prototype.supportsLocalStorage = function() {
202 testSupport = function() {
204 if (typeof localStorage === "undefined" || localStorage === null) {
208 key = '_storage_test';
209 sessionStorage.setItem(key, true);
210 sessionStorage.removeItem(key);
218 if (this._supportsLocalStorage == null) {
219 this._supportsLocalStorage = testSupport();
221 return this._supportsLocalStorage;
224 SaveStateHandler.prototype.getNodeIdToBeSelected = function() {
226 state = this.getStateFromStorage();
227 if (state && state.selected_node) {
228 return state.selected_node[0];
234 return SaveStateHandler;
238 module.exports = SaveStateHandler;