SpontaneousCMS/spontaneous

View on GitHub
application/js/popover.js

Summary

Maintainability
C
7 hrs
Test Coverage
// console.log("Loading Popover...");


Spontaneous.Popover = (function($, S) {
    var dom = S.Dom;
    var __popover_id = 0;
    var Popover = new JS.Class({
        initialize: function(view) {
            this.id = (++__popover_id);
            this.view = view;
            this.view.set_manager(this);
            this.depth = 0;
        },
        open: function(event) {
            event.preventDefault();
            var view = this.view;
            var location = view.attach_to();
            var wrapper = dom.div('.pop-over');
            var handle = dom.div('.menuHandle');
            var header = dom.header();//.append(back_btn).append(title);
            var title = dom.h3().text(view.title());

            var view_wrapper = dom.div().css('width', view.width());
            view_wrapper.append(view.view());

            if (view.has_navigation) {
                var back_btn = dom.a('.button.back').append(dom.span('.pointer')).append(dom.span('.label').text('Back')).css('visibility', 'hidden');
                header.append(back_btn);
            }
            var target = event.currentTarget;
            this.set_position(target, wrapper, handle);

            header.append(title);

            if (view.close_text()) {
                var close_btn = dom.a('.button.close').text(view.close_text()).click(this.close.bind(this));
                header.append(close_btn);
            }
            wrapper.append(handle).append(header).append(view_wrapper);
            wrapper.hide();
            location.append(wrapper);

            var update_position = function(e) {
                this.set_position(target, wrapper, handle);
            }.bind(this);

            if (view.scroll) {
                view.scroll_element().bind('scroll.popover', update_position);
            }
            this.wrapper = wrapper;
            this.is_open = true;
            wrapper.fadeIn(200, this.after_open.bind(this));
        },

        set_position: function(target, wrapper, handle) {
            var view = this.view, o = view.position_from_event(target), handle_width = 30, offset = 10, left = -30, top = 18;

            if (view.align === 'right') {
                handle.css('left', (view.width() - (offset + handle_width)) + 'px');
                left = -(view.width() - (offset + handle_width/2) + 8);
            }
            wrapper.css({top:(o.top), left:(o.left + left)});
        },

        after_open: function() {
            this.view.after_open();
        },
        close: function() {
            var view = this.view;
            if (view.scroll) {
                view.scroll_element().unbind('scroll.popover');
            }
            Popover.close();
            return false;
        },
        do_close: function() {
            var view = this.view;
            // do actual element removal here
            view.before_close();
            view.do_close();
            view.after_close();
            this.is_open = false;
            this.wrapper.fadeOut(100, function() {
                $(this).remove();
            });
        }
    });
    Popover.extend({
        _instance: false,
        div: function() {
            if (!this._div) { this._div = $('#content-outer'); }
            return this._div;
        },
        open: function(event, view) {
            this.close();
            this._instance = new Popover(view);
            this._instance.open(event);
            return this._instance;
        },
        close: function() {
            if (this._instance) {
                this._instance.do_close();
                this._instance = null;
            }
        }
    });
    $(document).bind('keydown.popover', function(event) {
        if (event.keyCode === 27) {
            Popover.close();
        }
    });
    return Popover;
})(jQuery, Spontaneous);