1###############################################################################
2# AdvancedTabs.pm                                                             #
3# $Date: 12.02.14 $                                                           #
4###############################################################################
5# YaBB: Yet another Bulletin Board                                            #
6# Open-Source Community Software for Webmasters                               #
7# Version:        YaBB 2.6.11                                                 #
8# Packaged:       December 2, 2014                                            #
9# Distributed by: http://www.yabbforum.com                                    #
10# =========================================================================== #
11# Copyright (c) 2000-2014 YaBB (www.yabbforum.com) - All Rights Reserved.     #
12# Software by:  The YaBB Development Team                                     #
13#               with assistance from the YaBB community.                      #
14###############################################################################
15# use strict;
16# use warnings;
17no warnings qw(uninitialized once redefine);
18use CGI::Carp qw(fatalsToBrowser);
19our $VERSION = '2.6.11';
20
21$advancedtabspmver = 'YaBB 2.6.11 $Revision: 1611 $';
22if ( $action eq 'detailedversion' ) { return 1; }
23
24sub AddNewTab {
25    GetTexttab();
26
27    $edittabs = qq~<option value="thefront">$tabmenu_txt{'tabfront'}</option>~;
28    foreach (@AdvancedTabs) {
29        $_ =~ /^([^\|]+)/xsm;
30        if ( $texttab{$1} ) {
31            $edittabs .= qq~<option value="$1">$texttab{$1}</option>~;
32        }
33    }
34
35    $yyaddtab = qq~
36    <br />
37    <script type="text/javascript">
38    function submittab() {
39        if (window.submitted) return false;
40        window.submitted = true;
41        return true;
42    }
43
44    function checkTab(theForm) {
45        var isError = 0;
46        var tabError = "$tabmenu_txt{'taberr'}\\n";
47
48        if (theForm.tabtext.value == "") { tabError += "\\n- $tabmenu_txt{'texterr'}"; if(isError == 0) isError = 1; }
49        if (theForm.taburl.value == "") { tabError += "\\n- $tabmenu_txt{'urlerr'}"; if(isError == 0) isError = 2; }
50        if(isError >= 1) {
51            alert(tabError);
52            if(isError == 1) theForm.tabtext.focus();
53            else if(isError == 2) theForm.taburl.focus();
54            else if(isError == 3) theForm.tabtext.focus();
55            return false;
56        }
57        return true
58    }
59    </script>~
60      . $brd_advanced_tabs;
61    $yyaddtab =~ s/{yabb tabtext}/$tabmenu_txt{'tabtext'}/sm;
62    $yyaddtab =~ s/{yabb taburl}/$tabmenu_txt{'taburl'}/sm;
63    $yyaddtab =~ s/{yabb tabwin}/$tabmenu_txt{'tabwin'}/sm;
64    $yyaddtab =~ s/{yabb tabview}/$tabmenu_txt{'tabview'}/sm;
65    $yyaddtab =~ s/{yabb viewall}/$tabmenu_txt{'viewall'}/sm;
66    $yyaddtab =~ s/{yabb viewmem}/$tabmenu_txt{'viewmem'}/sm;
67    $yyaddtab =~ s/{yabb viewgm}/$tabmenu_txt{'viewgm'}/sm;
68    $yyaddtab =~ s/{yabb viewadm}/$tabmenu_txt{'viewadm'}/sm;
69    $yyaddtab =~ s/{yabb tabinsert}/$tabmenu_txt{'tabinsert'}/sm;
70    $yyaddtab =~ s/{yabb addtab}/$tabmenu_txt{'addtab'}/sm;
71    $yyaddtab =~ s/{yabb edittabs}/$edittabs/sm;
72
73    return $yyaddtab;
74}
75
76sub AddNewTab2 {
77    if ($iamadmin) {
78        my $tabtext = $FORM{'tabtext'};
79        my $taburl  = $FORM{'taburl'};
80        $taburl =~ s/"/\%22/gxsm;    #";
81        my $tabwin         = $FORM{'tabwin'} ? 1 : 0;
82        my $tabview        = $FORM{'showto'};
83        my $tabafter       = $FORM{'addafter'};
84        my $tmpusernamereq = 0;
85
86        #Carsten's fix - nice and neat/';#
87        if ( $taburl !~ /[ht|f]tp[s]{0,1}:\/\//xsm ) {
88            $taburl = qq~http://$taburl~;
89        }
90        if (   $taburl =~ /$boardurl\/$yyexec\.$yyaext/ixsm
91            && $taburl =~ /action\=(.*?)(\;|\Z)/ixsm )
92        {
93            $taburl      = 1;
94            $tabaction   = $1;
95            $tmpisaction = 1;
96        }
97        elsif ($taburl =~ /$boardurl\/AdminIndex\.$yyaext/ixsm
98            && $taburl =~ /action\=(.*?)(\;|\Z)/ixsm )
99        {
100            $taburl      = 2;
101            $tabaction   = $1;
102            $tmpisaction = 1;
103        }
104        else {
105            $tabaction = lc $tabtext;
106            $tabaction =~ s/ /\_/gsm;
107            $tmpisaction = 0;
108        }
109        $tabaction =~ s/\W/_/gxsm;
110        map {
111            if ( $_ =~ /^$tabaction\|?/xsm )
112            {
113                fatal_error( 'tabext', $tabaction );
114            }
115        } @AdvancedTabs;
116
117        if ( $taburl == 1 || $taburl == 2 ) {
118            if ( $FORM{'taburl'} =~ m/username\=/ixsm ) { $tmpusernamereq = 1; }
119            $exttaburl = $FORM{'taburl'};
120            $exttaburl =~ s/(.*?)\?(.*?)/$2/gxsm;
121            $exttaburl =~ s/action\=(.*?)(\;|\Z)//ixsm;
122            $exttaburl =~ s/username\=(.*?)(\;|\Z)//ixsm;
123        }
124        else {
125            $exttaburl = q{};
126        }
127
128        ToHTML($tabtext);
129
130        opendir DIR, $langdir;
131        my @languages = readdir DIR;
132        closedir DIR;
133        foreach my $lngdir (@languages) {
134            next
135              if $lngdir eq q{.} || $lngdir eq q{..} || !-d "$langdir/$lngdir";
136            undef %tabtxt;
137            if ( fopen( TABTXT, "$langdir/$lngdir/tabtext.txt" ) ) {
138                %tabtxt = map { /(.*)\t(.*)/xsm } <TABTXT>;
139                fclose(TABTXT);
140            }
141            $tabtxt{$tabaction} = $tabtext;
142            fopen( TABTXT, ">$langdir/$lngdir/tabtext.txt" )
143              or fatal_error( 'file_not_open', "$langdir/$lngdir/tabtext.txt",
144                1 );
145            print {TABTXT} map { "$_\t$tabtxt{$_}\n" } keys %tabtxt
146              or croak "$croak{'print'} TABTXT";
147            fclose(TABTXT);
148        }
149
150        my @new_tabs_order;
151        if ( $tabafter eq 'thefront' ) {
152            push @new_tabs_order,
153qq~$tabaction|$taburl|$tmpisaction|$tmpusernamereq|$tabview|$tabwin|$exttaburl~;
154        }
155        foreach (@AdvancedTabs) {
156            push @new_tabs_order, $_;
157            if (/^$tabafter\|?/xsm) {
158                push @new_tabs_order,
159qq~$tabaction|$taburl|$tmpisaction|$tmpusernamereq|$tabview|$tabwin|$exttaburl~;
160            }
161        }
162        @AdvancedTabs = @new_tabs_order;
163
164        require Admin::NewSettings;
165        SaveSettingsTo('Settings.pm');
166    }
167
168    $yySetLocation = $scripturl;
169    redirectexit();
170    return;
171}
172
173sub EditTab {
174    get_micon();
175    GetTexttab();
176    $tabsave  = $micon{'tabsave'};
177    $tabdel   = $micon{'tabdel'};
178    %edittab= ();
179    my @tablist = qw(home help search ml eventcal birthdaylist admin revalidatesession login register guestpm mycenter logout);
180## Mod hook tablist ##
181## End Mod hook tablist ##
182    for (@tablist) {
183        $edittab{$_} = qq~<span class="tabstyle">$tabfill$texttab{$_}$tabfill</span>~;
184    }
185
186    my $selsize   = 0;
187    my $isexttabs = 0;
188    for my $i ( 0 .. ( @AdvancedTabs - 1 ) ) {
189        if ( $AdvancedTabs[$i] =~ /\|/xsm ) {
190            my ( $tab_key, $tmptab_url, $isaction, $username_req, $tab_access,
191                $dummy )
192              = split /\|/xsm, $AdvancedTabs[$i], 6;
193            my $enc_key = $tab_key;
194            $enc_key =~ s/\&/%26/gxsm;
195            $isexttabs++;
196            if (   !$tab_access
197                || ( $tab_access < 2 && !$iamguest )
198                || ( $tab_access < 3 && $iamgmod )
199                || $iamadmin )
200            {
201                if ( $tmptab_url == 1 ) { $tab_url = qq~$scripturl~; }
202                elsif ( $tmptab_url == 2 ) {
203                    $tab_url = qq~$boardurl/AdminIndex.$yyaext~;
204                }
205                else { $tab_url = qq~$tmptab_url~; }
206                if ($isaction) { $tab_url .= qq~?action=$tab_key~; }
207                if ($username_req) {
208                    $tab_url .= qq~;username=$useraccount{$username}~;
209                }
210                $inputlength = length $tabtxt{$tab_key};
211                $edittab{$tab_key} =
212qq~<form action="$scripturl?action=edittab2;savetab=$enc_key" method="post" name="$tab_key$isexttabs" style="display: inline; white-space: nowrap;" accept-charset="$yymycharset">~;
213                $edittab{$tab_key} .=
214qq~<input type="text" name="$tab_key" id="$tab_key" value="$tabtxt{$tab_key}" size="$inputlength" class="edittab" />~;
215                $edittab{$tab_key} .=
216qq~<input type="image" src="$micon_bg{'tabsave'}" alt="$tabmenu_txt{'savetab'}" title="$tabmenu_txt{'savetab'}" class="editttab_img" />~;
217                $edittab{$tab_key} .=
218qq~ <a href="$scripturl?action=deletetab;deltab=$enc_key" style="padding:0; margin:0">$tabdel</a>~;
219                $edittab{$tab_key} .= q~</form>~;
220                $edittabs .=
221                  qq~<option value="$tab_key"~
222                  . (
223                    $tab_key eq $INFO{'thetab'} ? ' selected="selected"' : q{} )
224                  . qq~>$texttab{$tab_key}</option>~;
225                $edittabmenu .= qq~<li>$edittab{$tab_key}</li>~;
226                $selsize++;
227            }
228        }
229        elsif ( $edittab{ $AdvancedTabs[$i] } ) {
230            $edittabs .= qq~<option value="$AdvancedTabs[$i]"~
231              . (
232                $AdvancedTabs[$i] eq $INFO{'thetab'}
233                ? ' selected="selected"'
234                : q{}
235              ) . qq~>$texttab{$AdvancedTabs[$i]}</option>~;
236            $edittabmenu .= qq~<li>$edittab{ $AdvancedTabs[$i] }</li>~;
237            $selsize++;
238        }
239    }
240    if ( $selsize > 11 ) { $selsize = 11; }
241
242    $yyaddtab = $brd_advanced_tabs_edit;
243    $yyaddtab =~ s/{yabb edittabmenu}/$edittabmenu/sm;
244    $yyaddtab =~ s/{yabb reordertab}/$tabmenu_txt{'reordertab'}/sm;
245    $yyaddtab =~ s/{yabb selsize}/$selsize/sm;
246    $yyaddtab =~ s/{yabb edittabs}/$edittabs/sm;
247    $yyaddtab =~ s/{yabb edittabs}/$edittabs/sm;
248    $yyaddtab =~ s/{yabb tableft}/$tabmenu_txt{'tableft'}/sm;
249    $yyaddtab =~ s/{yabb tabright}/$tabmenu_txt{'tabright'}/sm;
250    $yyaddtab =~ s/{yabb edittext1}/$tabmenu_txt{'edittext1'}/sm;
251    $yyaddtab =~ s/{yabb tabsave}/$tabsave/sm;
252    $yyaddtab =~ s/{yabb edittext2}/$tabmenu_txt{'edittext2'}/sm;
253    $yyaddtab =~ s/{yabb tabdel}/$tabdel/sm;
254    $yyaddtab =~ s/{yabb edittext3}/$tabmenu_txt{'edittext3'}/sm;
255    $yyaddtab =~ s/{yabb reordertext}/$tabmenu_txt{'reordertext'}/sm;
256
257    undef %edittab;
258    return;
259}
260
261sub EditTab2 {
262    if ($iamadmin) {
263        $tosave = $INFO{'savetab'};
264        $tosave =~ s/%26/&/gxsm;
265        $tosavetxt = $FORM{$tosave};
266        ToHTML($tosavetxt);
267        $tab_lang = $language ? $language : $lang;
268        fopen( TABTXT, "$langdir/$tab_lang/tabtext.txt" )
269          or fatal_error( 'file_not_open', "$langdir/$tab_lang/tabtext.txt" );
270        %tabtxt = map { /(.*)\t(.*)/xsm } <TABTXT>;
271        fclose(TABTXT);
272        $tabtxt{$tosave} = $tosavetxt;
273        fopen( TABTXT, ">$langdir/$tab_lang/tabtext.txt" )
274          or fatal_error( 'file_not_open', "$langdir/$tab_lang/tabtext.txt" );
275        print {TABTXT} map { "$_\t$tabtxt{$_}\n" } keys %tabtxt
276          or croak "$croak{'print'} TABTXT";
277        fclose(TABTXT);
278    }
279
280    $yySetLocation = $scripturl;
281    redirectexit();
282    return;
283}
284
285sub ReorderTab {
286    my $moveitem = $FORM{'ordertabs'};
287    if ($iamadmin) {
288        if ($moveitem) {
289            if ( $FORM{'moveleft'} ) {
290                for my $i ( 0 .. ( @AdvancedTabs - 1 ) ) {
291                    if ( $AdvancedTabs[$i] =~ /^$moveitem\|?/xsm && $i > 0 ) {
292                        my $j = $i - 1;
293                        my $x = $AdvancedTabs[$i];
294                        $AdvancedTabs[$i] = $AdvancedTabs[$j];
295                        $AdvancedTabs[$j] = $x;
296                        last;
297                    }
298                }
299            }
300            elsif ( $FORM{'moveright'} ) {
301                for my $i ( 0 .. ( @AdvancedTabs - 1 ) ) {
302                    if (   $AdvancedTabs[$i] =~ /^$moveitem\|?/xsm
303                        && $i < $#AdvancedTabs )
304                    {
305                        my $j = $i + 1;
306                        my $x = $AdvancedTabs[$i];
307                        $AdvancedTabs[$i] = $AdvancedTabs[$j];
308                        $AdvancedTabs[$j] = $x;
309                        last;
310                    }
311                }
312            }
313        }
314
315        require Admin::NewSettings;
316        SaveSettingsTo('Settings.pm');
317    }
318
319    $yySetLocation = qq~$scripturl?action=edittab;thetab=$moveitem~;
320    redirectexit();
321    return;
322}
323
324sub DeleteTab {
325    if ($iamadmin) {
326        my $todelete = $INFO{'deltab'};
327        $todelete =~ s/%26/&/gxsm;
328
329        opendir DIR, $langdir;
330        @languages = readdir DIR;
331        closedir DIR;
332        foreach my $lngdir (@languages) {
333            if (   $lngdir eq q{.}
334                || $lngdir eq q{..}
335                || !-d "$langdir/$lngdir"
336                || !-e "$langdir/$lngdir/tabtext.txt" )
337            {
338                next;
339            }
340            fopen( TABTXT, "$langdir/$lngdir/tabtext.txt" )
341              or fatal_error( 'file_not_open', "$langdir/$lngdir/tabtext.txt" );
342            %tabtxt = map { /(.*)\t(.*)/xsm } <TABTXT>;
343            fclose(TABTXT);
344            delete $tabtxt{$todelete};
345            if ( !%tabtxt ) {
346                unlink "$langdir/$lngdir/tabtext.txt";
347            }
348            else {
349                fopen( TABTXT, ">$langdir/$lngdir/tabtext.txt" );
350                print {TABTXT} map { "$_\t$tabtxt{$_}\n" } keys %tabtxt
351                  or croak "$croak{'print'} TABTXT";
352                fclose(TABTXT);
353            }
354        }
355
356        my @new_tabs_order;
357        foreach (@AdvancedTabs) {
358            if ( $_ !~ /^$todelete\|?/xsm ) { push @new_tabs_order, $_; }
359        }
360        @AdvancedTabs = @new_tabs_order;
361        require Admin::NewSettings;
362        SaveSettingsTo('Settings.pm');
363    }
364
365    $yySetLocation = $scripturl;
366    redirectexit();
367    return;
368}
369
370sub GetTexttab {
371    $texttab{'home'}              = $img_txt{'103'};
372    $texttab{'help'}              = $img_txt{'119'};
373    $texttab{'search'}            = $img_txt{'182'};
374    $texttab{'ml'}                = $img_txt{'331'};
375    $texttab{'eventcal'}          = $img_txt{'eventcal'};
376    $texttab{'birthdaylist'}      = $img_txt{'birthdaylist'};
377    $texttab{'admin'}             = $img_txt{'2'};
378    $texttab{'revalidatesession'} = $img_txt{'34a'};
379    $texttab{'login'}             = $img_txt{'34'};
380    $texttab{'register'}          = $img_txt{'97'};
381    $texttab{'guestpm'}           = $img_txt{'pmadmin'};
382    $texttab{'mycenter'}          = $img_txt{'mycenter'};
383    $texttab{'logout'}            = $img_txt{'108'};
384## Mod Hook GetTextTab ##
385## End Mod Hook GetTextTab ##
386    if ( !$tab_lang ) { GetTabtxt(); }
387    foreach ( keys %tabtxt ) { $texttab{$_} = $tabtxt{$_}; }
388    return;
389}
390
3911;
392