
var elementOptions = []
var elements = null;
var noNodeMessage = null;
var pleaseSelectMessage = null;

function initMultiSelect(options) {
    if(!document.getElementById || !document.createElement || !options.elements) { 
        return;
    }
    
    elements = options.elements;
    noNodeMessage = options.noNodeMessage || '           ';
    pleaseSelectMessage = options.pleaseSelectMessage || '<< Please Select';
    
    for (var i = 0;i < elements.length; i++) {
        var element = document.getElementById(elements[i]);
        
        var options = element.cloneNode(true).options;
        
        for (var j = 0; j < options.length; j++) {
            elementOptions[elementOptions.length] = options[j];
        }
                               
        if (i < elements.length-1) {
            element.nextId = document.getElementById(elements[i+1]).id;
            element.onchange = changeMultiSelect;  
        }
        
        if (i > 0) {
            removeOptions(element);
            addOption(element, pleaseSelectMessage);
        }
    }   
    
    var firstElement = document.getElementById(elements[0]);    
    var secondElement = document.getElementById(elements[1]);    
    loadSelection(secondElement, firstElement.options[0].className); 
}

function loadSelection(element, className) {     
    removeAllOptions(element);    
    loadOptions(element, className) 
}

function changeMultiSelect() {
    var element = document.getElementById(this.nextId);    
    var className = this.options[this.selectedIndex].className;        
    loadSelection(element, className)         
}

function loadNext(element, className) {
    removeOptions(element)
    loadOptions(element, className);         
}

function loadNextIfRequired(element, className)
{
    if (element.options == 'undefined' || element.options.length == 0){
        addOption(element, noNodeMessage);
    } else if (element.nextId != 'undefined' && element.nextId != null) {
        var nextElement = document.getElementById(element.nextId);              
        if (nextElement != null && nextElement != 'undefined') 
            loadNext(nextElement, className + ".1");
    }
}

function loadOptions(element, className) {    
    var pattern = new RegExp("^" + className + ".\d*[0-9][0-9]$");        
    for (var i = 0; i < elementOptions.length; i++) {   
        if (elementOptions[i].className.match(pattern)) {
            element.appendChild(elementOptions[i].cloneNode(true));
        }
    }
    
    loadNextIfRequired(element, className);
}

function removeOptions(element) {
    while(element.options.length){
        element.remove(0);
    }
}

function addOption(element, text) {
    element.options[0] = new Option(text, '-1');
    element.options[0].className = '0';
}

function removeAllOptions(currentElement) {
    var remove;
    for (var i = 0;i < elements.length; i++) { 
        var element = document.getElementById(elements[i]);
        if (!remove && element.id == currentElement.id) {
            remove = true;
            removeOptions(element);
        }else if (remove) {
            removeOptions(element);
            addOption(element, pleaseSelectMessage);
        }    
    }
}
