var IPython = (function (IPython) {

    var PrintWidget = function (selector) {
        this.selector = selector;
        if (this.selector !== undefined) {
            this.element = $(selector);
            this.style();
            this.bind_events();
        }
    };

    PrintWidget.prototype.style = function () {
        this.element.find('button#print_notebook').button();
        this.element.find('button#print_notebook').attr('title',
            "Open a new window with printer-friendly HTML of the Notebook." +
            " Note that this is incomplete, and may not produce perfect" +
            " printed output." +
            " Make sure to save before printing, to ensure the output is up to date."
            );
    };

    PrintWidget.prototype.bind_events = function () {
        var that = this;
        this.element.find('button#print_notebook').click(function () {
            that.print_notebook();
        });
    };

    PrintWidget.prototype.enable = function () {
        this.element.find('button#print_notebook').button('enable');
    };

    PrintWidget.prototype.disable = function () {
        this.element.find('button#print_notebook').button('disable');
    };

    PrintWidget.prototype.print_notebook = function () {
        var w = window.open('', '_blank', 'scrollbars=1,menubar=1');
        var html = '<html><head>' +
                   $('head').clone().html() +
                   '<style type="text/css">' +
                   '@media print { body { overflow: visible !important; } }' +
                   '.ui-widget-content { border: 0px; }' +
                   '</style>' +
                   '</head><body style="overflow: auto;">' +
                   $('#notebook').clone().html() +
                   '</body></html>';

        w.document.open();
        w.document.write(html);
        w.document.close();

        return false;
    };

    IPython.PrintWidget = PrintWidget;
    
    return IPython;

}(IPython));