/* 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, 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);

});