The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
=head1 NAME

XAO::DO::Web::Styler - Simple styler object

=head1 SYNOPSIS

Currently is only useful in XAO::Web site context.

=head1 DESCRIPTION

Styler allows to define style templates and then use them in the web
pages. It also includes formatting capabilities for various commonly
used values.

XXX - make real documentation!!

=cut

###############################################################################
package XAO::DO::Web::Styler;
use strict;
use XAO::Utils qw(:args fround);
use XAO::Objects;
use base XAO::Objects->load(objname => 'Web::Page');

###############################################################################

use vars qw($VERSION);
$VERSION=(0+sprintf('%u.%03u',(q$Id: Styler.pm,v 2.3 2007/07/10 18:38:44 am Exp $ =~ /\s(\d+)\.(\d+)\s/))) || die "Bad VERSION";

sub separate_thousands ($);

###############################################################################

sub display ($;%) {
    my $self=shift;
    my $args=get_args(\@_);

    ##
    # Special formatting for special fields.
    #
    # number => 1,234,456,789
    #
    my $template="<%NUMBER%>" if defined($args->{number});
    my $number=int($args->{number} || 0);
    $number=separate_thousands($args->{'format'} ? sprintf($args->{'format'},$number) : $number);

    ##
    # dollars => $1'234.78
    #
    $template="<%DOLLARS%>" if defined($args->{dollars}) || defined($args->{dollar});
    my $dollars=$args->{format}
                  ? sprintf($args->{format},$args->{dollars} || $args->{dollar} || 0)
                  : sprintf('%.2f',fround($args->{dollars} || $args->{dollar} || 0,100));
    $dollars='$' . separate_thousands($dollars);

    ##
    # real => 1'234.78
    #
    $template='<$REAL$>' if defined($args->{real});
    my $real=$args->{format}
             ? sprintf($args->{format},$args->{real} || 0)
             : sprintf("%.2f",$args->{real} || 0);
    $real=separate_thousands($real);         

    ##
    # Percents
    #
    my $percent=0;
    if(defined($args->{percent})) {
        $template='<$PERCENT$>';
        if(defined($args->{total})) {
            $percent=$args->{total} ? $args->{percent}/$args->{total} : 0;
        }
        else {
            $percent=$args->{percent};
        }
    }

  ##
  # Displaying what we've got and any additional arguments
  #
  my $path=$args->{style};
  my $text=$args->{text};
  if($path)
   { $path="/bits/styler/$path";
     $template=undef;
   }
  else
   { $template=$text unless $template;
     $path=undef;
   }
  $self->object->display($args,{
    path => $path,
    template => $template,
    TEXT => $text,
    NUMBER => $number,
    DOLLARS => $dollars,
    REAL => $real,
    PERCENT => sprintf($args->{format} || '%.2f%%', $percent*100),
  });
}

############################## PRIVATE ########################################

sub separate_thousands ($) {
    my $value=shift;

    return $value unless $value =~ /^(\d+)(\.\d+)?$/;

    my ($i,$f)=($1,$2);

    1 while $i=~s/(\d)(\d{3}($|,))/$1,$2/;

    $i.=$f if defined $f;

    return $i;
}

###############################################################################
1;
__END__

=head1 METHODS

No publicly available methods except overriden display().

=head1 EXPORTS

Nothing.

=head1 AUTHOR

Copyright (c) 2005 Andrew Maltsev

Copyright (c) 2001-2004 Andrew Maltsev, XAO Inc.

<am@ejelta.com> -- http://ejelta.com/xao/

=head1 SEE ALSO

Recommended reading:
L<XAO::Web>,
L<XAO::DO::Web::Page>.

=cut