/****************************  CATEGORY NAVIGATION **************************/
NavigationConfig = Class.create();
NavigationConfig.prototype = {
    initialize: function(config){
        this.config     = config;
        this.settings   = $$('.category-select');
        this.state      = new Hash();

        this.settings.each(function(element){
            Event.observe(element, 'change', this.configure.bind(this))
        }.bind(this));

        // fill state
        this.settings.each(function(element){
            var levelId = element.id.replace(/[a-z]*/, '');
            if(levelId && this.config.levels[levelId]) {
                element.config = this.config.levels[levelId];
                element.levelId = levelId;
                this.state[levelId] = false;
            }
        }.bind(this))

        // Init settings dropdown
        var childSettings = [];
        for(var i=this.settings.length-1;i>=0;i--){
            var prevSetting = this.settings[i-1] ? this.settings[i-1] : false;
            var nextSetting = this.settings[i+1] ? this.settings[i+1] : false;            
            if(i==0){
                this.fillSelect(this.settings[i])
            }
            else {
                this.settings[i].disabled=true;
            }
            $(this.settings[i]).childSettings = childSettings.clone();
            $(this.settings[i]).prevSetting   = prevSetting;
            $(this.settings[i]).nextSetting   = nextSetting;       
            childSettings.push(this.settings[i]);
        }
    },

    configure: function(event){
        var element = Event.element(event);
        this.configureElement(element);
    },

    configureElement : function(element) {
        this.reloadOptionLabels(element);
        if(element.value){
            this.state[element.config.id] = element.value;
            if(element.nextSetting){
                element.nextSetting.disabled = false;
                this.fillSelect(element.nextSetting);
                this.resetChildren(element.nextSetting);                
            } else {
            	// we are the last options to choose
            	for(var i=0;i<element.config.length;i++){			
			if(element.config[i].id==element.value){
		    		document.location = element.config[i].url;
		    	}
		}  
            }
        }
        else {
            this.resetChildren(element);
        }
    },

    reloadOptionLabels: function(element){
        for(var i=0;i<element.options.length;i++){
            if(element.options[i].config){
                element.options[i].text = element.options[i].config.label;
            }
        }
    },

    resetChildren : function(element){
        if(element.childSettings) {
            for(var i=0;i<element.childSettings.length;i++){
                element.childSettings[i].selectedIndex = 0;
                element.childSettings[i].disabled = true;
                if(element.config){
                    this.state[element.config.id] = false;
                }
            }
        }
    },

    fillSelect: function(element){
        var levelId = element.id.replace(/[a-z]*/, '');
        var options = this.getLevelOptions(levelId);
        this.clearSelect(element);
        element.options[0] = new Option('-', '');

        var prevConfig = false;
        if(element.prevSetting){
            prevConfig = element.prevSetting.options[element.prevSetting.selectedIndex].config;
        }

        if(options) {
            var index = 1;
            for(var i=0;i<options.length;i++){              	
		include = true;
		if(prevConfig && prevConfig.id != options[i].topCategoryId){
		   include = false;		    
		} 
                
                if (include){            
                	element.options[index] = new Option(options[i].label, options[i].id);
               		element.options[index].config = options[i];
                	index++;          
                }
            }
        }
    },

    clearSelect: function(element){
        for(var i=element.options.length-1;i>=0;i--){
            element.remove(i);
        }
    },

    getLevelOptions: function(levelId){
        if(this.config.levels[levelId]){
            return this.config.levels[levelId];
        }
    }
}
