var group_names = new Array();
var group_options = new Array();
var ordered_combinations = new Array();
$(document).ready(function()
{
   
    $('div#attributes select').each(function() {
        group_names.push($(this).attr('id'));
    });    
    
    $.each(group_names, function(key, group_name)
    {         
        var group = {};
        group.name = group_name;
        group.values = new Array();        
        $('#'+group_name+' option').each(function() {  
            var option = {};
            option.name = $(this).attr("text");
            option.id = $(this).val();            
            group.values.push(option);                
        });     
        group_options.push(group);
    });
    order_combinations();      
    
    $('div#attributes select').change(function(){
              
        var index = group_names.indexOf($(this).attr('id'));
        var selected = new Array();
        $.each(group_names, function(key, group_name)
        {        
            if(key <= index)
            {
                selected.push(get_selected(group_names[key]));  
            }    
        });    
         
        var valid_combinations = get_valid_selections(selected[0], 0);
        
        $.each(group_names, function(key, group_name)
        {        
            if(key > index)
            {
                delete_options(group_name);    
            }          
        
        });
        var show_combinations = get_combinations_for_selected(selected, index, valid_combinations);       
        show_combinations.sort(compareCombination);       
        if(index + 1 < group_names.length)
        {
            var next_values = new Array();
        
            for(var i = 0; i < show_combinations.length; i++)
            {            
                next_values.push(show_combinations[i].combination[index+1]);           
            }        
            next_values = next_values.unique();    
        
            for(var j = 0; j < next_values.length; j++)
            {
                add_option_select(group_names[index+1], index+1, next_values[j]);
            }
        
            $('#'+group_names[index+1]).change();             
        }        
       
        findCombination();
        
    });
   
    $('#'+group_names[0]).change();
    findCombination(true);  
});
function compareCombination(obj1, obj2)
{
    if (obj1.price < obj2.price)
        return -1;
    if (obj1.price >  obj2.price)
        return 1;
    return 0;

}
function hideUnavailable()
{
    
    
}
function set_avalaible_option(valid_combination)
{     
    for(var i = 1; i < valid_combination.length; i++)
    {
        add_option_select(group_names[i], i, valid_combination[i]) ;
    }
}
function add_option_select(group_name,index,id)
{
    var group = group_options[index];   
       
    for(var i = 0; i < group.values.length; i++)
    {
        if(group.values[i].id == id)
        {
            $('#'+group_name)  
            .append($("<option></option>")
                .attr("value",group.values[i].id)
                .text(group.values[i].name)); 
            break;
        }
    }       
}
function get_valid_selections(value, index)
{
    var valid_combinations = new Array();
    for (var c = 0 ; c < ordered_combinations.length;c++ ){  
        if(ordered_combinations[c].combination[index] == value)
        {            
            valid_combinations.push(ordered_combinations[c]);
        }        
    }
    return valid_combinations;
}
function get_combinations_for_selected(selected, index, valid_combinations)
{
    var combinations = new Array();
    for(var c = 0;c < valid_combinations.length; c++)
    {
        var valid = true;
        for(var i = 0;i <= index; i++)
        {            
            if(valid_combinations[c].combination[i] != selected[i])
            {
                valid = false;    
                break;
            }            
        }
        if(valid == true)
        {
            combinations.push(valid_combinations[c]);
        }
    }
    return combinations;
}
function get_selected(group_name)
{
    return $('#'+group_name).val();
}
function delete_options(group_name)
{
    $('#'+group_name+' option').remove();
}
function order_combinations()
{
    for (var combination = 0 ; combination < combinations.length;combination++ ){   
        ordered_combinations[combination] = {
            combination: new Array(), 
            price: combinations[combination]['price']
        };
        for(var group = 0;group < group_options.length;group++  )
        {
            for(var option = 0; option < group_options[group].values.length; option++  )
            {
                var temp_option = group_options[group].values[option].id;
                var temp_combination = combinations[combination]['idsAttributes'];                           
                var founded = false;
                for(var comb = 0; comb < temp_combination.length; comb++)
                {
                    if(temp_option == temp_combination[comb])
                    {                   
                        ordered_combinations[combination].combination.push(temp_combination[comb]);
                        founded = true;
                        break;
                    }   
                }
                if(founded == true)
                {
                    
                    break;                    
                }                
            }
        }
    }
}

function myIndexOf(array,v,n){
    n = (n==null)?0:n;
    var m = array.length;
    for(var i = n; i < m; i++)
        if(array[i] == v)
            return i;
    return -1;
}
[].unique || (Array.prototype.unique = function() {
    var a = [], i, l = this.length;
    for( i=0; i<l; i++ ) {
        if( a.indexOf( this[i], 0) < 0 ) {
            a.push( this[i] );
        }
    }
    return a;
});

