﻿AttachEvent(window, "onload", InitTextBoxList);

var filterList;
var txtFilter

var filterTimer;
var dataSource;
var previousFilter;

/*
 * Initialisation
 */
function InitTextBoxList() {
    filterList = FindElement("select", "filterList");
    txtFilter = document.getElementById("txtFilter");
    
    if (filterList == null || txtFilter == null) {
        return;
    }
    
    // Copy the option elements from the data source so we can filter them later
    dataSource = new Array();
    for (var i = 0; i < filterList.options.length; i++) {
        dataSource.push(filterList.options[i]);
    }
}

/*
 * Invoked when the user changes their filter criteria
 */
function OnFilterChanged(selectionChanged) {
    isSelectionChanged = selectionChanged;
    if (filterTimer) {
        clearTimeout(filterTimer);
    }
    
    filterTimer = setTimeout(ApplyTextBoxFilter, selectionChanged ? 1000 : 300);
}

/*
 * Applies the filter
 */
function ApplyTextBoxFilter() {
    clearTimeout(filterTimer);
    filterTimer = null;
    
    // Don't filter if the text wasn't changed and if the selection hasn't changed
    if (txtFilter.value == previousFilter && !isSelectionChanged) {
        return;
    }
    
    // Clear the options from the list
    for (var i = filterList.options.length - 1; i >= 0; i--) {
        filterList.remove(i);
    }

    // Create the Regex to do the filtering
    var filter = txtFilter.value != null && txtFilter.value != ""
        ? new RegExp(txtFilter.value, "i") 
        : "";

    // Now re-add the selected and matching options    
    for (var i = 0; i < dataSource.length; i++) {
        if (!txtFilter || dataSource[i].selected || dataSource[i].text.match(filter) != null) {
            filterList.options[filterList.options.length] = dataSource[i];
        }
    }
    
    // Save the current filter
    previousFilter = txtFilter.value;
}

/* 
 * Get a comma seperated list of selected items
 */
function GetSelectedItems() {
    var itemList = "";
    for (var i = 0; i < filterList.options.length; i++) {
        if (!filterList.options[i].selected) {
            continue;
        }
        
        itemList += itemList.length > 0
            ? "," + filterList.options[i].value
            : filterList.options[i].value;
    }
    
    return itemList;
}
