/* jshint phantom:true, devel:true */

/* Usage: phantomjs screenshot.js in.html out.png */



var sys = require('system'),

    page = new WebPage();

page.viewportSize = {

    width: 800,

    height: 600

};



page.open(sys.args[1], function(status){

    if (status !== 'success'){

        console.log('Bad status: %s', status);

        phantom.exit(1);

    }

    window.setTimeout(function(){

        var box = page.evaluate(function(){

            var lefts, rights, tops, bottoms,

                padding = 10, // px

                selection, show;



            // Call setup method

            if (window.setup)

                window.setup();

            // Show all pickers, or only those marked for showing

            show = $('body').data('show');

            show = show ? $(show) : $('*');

            show

                .filter(function(){

                    return 'datepicker' in $(this).data();

                })

                .datepicker('show');



            // Get bounds of selected elements

            selection = $($('body').data('capture'));

            tops = selection.map(function(){

                return $(this).offset().top;

            }).toArray();

            lefts = selection.map(function(){

                return $(this).offset().left;

            }).toArray();

            bottoms = selection.map(function(){

                return $(this).offset().top + $(this).outerHeight();

            }).toArray();

            rights = selection.map(function(){

                return $(this).offset().left + $(this).outerWidth();

            }).toArray();



            // Convert bounds to single bounding box

            var b = {

                top: Math.min.apply(Math, tops),

                left: Math.min.apply(Math, lefts)

            };

            b.width = Math.max.apply(Math, rights) - b.left;

            b.height = Math.max.apply(Math, bottoms) - b.top;



            // Return bounding box

            return {

                top: Math.max(b.top - padding, 0),

                left: Math.max(b.left - padding, 0),

                width: b.width + 2 * padding,

                height: b.height + 2 * padding

            };

        });

        page.clipRect = box;

        page.render(sys.args[2]);

        phantom.exit();

    }, 1);

});

