//  'Pref name': [ [ Disable values ], Dep pref 1, ... , Dep pref n ],
// '[ Disable value ]' are the values for which the dependant prefs should be disabled
// In the case of radio type, [ Disable Values ] should be an index that,
// when .checked == true, the dependant prefs should be disabled
// In the case of a checkbox type, [ Disable Values ] is the value of the 'checked' property
var pref_deps = new Array();
pref_deps['DC.QUARANTINE.REPORT_TIME'] = new Array();
pref_deps['DC.QUARANTINE.REPORT_TIME'][ 0 ] = [ 'DC.QUARANTINE.REPORT_RANGE',
                                                'DC.QUARANTINE.DEST_ADDRESS' ];

pref_deps['QP.MAIN.SPAM_SCANNING_ENABLED'] = new Array();
pref_deps['QP.MAIN.SPAM_SCANNING_ENABLED'][ 0 ] = [
        'QP.MAIN.SPAM_THRESHOLD', 'QP.MAIN.SPAM_ACTION',
        'QP.MAIN.DOWNGRADE_ACTION',
// FIXME (2113): the following two lines need to appear in this order.  If you reverse the order,
//       the REPORT_RANGE and DEST_ADDRESS prefs refuse to disable themselves, at least in Chrome.
//       This is probably some sort of bug in pref_depends(), although Inspector doesn't report any
//       errors or warnings.
        'DC.QUARANTINE.REPORT_DAYS',  'DC.QUARANTINE.REPORT_TIME',
        'DC.QUARANTINE.REPORT_RANGE', 'DC.QUARANTINE.DEST_ADDRESS' ];

pref_deps['QP.MAIN.HOST_ACCESS'] = new Array();
pref_deps['QP.MAIN.HOST_ACCESS']['RELAY_ALL'] = [
                                     'QP.MAIN.SPAM_SCANNING_ENABLED', 'QP.MAIN.DENY_EARLY_TALKERS',
                                     'QP.MAIN.REQUIRE_RDNS',          'QP.MAIN.REQUIRE_RDNS_MATCH',
                                     'QP.MAIN.RBL_ENABLED',           'QP.MAIN.SPF_MODE',
                                     'QP.MAIN.UVSCAN_ENABLED' ];
pref_deps['QP.MAIN.HOST_ACCESS']['RELAY_DOMAIN'] = [
                                     'QP.MAIN.SPAM_SCANNING_ENABLED', 'QP.MAIN.DENY_EARLY_TALKERS',
                                     'QP.MAIN.REQUIRE_RDNS',          'QP.MAIN.REQUIRE_RDNS_MATCH',
                                     'QP.MAIN.RBL_ENABLED',           'QP.MAIN.SPF_MODE',
                                     'QP.MAIN.UVSCAN_ENABLED' ];
pref_deps['QP.MAIN.HOST_ACCESS']['DENY'] = [
                                     'QP.MAIN.SPAM_SCANNING_ENABLED', 'QP.MAIN.DENY_EARLY_TALKERS',
                                     'QP.MAIN.REQUIRE_RDNS',          'QP.MAIN.REQUIRE_RDNS_MATCH',
                                     'QP.MAIN.RBL_ENABLED',           'QP.MAIN.SPF_MODE',
                                     'QP.MAIN.UVSCAN_ENABLED',        'QP.MAIN.CLAM_ENABLED',
                                     'QP.MAIN.MAXCONN_OVERRIDE',      'QP.MAIN.NULLSENDER_MODE' ];

pref_deps['QP.MAIN.SPAM_ACTION'] = new Array();
// FIXME (2113): Don't you dare change the order of these elements, either
pref_deps['QP.MAIN.SPAM_ACTION']['Reject'] = [
    'DC.QUARANTINE.REPORT_DAYS',  'DC.QUARANTINE.REPORT_TIME',
    'DC.QUARANTINE.REPORT_RANGE', 'DC.QUARANTINE.DEST_ADDRESS' ];
pref_deps['QP.MAIN.SPAM_ACTION']['Body Tag'] = [
    'DC.QUARANTINE.REPORT_DAYS',  'DC.QUARANTINE.REPORT_TIME',
    'DC.QUARANTINE.REPORT_RANGE', 'DC.QUARANTINE.DEST_ADDRESS' ];
pref_deps['QP.MAIN.SPAM_ACTION']['Subject Tag'] = [
    'DC.QUARANTINE.REPORT_DAYS',  'DC.QUARANTINE.REPORT_TIME',
    'DC.QUARANTINE.REPORT_RANGE', 'DC.QUARANTINE.DEST_ADDRESS' ];

pref_deps['mask'] = new Array();
pref_deps['mask']['/[^0-9.\/]/'] = [ 'QP.MAIN.MAXCONN_OVERRIDE' ];

// Used to un-check the 'Default' option for a pref
function undefault(pref) {
    pref = pref.replace(/^override\./,'');
    var e = document.getElementsByTagName('input');
    for ( var i = 0; i < e.length; i++ ) {
        if ( e[i].name.match( pref ) && e[i].name.match(/^default\./) ) {
            if( e[i].type == 'checkbox' ) {
                e[i].checked = 0;
            } else {
                e[i].value = 0;
            }
        }
    }
}

function pref_depends(pref) {
    if ( ! ( pref in pref_deps ) ) {
        return;
    }
    var p = document.getElementsByName( pref );
    if ( ! p.length ) return;
    var needed_prefs = new Array();
    for ( var disable_value in pref_deps[pref] ) {
        var is_re = /^\/(.+)\/$/.exec( disable_value );
        var deps_off = 0;
        if ( p[0].type == 'radio' && p[disable_value].checked == 1 ) {
            deps_off = 1;
        }
        else if ( p[0].type == 'checkbox' && p[0].checked == disable_value ) {
            deps_off = 1;
        }
        else if ( p[0].type == 'text' && is_re != null ) {
            if ( p[0].value.match( new RegExp( is_re[1] ) ) ) {;
                deps_off = 1;
            }
        }
        else if ( p[0].value == disable_value ) {
            deps_off = 1;
        }
        var check = pref_deps[pref][disable_value];
        for ( var i = 0; i < check.length; i++ ) {
            if ( needed_prefs[ check[i] ] ) continue;
            needed_prefs[ check[i] ] = deps_off;
        }
    }
    for ( var needed_pref in needed_prefs ) {
        on_off_pref( needed_pref, needed_prefs[needed_pref] );
        pref_depends( needed_pref );
    }
}

function on_off_pref(pref,on_off) {
    var e = document.getElementsByTagName('*');
    for ( var i = 0; i < e.length; i++ ) {
        if ( e[i].tagName == 'INPUT' || e[i].tagName == 'SELECT' || e[i].tagName == 'TEXT' ) {
            if ( e[i].name.match( pref ) )
                e[i].disabled = on_off;
        }
    }
}

function enable_pref(pref) {
    on_off_pref(pref,0);
}

function disable_pref(pref) {
    on_off_pref(pref,1);
}
