# --*-Perl-*--
# $Id: ElsevierJSS.pm 10 2004-11-02 22:14:09Z tandler $
#

package PBib::BibItemStyle::ElsevierJSS;
use strict;
use warnings;
#use English;

=head1 package PBib::BibItemStyle::ElsevierJSS;

Based on the vague description at http://www.elsevier.com/....

=cut

# for debug:
#use Data::Dumper;

BEGIN {
    use vars qw($Revision $VERSION);
	my $major = 1; q$Revision: 10 $ =~ /: (\d+)/; my ($minor) = ($1); $VERSION = "$major." . ($minor<10 ? '0' : '') . $minor;
}

# superclass
use base qw(PBib::BibItemStyle);
#  use vars qw(@ISA);
#  @ISA = qw(PBib::BibItemStyle);

# used modules
#use ZZZZ;

# module variables
#use vars qw(mmmm);

#
#
# constructor
#
#

sub new {
  my $self = PBib::Style::new(@_);
  $self->{'keywords'} = $self->ElsevierJSS_keywords();
  return $self;
}


#
#
# access methods
#
#

sub ElsevierJSS_keywords {
  return {
	'editor' => 'Ed.',
	'editors' => 'Eds.',
	"page" => "p.",
	"pages" => "pp.",
	"volume" => "Vol.", # ???
	"number" => "No.",
	"chapter" => "ch.", # ???
	"PhD thesis" => "Ph.D. thesis",
	"Technical Report" => "Tech. Rep.", # ???
	};
}

sub includeLabel { my ($self) = @_;
# should the Cite label be included in the bibliography?
#
# overwrite to set default to 0
#
  return $self->option("include-label") || 0;
}

#
#
# format methods for entries
#
#

sub format_names { my ($self, $names) = @_;
  return () unless( defined($names) );
  return $self->format_names_last_initials($names);
}

sub format_editors { my ($self, $check) = @_;
  my $eds = $self->entry('Editors', $check);
  return undef unless defined $eds;
  my $num = $self->num_names($eds);
  return $num == 0 ? () :
	($self->format_names($eds) .
	 " (" .
	 $self->format_keyword($num == 1 ? "editor" : "editors") .
	 ")"
	);
}

sub format_title { my ($self, $check) = @_;
  my $Title = $self->entry('Title', $check);
  return $Title;
}
sub format_journal { my ($self) = @_;
  return $self->entry('Journal', 1);
}

sub format_date { my ($self, $check) = @_;
  my $Year = $self->entry('Year', $check);
  return '' unless defined($Year);
  my $postfix = $self->labelStyle()->postfix($self->refID());
  return "$Year$postfix";
}

sub format_in_ed_booktitle { my ($self, $check) = @_;
  my $Booktitle = $self->entry('SuperTitle', $check);
  return () unless $Booktitle;
  return $self->entryNotEmpty('Editors') ?
	"In: " . $self->format_editors() . ", $Booktitle" :
	"In: $Booktitle";
}

sub format_vol_num_pages { my ($self) = @_;
# return "volume(number):pages" or "pp. pages"
  my $Volume = $self->entry('Volume');
  my $Number = $self->entry('Number');
  return $self->format_pages()
	unless ($Volume || $Number);
  my $Pages = $self->outDoc->formatRange($self->entry('Pages'));
  return $self->tieOrSpaceConnect(
		$Volume,
		($Number ? "($Number)" : ())
	) .
	($Pages ? ", $Pages" : '');
}

sub format_addr_pub { my ($self, $check) = @_;
  my $Publisher = $self->entry('Publisher', $check);
  my $Address = $self->entry('Address');
  return () unless ($Publisher);
  return $Address ?
	"$Publisher, $Address" :
	$Publisher;
}

#
#
# sorting ...
#
#


sub sortkey_names { my ($self, $names) = @_;
  my @all_names = $self->split_names($names);
  return () unless( @all_names );
  @all_names = map( $self->last_name($_), @all_names );
  return join(" ", @all_names);
}

#
#
# formating methods for different bib types
#
#


sub format_article { my ($self) = @_;
  return [
	[
		[
			$self->format_authors(1),
			$self->format_date(1),
		], [
			$self->format_title(1),
			$self->spaceConnect(
				$self->format_journal(1),
				$self->format_vol_num_pages()
			),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}
sub format_book { my ($self) = @_;
  return [
	[
		[
			$self->format_authors_or_editors(),
			$self->format_date(1),
		], [
			$self->format_title(1),
			$self->format_volume_number_series(),
			$self->format_addr_pub(1),
			$self->format_edition(),
			$self->format_language(),
		],
	],
	$self->format_trailer(),
	];
}

sub format_booklet { my ($self) = @_;
### this is simplyfied: always generate a new block
### between title and howpublished/address ...
  return [
	[ $self->format_authors() ],
	[ [
		$self->format_title(1),
		$self->format_howpublished(),
		$self->format_address(),
		$self->format_date(),
		$self->format_language(),
	] ],
	$self->format_trailer(),
	];
}


sub format_inbook { my ($self) = @_;
  return [
	[
		[
			$self->format_authors_or_editors(),
			$self->format_date(1),
		], [
			$self->format_title(1),
			$self->format_volume_number_series(),
			$self->format_addr_pub(1),
			$self->format_edition(),
			$self->format_chapter_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

sub format_incollection { my ($self) = @_;
  return [
	[
		[
			$self->format_authors(1),
			$self->format_date(1),
		], [
			$self->format_title(1),
		], [
			$self->format_in_ed_booktitle(1),
			$self->format_volume_number_series(),
			$self->format_addr_pub(1),
			$self->format_edition(),
			$self->format_chapter_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

sub format_inproceedings { my ($self) = @_;
  return $self->format_incollection();
}

sub sortkey_manual { my ($self) = @_; return $self->sortkey_authors(); }
sub format_manual { my ($self) = @_;
  ## well, free-style ...
  return [
	[ [
		$self->format_authors(),
		$self->format_title_for_book(1),
		$self->format_volume_number_series(),
	] ],
	[ [
		$self->format_organization(),
		$self->format_address(),
		$self->format_edition(),
		$self->format_date(),
		$self->format_language(),
	] ],
	$self->format_trailer(),
	];
}

sub format_thesis { my ($self, $default_type) = @_;
  return [
	[
		[
			$self->format_authors(1),
			$self->format_date(1),
		], [
			$self->format_title(1),
			$self->format_type($default_type || "thesis"),
			$self->format_school(1),
			$self->format_address(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

#sub format_masterthesis { my ($self) = @_;
#  return $self->format_thesis("Master's thesis");
#}

sub format_misc { my ($self) = @_;
  return [
	[
		[
			$self->format_authors(),
			$self->format_date(1),
		], [
			$self->format_title(),
			$self->format_howpublished(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

#sub format_phdthesis { my ($self) = @_;
#  return $self->format_thesis("PhD thesis");
#}

sub format_proceedings { my ($self) = @_;
  return $self->format_book();
}

sub format_report { my ($self) = @_;
  return [
	[
		[
			$self->format_authors(1),
			$self->format_date(1),
		], [
			$self->format_title(1),
			$self->format_techrep_number(),
			$self->format_institution(1),
			$self->format_address(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}

sub format_unpublished { my ($self) = @_;
  return $self->format_misc();
}

sub format_talk { my ($self) = @_;
# a talk here is just like a conference paper, but with
# an optional publisher.
# I'd recommend to use this for workshop position paper etc.
  return [
	[
		[
			$self->format_authors(1),
			$self->format_date(1),
		], [
			$self->format_title(1),
		], [
			$self->format_in_ed_booktitle(1),
			$self->format_volume_number_series(),
			$self->format_addr_pub(),
			$self->format_edition(),
			$self->format_chapter_pages(),
			$self->format_language(),
		]
	],
	$self->format_trailer(),
	];
}


1;

#
# $Log: ElsevierJSS.pm,v $
# Revision 1.3  2003/05/22 11:56:06  tandler
# the "talk" is now formatted just like a inproceedings (paper), but with optional publisher.
#
# Revision 1.2  2002/11/05 18:30:44  peter
# format vol/nr (space/tie connect)
# minor fixes
#
# Revision 1.1  2002/11/03 22:16:07  peter
# new JSS style (Elsevier)
#
