| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.collections.Store"); |
| dojo.require("dojo.lang.common"); |
| dojo.collections.Store = function (jsonArray) { |
| var data = []; |
| var items = {}; |
| this.keyField = "Id"; |
| this.get = function () { |
| return data; |
| }; |
| this.getByKey = function (key) { |
| return items[key]; |
| }; |
| this.getByIndex = function (idx) { |
| return data[idx]; |
| }; |
| this.getIndexOf = function (key) { |
| for (var i = 0; i < data.length; i++) { |
| if (data[i].key == key) { |
| return i; |
| } |
| } |
| return -1; |
| }; |
| this.getData = function () { |
| var arr = []; |
| for (var i = 0; i < data.length; i++) { |
| arr.push(data[i].src); |
| } |
| return arr; |
| }; |
| this.getDataByKey = function (key) { |
| if (items[key] != null) { |
| return items[key].src; |
| } |
| return null; |
| }; |
| this.getIndexOfData = function (obj) { |
| for (var i = 0; i < data.length; i++) { |
| if (data[i].src == obj) { |
| return i; |
| } |
| } |
| return -1; |
| }; |
| this.getDataByIndex = function (idx) { |
| if (data[idx]) { |
| return data[idx].src; |
| } |
| return null; |
| }; |
| this.update = function (obj, fieldPath, val, bDontFire) { |
| var parts = fieldPath.split("."), i = 0, o = obj, field; |
| if (parts.length > 1) { |
| field = parts.pop(); |
| do { |
| if (parts[i].indexOf("()") > -1) { |
| var temp = parts[i++].split("()")[0]; |
| if (!o[temp]) { |
| dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object."); |
| } else { |
| o = o[temp](); |
| } |
| } else { |
| o = o[parts[i++]]; |
| } |
| } while (i < parts.length && o != null); |
| } else { |
| field = parts[0]; |
| } |
| obj[field] = val; |
| if (!bDontFire) { |
| this.onUpdateField(obj, fieldPath, val); |
| } |
| }; |
| this.forEach = function (fn) { |
| if (Array.forEach) { |
| Array.forEach(data, fn, this); |
| } else { |
| for (var i = 0; i < data.length; i++) { |
| fn.call(this, data[i]); |
| } |
| } |
| }; |
| this.forEachData = function (fn) { |
| if (Array.forEach) { |
| Array.forEach(this.getData(), fn, this); |
| } else { |
| var a = this.getData(); |
| for (var i = 0; i < a.length; i++) { |
| fn.call(this, a[i]); |
| } |
| } |
| }; |
| this.setData = function (arr, bDontFire) { |
| data = []; |
| for (var i = 0; i < arr.length; i++) { |
| var o = {key:arr[i][this.keyField], src:arr[i]}; |
| data.push(o); |
| items[o.key] = o; |
| } |
| if (!bDontFire) { |
| this.onSetData(); |
| } |
| }; |
| this.clearData = function (bDontFire) { |
| data = []; |
| items = {}; |
| if (!bDontFire) { |
| this.onClearData(); |
| } |
| }; |
| this.addData = function (obj, key, bDontFire) { |
| var k = key || obj[this.keyField]; |
| if (items[k] != null) { |
| var o = items[k]; |
| o.src = obj; |
| } else { |
| var o = {key:k, src:obj}; |
| data.push(o); |
| items[o.key] = o; |
| } |
| if (!bDontFire) { |
| this.onAddData(o); |
| } |
| }; |
| this.addDataRange = function (arr, bDontFire) { |
| var objects = []; |
| for (var i = 0; i < arr.length; i++) { |
| var k = arr[i][this.keyField]; |
| if (items[k] != null) { |
| var o = items[k]; |
| o.src = arr[i]; |
| } else { |
| var o = {key:k, src:arr[i]}; |
| data.push(o); |
| items[k] = o; |
| } |
| objects.push(o); |
| } |
| if (!bDontFire) { |
| this.onAddDataRange(objects); |
| } |
| }; |
| this.addDataByIndex = function (obj, idx, key, bDontFire) { |
| var k = key || obj[this.keyField]; |
| if (items[k] != null) { |
| var i = this.getIndexOf(k); |
| var o = data.splice(i, 1); |
| o.src = obj; |
| } else { |
| var o = {key:k, src:obj}; |
| items[k] = o; |
| } |
| data.splice(idx, 0, o); |
| if (!bDontFire) { |
| this.onAddData(o); |
| } |
| }; |
| this.addDataRangeByIndex = function (arr, idx, bDontFire) { |
| var objects = []; |
| for (var i = 0; i < arr.length; i++) { |
| var k = arr[i][this.keyField]; |
| if (items[k] != null) { |
| var j = this.getIndexOf(k); |
| var o = data.splice(j, 1); |
| o.src = arr[i]; |
| } else { |
| var o = {key:k, src:arr[i]}; |
| items[k] = o; |
| } |
| objects.push(o); |
| } |
| data.splice(idx, 0, objects); |
| if (!bDontFire) { |
| this.onAddDataRange(objects); |
| } |
| }; |
| this.removeData = function (obj, bDontFire) { |
| var idx = -1; |
| var o = null; |
| for (var i = 0; i < data.length; i++) { |
| if (data[i].src == obj) { |
| idx = i; |
| o = data[i]; |
| break; |
| } |
| } |
| if (!bDontFire) { |
| this.onRemoveData(o); |
| } |
| if (idx > -1) { |
| data.splice(idx, 1); |
| delete items[o.key]; |
| } |
| }; |
| this.removeDataRange = function (idx, range, bDontFire) { |
| var ret = data.splice(idx, range); |
| for (var i = 0; i < ret.length; i++) { |
| delete items[ret[i].key]; |
| } |
| if (!bDontFire) { |
| this.onRemoveDataRange(ret); |
| } |
| return ret; |
| }; |
| this.removeDataByKey = function (key, bDontFire) { |
| this.removeData(this.getDataByKey(key), bDontFire); |
| }; |
| this.removeDataByIndex = function (idx, bDontFire) { |
| this.removeData(this.getDataByIndex(idx), bDontFire); |
| }; |
| if (jsonArray && jsonArray.length && jsonArray[0]) { |
| this.setData(jsonArray, true); |
| } |
| }; |
| dojo.extend(dojo.collections.Store, {getField:function (obj, field) { |
| var parts = field.split("."), i = 0, o = obj; |
| do { |
| if (parts[i].indexOf("()") > -1) { |
| var temp = parts[i++].split("()")[0]; |
| if (!o[temp]) { |
| dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object."); |
| } else { |
| o = o[temp](); |
| } |
| } else { |
| o = o[parts[i++]]; |
| } |
| } while (i < parts.length && o != null); |
| if (i < parts.length) { |
| dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + field + "' is not a property of the passed object."); |
| } |
| return o; |
| }, getFromHtml:function (meta, body, fnMod) { |
| var rows = body.rows; |
| var ctor = function (row) { |
| var obj = {}; |
| for (var i = 0; i < meta.length; i++) { |
| var o = obj; |
| var data = row.cells[i].innerHTML; |
| var p = meta[i].getField(); |
| if (p.indexOf(".") > -1) { |
| p = p.split("."); |
| while (p.length > 1) { |
| var pr = p.shift(); |
| o[pr] = {}; |
| o = o[pr]; |
| } |
| p = p[0]; |
| } |
| var type = meta[i].getType(); |
| if (type == String) { |
| o[p] = data; |
| } else { |
| if (data) { |
| o[p] = new type(data); |
| } else { |
| o[p] = new type(); |
| } |
| } |
| } |
| return obj; |
| }; |
| var arr = []; |
| for (var i = 0; i < rows.length; i++) { |
| var o = ctor(rows[i]); |
| if (fnMod) { |
| fnMod(o, rows[i]); |
| } |
| arr.push(o); |
| } |
| return arr; |
| }, onSetData:function () { |
| }, onClearData:function () { |
| }, onAddData:function (obj) { |
| }, onAddDataRange:function (arr) { |
| }, onRemoveData:function (obj) { |
| }, onRemoveDataRange:function (arr) { |
| }, onUpdateField:function (obj, field, val) { |
| }}); |
| |