/*
---------------------------------------------------------------------------------------------------
    Extra Init
---------------------------------------------------------------------------------------------------
*/
var ExtraInit = new Class({
	Implements: [Options,Events],
    wrapper: null,
    bookmarkItemWidth: null,
    initialize: function(options) {
        this.wrapper = $('wrapper');
        var bookmarkItem = $(document.body).getElement('.bookmark-item');
        if (bookmarkItem) {
            this.bookmarkItemWidth = bookmarkItem.getSize().x + bookmarkItem.getStyle('margin-left').toInt() + bookmarkItem.getStyle('margin-right').toInt();
        }
        window.addEvent('resize', function() {
            this.resize.apply(this);
        }.bind(this));
        this.resize.apply(this);
    },
    
    resize: function() {
        if (this.bookmarkItemWidth) {
            var col = Math.floor(window.getSize().x / this.bookmarkItemWidth) || 1;
            this.wrapper.setStyle('width', this.bookmarkItemWidth * col);
        }
    }
});

/*
---------------------------------------------------------------------------------------------------
    Extra Label
---------------------------------------------------------------------------------------------------
*/
var ExtraLabel = new Class({
	Implements: [Options,Events],
    initialize: function(options) {
        $$('#tag-list label').each(function(label) {
            var id = label.get('for');
            var input = $(id);
            label.addEvent('click', function(event) {
                event.stop();
                if (input && input.get('type') == 'checkbox') {
                    if (input.get('checked')) {
                        input.set('checked', false)
                        label.removeClass('checked');
                    } else {
                        input.set('checked', true)
                        label.addClass('checked');
                    }
                    
                }
            });
            if (input.get('checked')) {
                label.addClass('checked');
            }
        });
    }
});

/*
---------------------------------------------------------------------------------------------------
    Extra Detail
---------------------------------------------------------------------------------------------------
*/
var ExtraDetail = new Class({
	Implements: [Options,Events],
    sidebar: null,
    initialize: function(options) {
        this.sidebar = new ExtraSidebar();
    },
    
    run: function() {
        
        $$('.more-info').each(function(element) {
            var url = element.getElement('a').get('href');
            
            if (element.retrieve('clickEvent') == null) {
                element.store('clickEvent', function(event) {
                    event.stop();
                    if (element.hasClass('ajax-loading') == false) {
                        var request = new Request({
                            method: 'get',
                            url: url,
                            onRequest: function() {
                                element.addClass('ajax-loading');
                            }.bind(this),
                            onSuccess: function(text, xml) {
                                element.removeClass('ajax-loading');
                                this.sidebar.setInner(text, 'ajax-for-detail');
                            }.bind(this),
                            onFailure: function(xhr) {
                                if (element) {
                                    element.set('html', 'error');
                                }
                            }
                        });
                        request.send('ajax=1');
                    }
                }.bind(this));
                element.addEvent('click', element.retrieve('clickEvent'));
            }
        }.bind(this));
    
    }
});

/*
---------------------------------------------------------------------------------------------------
    Extra Sidebar
---------------------------------------------------------------------------------------------------
*/
var ExtraSidebar = new Class({
	Implements: [Options,Events],
    content: null,
    sidebar: null,
    defaultTop: 0,
    initialize: function(options) {
        this.content = $('content');
        
        if (this.content) {
            window.addEvent('scroll', function() { 
                this.adjust.apply(this)
            }.bind(this));
            
            if ($('sidebar') == null) {
                this.sidebar = new Element('div', { 'id': 'sidebar' }).inject(this.content, 'before');
                this.defaultTop = this.sidebar.getCoordinates().top;
                this.sidebar.setStyle('display', 'none');
            }
        }
    },
    
    setInner: function(text, widgetID) {
        if ($(widgetID) == null) {
            new Element('div', { styles: { 'position': 'relative' }, 'id': widgetID, 'class': 'widget' }).inject(this.sidebar);
        }
        
        var top = window.getScrollTop() - this.defaultTop;
        if (top < 0) { top = 0; }
        this.content.setStyles({
            'margin-left': 300
        });
        this.sidebar.setStyles({
            position: 'absolute',
            left: 0,
            width: 280,
            display:'block',
            'margin-top': top,
            'margin-left': 10
        });
        
        var closeWidget = new Element('div', { 
            'class': 'close-widget',
            events: {
                'click': function(){
                    this.close.apply(this, [widgetID]);
                }.bind(this)
            }
        });
        
        $(widgetID).set('html', text);
        closeWidget.inject($(widgetID), 'top');
    },
    
    adjust: function() {
        if (this.sidebar == null) {
            return;
        }
        var sidebarTop = this.sidebar.getCoordinates().top;
        var sidebarBottom = this.sidebar.getCoordinates().bottom;
        var top = window.getScrollTop();
        var bottom = top + window.getHeight();
        
        if (top - sidebarTop < 0 || top > sidebarBottom) {
            var posTop = top - this.defaultTop;
            if (posTop < 0) { posTop = 0; }
            this.sidebar.setStyle('margin-top', posTop);
        }
    },
    
    close: function(widgetID) {
        $(widgetID).destroy();
        if (!this.sidebar.getLast()) {
            this.sidebar.setStyle('display', 'none');
            this.content.setStyle('margin-left', 0);
        }
    }
    
});

/*
---------------------------------------------------------------------------------------------------
    Exita Switch Menu
---------------------------------------------------------------------------------------------------
*/
var ExtraSwitchMenu = new Class({
	Implements: [Options,Events],
    initialize: function() {
        $$('.switch').each(function(toggle) {
            toggle.setStyle('cursor', 'pointer');
            toggle.addClass('switch-closed');
        
            var toggleId = toggle.get('id');
            var menu = $('menu-' + toggleId)
        
            if (menu) {
                toggle.addEvent('click', function(event) {
                    if (menu.getStyle('display') == 'none') {
                        toggle.removeClass('switch-closed');
                        toggle.addClass('switch-opened');
                        menu.setStyle('top', toggle.getTop() + toggle.getCoordinates().height);
                        if (menu.getStyle('width') != '100%') {
                            menu.setStyle('left', toggle.getCoordinates().left);
                            menu.setStyle('width', toggle.getCoordinates().width - menu.getStyle('border-left-width').toInt() - menu.getStyle('border-right-width').toInt());
                        }
                        menu.setStyle('display', '');
                    } else {
                        toggle.removeClass('switch-opened');
                        toggle.addClass('switch-closed');
                        menu.setStyle('display', 'none');
                    }
                
                });
                menu.setStyles({
                    position: 'absolute',
                    display: 'none',
                    'z-index': 9998
                });
            }
        }.bind(this));
    }
});


