114 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var SelectBox = {
 | 
						|
    cache: new Object(),
 | 
						|
    init: function(id) {
 | 
						|
        var box = document.getElementById(id);
 | 
						|
        var node;
 | 
						|
        SelectBox.cache[id] = new Array();
 | 
						|
        var cache = SelectBox.cache[id];
 | 
						|
        for (var i = 0; (node = box.options[i]); i++) {
 | 
						|
            cache.push({value: node.value, text: node.text, displayed: 1});
 | 
						|
        }
 | 
						|
    },
 | 
						|
    redisplay: function(id) {
 | 
						|
        // Repopulate HTML select box from cache
 | 
						|
        var box = document.getElementById(id);
 | 
						|
        box.options.length = 0; // clear all options
 | 
						|
        for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
 | 
						|
            var node = SelectBox.cache[id][i];
 | 
						|
            if (node.displayed) {
 | 
						|
                var new_option = new Option(node.text, node.value, false, false);
 | 
						|
                // Shows a tooltip when hovering over the option
 | 
						|
                new_option.setAttribute("title", node.text);
 | 
						|
                box.options[box.options.length] = new_option;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    },
 | 
						|
    filter: function(id, text) {
 | 
						|
        // Redisplay the HTML select box, displaying only the choices containing ALL
 | 
						|
        // the words in text. (It's an AND search.)
 | 
						|
        var tokens = text.toLowerCase().split(/\s+/);
 | 
						|
        var node, token;
 | 
						|
        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
 | 
						|
            node.displayed = 1;
 | 
						|
            for (var j = 0; (token = tokens[j]); j++) {
 | 
						|
                if (node.text.toLowerCase().indexOf(token) == -1) {
 | 
						|
                    node.displayed = 0;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        SelectBox.redisplay(id);
 | 
						|
    },
 | 
						|
    delete_from_cache: function(id, value) {
 | 
						|
        var node, delete_index = null;
 | 
						|
        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
 | 
						|
            if (node.value == value) {
 | 
						|
                delete_index = i;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        var j = SelectBox.cache[id].length - 1;
 | 
						|
        for (var i = delete_index; i < j; i++) {
 | 
						|
            SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
 | 
						|
        }
 | 
						|
        SelectBox.cache[id].length--;
 | 
						|
    },
 | 
						|
    add_to_cache: function(id, option) {
 | 
						|
        SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
 | 
						|
    },
 | 
						|
    cache_contains: function(id, value) {
 | 
						|
        // Check if an item is contained in the cache
 | 
						|
        var node;
 | 
						|
        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
 | 
						|
            if (node.value == value) {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    },
 | 
						|
    move: function(from, to) {
 | 
						|
        var from_box = document.getElementById(from);
 | 
						|
        var to_box = document.getElementById(to);
 | 
						|
        var option;
 | 
						|
        for (var i = 0; (option = from_box.options[i]); i++) {
 | 
						|
            if (option.selected && SelectBox.cache_contains(from, option.value)) {
 | 
						|
                SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
 | 
						|
                SelectBox.delete_from_cache(from, option.value);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        SelectBox.redisplay(from);
 | 
						|
        SelectBox.redisplay(to);
 | 
						|
    },
 | 
						|
    move_all: function(from, to) {
 | 
						|
        var from_box = document.getElementById(from);
 | 
						|
        var to_box = document.getElementById(to);
 | 
						|
        var option;
 | 
						|
        for (var i = 0; (option = from_box.options[i]); i++) {
 | 
						|
            if (SelectBox.cache_contains(from, option.value)) {
 | 
						|
                SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
 | 
						|
                SelectBox.delete_from_cache(from, option.value);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        SelectBox.redisplay(from);
 | 
						|
        SelectBox.redisplay(to);
 | 
						|
    },
 | 
						|
    sort: function(id) {
 | 
						|
        SelectBox.cache[id].sort( function(a, b) {
 | 
						|
            a = a.text.toLowerCase();
 | 
						|
            b = b.text.toLowerCase();
 | 
						|
            try {
 | 
						|
                if (a > b) return 1;
 | 
						|
                if (a < b) return -1;
 | 
						|
            }
 | 
						|
            catch (e) {
 | 
						|
                // silently fail on IE 'unknown' exception
 | 
						|
            }
 | 
						|
            return 0;
 | 
						|
        } );
 | 
						|
    },
 | 
						|
    select_all: function(id) {
 | 
						|
        var box = document.getElementById(id);
 | 
						|
        for (var i = 0; i < box.options.length; i++) {
 | 
						|
            box.options[i].selected = 'selected';
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |