#!/usr/bin/perl -w

# Bibliotecas a utilizar + la condición de que sea stricto.
use Gtk;
use Gtk::XmHTML;
use LWP::UserAgent;
use URI;
use strict;

# Perl-Gtk: esqueleto básico. Agrega internacionalización.
set_locale Gtk;
init Gtk;

# Perk-Gtk: Función obligatoria para cerrar ventanas.
sub Window_delete_event {
	Gtk->exit(0);
}

# Función para mostrar toda la información correspondiente a un evento.
sub html_info {
	my($widget, $info, $track) = @_;
	
	print "\u$info->{'reason'}!\n";
	foreach (keys %{$widget}) {
		print "Widget: $_ -> $widget->{$_}\n";
	}
	foreach (keys %{$info}) {
		print "Key: $_ -> $info->{$_}\n";
	}
	foreach ($track) {
		print "Track: $_ -> $track->{$_}\n";
	}
}

# Función para ir a una nueva página cuando el usuario hace click en un
# link de la página actual.
sub follow_link {
	my($widget, $info, $track) = @_;
	
	our $URL; # Dirección actual
	my $link = $info->{"href"}; # Nueva dirección.
	
	# Los protocolos raros (ej: mailto) tienen este tipo:
	if ( $info->{'urltype'} eq "exec:foo_bar" ) {
		print "No es posible utilizar el protocolo de la dirección: $link.\n";
		return 1;
	}
	# Obtiene la ruta completa para la nueva página, a partir de la anterior.
	$URL = URI->new_abs($link,$URL);
	# Muestra la nueva página.
	get_url($URL, $widget);
}

# Solicita la página y luego la muestra.
sub get_url {
	# Toma el primer y segundo parámetro
	my $URL = shift;
	my $html = shift;
	
	# En $req se arma el pedido completo de la página a mostrar.
	my $req = new HTTP::Request GET => "$URL";

	# Con $ua podemos obtener la página.
	my $ua = new LWP::UserAgent;
	my $res = $ua->request($req);
	if (! $res->is_success) {
		die "No se pudo cargar la página: $URL";
	}
	# Mostrar la página.
	$html->source($res->content);
}

# Obtiene las imágenes a mostrar.
sub get_image {
	my $widget=shift; # Primer parámetro
	my $image=shift;  # Segundo parámetro
	our $URL;
	
	# Obtiene la ruta completa de la imagen y en $req arma el pedido.
	$image = URI->new_abs($image,$URL);
	my $req = new HTTP::Request GET => "$image";

	# Con $ua obtiene la imagen
	my $ua = new LWP::UserAgent;
	my $res = $ua->request($req);
	if (! $res->is_success) {
		die "No se pudo cargar la imagen: $image";
	}
	# El resultado es un array de dos elementos: el estado y el contenido.
	return (0,$res->content);
}

# Perl-Gtk: Parte del esqueleto básico de Gtk.
my $false = 0;
my $true  = 1;

# Define todas las variables a utilizar. (qw = quickwrite)
use vars qw($window $html $URL);
	
# La URL a mostrar es el primer parámetro recibido por el comando.
$URL = shift;
# Si no hubo URL, sale con error.
if ($URL eq "")
{
	print "Es necesario proporcionar una dirección";
	exit(1);
}

# Perl-Gtk: Creación de la ventana.
$window = new Gtk::Widget "GtkWindow",
		title => "Navegador",
		-delete_event => "Window_delete_event";

# Perl-Gtk: Crea el objeto HTML, lo agrega a la ventana.
$html=new Gtk::XmHTML;
$window->add($html);

# Perl-GTk: indica cuál es el procedimiento para manipular imágenes
$html->set_image_procs("get_image");

# Obtiene la página.
get_url ($URL, $html);

# Perl-Gtk: Cambia el tamaño de la ventana.
$window->set_usize(640, 480);

# Perl-Gtk: Señal para los links
$html->signal_connect('activate' => \&follow_link);
# Perl-Gtk: Otras señales
$html->signal_connect('html-event' => \&html_info);
$html->signal_connect('form' => \&html_info);
$html->signal_connect('input' => \&html_info);

# Perl-Gtk: Muestra el HTML y la ventana.
show $html;
show $window;
# Perl-Gtk: Loop infinito obligatorio.
main Gtk;
