Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/_gentweakpage.tmpl
[%#
ts_conf - REQUIRED
ts_texts
tweakmodule
tweakcfg
conf
nocontainers
changed_settings (optional for tweaksettings only right now)
-%]
[% USE ServerRoles -%]
[% USE JSON -%]
[% USE Whostmgr -%]
[% USE CPHash -%]
[% USE CPScalar -%]
[% USE CPSort -%]
[% USE Encoder -%]
<!-- prevent password autofill -->
<input type="text" style="display:none">
<input type="password" autocomplete='off' style="display:none">
<style type="text/css">
#find_container {
float: right;
margin-left: 6px;
margin-right: 6px;
}
.noradio {
width: 95%;
}
.yui-navset {
position: static; /* override tabview.css */
}
</style>
[%# could not get scrolling tabs to behave in IE6 -%]
[% SET this_is_ie6 = CPANEL.ua_is_ie().match('^6'); -%]
[% bootstrap = bootstrap; %]
<input type="hidden" name="module" value="[% tweakmodule %]" />
<!--
<table width="98%" class="datatable tweaksettings">
-->
<script type="text/javascript">
var tweak_controls = [];
</script>
[% UNLESS nocontainers -%]
<div class="tweaksettings">
<div id="promptBeforeSelect" style="visibility:hidden">
<div id="promptHd" class="hd"></div>
<div id="promptBd" class="bd"></div>
<div id="promptFt" class="ft">
<button id="promptOk"
class="btn-primary btn-small"
type="button">
[% locale.maketext('Continue') %]
</button>
<button id="promptCancel"
class="btn-secondary btn-small"
type="button">
[% locale.maketext('Cancel') -%]
</button>
</div>
</div>
<div class="" style="align:left;" >
<div id="tweaktabs" class="yui-navset">
<div id="find_container">
<span class="jumptext">[% locale.maketext("Find") %] </span>
<input type="text" name="find" id="quickjump" onKeyUp="try {searchpage(this);} catch(e) {}" style="width:130px;"[% IF bootstrap -%] class="form-control"[% END -%]>
<b style="display:none;" id="clearlnk" class="smalltext"><a onClick="try {clearsearch()} catch(e) {};return false;" href="javascript:void(0)">x</a></b>
<span id="gosearch" class="smalltext[% IF bootstrap -%] text-danger[% END -%]" style="display:none; margin: 0 auto">[% locale.maketext("No Matches") %]</span>
</div>
[% END -%]
[%
SET extrascript = '';
IF tweakcfg.extra_settings;
FOR settings_key = tweakcfg.extra_settings.keys;
ts_conf.$settings_key = tweakcfg.extra_settings.$settings_key;
END;
END;
SET TS_display = ts_display || ts_texts.TS_display;
SET make_tabs = TS_display.size > 1;
SET hide_group = {};
FOR group_item = TS_display;
SET shown = 0;
FOR setting_name = group_item.1;
SET cur_settings = ts_conf.$setting_name;
# Sometimes ts_conf is pre-filtered to have removed
# role-restricted settings. This handles those cases.
IF !cur_settings;
NEXT;
END;
IF !cur_settings.needs_role || ServerRoles.are_roles_enabled(cur_settings.needs_role);
shown = 1;
LAST;
END;
END;
IF !shown;
hide_group.${group_item.0} = 1;
END;
END;
IF make_tabs;
UNLESS this_is_ie6;
'<div id="left_scroll_button" class="scroll_button inactive"> < </div>';
'<div id="right_scroll_button" class="scroll_button"> > </div>';
'<div id="scrolling_tabs_container" valign="bottom">';
'<div id="scrolling_tabs" class="yui_tabview_scroll_tabs">';
END;
'<ul id="yui_tabs" class="yui-nav">';
FOR group_item = TS_display;
SET group = group_item.0;
IF !hide_group.$group;
SET groupkey = group.replace('[^A-Za-z0-9]','');
SET class_html = loop.last ? ' class="last"' : '';
"\t<li$class_html><a href='#tab_${groupkey}'><em>${group}</em></a></li>\n";
END;
END;
'</ul>' _ "\n";
UNLESS this_is_ie6;
'</div>';
'</div>';
END;
END;
'<div id="alltweaks" class="yui-content">' _ "\n\n";
FOR group_item = TS_display;
SET group = group_item.0;
IF hide_group.$group;
NEXT;
END;
SET groupkey = group.replace('[^A-Za-z0-9]','');
SET header_text = ts_headers
? ts_headers.$group
? ts_headers.$group.txt
: ''
: ''
;
'<div id="' _ 'tab_' _ groupkey _ '">';
WRAPPER '_brick.tmpl'
bootstrap = bootstrap
norow=1
bricktitle = group _ ( header_text ? " $header_text" : '' )
brickid = "group_" _ groupkey
brickclass = "settingsgroup"
;
#do this because we do NEXT IF to some of the rows, which would give
#two rows with the same color using loop.index
SET row_index = 0;
SET sorted_keys = group_item.1;
IF tweakcfg.extra_texts && tweakcfg.extra_texts.$group;
SET extra_keys = tweakcfg.extra_texts.$group.keys.sort();
SET sorted_keys = sorted_keys.merge( extra_keys );
FOR extra_key = extra_keys;
SET ts_texts.$extra_key = tweakcfg.extra_texts.$group.$extra_key;
END;
END;
FOR key = sorted_keys;
"\n<!-- |$group| |$key| -->\n";
SET cur_settings = ts_conf.$key;
# Sometimes ts_conf is pre-filtered to have removed
# role-restricted settings. This handles those cases.
IF !cur_settings;
NEXT;
END;
SET cur_texts = ts_texts.$key;
SET cur_label = cur_texts.label || cur_settings.label;
NEXT IF cur_settings.exists( 'skipif' )
&& ref( \cur_settings.skipif ) == 'CODE'
&& cur_settings.skipif( conf )
;
SET row_index = row_index + 1;
SET tclass = row_index % 2 ? 'tdshade1_noborder' : 'tdshade2_noborder';
'<input type="hidden" name="___original_' _ key.cpanel_safe_html_encode_str() _ '" value="' _ conf.$key.cpanel_safe_html_encode_str() _ '">';
IF ! conf.$key.defined;
'<input type="hidden" name="___undef_original_' _ key.cpanel_safe_html_encode_str() _ '" value="1">';
END;
IF cur_settings.needs_role && !ServerRoles.are_roles_enabled(cur_settings.needs_role);
NEXT;
END;
SET this_is_a_button = cur_settings && cur_settings.type == 'button';
IF this_is_a_button;
IF cur_settings && cur_settings.popup;
SET button_html = "<a onclick='return quick_popup_button(this," _ cur_label.json _ ");' target=\"${cur_settings.target}\" class=\"btn-primary\" href=\"${cur_settings.action}\">${cur_texts.button}</a>";
ELSE;
SET button_html = "<a target=\"${cur_settings.target}\" class=\"btn-primary\" href=\"${cur_settings.action}\">${cur_texts.button}</a>";
END;
#if no label, put the button on the left and then go to the next setting
IF !cur_texts.label;
"<tr class='$tclass'><td class='label_and_help' style='text-align:left'>";
button_html;
'</td><td></td></tr>';
NEXT;
END;
END;
SET newoption_title = '';
IF changed_settings && changed_settings.exists(key);
SET newoption = !this_is_a_button;
IF newoption;
SET newoption_title = locale.maketext('The setting, [_1], has changed since the last time you saved this page.',key);
END;
ELSE;
SET newoption = !this_is_a_button && !conf.exists( key );
IF newoption;
SET newoption_title = locale.maketext('The setting, [_1], was not set in the configuration file, so the default has been used.',key);
IF cur_settings.exists('default');
SET conf.$key = cur_settings.default;
END;
END;
END;
IF cur_settings.requires_test;
extrascript = extrascript _ "register_requires_test( '$key', '"
_ cur_settings.requires_test.join("','")
_ "')\n"
;
END;
IF cur_settings.excludes;
SET excludes = ref ( cur_settings.excludes ) == 'ARRAY'
? cur_settings.excludes
: cur_settings.excludes.split(',')
;
FOR exclusion = excludes;
IF exclusion != key; #cannot exclude self
extrascript = extrascript _ "register_exclude('$key','$exclusion');\n";
END;
END;
END;
IF cur_settings.requires;
SET requirements = ref ( cur_settings.requires ) == 'ARRAY'
? cur_settings.requires
: cur_settings.requires.split(',')
;
FOR requirement = requirements;
IF requirements != key; #cannot require self
extrascript = extrascript _ "register_requires('$key','$requirement');\n";
END;
END;
END;
IF cur_settings.depends;
FOR dep = cur_settings.depends;
extrascript = extrascript _ "register_depends('$key','$dep');\n";
END;
END;
IF cur_settings.exists('value');
#ignore the value in the config file and use the value supplied
conf.$key = cur_settings.value(conf);
END;
SET unformatted_value = conf.$key;
SET formatted_value = cur_settings.exists( 'format' ) && ref( \cur_settings.format ) == 'CODE'
? cur_settings.format( unformatted_value )
: unformatted_value
;
SET formatted_value_enc = formatted_value.cpanel_safe_html_encode_str();
IF newoption || this_is_a_button || cur_settings.type == 'multiselect';
SET is_invalid = 0;
ELSE;
#undef values are "special"
IF cur_settings.type == 'number' && !formatted_value.length;
SET formatted_value = UNDEF;
SET is_invalid = 0;
END;
IF formatted_value.defined();
TRY;
SET is_invalid = cur_settings.exists( 'checkval' )
&& ref( \cur_settings.checkval ) == 'CODE'
&& ! cur_settings.checkval( formatted_value ).defined();
CATCH;
SET is_invalid = 1;
END;
ELSE;
#if undef but setting can't disable, then that's invalid
SET is_invalid = !cur_settings.can_undef;
END;
END;
IF is_invalid;
SET tclass = tclass _ ' invalid';
END;
SET range_html = [];
IF cur_settings.exists('minimum');
SET minimum = cur_settings.minimum;
# If a special formatter is being applied to the displayed value, the same
# needs to be done to the displayed minimum, if any.
IF cur_settings.exists( 'format' ) && ref( \cur_settings.format ) == 'CODE';
minimum = cur_settings.format( minimum );
END;
range_html.push( locale.maketext('Minimum: [numf,_1]',minimum) );
END;
IF cur_settings.exists('maximum');
SET maximum = cur_settings.maximum;
IF cur_settings.exists( 'format' ) && ref( \cur_settings.format ) == 'CODE';
maximum = cur_settings.format( maximum );
END;
range_html.push( locale.maketext('Maximum: [numf,_1]',maximum) );
END;
SET range_html = ( range_html.size > 0 )
? ' <span class="range">(' _ range_html.join('; ') _ ')</span>'
: UNDEF
;
SET newoption_html = '';
IF newoption;
SET newoption_html = '<span id="' _ key _ '_warning" title="' _ newoption_title _ '" class="changed_setting"> </span> ';
END;
SET cur_help = cur_texts.help || cur_settings.help;
IF tweakcfg.display_label;
IF !cur_help;
SET display_html = "<div id='label-$key'>${newoption_html}${cur_label}${range_html}</div>";
ELSIF tweakcfg.always_show_help;
SET display_html = "<div id='label-$key'>${newoption_html}${cur_label}${range_html}</div>"
_ "<div>"
_ "<div class='help' id='help-$key'>$cur_help</div>"
_ '</div>';
ELSE;
SET display_html = "<div id='label-$key'>${newoption_html}${cur_label}${range_html}"
_ " <a href='javascript:void(0)' onclick='showhelp(\"$key\"); return false;'>[?]</a>"
_ '</div>'
_ "<div>"
_ "<div class='help' id='help-$key' style='display:none;'>$cur_help</div>"
_ '</div>'
;
END;
ELSE;
# Adding an alert warning to inform users that their website stats are not available because of
# the 'common' setting as LOGSTYLE.
IF key == "LOGSTYLE" && formatted_value == "common";
SET common_setting_warning =
"<div class='alert alert-warning'>"
_ locale.maketext("Your “[_1]” uses the “[_2]” setting. Your website’s stats may not function.", "LOGSTYLE", "COMMON")
_ "</div>";
SET display_html = common_setting_warning _ cur_help;
ELSE;
SET display_html = cur_help _ range_html;
END;
END;
"<tr id='${key}_container' class='$tclass'>\n";
"<td class='label_and_help' id='labelhelp-$key'>"
_ (debug ? "<b>$key</b> " : '' )
_ display_html
_ ( is_invalid
? '<br /><br/><span class="warning">The current value for this field is invalid. You must update it.</span>'
: ''
)
_ "</td>\n"
;
"<td class='controls' valign='middle'>";
SWITCH cur_settings.type;
CASE [ 'button' ];
button_html; #assembled earlier
CASE [ 'path' 'text' 'number' 'size' 'password' ];
SET text_type = cur_settings.type == 'password'
? 'password'
: 'text'
;
SET input_maxlength = cur_settings.exists('maxlength')
? " maxlength='${cur_settings.maxlength}'"
: ''
;
IF cur_settings.exists('maxlength') && cur_settings.maxlength && cur_settings.exists('size') && cur_settings.size;
SET input_size = " size='${cur_settings.size}'";
ELSIF cur_settings.exists('maxlength') && cur_settings.maxlength;
SET input_size = " size='${cur_settings.maxlength}'";
ELSIF cur_settings.exists('width') && cur_settings.width;
SET input_size = " size='${cur_settings.width}'";
ELSE;
SET input_size = '';
END;
SET buttons = [];
SET use_radio_buttons = cur_settings.options || cur_settings.can_undef || cur_settings.defined( 'default' );
SET cur_radios = cur_settings.options;
IF !cur_radios && (cur_settings.can_undef || cur_settings.defined( 'default' ));
cur_radios = [];
# Note: order in which we push items to the list matters, so we can't
# collapse the if logic nicely here.
IF cur_settings.can_undef && cur_settings.item( 'default' ).length != 0;
cur_radios.push(UNDEF);
END;
IF cur_settings.defined( 'default' );
cur_radios.push(cur_settings.default);
END;
IF cur_settings.defined( 'pci' );
cur_radios.push(cur_settings.pci);
END;
END;
IF cur_radios;
"<script type='text/javascript'>tweak_controls.push( '$key' )</script>";
SET selected_radio = '';
FOR cur_radio = cur_radios;
IF !cur_radio.defined;
SET undef_is_default = cur_settings.exists( 'default' )
&& ! cur_settings.defined( 'default' )
;
IF ( undef_is_default );
SET extrascript = extrascript
_ "default_values['$key'] = null;\n";
END;
IF is_invalid;
SET check_undef = undef_is_default;
ELSE;
SET check_undef = !formatted_value.defined();
END;
IF check_undef;
selected_radio = 'undef';
END;
buttons.push( '<label>'
_ "<input type='radio' name='${key}_control' value='undef'"
_ " id='${key}_undef'"
_ ( check_undef ? ' checked="checked"' : '' )
_ ' onclick="checktweaks()"'
_ ' />'
_ ( cur_texts.undef || cur_settings.can_undef )
_ ( undef_is_default ? ' <span class="' : '' )
_ ( ( bootstrap && undef_is_default ) ? 'label label-' : '' )
_ ( undef_is_default ? 'default">default</span>' : '' )
_ '</label>'
);
ELSIF cur_radio == cur_settings.default;
#in case any Javascript tests on the value
SET js_default = cur_settings.default.match('\A\d+(?:\.\d+)\z')
? cur_settings.default + 0
: "'${cur_settings.default}'"
;
SET extrascript = extrascript
_ "default_values['$key'] = $js_default;\n";
SET cur_default = cur_settings.default;
SET default_text = cur_settings.default_text || cur_default;
SET cur_radio_checked = is_invalid || formatted_value == cur_default;
IF cur_radio_checked;
selected_radio = 'default';
END;
buttons.push( '<label>'
_ "<input type='radio' name='${key}_control' value='default'"
_ ( cur_radio_checked ? ' checked="checked"' : '' )
_ ' onclick="checktweaks()"'
_ ' /> '
_ default_text
_ ( cur_settings.exists( 'unit' ) ? " ${cur_settings.unit}" : '' )
_ ' <span class="'
_ ( bootstrap ? 'label label-' : '' )
_ 'default">default</span>'
_ '</label>'
);
ELSIF cur_radio == cur_settings.pci;
SET pci_text = cur_settings.pci_text || cur_settings.pci;
SET cur_radio_checked = (formatted_value == cur_settings.pci);
IF cur_radio_checked;
selected_radio = 'pci';
END;
buttons.push( '<label>'
_ "<input type='radio' name='${key}_control' value='pci'"
_ ( cur_radio_checked ? ' checked="checked"' : '' )
_ ' onclick="checktweaks()"'
_ ' />'
_ (pci_text || cur_settings.pci)
_ ( cur_settings.exists( 'unit' ) ? " ${cur_settings.unit}" : '' )
_ ' <span class="pci">PCI recommended</span>'
_ '</label>'
);
ELSE;
SET text_key = "custom_${cur_radio}";
SET cur_radio_text = cur_texts.custom.$cur_radio;
SET cur_radio_text = cur_radio_text.html();
IF !cur_radio_text;
cur_radio_text = cur_radio.html();
cur_radio_text = cur_radio _ ( cur_settings.exists( 'unit' ) ? " ${cur_settings.unit}" : '' );
END;
SET cur_radio_checked = (formatted_value == cur_radio);
IF cur_radio_checked;
selected_radio = "custom_$cur_radio";
END;
cur_radio_html = cur_radio.html();
buttons.push( '<label>'
_ "<input type='radio' name='${key}_control' value=\"custom_${cur_radio_html}\""
_ ( cur_radio_checked ? ' checked="checked"' : '' )
_ ' onclick="checktweaks()"'
_ ' />'
_ cur_radio_text
_ '</label>'
);
END;
END;
SET custom_selected = !selected_radio;
SET disabled_html = custom_selected
? ''
: ' disabled="disabled"'
;
SET checked_html = custom_selected
? ' checked="checked"'
: ''
;
SET default_input_value = formatted_value.defined()
? formatted_value_enc
: cur_settings.default
;
buttons.push(
( bootstrap ?
"<div class='input-group'>"
_ "<div class='input-group-addon'>"
_ "<input type='radio' onclick='checktweaks()' name='${key}_control' value='other' $checked_html />"
_ "</div>"
_ "<input onkeyup='checktweaks()' id='$key' name='${key}_other' type='$text_type' $input_size $input_maxlength $disabled_html value=\"$default_input_value\" class='form-control' />"
_ "</div>"
:
"<input type='radio' onclick='checktweaks()' name='${key}_control' value='other' $checked_html />"
_ "<input onkeyup='checktweaks()' id='$key' name='${key}_other' type='$text_type' autocomplete='off' $input_size $input_maxlength $disabled_html value=\"$default_input_value\" />"
_ ( key.match('TTL$') ? '<br><br><i>' _ locale.maketext('Required') _ '</i>' : '' )
)
_ ( cur_settings.exists( 'unit' ) ? " ${cur_settings.unit}" : '' )
);
ELSE; #no buttons, simple text field
SET disabled_html = cur_settings.can_undef && ! formatted_value.defined()
? 'disabled="disabled"'
: ''
;
"<input class='noradio' onkeyup=\"checktweaks('$key');\" id='$key' type='$text_type' autocomplete='off' $disabled_html"
_ " name='$key'$input_size $input_maxlength value=\"$formatted_value_enc\" />"
_ ( cur_settings.unit.defined() ? " ${cur_settings.unit}" : '' )
;
IF key == 'ADDR';
'<br><br><i>' _ locale.maketext('Required') _ '</i>';
END;
END;
'<div class="brickcontainer">'; #weird hack to achieve centering...
"<ul onclick='check_tweak_controls(\"$key\", true)' style='text-align: left; list-style-type: none; padding: 0px; margin: 0 auto'>";
"<li>" _ buttons.join('</li><li>') _ '</li>';
'</ul></div>';
CASE 'textarea';
"<textarea name='$key'>$formatted_value_enc</textarea>";
CASE 'multiselect';
'<div class="brickcontainer" style="text-align: left">';
FOR opt = cur_settings.options;
SET checked_html = conf.$key.$opt ? 'checked="checked"' : '';
# NB: If every option is hidden then the user will see
# no controls, which is awkward. If that’s ever a
# possibility, we’ll need to make this smarter.
IF cur_settings.hidden.grep("$opt").size();
IF checked_html;
"<input type='hidden' name='${key}' value='${opt}' />";
END;
NEXT;
ELSE;
SET label = cur_texts.optionlabels.$opt || cur_settings.optionlabels.$opt || opt;
IF cur_settings.default.$opt;
label = label _ " <span class='"
_ ( bootstrap ? "label label-" : "" )
_ "default'>default</span>";
END;
IF cur_settings.pci.$opt;
label = label _ " <span class='pci'>PCI Recommended</span>";
END;
"<label><input type='checkbox' name='${key}' value='${opt}' $checked_html /> $label</label><br />";
END;
END;
'</div>';
CASE [ 'select', 'locale' ];
IF cur_settings.sorter;
SET select_options = cur_settings.sorter( cur_settings.options );
ELSE;
SET select_options = cur_settings.options.sort();
END;
SET cur_option_in_options = 0;
SET select_html = "<select id='${key}_select' name='${key}' onchange='checktweaks()'"
_ ( bootstrap ? " class='form-control'" : "" )
_ ">";
IF cur_settings.type == 'locale';
data.selected_locale = conf.$key || cur_settings.default || 'en';
options_html = PROCESS '_locale_option_tags.tmpl';
SET select_html = select_html _ options_html;
ELSE;
FOREACH opt = select_options;
IF opt == conf.$key;
SET cur_option_in_options = 1;
SET selected_html = 'selected="selected"';
ELSE;
SET selected_html = '';
END;
SET opt_html = cur_texts.optionlabels.$opt || cur_settings.optionlabels.$opt || opt;
SET select_html = select_html _ "<option ${selected_html} value='$opt'>$opt_html</option>";
END;
END;
SET select_html = select_html _ '</select>';
select_html = select_html _ '<div class="brickcontainer" style="text-align:left">';
IF cur_settings.exists('default');
IF cur_settings.type == 'locale';
SET cur_default = locale.get_locale_name(cur_settings.default);
ELSE;
SET cur_default = cur_settings.default;
END;
select_html = select_html _ '<br />' _ locale.maketext('System Default: [_1]',cur_default);
END;
IF cur_settings.exists('pci');
select_html = select_html _ '<br />' _ locale.maketext('PCI Recommendation: [_1]',cur_settings.pci);
END;
select_html = select_html _ '</div>';
SET use_radio_buttons = cur_settings.allow_other;
IF use_radio_buttons;
"<script type='text/javascript'>tweak_controls.push( '$key' )</script>";
'<div class="brickcontainer">'; #weird hack to achieve centering...
"<ul class='tweak_settings' onclick='check_tweak_controls(\"$key\", true)'>";
"<li>"
_ "<input type='radio' name='${key}_control' value=''"
_ ( cur_option_in_options ? ' checked="checked"' : '' )
_ ' />'
_ select_html
_ '</li>'
;
IF cur_settings.exists('maxlength') && cur_settings.maxlength;
SET input_size = " size='${cur_settings.maxlength}'";
ELSIF cur_settings.exists('width') && cur_settings.width;
SET input_size = " size='${cur_settings.width}'";
ELSE;
SET input_size = '';
END;
"<li>"
_ '<label>'
_ "<input type='radio' name='${key}_control' value='other'"
_ ( ! cur_option_in_options ? ' checked="checked"' : '' )
_ ' />'
_ 'Other:'
_ '</label>'
_ ' '
_ "<input type='text' $input_size id='${key}_other' name='${key}_other' value='$formatted_value_enc'"
_ ( bootstrap ? " class='form-control'" : "" )
_ " />"
_ '</li>'
_ ( key == 'ETHDEV' ? '<br><i>' _ locale.maketext('Required') _ '</i>' : '' )
;
'</ul></div>';
ELSE;
select_html;
END;
CASE [ 'radio' 'binary' 'inversebinary' ]; #radio buttons, with values specified in "options"
SET is_binary = cur_settings.type == 'binary' || cur_settings.type == 'inversebinary';
'<div class="brickcontainer">'; #weird hack to achieve centering...
'<ul class="tweak_settings'
_ (is_binary ? ' binary' : '')
_ '">'
;
SET cur_optionlabels = cur_texts.optionlabels || cur_settings.optionlabels;
IF cur_settings.exists( 'options' ) && cur_optionlabels;
FOREACH cur_option=cur_settings.options;
IF ref( cur_option ) != 'ARRAY' && CPHash.vmethod('exists',cur_optionlabels, cur_option);
SET cur_settings.options.${loop.index} = [
cur_optionlabels.$cur_option, cur_option,
];
END;
END;
END;
SET radio_options = cur_settings.options || ( cur_settings.type == 'inversebinary'
? [ [ 'On', 0 ], ['Off', 1 ] ]
: [ [ 'On', 1 ], ['Off', 0 ] ]
) ;
FOR cur_option = radio_options;
IF ref( cur_option ) == 'ARRAY';
SET real_option = cur_option.1;
SET disp_option = cur_option.0;
ELSE;
SET real_option = cur_option;
SET disp_option = cur_option;
END;
IF cur_settings.exists( 'default' )
&& real_option == cur_settings.default;
IF bootstrap;
SET spacer = ' ';
ELSE;
SET spacer = is_binary ? '<br />' : ' ';
END;
SET disp_option = disp_option _ "$spacer<span class='"
_ ( bootstrap ? "label label-" : "" )
_ "default'>default</span>";
END;
IF cur_settings.exists( 'pci' )
&& real_option == cur_settings.pci;
SET spacer = is_binary ? '<br />' : ' ';
SET disp_option = disp_option _ "$spacer<span class='pci'>PCI recommended</span>";
END;
radio_onclick_fn = "checktweaks()";
IF (key == "LOGSTYLE" && real_option == "common");
radio_onclick_fn = "promptBeforeSelection('" _ key _ "', '" _ formatted_value _ "')";
END;
"<li><label><input type='radio' id='${key}_${real_option}' name='$key' value='${real_option}'"
_ ( real_option == formatted_value ? ' checked="checked"' : '' )
_ ' onclick="'_ radio_onclick_fn _';" /> '
_ disp_option
_ '</label>'
_ '</li>'
;
END;
'</ul></div>';
END;
"</td>";
"</tr>\n";
END;
END;
'</div>';
END;
IF make_tabs;
'<div id="tab_All"></div>';
END;
'</div>';
-%]
[% UNLESS nocontainers -%]
</div>
</div>
</div>
<br />
<div class="clearit" style="clear:both; height: 1px; width: auto;"> </div>
[% END -%]
<script type="text/javascript">
function getQueryParamByName(name) {
var query = window.location.search.substring(1);
var parms = query.split('&');
for (var i = 0; i < parms.length; i++) {
var pos = parms[i].indexOf('=');
if (pos > 0) {
var key = parms[i].substring(0, pos);
var val = parms[i].substring(pos + 1);
if(key === name) {
return val;
}
}
}
return "";
}
var _TSForm = ( typeof TweakForm == 'undefined' ) //test if this is set
? document.forms[0]
: TweakForm
;
function quick_popup_button(thisEl,thisTitle) {
do_quick_popupbox({
title:thisTitle,
url:thisEl.href,
iframe:true,
buttons: { 'close':1, 'save-iframe':1 },
showloading:1
});
return false;
}
//https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter
function array_first( theArray, fun /* thisp*/) {
var len = theArray.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = new Array();
var thisp = arguments[2];
for (var i = 0; i < len; i++) {
if (i in theArray) {
var val = theArray[i];
if (fun.call(thisp, val, i, theArray)) {
return val;
}
}
}
return;
};
var requires = {};
var excludes = {};
var requires_tests = {};
var depends = {};
var default_values = {};
var current_config = [% conf.json %];
var _help_opened = {};
var _help_animating = {};
function showhelp(tid) {
if ( _help_animating[tid] ) return;
_help_animating[tid] = true;
var help_el = document.getElementById('help-' + tid);
var is_displayed = YAHOO.util.Dom.getRegion( help_el );
var label_el = document.getElementById('label-' + tid);
var slide;
if ( is_displayed ) {
slide = CPANEL.animate.slide_up(help_el);
}
else {
if ( !(tid in _help_opened) ) {
var td = document.getElementById('labelhelp-' + tid);
DOM.setStyle(td, 'padding-top', label_el.offsetTop + 'px');
DOM.setStyle(td, 'vertical-align', 'top');
var parent_width = CPANEL.dom.get_content_width( help_el.parentNode.offsetParent );
var extra_left = parseFloat( DOM.getStyle( help_el, "margin-left" ) ) || 0
+ parseFloat( DOM.getStyle( help_el, "border-left-width" ) ) || 0
+ parseFloat( DOM.getStyle( help_el, "padding-left" ) ) || 0
;
var extra_right = parseFloat( DOM.getStyle( help_el, "margin-right" ) ) || 0
+ parseFloat( DOM.getStyle( help_el, "border-right-width" ) ) || 0
+ parseFloat( DOM.getStyle( help_el, "padding-right" ) ) || 0
;
help_el.style.width = ( parent_width - extra_left - extra_right ) + "px";
_help_opened[tid] = 1;
}
slide = CPANEL.animate.slide_down(help_el);
}
slide.onComplete.subscribe( function() { delete _help_animating[tid] } );
}
function getoptval(tid) {
var El = DOM.get(tid);
if ( _TSForm[ tid + '_control' ] ) { //control radio buttons
var inputs = _TSForm[ tid + '_control' ];
var checked = array_first( inputs, function(i) { return i.checked } );
if ( checked === undefined || checked.value == 'undef' ) {
return false;
}
else if ( ( ! checked.value ) || checked.value == '0' ) {
return 0;
}
else if ( checked.value == 'default' ) {
return default_values[ tid ];
}
else if ( checked.value == 'other' ) {
return _TSForm[ tid + '_other' ].value;
}
else {
return 1;
}
}
else if ( El ) {
if (El.getAttribute('type') == 'text') { return El.value }
}
else { //radio buttons
var inputs = _TSForm[ tid ];
if (inputs) {
var checked = array_first( inputs, function(i) { return i.checked } );
return ( ( ! checked ) || ( ! checked.value ) || ( checked.value == '0' ) )
? false
: checked.value
;
}
}
if (current_config.hasOwnProperty(tid)) {
return current_config[tid];
}
return undefined;
}
function enable_control( key ) {
var control_buttons = _TSForm[ key + '_control' ];
var control_value;
if ( control_buttons ) {
for ( var c=0, ctl; ctl = control_buttons[c]; c++ ) {
ctl.disabled = false;
if ( ctl.checked ) {
control_value = ctl.value;
}
}
}
var controls = _TSForm[key];
if ( controls[0] ) {
for ( var c=0, ctl; ctl = controls[c]; c++ ) {
ctl.disabled = false;
}
}
else if ( ! control_value ) { //undefined, or empty string
controls.disabled = false;
}
var container = document.getElementById( key + '_container' );
var revert = document.getElementById( key + '_revert' );
var container_class = container.className.split(/\s+/);
var new_class = [];
for ( var c=0, cl; cl = container_class[c]; c++ ) {
if ( cl != 'disabled' ) {
new_class.push( cl );
}
}
container.className = new_class.join(' ');
if ( revert ) {
revert.disabled = false;
}
}
function disable_control( key ) {
var controls = _TSForm[key];
if ( controls[0] ) {
for ( var c=0, ctl; ctl = controls[c]; c++ ) {
ctl.disabled = true;
}
}
else {
controls.disabled = true;
}
var control_buttons = _TSForm[ key + '_control' ];
if ( control_buttons ) {
for ( var c=0, ctl; ctl = control_buttons[c]; c++ ) {
ctl.disabled = true;
}
}
var container = document.getElementById(key + '_container');
var revert = document.getElementById( key + '_revert' );
if ( ! container.className.match( /(?:^|\s)disabled(?:$|\s)/ ) ) {
container.className = container.className.split(/\s+/).concat('disabled').join(' ');
}
if ( revert ) {
revert.disabled = true;
}
}
//disables a control explicitly, not because something else is set
function set_disable( checkbox, key ) {
var control = document.getElementById( key );
control.disabled = checkbox.checked;
}
function set_value( key, value ) {
var control = document.getElementById( key );
var disabler = document.getElementById( key + '_undef' );
if ( value !== false ) {
control.value = value;
}
if ( disabler ) {
disabler.checked = ( value === false );
control.disabled = ( value === false );
}
}
function checktweaks() {
var showdb = {};
for (var requirer in requires) {
var showcol=1;
for(var requiree in requires[requirer]) {
var optval = getoptval( requiree );
if ( optval || optval === '' ) {
showcol=1;
} else {
showcol=0;
break;
}
}
showdb[requirer]=showcol;
}
for(var key in requires_tests) {
var req = requires_tests[key].req;
var testop = requires_tests[key].testop;
var op = requires_tests[key].op;
if (req.match(/^\$/)) {
req = getoptval(req.replace(/^\$/,''));
}
if (op.match(/^\$/)) {
op = getoptval(op.replace(/^\$/,''));
}
var result = eval('"' + req + '" ' + testop + ' "' + op + '"');
if (result && showdb[key] != 0) { /*from above*/
showdb[key]=1;
} else {
showdb[key]=0;
}
}
for(var excludee in excludes) {
var showcol=1;
for(var excluder in excludes[excludee]) {
var optval = getoptval( excluder );
if ( ( optval && optval !== '0' ) || optval === '' ) {
showcol=0;
break;
} else {
showcol=1;
}
}
if (showdb[excludee] != 0) {
showdb[excludee]=showcol;
}
}
for (var key in depends ) {
for ( var dep in depends[key] ) {
check_depends(dep);
}
}
for (var key in showdb) {
if (showdb[key] == 1) {
enable_control( key );
} else if (showdb[key] == 0) {
disable_control( key );
}
}
return false;
}
/* Check for dependencies declared in the tweaksetting's YAML entry/iContact schema module */
function check_depends(thing) {
if(!thing) return false;
var elem = document.getElementById(thing);
var deps = Object.keys(depends[thing]);
/*XXX what if it is a radio, etc.? not sure what to do there, as there's no 'value'. */
var invalid = 0;
for( var i = 0; i < deps.length; i++ ) {
var chainedElem = document.getElementById(deps[i]);
/* If the dependent element doesn't exist, just ignore it, the developer probably did something silly */
if( !chainedElem ) continue;
var submitBtn = document.querySelector('input[type="submit"]');
if( !submitBtn ) {
/* Give it a second to figure it out */
window.setTimeout(function() { check_depends(thing); }, 1000 );
} else {
if( !chainedElem.value && elem.value ) {
submitBtn.disabled = true;
document.getElementById( deps[i] + "_container").classList.add("invalid");
} else if( chainedElem.value && !elem.value ) {
submitBtn.disabled = true;
document.getElementById( thing + "_container").classList.add("invalid");
} else {
submitBtn.disabled = false;
document.getElementById( deps[i] + "_container").classList.remove("invalid");
document.getElementById( thing + "_container").classList.remove("invalid");
}
}
}
return false;
}
var confirm_panel;
function promptBeforeSelection(tweakKey, lastValue){
var promptMessage = "";
var promptHeaderText = "";
// Add messages
if(tweakKey === "LOGSTYLE"){
promptMessage = LOCALE.maketext("If you select the “[_1]” log style, your website’s stats may no longer function. Are you sure that you wish to continue?", "COMMON");
promptHeaderText = LOCALE.maketext("[_1][comment,proper name] selection", "Apache LOGSTYLE");
}
if (!confirm_panel) {
var panel_options = {
width: "500px",
fixedcenter: true,
close: true,
draggable: false,
modal: true,
visible: true
};
confirm_panel = new YAHOO.widget.Panel("promptBeforeSelect", panel_options);
confirm_panel.render();
YAHOO.util.Event.addListener("promptCancel", "click", function () {
var previousEl = DOM.get(tweakKey + "_" + lastValue);
if(previousEl.type === "radio" || previousEl.type === "checkbox"){
previousEl.checked = true;
}
confirm_panel.hide();
}, tweakKey, lastValue);
}
document.getElementById("promptHd").innerHTML = promptHeaderText;
document.getElementById("promptBd").innerHTML = promptMessage;
YAHOO.util.Event.removeListener("promptOk", "click");
YAHOO.util.Event.addListener("promptOk", "click", function () {
confirm_panel.hide();
checktweaks();
});
confirm_panel.show();
}
function register_requires_test(key,req,testop,op) {
requires_tests[key] = {
req: req,
testop: testop,
op: op
};
}
function register_exclude(key,exclude) {
if (!excludes[key]) { excludes[key] = {}; }
excludes[key][exclude]=1;
}
function register_requires(key,req) {
if (!requires[key]) { requires[key] = {}; }
requires[key][req]=1;
}
function register_depends(key,dep) {
if (!depends[key]) { depends[key] = {}; }
depends[key][dep] = 1;
return false;
}
var selected_input;
function check_tweak_controls( var_name, to_focus ) {
var radio_buttons = _TSForm[ var_name + '_control' ];
for (var r=0, rb; rb = radio_buttons[r]; r++) {
var to_disable = ! rb.checked;
var li_parent = YAHOO.util.Dom.getAncestorByTagName( rb, 'li' );
var inputs = li_parent.getElementsByTagName('input');
var selects = li_parent.getElementsByTagName('select');
for ( var i=0, cur_input; cur_input = inputs[i]; i++ ) {
if ( cur_input != rb ) {
cur_input.disabled = to_disable;
if ( to_focus && !to_disable && cur_input != selected_input ) {
var cur_type = cur_input.type.toLowerCase();
if ( cur_type == 'text' || cur_type == 'password' ) {
cur_input.focus();
cur_input.select();
selected_input = cur_input;
}
}
}
}
for ( var s=0, cur_select; cur_select = selects[s]; s++ ) {
cur_select.disabled = to_disable;
if ( to_focus && !to_disable && cur_select != selected_input ) {
cur_select.focus();
selected_input = cur_select;
}
}
}
}
for ( var tc=0; tc < tweak_controls.length; tc++ ) {
check_tweak_controls( tweak_controls[tc], false ); //disable auto-focusing
}
function setAllTabVisibility (tabView,setting) {
var len;
var tabs = tabView.get('tabs');
for (var i = 0, len = tabs.length; i < len; i++) {
tabs[i].set('contentVisible',setting,true);
var thead = tabs[i].get('contentEl').getElementsByTagName('thead');
if (thead && thead[0]) {
(thead[0].getElementsByTagName('tr'))[0].style.display=(setting ? '' : 'none');
}
}
}
var tweakTabs;
/* Search Code Starts Here */
var insearch = 0;
var idgen = 0;
var ElementTextCache = {};
var tblParentCache = {};
var searchCells = [];
function searchpage(searchBoxEl) {
var searchText = searchBoxEl.value.toLowerCase();
if (searchText) {
document.getElementById('clearlnk').style.display='';
} else {
insearch=0;
document.getElementById('clearlnk').style.display='none';
}
var matchCount = 0;
var cur_tbl_match_count = 0;
var allParentHeaders = {};
var matchedParentUls = {};
[% IF make_tabs -%]
if (!insearch) {
if (tweakTabs.get('activeTab').get('label') != "All") {
var tabs = tweakTabs.get('tabs');
tweakTabs.set('activeIndex', 0);
}
insearch=1;
}
[% END -%]
var last_tbl_parent = null;
for(var i = 0;i < searchableElements.length;i++) {
var cur_elem = searchableElements[i];
var innerText;
if (!ElementTextCache[cur_elem.id] || ElementTextCache[cur_elem.id] == "") {
var AddedsearchText = cur_elem.getAttribute('searchtext');
innerText = cur_elem.innerHTML.replace(/\<[^\>]+\>/g,'');
if (AddedsearchText) { innerText += " " + AddedsearchText; }
innerText += " " + cur_elem.id.replace(/_container$/,'');
innerText = innerText.toLowerCase();
ElementTextCache[cur_elem.id] = innerText;
} else {
innerText = ElementTextCache[cur_elem.id];
}
var tblParent = getTblParent(cur_elem);
allParentHeaders[tblParent.id] = tblParent;
if ( tblParent !== last_tbl_parent ) cur_tbl_match_count = 0;
if (innerText.match(searchText)) {
matchCount++;
cur_tbl_match_count++;
matchedParentUls[tblParent.id] = 1;
YAHOO.util.Dom.removeClass(cur_elem,'searchhide');
if ( cur_tbl_match_count % 2 ) {
DOM.addClass(cur_elem, 'tdshade1_noborder');
DOM.removeClass(cur_elem, 'tdshade2_noborder');
}
else {
DOM.addClass(cur_elem, 'tdshade2_noborder');
DOM.removeClass(cur_elem, 'tdshade1_noborder');
}
} else {
YAHOO.util.Dom.addClass(cur_elem,'searchhide');
}
last_tbl_parent = tblParent;
}
document.getElementById('gosearch').style.display=(matchCount == 0 ? '' : 'none');
for(var i in allParentHeaders) {
if (matchedParentUls[i]) {
YAHOO.util.Dom.removeClass(allParentHeaders[i],'searchhide');
} else {
YAHOO.util.Dom.addClass(allParentHeaders[i],'searchhide');
}
}
[% UNLESS this_is_ie6 -%]
adjust_scroll();
[% END -%]
}
function getTblParent(tagEl) {
if (!tagEl.id) {
tagEl.id = 'idgen' + idgen++;
}
if (tblParentCache[tagEl.id]) { return tblParentCache[tagEl.id]; }
var parent_row = YAHOO.util.Dom.getAncestorByTagName( tagEl, 'table' ).rows[0];
tblParentCache[tagEl.id] = parent_row;
return parent_row;
}
function clearsearch() {
var quickJumpEl = document.getElementById('quickjump');
quickJumpEl.value='';
searchpage(quickJumpEl);
insearch=0;
}
/* Search Code Ends Here */
var EU = YAHOO.util.Event;
[% extrascript %]
function init_tweaks () {
[% IF make_tabs -%]
tweakTabs = new YAHOO.widget.TabView('tweaktabs');
tweakTabs.addTab(
new YAHOO.widget.Tab( { label: 'All', active: true } ),
0
);
tweakTabs.on('beforeActiveTabChange', function(e) {
insearch=0;
if (e.prevValue.get('label') == "All") {
clearsearch();
setAllTabVisibility(tweakTabs,false);
}
});
tweakTabs.on('activeTabChange', function(e) {
insearch=0;
if (e.newValue.get('label') == "All") {
setAllTabVisibility(tweakTabs,true);
}
});
setAllTabVisibility(tweakTabs,true);
[% END -%]
var alltweaksEl = YAHOO.util.Dom.get('alltweaks');
searchableElements = alltweaksEl.getElementsByTagName('tr');
checktweaks();
var quickJumpEl = document.getElementById('quickjump');
var stop_propagation = function(e) {
var key_code = YAHOO.util.Event.getCharCode(e);
if ( key_code == 13 ) YAHOO.util.Event.preventDefault(e);
};
YAHOO.util.Event.addListener( quickJumpEl, 'keypress', stop_propagation );
YAHOO.util.Event.addListener( quickJumpEl, 'keydown', stop_propagation );
[% IF Whostmgr.FORM.find %]
quickJumpEl.value = [% Whostmgr.FORM.find.json %];
searchpage(quickJumpEl);
[% END %]
try { quickJumpEl.focus(); } catch(e) {
//love IE
}
// Reset the search focus after the navigation area finishes loading.
// We wrap the call here in a setTimeout without a time so that
// the javascript is executed on the next available cycle.
window.addEventListener("content-container-init", function() {
window.setTimeout(function() {
quickJumpEl.focus();
});
});
[% IF make_tabs %]
var tabs = tweakTabs.get("tabs");
var preTab = getQueryParamByName('active_tab') || false;
if(preTab){
var re = new RegExp("^tab_" + preTab.trim() + "$" , "i");
for(var i = 0; i < tabs.length; i++){
if(re.test(tabs[i].get("contentEl").id) !== false){
tweakTabs.set('activeIndex', i);
break;
}
}
}
[% END %]
}
init_tweaks();
[% UNLESS this_is_ie6 || !make_tabs -%]
//YAHOO.util.Dom.getRegion does not include margins
function getRegionWithMargins( el ) {
el = DOM.get(el);
var get_float_from_style = function( style ) {
var raw_style = DOM.getStyle( el, style );
if ( !raw_style || !YAHOO.lang.isString(raw_style) ) {
return;
}
var match = raw_style.match( /(\d+(?:\.\d+)?)([a-z]+)/ );
if ( !match ) return;
var unit = match[2];
var pixels;
if ( unit == 'em' ) {
if ( ! CPANEL._dummy_div ) {
var dummy_div = document.createElement('div');
CPANEL._dummy_div = dummy_div;
DOM.setStyle( dummy_div, 'position', 'absolute' );
DOM.setStyle( dummy_div, 'visibility', 'hidden' );
DOM.setStyle( dummy_div, 'height', '1px' );
document.body.appendChild( dummy_div );
}
DOM.setStyle( CPANEL._dummy_div, 'width', raw_style );
pixels = DOM.getRegion( CPANEL._dummy_div ).width;
}
else {
pixels = parseFloat( match[0] );
}
return pixels;
};
var base_region = DOM.getRegion(el);
var margin_top = get_float_from_style( 'margin-top' ) || 0;
var margin_right = get_float_from_style( 'margin-right' ) || 0;
var margin_bottom = get_float_from_style( 'margin-bottom' ) || 0;
var margin_left = get_float_from_style( 'margin-left' ) || 0;
var new_region = new YAHOO.util.Region(
base_region.top - margin_top,
base_region.right + margin_right,
base_region.bottom + margin_bottom,
base_region.left - margin_left
);
return new_region;
};
var scrolling_tabs = document.getElementById('scrolling_tabs');
var tabs_list = document.getElementById('yui_tabs');
var scroll_content_copy = tabs_list.cloneNode(true);
YAHOO.util.Dom.setStyle( scroll_content_copy, 'position', 'absolute' );
YAHOO.util.Dom.setStyle( scroll_content_copy, 'visibility', 'hidden' );
scrolling_tabs.appendChild( scroll_content_copy );
var scroll_width = YAHOO.util.Dom.getRegion( scroll_content_copy ).width;
scroll_content_copy.parentNode.removeChild( scroll_content_copy );
if ( 'addEventListener' in scrolling_tabs ) {
scrolling_tabs.addEventListener( 'DOMMouseScroll', function(e) {
if ( max_scroll > 0 ) {
scroll_by( e.detail );
blink_buttons_with_wheel( e.detail )
e.preventDefault(); e.stopPropagation();
}
}, false );
scrolling_tabs.addEventListener( 'mousewheel', function(e) {
if ( max_scroll > 0 ) {
var scroll_distance = e.wheelDelta / -40;
scroll_by( scroll_distance );
blink_buttons_with_wheel( scroll_distance )
e.preventDefault(); e.stopPropagation();
}
}, false );
}
else {
scrolling_tabs.onmousewheel = function() {
if ( max_scroll > 0 ) {
var scroll_distance = window.event.wheelDelta / -20 * scale;
scroll_by( scroll_distance );
blink_buttons_with_wheel( scroll_distance )
return false;
}
};
}
var scroll_button_class_remover = null;
function blink_buttons_with_wheel( reported_delta ) {
if ( cur_pos <= 0 && reported_delta < 0 ) {
return false;
}
if ( cur_pos >= max_scroll && reported_delta > 0 ) {
return false;
}
var active_button = ( reported_delta > 0 )
? right_scroll_button
: left_scroll_button
;
DOM.addClass( active_button, 'scrolling' );
//wait to see when the scroll wheel stops moving
if ( ! scroll_button_class_remover ) {
var old_pos = -1;
scroll_button_class_remover = function() {
if ( old_pos == cur_pos ) {
DOM.removeClass( active_button, 'scrolling' );
scroll_button_class_remover = null;
}
else {
old_pos = cur_pos;
setTimeout( scroll_button_class_remover, 60 );
}
};
scroll_button_class_remover();
}
}
var left_scroll_button = document.getElementById('left_scroll_button');
var right_scroll_button = document.getElementById('right_scroll_button');
var left_scroller_total_region = getRegionWithMargins( left_scroll_button );
var right_scroller_total_region = getRegionWithMargins( right_scroll_button );
var fixed_right_scroller_pos = left_scroller_total_region.width + scroll_width;
var find_area_threshold = fixed_right_scroller_pos + right_scroller_total_region.width;
var cur_pos = 0;
var scale = 1.5;
var max_scroll;
function adjust_scroll() {
var find_total_region = getRegionWithMargins( 'find_container' );
var old_scroll = max_scroll;
max_scroll = scroll_width - YAHOO.util.Dom.getRegion( scrolling_tabs ).width + 1;
var difference = max_scroll - old_scroll;
if ( cur_pos > 0 && difference < 0 ) {
scroll_by( difference );
}
else if ( right_scroll_button_inactive ) {
right_scroll_button_activate();
}
};
adjust_scroll();
window.onresize = adjust_scroll;
var right_scroll_button_inactive = false;
var right_scroll_button_activate = function() {
DOM.removeClass( right_scroll_button, 'inactive' );
right_scroll_button_inactive = false;
}
var right_scroll_button_deactivate = function() {
DOM.addClass( right_scroll_button, 'inactive' );
right_scroll_button_inactive = true;
}
function scroll_by( pixel_increment, window_drag ) {
if ( cur_pos <= 0 ) {
if ( pixel_increment < 0 ) {
return false;
}
else if ( cur_pos + pixel_increment > 0 ) {
DOM.removeClass( left_scroll_button, 'inactive' );
}
}
if ( cur_pos >= max_scroll ) {
if ( pixel_increment > 0 ) {
return false;
}
else if ( cur_pos + pixel_increment < max_scroll ) {
right_scroll_button_activate();
}
}
var new_pos;
if ( cur_pos > 0 && cur_pos + pixel_increment <= 0 ) {
new_pos = 0;
DOM.addClass( left_scroll_button, 'inactive' );
} else if ( cur_pos < max_scroll && cur_pos + pixel_increment >= max_scroll ) {
new_pos = max_scroll;
right_scroll_button_deactivate();
}
else {
new_pos = cur_pos + pixel_increment;
}
YAHOO.util.Dom.setStyle( tabs_list, 'left', ( -1 * new_pos ) + 'px' );
cur_pos = new_pos;
return pixel_increment;
}
var mousedown_scroll = 0;
function start_scroll( scroll_left ) {
var old_pos = cur_pos;
mousedown_scroll = scroll_left ? -1 : 1;
var increment = mousedown_scroll * scale * 2;
var recursive_scroll = function() {
var ok_to_scroll = scroll_left ? (cur_pos > 0) : (cur_pos < max_scroll);
if ( mousedown_scroll != 0 && ok_to_scroll ) {
scroll_by( increment );
setTimeout( recursive_scroll, 8 );
}
};
recursive_scroll();
}
function stop_scroll() {
mousedown_scroll = 0;
}
left_scroll_button.onmousedown = function() {
DOM.addClass( left_scroll_button, 'scrolling' );
start_scroll( true );
};
left_scroll_button.onmouseout = function() {
DOM.removeClass( left_scroll_button, 'scrolling' );
stop_scroll();
};
left_scroll_button.onmouseup = left_scroll_button.onmouseout;
right_scroll_button.onmousedown = function() {
DOM.addClass( right_scroll_button, 'scrolling' );
start_scroll( false );
};
right_scroll_button.onmouseout = function() {
DOM.removeClass( right_scroll_button, 'scrolling' );
stop_scroll();
};
right_scroll_button.onmouseup = right_scroll_button.onmouseout;
[% END #exclusion for IE6 -%]
</script>
Back to Directory
File Manager