The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Railsish::ViewHelpers;
our $VERSION = '0.21';

use strict;
use warnings;
use Railsish::CoreHelpers;
use HTML::Entities;

use Exporter::Lite;
our @EXPORT = qw(render_stickies stylesheet_link_tag javascript_include_tag link_to);

sub stylesheet_link_tag {
    my (@css) = @_;

    my $out = "";
    for my $css (@css) {
	my $uri;
	if ($css =~ /^http:/) {
	    $uri = $css;
	}
	else {
            $uri = $css;
            $uri .= ".css" if $css !~ /\./;
            $uri = "/stylesheets/$uri" if $css !~ /^\//;
	}

	if ($uri) {
            $out .= qq{<link href="$uri" media="all" rel="stylesheet" type="text/css">\n}
	}
    }
    return $out;
};

sub javascript_include_tag {
    my @sources = @_;
    my $out = "";
    for my $source (@sources) {
        my $uri;
        if ($source =~ /^\w+:\/\//) {
            $uri = $source;
        }
        else {
            $uri = $source;
            $uri .= ".js" if $source !~ /\./;
            $uri = "/javascripts/$uri" if $source !~ /\//;
        }

        $out .= qq{<script type="text/javascript" src="$uri"></script>\n};
    }
    return $out;
}

sub link_to {
    my ($label, $url, @attr) = @_;

    my $attr = "";
    my %attr = ();
    if (@attr == 1 && ref($attr[0]) eq 'HASH') {
        %attr = %{$attr[0]};
    }
    elsif (@attr % 2 == 0) {
        %attr = (@attr);
    }

    if (%attr) {
        my $js;
        if ($attr{method} && $attr{method} eq 'delete') {
            $js = <<JS;
var f = document.createElement('form');
f.style.display = 'none'; this.parentNode.appendChild(f);
f.method = 'POST'; f.action = this.href;
var m = document.createElement('input');
m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method');
m.setAttribute('value', 'delete'); f.appendChild(m);f.submit();
JS
        }

        if (my $confirm = delete $attr{confirm}) {
            $js ||= "return true;";
            $attr{onclick} ||= "";
            $attr{onclick} .= ";if(confirm(\"$confirm\")) { $js }; return false;";
        } elsif ($js) {
            $attr{onclick} ||= "";
            $attr{onclick} .= "$js";
        }

	$attr .= qq{ $_="@{[ encode_entities($attr{$_}, '<>&"') ]}"} for keys %attr;
    }
    qq{<a href="$url"$attr>@{[ encode_entities($label, '<>&') ]}</a>};
}

sub render_stickies {
    my $session = &Railsish::Controller::session;

    return "" unless @{$session->{notice_stickies}||[]} > 0;

    my $out = '<div id="notice_stickies" class="message notice">';
    while(my $stickie = pop @{$session->{notice_stickies}}) {
        $out .= "<p>" . $stickie->{text} . "</p>";
    }
    $out .= "</div>";

    return $out;
}

1;

__END__
=head1 NAME

Railsish::ViewHelpers

=head1 VERSION

version 0.21

=head1 AUTHOR

  Liu Kang-min <gugod@gugod.org>

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2009 by Liu Kang-min <gugod@gugod.org>.

This is free software, licensed under:

  The MIT (X11) License