/*
    LightBox 1.0
    ===========================
    developed by Core Engine
    http://www.core-engine.com/
*/



var LightBox = new Class({
    
    Implements: Options,
    element: null,
    options: {
        'position': 'center',
        'background': '#000',
        'opacity': 0.75,
        'delay': 0,
        'duration': 300,
        'content': '',
        'autohide': true,
        'callback': null,
        'onRemove': null
    },
    
    
    
    initialize: function(options) {
        /*
        Initialize
        ------------------------------------
            options: arguments
        */
        
        if($('lightbox') || !('content' in options)) return;
        
        this.setOptions(options);
        
        // Lightbox
        var lightbox = new Element('div', {
            'id': 'lightbox',
            'styles': {'opacity': 0, 'top': 0}
        });
        lightbox.fx = new Fx.Tween(lightbox, {
            'duration': this.options['duration'],
            'link': 'cancel',
            'property': 'opacity'
        });
        lightbox.instance = this;
        lightbox.show = this.show.bind(this);
        lightbox.hide = this.hide.bind(this);
        this.element = lightbox;
        
        // Lightbox background
        lightbox.background = new Element('div', {
            'id': 'lightbox-background',
            'styles': {
                'opacity': this.options['opacity'],
                'background-color': this.options['background']
            }
        }).inject(lightbox);
        
        // Lightbox content
        lightbox.content = new Element('div', {
            'id': 'lightbox-content',
            'html': this.options['content']
        }).inject(lightbox);
        
        // set position
        lightbox.getElement('.lightbox').setStyle('position', 'relative');
        switch (options.position) {
            case 'top':
                lightbox.getElement('.lightbox').setStyle('top', 0);
                break;
            case 'center':
            default:
                lightbox.getElement('.lightbox').setStyle('top', window.getScrollTop());
                break;
        }
        
        // Lightbox basic animations
        lightbox.content.getElements('.button-add').each(function(button) {
            Oishii.AnimTween(button, 'color', '#387481', '#FFB807')
        });
        lightbox.content.getElements('.imageButton').each(Oishii.ImageButton);
        lightbox.content.getElements('.image-sub').each(Oishii.ImageSwitch);
        lightbox.content.getElements('.form-quantity').each(Oishii.FormQuantity);
        lightbox.content.getElements('.button-close').each(function(button) {
            button.addEvent('click', function() {
                lightbox.hide();
            });
        });
        
        if(this.options['delay'] > 0) {
            lightbox.content.setStyle('opacity', 0);
            lightbox.content.fx = new Fx.Tween(lightbox.content, {
                'duration': this.options['duration'],
                'link': 'cancel',
                'property': 'opacity'
            });
        };
        
        if(this.options['autohide'])
            lightbox.addEvent('click', this.__autohide);
        
        lightbox = lightbox.inject(document.body);
        lightbox.setStyles({
            'width': window.getScrollSize().x,
            'height': window.getScrollSize().y,
            'top': 0
        });
        lightbox.pin();
        
        if($type(this.options['callback']) == 'function') {
            this.options['callback'].attempt(lightbox, lightbox);
        };
        
        this.content = lightbox.getElement('.window');
        this.container = lightbox.getElement('.lightbox');
        this.wheel_fx = new Fx.Tween(this.container, {
            'link': 'cancel',
            'duration': 200,
            'transition': Fx.Transitions.Cubic.easeOut
        });
        this.wheel = function (event) {
            event.stop();
            
            var content_height = this.getHeight();
            var viewport_height = $(document.body).getSize().y;
            
            //&& content.getStyle('top') > (content_height - viewport_height)
            
            /*if (content_height > viewport_height) {    
                var content_top = this.container.getStyle('top').toInt();
                if ((event.wheel > 0 && (content_top - this.base_top) < (content_height - viewport_height)) || (event.wheel < 0 && (content_top - this.base_top) > (-(content_height - viewport_height))))
                    this.wheel_fx.start('top', content_top + (event.wheel * 20));
            }*/
            
            if (content_height > viewport_height) {
                var content_top = this.container.getStyle('top').toInt();
                var wheel_margin = this.base_top - (content_height - viewport_height);
                
                if((event.wheel < 0 && content_top >= wheel_margin) || (event.wheel > 0 && content_top <= this.base_top))
                    this.wheel_fx.start('top', content_top + (event.wheel * 60));
            }
        }.bindWithEvent(this);
        
        return lightbox;
    },
    
    getHeight: function() {
        var container_size = $(this.container).getComputedSize();
        var content_size = $(this.content).getComputedSize();
        return (container_size.totalHeight > content_size.totalHeight) ? container_size.totalHeight : content_size.totalHeight;
    },
    
    show: function(callback) {
        /*
        Show current lightbox
        ------------------------------------
            callback: callback function (optional)
        */
        
        var lightbox = $(this.element);
        this.base_top = $(this.container).getStyle('top').toInt();
        if(lightbox.getStyle('opacity') == 1) return;
        if(callback && $type(callback) == 'function') {
            callback(lightbox, this.__showend);
        }
        else
            this.__showend();
        lightbox.addEvent('mousewheel', this.wheel);
        
        lightbox.fx.start(1).chain(function() {
            if(this.options['delay'] > 0)
                lightbox.content.fx.start.delay(this.options['delay'], lightbox.content.fx, 1);
        }.bind(this));
    },
    
    
    
    hide: function(callback) {
        /*
        Hide current lightbox
        ------------------------------------
            callback: callback function (optional)
        */
        
        var cls = this;
        var lightbox = this.element;
        if(!lightbox) return;
        
        lightbox.removeEvent('mousewheel', this.wheel);
        
        lightbox.fx.start(0).chain(function() {
            if(callback && $type(callback) == 'function') {
                try { callback.bind(this, lightbox)(); }
                catch (ex) {
                    console.warn('e-lightbox::LightBox.hide:fx.callback: ' + ex);
                }
            }
            if ($defined(lightbox._end_event_check)) dispatcher.uncheck(lightbox._end_event_check)
            
            if($type(cls.options['onRemove']) == 'function')
                cls.options['onRemove'](lightbox, lightbox);
            
            lightbox.destroy();
        });
    },
    
    
    
    __showend: function() {
        var fx = this.wheel_fx;
        var content_top = $(this.content).getStyle('top').toInt();
        var content_height = this.getHeight();
        var viewport_height = $(document.body).getSize().y;
        if (content_height > viewport_height) {
            fx.start('top', this.base_top);
        }
        else {
            
            fx.start('top', this.base_top + (viewport_height/2) - (content_height / 2));
        }
        if ($defined(this.element._end_event_check)) {
            dispatcher.uncheck(this.element._end_event_check);
            delete this.element._end_event_check
        }
    },
    
    
    
    __autohide: function(event) {
        /*
        Autohide animation
        ------------------------------------
            event: mouse click event
        */
        
        if(event.target.getParent && event.target.getParent() == $('lightbox'))
            $('lightbox').hide();
    }
    
});
