/*
*   Section Navigation
*   Generates a section navigation with toggle classes on hover
*
*   Requires: Trapeze jQuery distribution
*
*   Marcos Abreu - April 18, 2009
*/

$.namespace("trapeze.SlideNavigation");

trapeze.SlideNavigation = $.Class.extend({
    wrapper     : null,
    base_list   : null,
    active_list : null,
    settings : null,

    get_name_from_class : function(obj, prefix) { //TODO: use regexp
        var name = obj.attr('class');
        if (name.match(prefix) !== null) {
            name = name.substring(name.indexOf(prefix));
            name = name.substring(0, (name.indexOf(' ') > 0 ? name.indexOf(' ') : name.length));
            return name.replace(prefix, '');
        }
        return '';
    },

    set_list_level : function(obj, level) {
        obj.addClass(this.settings.level_prefix + level);
    },

    get_list_level : function(obj) {
        var name = this.get_name_from_class(obj, this.settings.level_prefix);
        if (!isNaN(name)) {
            return Number(name);
        }
        return -1
    },

    setup_levels : function() {
        this.set_list_level(this.base_list, 0);

        this.wrapper.find('.' + this.settings.slidelist_class + ' li').add(this.base_list.find('li')).bind('click', this.open_next.bind(this));
        this.wrapper.find('.' + this.settings.slidelist_class).hide();
    },

    open_next : function(evt) {
        var current_target = $(evt.currentTarget);
        var level = this.get_list_level(current_target.parent());

        if ((level >= 0) && (this.get_list_level(this.active_list) > level)) {
            this.close_next_levels(level);
        }

        //Main Level Callback
        if ((level === 0) && (typeof this.settings.show_mainlevel_callback == 'function')) {
                this.settings.show_mainlevel_callback(current_target);
        }

        //Callback
        if (typeof this.settings.show_callback == 'function') {
            this.settings.show_callback(current_target);
        }

        var class_sufix = current_target.find('a').text().toLowerCase().replace(/\s/g, '-').replace(/\.|\'/g, '').replace("é", "e");
        var next_target = this.wrapper.find('ul.'+this.settings.slidelist_prefix + class_sufix);

        if (next_target.size() > 0) {
            evt.preventDefault();
            this.set_list_level(next_target, (level + 1));

            if ((typeof this.settings.stick_beside_class !== null) && next_target.hasClass(this.settings.stick_beside_class)) {
                var pos_top = current_target.position().top;
                next_target.attr('style', 'margin-top:' + pos_top + 'px;'+next_target.attr('style'));
            }

            //Animage Callback
            if (typeof this.settings.on_animate_next == 'function') {
                this.settings.on_animate_next(next_target);
            }
            next_target.animate({width:'show'},this.settings.open_speed);
            current_target.addClass(this.settings.item_call_prefix + class_sufix);
            this.active_list = next_target;
        }
    },

    close_next_levels : function(level) {
        if (this.get_list_level(this.active_list) > level) {
            this.active_list.find('li.' + this.settings.active_item_class)
                .removeClass(this.settings.active_item_class);

            this.active_list.animate({width:'hide'},this.settings.close_speed);


            //Mainlevel Callback
            if ((level === 0) && (typeof this.settings.hide_mainlevel_callback == 'function')) {
                    this.settings.hide_mainlevel_callback(this.active_list);
            }

            //Callback
            if (typeof this.settings.hide_callback == 'function') {
                    this.settings.hide_callback(this.active_list);
            }

            this.active_list = this.wrapper.find('ul li[class*="'+ this.settings.item_call_prefix +  this.get_name_from_class(this.active_list, this.settings.slidelist_prefix) +  '"]').parents('ul');

            this.close_next_levels(level);
        }
    },

    reset : function() {
        this.close_next_levels(0);
        this.base_list.find('li.'+this.settings.active_item_class).removeClass(this.settings.active_item_class);
    },

    init : function (params) {
        var default_params = {
            level_prefix        : 'slidelist-level-',
            slidelist_prefix    : 'slidelist-of-',

            item_call_prefix    : 'slideitem-for-',
            slidelist_class     : 'slidelist',
            active_item_class   : 'active',
            stick_beside_class  : null, //usually the last list level so the column opens with its top aligned to the item clicked;

            open_speed          : 'normal',
            close_speed         : 'fast',

            hide_callback           : null,
            show_callback           : null,
            show_mainlevel_callback : null,
            on_animate_next         : null,
            hide_mainlevel_callback : null, //TODO: Implement it

            selector            : null
        };
        this.settings = $.extend({}, default_params, params);
        this.base_list = $(this.settings.selector);
        this.active_list = this.base_list;
        this.wrapper = this.base_list.parent();

        this.setup_levels();
    }
});