package ZTabs;
$VERSION = '0.00';
use strict;

{   
    # The Package variables
    my $_location = '/jslib/tabs'; # location of tabs js-src in project tree
    sub get_location { $_location; }
    
    my $_tab_counter = 1;
    sub get_tab_counter   { $_tab_counter; }
    sub _incr_tab_counter { $_tab_counter++; }
}

# Universap subroutine. May be moved from the Package.
sub _add_def_parms {
    my ($parm,$def_parm,$sep) = @_;
    $sep = ';' unless($sep);
    my $tail_sep =  ($def_parm =~ m/$sep\s*$/ );
    if($parm) { $parm .= $sep unless($parm =~ m/$sep\s$/); }
    
    my @def_parm = split(/$sep/,$def_parm);
    for(my $i=0;$i<=$#def_parm;$i++) {
        if( $def_parm[$i] =~ m/^\s*([^\s:]+)\s*:/ ) {
            my $style_parm = $1;
            unless( $parm =~ m/\b$style_parm\s*:/ ) {
                $parm .= $def_parm[$i] . $sep;
            }
        }
        
    }
    $parm =~ s/$sep\s*$//;
    
    return $parm;
}

# Procedure of the Package, not package object. Call one time only
sub body_attr { ' onload="tabInit()"' }

sub head (%) {
my %parm = @_;

my $body     ; # = _add_def_parms($parm{'body'},'margin: 0; padding: 0; background-color:#e3e6e9; height: 100%;');
my $_content = _add_def_parms($parm{'.content'},'position: relative; margin-left: 0%; top: 0px; font-family: Trebuchet MS, Arial, sans-serif; padding: 8px 12px 12px 12px; border: 1px solid #666; width: 90%; border-top: 1px solid #999; border-left: 1px solid #666; z-index: 500;');
my $div_tabs = _add_def_parms($parm{'div.tabs'},'font-size: 12px; line-height: 15px; position: relative; top: 0px; left: 0%; white-space: nowrap; font-family: Verdana, Arial, sans-serif; cursor: default !important; font-weight: 700 !important; z-index: 10000;');
my $_tab     = _add_def_parms($parm{'.tab'},'border: 1px solid #347; padding: 2px 9px 1px 9px; background-color: #fff000; z-index: 100; border-bottom-width: 1;');
my $_tabHover= _add_def_parms($parm{'.tabHover'},'border: 1px solid #347; padding: 2px 9px 1px 9px; background-color: #fff000; z-index: 100; border-bottom-width: 1;');
my $_tabActive = _add_def_parms($parm{'.tabActive'},'border: 1px solid #347; padding: 2px 9px 1px 9px; background-color: #ffffff; z-index: 100; border-bottom-width: 1;');
my $div_tabsClone = _add_def_parms($parm{'div.tabsClone'},'border-top-width: 0 !important; border-bottom-width: 1px !important;');
my $a_removeTab = _add_def_parms($parm{'a.removeTab'},'font-size: smaller; text-decoration: none;');
my $TabParams = _add_def_parms($parm{'TabParams'},'useClone: true, alwaysShowClone: false, eventType: "click", tabTagName: "span"',',');

my $location  = $parm{'location'} || get_location();
my $base      = $parm{'base'};
my $file_test = $parm{'file_test'};

my ($BASE,$delim_l,$delim_r);
if($file_test) { $BASE = "<BASE href=\"file:$base\">"; } 
else           { $delim_l = '<| '; $delim_r = ' |>'; }

my $head=<<EOT;    
<style type="text/css">
body{ $body }
.content { $_content }
.content .padder{ height: 0px; }
div.tabs { $div_tabs }
.tab { $_tab }
.tabHover { $_tabHover }
.tabActive { $_tabActive }
div.tabsClone .tabActive{top:-2px;}
a.removeTab{ $a_removeTab }
</style>

$BASE
<script src="$delim_l$location/utils.js$delim_r" type="text/javascript"></script>
<script src="$delim_l$location/viewport.js$delim_r" type="text/javascript"></script>
<script src="$delim_l$location/global.js$delim_r" type="text/javascript"></script>
<script src="$delim_l$location/cookie.js$delim_r" type="text/javascript"></script>
<script src="$delim_l$location/tabs.js$delim_r" type="text/javascript"></script>
<script type="text/javascript">
TabParams = { $TabParams };
</script>
EOT

return ($head);
}


# Methods

sub new {
    my $class = $_[0];
    my $id = $class->get_tab_counter();
    my $label = $id . '_' if($id);
    
    my $objref = { 
        _id       => $id, # unical object ID
        _label    => $label,         # unical label for names (not used now)
        _tabs     => [],
        _contents => [],
    };
    
    $class->_incr_tab_counter();
    
    bless  $objref, $class;
}

sub get_label { $_[0]->{_label} }

sub last_tab {
    my ($self) = @_;
    my $len1 = $#{$self->{_tabs}};
    my $len2 = $#{$self->{_contents}};
    return (($len1 > $len2) ? $len1 : $len2 );
}    

sub add_tab {
    my ($self,%arg) = @_;
    my $new_last = $self->last_tab() + 1;

    $self->{_tabs}->[$new_last] = $arg{'tab'};
    $self->{_contents}->[$new_last] = $arg{'content'};
}

sub set_tab {
    my ($self,$index,%arg) = @_;

    $self->{_tabs}->[$index] = $arg{'tab'};
    $self->{_contents}->[$index] = $arg{'content'};
}

sub get_tabs {
    my ($self,%arg) = @_;
    my $active = $arg{'active'} || 1;
    my $label   = $self->get_label();

    my $out = '<div class="tabs">' . "\n";
    for(my $i=0;$i<=$self->last_tab();$i++) 
    {
        if( defined($self->{_tabs}->[$i]) || 
            defined($self->{_contents}->[$i]) ) {
            my $class = ($i+1==$active) ? 'tab tabActive' : 'tab';
            $out .= '<span id="tab' . $label . ($i+1) . '" class="' . 
                $class . '">' . $self->{_tabs}->[$i] . '</span>' . "\n";
        }
    }
    $out .= "</div>\n\n";
    
    return($out);
}

sub get_contents {
    my ($self) = @_;
    my $label   = $self->get_label();

    my $out;
    for(my $i=0;$i<=$self->last_tab();$i++) {
        if( defined($self->{_tabs}->[$i]) ||
            defined($self->{_contents}->[$i]) ) 
        {
            $out .= '<div id="content' . $label . ($i+1) . 
                '" class="content">' . $self->{_contents}->[$i] . 
                '</div>' . "\n\n";
        }
    }
    
    return($out);
}

1;
