package CfgIO;
use vars qw(@ISA @EXPORT @EXPORT_OK);

use Exporter;
@ISA = qw(Exporter);

@EXPORT = qw(config_new make_cfgfile_content);

push @EXPORT, qw(next_itemid get_item_allids);
push @EXPORT, qw(set_item_name get_item_name get_item_need set_item_need
		 get_item_eleids add_item_eleids);

push @EXPORT, qw(next_eleid get_element_allids);
push @EXPORT, qw(set_element_name get_element_name 
		 set_element_type get_element_type
		 set_element_itemid get_element_itemid
		 get_element_labels add_element_labels set_element_labels
		 get_element_cols set_element_cols
		 get_element_rows set_element_rows
		 get_element_values add_element_values set_element_values
		 get_element_size set_element_size
		 get_element_text set_element_text
		 get_element_mandatory add_element_mandatory
		 get_element_mandatory_temp add_element_mandatory_temp
		 get_element_need set_element_need
		 get_element_style set_element_style
		 get_element_check set_element_check
		 get_element_value set_element_value
		 get_element_depeleids set_element_depeleids
		 get_element_errmsg set_element_errmsg
		 get_element_jvalue
		 );
push @EXPORT, qw(
		 get_conf_title set_conf_title
		 get_conf_confpath set_conf_confpath
		 get_conf_logspath set_conf_logspath
		 get_conf_htmlpath set_conf_htmlpath
		 get_conf_filepath set_conf_filepath
		 get_conf_tmplpath set_conf_tmplpath
		 get_conf_paydate set_conf_paydate
		 );
push @EXPORT, qw(
		 next_mailid
		 get_mail_allids
		 get_mail_cond set_mail_cond
		 get_mail_need set_mail_need
		 get_mail_body set_mail_body
		 get_mail_send set_mail_send
		 get_mail_to set_mail_to
		 get_mail_cc set_mail_cc
		 get_mail_bcc set_mail_bcc
		 get_mail_from set_mail_from 
		 get_mail_subject set_mail_subject
		 );
push @EXPORT, qw(get_inputable_eleids
		 is_inputable_element
		 label2eleid
		 eleid2itemid
		 is_item_mandatory 
		 );

@EXPORT_OK = qw();

use Bool;

#---------------------------------------------------------------------------
# 入力項目ごとの情報
#
#     $items[$itemid]{name}    : 名前
#     $items[$itemid]{need}    : 必須項目か
#   @{$items[$itemid]{eleids}} : 
#
#   ※ 項目は最小の意味をなる単位（であるべき）．
#      通常は，関連する1つ以上の要素が集まって項目となる．
# 
#---------------------------------------------------------------------------
my $itemid = 0;
@items = ();


#---------------------------------------------------------------------------
# 表示される要素ごとの情報
#
#     $elements[$eleid]{name}      :
#     $elements[$eleid]{type}      : 要素のタイプ
#     $elements[$eleid]{need}      : 必須かどうか
#   @{$elements[$eleid]{mandatory}}: 条件付き必須要素の定義
#    例: eleid が label の時に
#          $elements[$eleid]{mandatory}[0] = qq|$eleid=$label|;
#                             :
#          $elements[$eleid]{mandatory}[n] = qq|$eleid=$label|;
#  ( @{$elements[$eleid]{mandtemp}} ) :
#        条件付き必須要素の定義をするための一時変数
#    例: ラベルだけが入る．この後，
#          $elements[$eleid]{mandtemp}[0] = qq|$label|;
#     $elements[$eleid]{style}   :
#     $elements[$eleid]{check}   :
#   @{$elements[$eleid]{values}} :
#   @{$elements[$eleid]{labels}} :
#     $elements[$eleid]{size}    :
#     $elements[$eleid]{cols}    :
#     $elements[$eleid]{rows}    :
#     $elements[$eleid]{text}    :
#
#     $elements[$eleid]{itemid} :
#
#   ※ 要素は最小の入力単位，通常は，1つ以上の要素が集まって項目となる．
#   ※ 条件つき必須項目については，互いの要素ごとの
#
#---------------------------------------------------------------------------
my $eleid = 0;
@elements = ();


#---------------------------------------------------------------------------
#
# mail , conf
#
#---------------------------------------------------------------------------
my $mailid = 0;
@mails = ();

# =begin modified by ishikawa
# my %conf = ();
%conf = ();
# =end modified by ishikawa


#---------------------------------------------------------------------------
#
# 項目と要素の初期化
#   ※ CGIの設定ファイル がある場合はそれを読みこむ。
#      ない場合は、
#
#---------------------------------------------------------------------------
sub config_new {
    my ($cfgfile) = @_;
    if ($cfgfile && (-e $cfgfile)) {
	require $cfgfile;
    }
    else {
	$itemid = 0;
	@items = ();
	$eleid = 0;
	@elements = ();
	$mailid = 0;
    }
}


#---------------------------------------------------------------------------
#
# 項目にアクセスするためのメソッド
#
#---------------------------------------------------------------------------
sub next_itemid {
    $itemid++;
    return $itemid;
}

sub get_item_allids {
    return (0 .. $#items);
}

sub set_item_name {
    my ($itemid, $name) = @_;
    $items[$itemid]{name} = $name;
}

sub get_item_name {
    my ($itemid) = @_;
    return ($items[$itemid]{name});
}

sub get_item_eleids {
    my ($itemid) = @_;
    return (@{$items[$itemid]{eleids}});
}

sub add_item_eleids {
    my ($itemid, $eleid) = @_;
    push @{$items[$itemid]{eleids}}, $eleid;
}

sub get_item_need {
    my ($itemid, $need) = @_;
    return ($items[$itemid]{need});
}

sub set_item_need {
    my ($itemid, $need) = @_;
    $items[$itemid]{need} = $need;
}


#---------------------------------------------------------------------------
#
# 要素にアクセスするためのメソッド
#
#---------------------------------------------------------------------------
sub next_eleid {
    $eleid++;
    return $eleid;
}


sub get_element_allids {
    return (0 .. $#elements);
}


sub set_element_name {
    my ($eleid, $name) = @_;
    $elements[$eleid]{name} = $name;
}


sub get_element_name {
    my ($eleid) = @_;

    my $name = &_get_element_name($eleid);
    if ($name) {
	return $name;
    }
    else {
	return qq|item_$eleid|;
    }
}

sub _get_element_name {
    my ($eleid) = @_;
    #if (defined($elements[$eleid]{name})) {
    if ($elements[$eleid]{name}) {
	return qq|$elements[$eleid]{name}|;
    }
    else {
	return qq||;
    }
}


sub set_element_type {
    my ($eleid, $type) = @_;
    $elements[$eleid]{type} = $type;
}

sub get_element_type {
    my ($eleid) = @_;
    return ($elements[$eleid]{type});
}


sub set_element_itemid {
    my ($eleid, $value) = @_;
    $elements[$eleid]{itemid} = $value;
}

sub get_element_itemid {
    my ($eleid) = @_;
    return ($elements[$eleid]{itemid});
}


sub get_element_labels {
    my ($eleid) = @_;
#    if (defined(@{$elements[$eleid]{labels}})) {
    if (@{$elements[$eleid]{labels}}) {
	return (@{$elements[$eleid]{labels}});
    }
    else {
	return ();
    }
}

sub add_element_labels {
    my ($eleid, @labels) = @_;
    push @{$elements[$eleid]{labels}}, @labels; 
}

sub set_element_labels {
    my ($eleid, @labels) = @_;
    @{$elements[$eleid]{labels}} = @labels; 
}

sub get_element_cols {
    my ($eleid) = @_;
    if ($elements[$eleid]{cols}) {
	    #if (defined($elements[$eleid]{cols})) {
	return ($elements[$eleid]{cols});
    }
    else {
	return ();
    }
}

sub set_element_cols {
    my ($eleid, $cols) = @_;
    $elements[$eleid]{cols} = $cols;
}


sub get_element_rows {
    my ($eleid) = @_;
#    if (defined($elements[$eleid]{rows})) {
    if ($elements[$eleid]{rows}) {
	return ($elements[$eleid]{rows});
    }
    else {
	return ();
    }
}

sub set_element_rows {
    my ($eleid, $rows) = @_;
    $elements[$eleid]{rows} = $rows;
}


sub get_element_values {
    my ($eleid) = @_;
    #if (defined(@{$elements[$eleid]{values}})) {
    if (@{$elements[$eleid]{values}}) {
	return (@{$elements[$eleid]{values}});
    }
    else {
	return ();
    }
}

sub add_element_values {
    my ($eleid, @values) = @_;
    push @{$elements[$eleid]{values}}, @values; 
}

sub set_element_values {
    my ($eleid, @values) = @_;
    @{$elements[$eleid]{values}} = @values; 
}


sub get_element_size {
    my ($eleid) = @_;
    if (defined($elements[$eleid]{size})) {
	return ($elements[$eleid]{size});
    }
    else {
	return ();
    }
}

sub set_element_size {
    my ($eleid, $size) = @_;
    $elements[$eleid]{size} = $size;
}


sub get_element_text {
    my ($eleid) = @_;
    if (defined($elements[$eleid]{text})) {
	my $text = $elements[$eleid]{text};
	$text =~ s/\\s/ /g;
	$text =~ s/\\n/<br>/g;
	return ($text);
    }
    else {
	return ();
    }
}

sub set_element_text {
    my ($eleid, $text) = @_;
    $elements[$eleid]{text} = $text;
}


sub get_element_mandatory {
    my ($eleid) = @_;
    return @{$elements[$eleid]{mandatory}};
}

sub add_element_mandatory {
    my ($eleid, $label) = @_;
    push @{$elements[$eleid]{mandatory}}, $label;
}


sub get_element_mandatory_temp {
    my ($eleid) = @_;
    return @{$elements[$eleid]{mandtemp}};
}

sub add_element_mandatory_temp {
    my ($eleid, $label) = @_;
    push @{$elements[$eleid]{mandtemp}}, $label;
}


sub get_element_need {
    my ($eleid) = @_;
    return ($elements[$eleid]{need});
}

sub set_element_need {
    my ($eleid, $need) = @_;
    $elements[$eleid]{need} = $need;
}


sub get_element_style {
    my ($eleid) = @_;
    if (defined($elements[$eleid]{style})) {
	return ($elements[$eleid]{style});
    }
    else {
	return ();
    }
}

sub set_element_style {
    my ($eleid, $style) = @_;
    $elements[$eleid]{style} = $style;
}


sub get_element_check {
    my ($eleid) = @_;
    if (defined($elements[$eleid]{check})) {
	return ($elements[$eleid]{check});
    }
    else {
	return ();
    }
}

sub set_element_check {
    my ($eleid, $check) = @_;
    $elements[$eleid]{check} = $check;
}

sub get_element_value {
    my ($eleid) = @_;
    return ($elements[$eleid]{value});
}

sub set_element_value {
    my ($eleid, $value) = @_;
    $elements[$eleid]{value} = $value;
}

sub get_element_depeleids {
    my ($eleid) = @_;
    return @{$elements[$eleid]{depeleids}};
}

sub set_element_depeleids {
    my ($eleid, @depeleids) = @_;
    @{$elements[$eleid]{depeleids}} = @depeleids;
}

sub get_element_errmsg {
    my ($eleid) = @_;
    return $elements[$eleid]{errmsg};
}

sub set_element_errmsg {
    my ($eleid, $errmsg) = @_;
    $elements[$eleid]{errmsg} = $errmsg;
}

sub get_element_jvalue {
    my ($eleid, $value) = @_;
    my @labels = &get_element_labels($eleid);
    my @values = &get_element_values($eleid);
    my $jvalue = $value;
    foreach my $idx (0 .. $#labels) {
	if ($labels[$idx] eq $value) {
	    $jvalue = $values[$idx];
	    last;
	}
    }    
    return $jvalue;
}


#---------------------------------------------------------------------------
#
# 未整理
#
#---------------------------------------------------------------------------


sub get_inputable_eleids {
    my @inputable = ();
    foreach my $eleid (&get_element_allids()) {
	push @inputable, $eleid if (&is_inputable_element($eleid) == TRUE);
    }
    return @inputable;
}

sub is_inputable_element {
    my ($eleid) = @_;
    my $ele_type = &get_element_type($eleid);
    if ($ele_type eq 'text' || $ele_type eq 'textarea'
	|| $ele_type eq 'radio' || $ele_type eq 'selector') {
	return TRUE;
    }
    elsif ($ele_type eq 'hidden') {
	return TRUE;
    }
    else {
	return FALSE;
    }
}






#---------------------------------------------------------------------------
#
#
#
#---------------------------------------------------------------------------


# eleid2itemid -> get_element_itemid 
sub eleid2itemid {
    my ($eleid) = @_;
    return qq|$elements[$eleid]{itemid}|;
}

sub is_item_mandatory {
    my ($itemid) = @_;

    if (&get_item_need($itemid) eq 'mandatory') {
	return TRUE;
    }
    else {
	return FALSE;
    }
}

#---------------------------------------------------------------------------
#
# conf
#
#---------------------------------------------------------------------------
sub get_conf_title {
    return $conf{title};
}
sub set_conf_title {
    my ($title) = @_;
    $conf{title} = $title;
}

sub get_conf_confpath {
    return $conf{confpath};
}
sub set_conf_confpath {
    my ($path) = @_;
    $conf{confpath} = $path;
}

sub get_conf_logspath {
    return $conf{logspath};
}
sub set_conf_logspath {
    my ($path) = @_;
    $conf{logspath} = $path;
}

sub get_conf_htmlpath {
    return $conf{htmlpath};
}
sub set_conf_htmlpath {
    my ($path) = @_;
    $conf{htmlpath} = $path;
}

sub get_conf_filepath {
    return $conf{filepath};
}
sub set_conf_filepath {
    my ($path) = @_;
    $conf{filepath} = $path;
}

sub get_conf_tmplpath {
    return $conf{tmplpath};
}
sub set_conf_tmplpath {
    my ($path) = @_;
    $conf{tmplpath} = $path;
}

sub get_conf_paydate {
    return $conf{paydate};
}
sub set_conf_paydate {
    my ($paydate) = @_;
    $conf{paydate} = $paydate;
}

#---------------------------------------------------------------------------
#
# mail
#
#---------------------------------------------------------------------------
sub next_mailid {
    $mailid++;
    return $mailid;
}

sub get_mail_allids {
    return (0 .. $#mails);
}


sub set_mail_cond {
    my ($mailid, $cond) = @_;
    $mails[$mailid]{cond} = $cond;
}

sub get_mail_cond {
    my ($mailid) = @_;
    return $mails[$mailid]{cond};
}

sub set_mail_need {
    my ($mailid, $need) = @_;
    $mails[$mailid]{need} = $need;
}    

sub get_mail_need {
    my ($mailid) = @_;
    return $mails[$mailid]{need};
}

sub set_mail_body {
    my ($mailid, $body) = @_;
    $mails[$mailid]{body} = $body;
}    

sub get_mail_body {
    my ($mailid) = @_;
    return $mails[$mailid]{body};
}

sub set_mail_send {
    my ($mailid, $type) = @_;
    $mails[$mailid]{send} = $type;
}    

sub get_mail_send {
    my ($mailid) = @_;
    return $mails[$mailid]{send};
}

sub set_mail_from {
    my ($mailid, $addr) = @_;
    $mails[$mailid]{from} = $addr;
}

sub get_mail_from {
    my ($mailid) = @_;
    return $mails[$mailid]{from};
}

sub set_mail_to {
    my ($mailid, $addr) = @_;
    $mails[$mailid]{to} = $addr;
}

sub get_mail_to {
    my ($mailid) = @_;
    return $mails[$mailid]{to};
}

sub set_mail_cc {
    my ($mailid, $addr) = @_;
    $mails[$mailid]{cc} = $addr;
}

sub get_mail_cc {
    my ($mailid) = @_;
    return $mails[$mailid]{cc};
}

sub set_mail_bcc {
    my ($mailid, $addr) = @_;
    $mails[$mailid]{bcc} = $addr;
}

sub get_mail_bcc {
    my ($mailid) = @_;
    return $mails[$mailid]{bcc};
}

sub set_mail_subject {
    my ($mailid, $subject) = @_;
    $mails[$mailid]{subject} = $subject;
}

sub get_mail_subject {
    my ($mailid) = @_;
    return $mails[$mailid]{subject};
}


1;
