| /* |
| 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.SortedList"); |
| dojo.require("dojo.collections.Collections"); |
| dojo.collections.SortedList = function (dictionary) { |
| var _this = this; |
| var items = {}; |
| var q = []; |
| var sorter = function (a, b) { |
| if (a.key > b.key) { |
| return 1; |
| } |
| if (a.key < b.key) { |
| return -1; |
| } |
| return 0; |
| }; |
| var build = function () { |
| q = []; |
| var e = _this.getIterator(); |
| while (!e.atEnd()) { |
| q.push(e.get()); |
| } |
| q.sort(sorter); |
| }; |
| var testObject = {}; |
| this.count = q.length; |
| this.add = function (k, v) { |
| if (!items[k]) { |
| items[k] = new dojo.collections.DictionaryEntry(k, v); |
| this.count = q.push(items[k]); |
| q.sort(sorter); |
| } |
| }; |
| this.clear = function () { |
| items = {}; |
| q = []; |
| this.count = q.length; |
| }; |
| this.clone = function () { |
| return new dojo.collections.SortedList(this); |
| }; |
| this.contains = this.containsKey = function (k) { |
| if (testObject[k]) { |
| return false; |
| } |
| return (items[k] != null); |
| }; |
| this.containsValue = function (o) { |
| var e = this.getIterator(); |
| while (!e.atEnd()) { |
| var item = e.get(); |
| if (item.value == o) { |
| return true; |
| } |
| } |
| return false; |
| }; |
| this.copyTo = function (arr, i) { |
| var e = this.getIterator(); |
| var idx = i; |
| while (!e.atEnd()) { |
| arr.splice(idx, 0, e.get()); |
| idx++; |
| } |
| }; |
| this.entry = function (k) { |
| return items[k]; |
| }; |
| this.forEach = function (fn, scope) { |
| var s = scope || dj_global; |
| if (Array.forEach) { |
| Array.forEach(q, fn, s); |
| } else { |
| for (var i = 0; i < q.length; i++) { |
| fn.call(s, q[i], i, q); |
| } |
| } |
| }; |
| this.getByIndex = function (i) { |
| return q[i].valueOf(); |
| }; |
| this.getIterator = function () { |
| return new dojo.collections.DictionaryIterator(items); |
| }; |
| this.getKey = function (i) { |
| return q[i].key; |
| }; |
| this.getKeyList = function () { |
| var arr = []; |
| var e = this.getIterator(); |
| while (!e.atEnd()) { |
| arr.push(e.get().key); |
| } |
| return arr; |
| }; |
| this.getValueList = function () { |
| var arr = []; |
| var e = this.getIterator(); |
| while (!e.atEnd()) { |
| arr.push(e.get().value); |
| } |
| return arr; |
| }; |
| this.indexOfKey = function (k) { |
| for (var i = 0; i < q.length; i++) { |
| if (q[i].key == k) { |
| return i; |
| } |
| } |
| return -1; |
| }; |
| this.indexOfValue = function (o) { |
| for (var i = 0; i < q.length; i++) { |
| if (q[i].value == o) { |
| return i; |
| } |
| } |
| return -1; |
| }; |
| this.item = function (k) { |
| if (k in items && !testObject[k]) { |
| return items[k].valueOf(); |
| } |
| return undefined; |
| }; |
| this.remove = function (k) { |
| delete items[k]; |
| build(); |
| this.count = q.length; |
| }; |
| this.removeAt = function (i) { |
| delete items[q[i].key]; |
| build(); |
| this.count = q.length; |
| }; |
| this.replace = function (k, v) { |
| if (!items[k]) { |
| this.add(k, v); |
| return false; |
| } else { |
| items[k] = new dojo.collections.DictionaryEntry(k, v); |
| q.sort(sorter); |
| return true; |
| } |
| }; |
| this.setByIndex = function (i, o) { |
| items[q[i].key].value = o; |
| build(); |
| this.count = q.length; |
| }; |
| if (dictionary) { |
| var e = dictionary.getIterator(); |
| while (!e.atEnd()) { |
| var item = e.get(); |
| q[q.length] = items[item.key] = new dojo.collections.DictionaryEntry(item.key, item.value); |
| } |
| q.sort(sorter); |
| } |
| }; |
| |