﻿/*
Author: Gareth Brown 
WWW: www.evolution-internet.com
*/

var elementOptions = []
var elements = null;
var noNodeMessage = null;
var pleaseSelectMessage = null;

function initMultiSelect(options) {
    
    elements = options.elements;
    noNodeMessage = options.noNodeMessage || 'No options available';
    pleaseSelectMessage = options.pleaseSelectMessage || '<< Please Select';
    
    for (var i = 0;i < elements.length; i++) {
        var element = $(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 = $(elements[i+1]).id;
            element.addEvent('change', changeMultiSelect); 
        }
        
        if (i > 0) {
            removeOptions(element);
            addOption(element, pleaseSelectMessage);
        }
    }   
    
    var firstElement = $(elements[0]);    
    var secondElement = $(elements[1]);    
    loadSelection(secondElement, firstElement.options[0].className); 
}

function loadSelection(element, className) {     
    removeAllOptions(element);
    loadOptions(element, className) 
}

function changeMultiSelect() {
    var element = $(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 = $(element.nextId);              
        if (nextElement != null && nextElement != 'undefined') {
            
            loadNext(nextElement, className + "#1");
        }
    }
}

function loadOptions(element, className) {    
    var pattern = new RegExp("^" + className + "#\d*[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) {   
    element.empty();
}

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 = $(elements[i]);
        if (!remove && element.id == currentElement.id) {
            remove = true;
            removeOptions(element);
        }else if (remove) {
            removeOptions(element);
            addOption(element, pleaseSelectMessage);
        }    
    }
}