The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Net::SMS::MunduSMS;

use 5.008008;
use strict;
use warnings;
use WWW::Mechanize;

our $VERSION = '0.021';

sub new {
    my $class = shift;
    my %args  = @_;

    $class = ref $class || $class;

    my %params = %args;

    $params{sms} = [];
    $params{mech} = WWW::Mechanize->new( onerror => sub { } );
    $params{mech}->agent_alias('Windows IE 6');

    return bless \%params, $class;
}

sub _login {
    my $self = shift;

    $self->{mech}->get(q[http://www.mundusms.com/web/Login.aspx]);
    $self->{mech}->form_number(1);

    map { $_->value( $self->{username} ); } $self->{mech}->find_all_inputs(
        type       => 'text',
        name_regex => qr/user_login$/,
    );

    map { $_->value( $self->{password} ); } $self->{mech}->find_all_inputs(
        type       => 'password',
        name_regex => qr/user_pass$/,
    );

    $self->{mech}->submit_form(
        fields => {
            '__EVENTARGUMENT'                                    => '',
            '__EVENTTARGET'                                      => '',
            '__LASTFOCUS'                                        => '',
            'ctl00$ContentPlaceHolderMasterLogin$button_login.x' => 10,
            'ctl00$ContentPlaceHolderMasterLogin$button_login.y' => 14,
            'ctl00$dropCulture'                                  => 1
        }
    );

    return ( $self->{mech}->uri =~ /UserHome.aspx$/ ) ? 1 : 0;

    return 0 unless ( $self->{mech}->find_link( url_regex => qr/sendsms.aspx/i ) && $self->{mech}->follow_link( url_regex => qr/sendsms.aspx/i ) );
}

sub add_sms {
    my $self = shift;
    my %args = @_;

    push( @{ $self->{sms} }, \%args );

    return 1;
}

sub send_sms {
    my $self = shift;

    $self->{logged_in} = $self->_login unless ( $self->{logged_in} );

    while ( my $sms = pop( @{ $self->{sms} } ) ) {
        $self->{mech}->follow_link( url_regex => qr/sendsms.aspx/i ) unless ( $self->{mech}->uri =~ /sendsms.aspx/i );

        $self->{mech}->form_number(1);

        map { $_->value( $sms->{to} ); } $self->{mech}->find_all_inputs(
            type       => 'textarea',
            name_regex => qr/mobileno$/,
        );

        map { $_->value( $sms->{message} ); } $self->{mech}->find_all_inputs(
            type       => 'textarea',
            name_regex => qr/msg$/,
        );

        my $len = sprintf( '%d characters, %d SMS', length( $sms->{message} ), ( int( length( $sms->{message} ) ) / 160 ) + 1 );

        $self->{mech}->submit_form(
            fields => {
                '__EVENTARGUMENT'                                     => '',
                '__EVENTTARGET'                                       => '',
                '__LASTFOCUS'                                         => '',
                'ctl00$ContentPlaceHolderContent$button_submit_sms.x' => 15,
                'ctl00$ContentPlaceHolderContent$button_submit_sms.y' => 6,
                'ctl00$ContentPlaceHolderContent$InfoCharCounter'     => $len,
                'ctl00$ContentPlaceHolderContent$hiddenCharCount'     => $len,
                'ctl00$ContentPlaceHolderContent$Hiddenselected'      => 0,
                'ctl00$ContentPlaceHolderContent$HiddenUnicode'       => 0,
                'ctl00$ContentPlaceHolderContent$DropDown_groups'     => 0,
                'ctl00$ContentPlaceHolderContent$Cal_to_ClientStat'   => '',
                'ctl00$ContentPlaceHolderContent$HiddenScheduled_id'  => '',
                'ctl00$ContentPlaceHolderContent$Hidden_date'         => '',
                'ctl00$ContentPlaceHolderContent$Hidden_time'         => '',
                'ctl00$ContentPlaceHolderContent$Drop_repeat'         => '',
                'ctl00$ContentPlaceHolderContent$hidden_charcount'    => length( $sms->{message} ),
                'ctl00$ContentPlaceHolderContent$txt_date'            => '',
                'ctl00$ContentPlaceHolderContent$txt_time'            => '',
                'hiddenInputToUpdateATBuffer_CommonToolkitScripts'    => 0
            }
        );
    }

    return 1;
}

1;

__END__

=head1 NAME

Net::SMS::MunduSMS - Perl interface for sending SMS using the mundusms.com service.

=head1 VERSION

Version 0.021

=head1 SYNOPSIS

  use Net::SMS::MunduSMS;
  my $m = Net::SMS::MunduSMS->new(username => '919988445566' ,password => 'passme' );

  $m->add_sms(to => '+919866544992', message => 'hello');
  $m->send_sms;

=head1 DESCRIPTION

The Net::SMS::MunduSMS Perl module allows you to send SMS in your Perl code, using the paid service of mundusms.com

=head2 METHODS

=item new

Constructor, requires two named arguments namely the username & the password for the mundusms.com account.

=item add_sms

Add sms to the internal queue, it take two named arguments, to & message.

=item send_sms

Send the queued messages stored internally.

=head1 REQUIRES

L<WWW::Mechanize>

=head1 SEE ALSO

L<Net::SMS::WAY2SMS>

=head1 AUTHOR

S Pradeep, E<lt>spradeep@cpan.orgE<gt>

=head1 BUGS

Please report any bugs or feature requests to C<bug-net-sms-mundusms at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Net-SMS-MunduSMS>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SOURCE

Git repository at http://github.com/spradeep/Perl-Net-SMS-MunduSms

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Net::SMS::MunduSMS

You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Net-SMS-MunduSMS>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Net-SMS-MunduSMS>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Net-SMS-MunduSMS>

=item * Search CPAN

L<http://search.cpan.org/dist/Net-SMS-MunduSMS/>

=back

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2010 by S Pradeep

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.

=cut