The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package HTML::JQuery::Data;

$HTML::JQuery::Data::JQuery = [];
$HTML::JQuery::Data::Inline = [];
$HTML::JQuery::Data::Keystrokes = 0;
my $CLASS = __PACKAGE__;

sub jquery_add {
    my ($class, $add) = @_;
    if ($HTML::JQuery::Inline == 1) { push @{$HTML::JQuery::Data::Inline}, "$add\n"; }
    else { push @{$HTML::JQuery::Data::JQuery}, "$add\n"; }
}

sub jquery_onclick {
    my ($self, $name) = @_;
    return "\$('$name').click(function() {";
}

sub jquery_end {
    return "});";
}

sub jquery_fade {
    my $self = shift;
    my $type = shift;
    my ($sel, $duration, $after) = @_;

    $sel = "\$('$sel')";
    $sel = '$(this)'  
        if $sel eq "\$('this')";
    $duration = $duration ? $duration : 'undefined';
    $after = $after ? $after : 'undefined';
    $CLASS->jquery_add( "$sel.fade$type($duration, function() { $after });");
}

sub jquery_slidetoggle {
    my $self = shift;
    my ($sel, $duration, $after) = @_;
    $sel = "\$('$sel')";
    $sel = '$(this)'  
        if $sel eq "\$('this')";
    $duration = $duration ? "\"$duration\"" : 'undefined';
    $after = $after ? $after : 'undefined';
    $CLASS->jquery_add( "$sel.slideToggle($duration, function() { $after });");
}

sub jquery_keystrokes {
    my $self = shift;
    my ($sel, $args) = @_;

    if (! exists $args->{keys}) {
        $CLASS->js_alert("Please don't forget to include 'keys' in keystrokes.");
        return ;
    }
    $HTML::JQuery::Data::Keystrokes++;
    #my $keys = join q{, }, $args->{keys};
    my $keys;
    map { $keys .= qq{'$_',} } @{$args->{keys}};
    my $bind = "\$('$sel').bind('keystrokes.$HTML::JQuery::Data::Keystrokes', {\n";
    $bind   .= "keys : [ $keys ] },\n";
    $bind   .= "function(event) { $args->{event} } );";
    $CLASS->jquery_add($bind);
}

sub jquery_datepicker {
    my ($self, $sel, $args) = @_;
    my $p = "";
    foreach my $key (keys %$args) {
        next if $key eq 'auto';
        $args->{$key} = 'false'
            if $args->{$key} == 0;
        $args->{$key} = 'true'
            if $args->{$key} == 1;
        $p .= "$key : $args->{$key},\n";
    }
    if ($args->{auto}) { $CLASS->jquery_add( "\$('$sel').datepicker({dateFormat: 'dd/mm/yy', changeMonth: true, changeYear: true, $p});\n" ); }
    else { $CLASS->jquery_add( "\$('$sel').datepicker({ $p });\n" ); }
}

sub jquery_dialog {
    my $self = shift;
    my $sel = shift;
    my $args = shift;
    my $p = "";
    my $selector = $sel;
    foreach my $key (keys %$args) {
        unless ($key eq 'id' or $key eq 'body' or $key eq 'buttons' or $key eq 'modal' or $key eq 'autoOpen' or $key eq 'open' or $key eq 'close') {
            if ($args->{$key} eq 'true' or $args->{$key} eq 'false') {
                $p .= "$key : $args->{$key},\n";
            }
            else { $p .= "$key : '$args->{$key}',\n"; }
        }
        if ($key eq 'open') {
                $CLASS->jquery_add( "\$('$sel').dialog('open');");
                return;
        }
        if ($key eq 'close') {
                $CLASS->jquery_add( "\$('$sel').dialog('close');");
                return;
        }
        if ($key eq 'buttons') {
            $p .= "buttons : {\n";
            foreach my $button (keys %{$args->{buttons}}) {
                $p .= "$button : function() { $args->{buttons}->{$button} },\n"
            }
            $p .= "},\n";
        }
        if ($key eq 'modal') {
            if ($args->{$key} == 0) { $p .= "modal : false,\n"; }
            else { $p .= "modal : true,\n"; }
        }
        if ($key eq 'autoOpen') {
            if ($args->{$key} == 0) { $p .= "autoOpen : false,\n"; }
            else { $p .= "autoOpen : true,\n"; }
        }
        if ($key eq 'body') {
            my $title = $args->{title};
            my $body = $args->{body};
            $body =~ s/"/\\"/g;
            $body =~ s/\n//g;
            if (substr($sel, 0, 1) eq '.') { $sel = 'class="' . substr($sel, 1) . '"'; }
            elsif (substr($sel, 0, 1) eq '#') { $sel = 'id="' . substr($sel, 1) . '"'; }
            my $build_dialog = qq{
                var div = '<div $sel title="$title" style="display:none">$body</div>';
                \$(div).appendTo("body");
            };
            $CLASS->jquery_add($build_dialog);
        }
    }
    $CLASS->jquery_add("\$('$selector').dialog({$p});");
}

sub js_alert {
    my ($self, $message) = @_;
    $CLASS->jquery_add( "alert(\"$message\");");
}

sub js_callfunc {
    my ($self, $func) = @_;
    #$CLASS->jquery_add( "if (typeof $func == 'function') { $func(); }" );
    $CLASS->jquery_add( "$func();" );
}

sub jquery_rel {
    my ($self, $rel) = @_;

    $rel = "\$('$rel')";
    $rel = '$(this)'  
        if $rel eq "\$('this')";
    $CLASS->jquery_add( "$rel.attr('rel');\n" );
}

sub jquery_hide {
    my $self = shift;
    my ($sel, $duration, $after) = @_;
    $sel = "\$('$sel')";
    $sel = '$(this)'  
        if $sel eq "\$('this')";
    $duration = $duration ? "\"$duration\"" : 'undefined';
    $after = $after ? $after : 'undefined';
    $CLASS->jquery_add( "$sel.hide($duration, function() { $after });");
}

sub jquery_show {
    my $self = shift;
    my ($sel, $duration, $after) = @_;
    $sel = "\$('$sel')";
    $sel = '$(this)'  
        if $sel eq "\$('this')";
    $duration = $duration ? "\"$duration\"" : 'undefined';
    $after = $after ? $after : 'undefined';
    $CLASS->jquery_add( "$sel.show($duration, function() { $after });");
}

sub jquery_remove {
    my ($self, $sel) = @_;
    $sel = "\$('$sel')";
    $sel = '$(this)'  
        if $sel eq "\$('this')";
    $CLASS->jquery_add( "$sel.remove();" );
}

sub jquery_innerhtml {
    my ($self, $sel, $text) = @_;
    #my $append;
    #$append = 1 if substr($text, 0, 1) eq '+';
    #
    #if ($append) {
    #    $CLASS->jquery_add( "$sel.innerHtml
    $text =~ s/"/\\"/g;
    $text =~ s/\n//g;
    $CLASS->jquery_add( "\$('$sel').append(\"$text\");" );
}

1;