1 /* 2 * JBoss, Home of Professional Open Source 3 * Copyright 2013, Red Hat, Inc. and individual contributors 4 * by the @authors tag. See the copyright.txt in the distribution for a 5 * full listing of individual contributors. 6 * 7 * This is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU Lesser General Public License as 9 * published by the Free Software Foundation; either version 2.1 of 10 * the License, or (at your option) any later version. 11 * 12 * This software is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this software; if not, write to the Free 19 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 20 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 21 */ 22 23 // RichFaces.utils 24 // RichFaces.utils.cache 25 (function ($, rf) { 26 rf.utils = rf.utils || {}; 27 28 rf.utils.Cache = function (key, items, values, useCache) { 29 this.key = key.toLowerCase(); 30 this.cache = {}; 31 this.cache[this.key] = items || []; 32 this.originalValues = typeof values == "function" ? values(items) : values || this.cache[this.key]; 33 this.values = processValues(this.originalValues); 34 this.useCache = useCache || checkValuesPrefix.call(this); 35 }; 36 37 var processValues = function (values) { 38 var processedValues = []; 39 for (var i = 0; i < values.length; i++) { 40 processedValues.push(values[i].toLowerCase()); 41 } 42 return processedValues; 43 }; 44 45 var checkValuesPrefix = function () { 46 var result = true; 47 for (var i = 0; i < this.values.length; i++) { 48 if (this.values[i].indexOf(this.key) != 0) { 49 result = false; 50 break; 51 } 52 } 53 return result; 54 }; 55 56 var getItems = function (key, filterFunction) { 57 key = key.toLowerCase(); 58 var newCache = []; 59 60 if (key.length < this.key.length) { 61 return newCache; 62 } 63 64 if (this.cache[key]) { 65 newCache = this.cache[key]; 66 } else { 67 var useCustomFilterFunction = typeof filterFunction == "function"; 68 var itemsCache = this.cache[this.key]; 69 for (var i = 0; i < this.values.length; i++) { 70 var value = this.values[i]; 71 if (useCustomFilterFunction && filterFunction(key, value)) { 72 newCache.push(itemsCache[i]); 73 } else { 74 var p = value.indexOf(key); 75 if (p == 0) { 76 newCache.push(itemsCache[i]); 77 } 78 } 79 } 80 81 if ((!this.lastKey || key.indexOf(this.lastKey) != 0) && newCache.length > 0) { 82 this.cache[key] = newCache; 83 if (newCache.length == 1) { 84 this.lastKey = key; 85 } 86 } 87 } 88 89 return newCache; 90 }; 91 92 var getItemValue = function (item) { 93 return this.originalValues[this.cache[this.key].index(item)]; 94 }; 95 96 var isCached = function (key) { 97 key = key.toLowerCase(); 98 return this.cache[key] || this.useCache && key.indexOf(this.key) == 0; 99 }; 100 101 $.extend(rf.utils.Cache.prototype, (function () { 102 return { 103 getItems: getItems, 104 getItemValue: getItemValue, 105 isCached: isCached 106 }; 107 })()); 108 109 })(RichFaces.jQuery, RichFaces);