
// -----------------------------------------------------------------------------
// LTDSN - Suche
// -----------------------------------------------------------------------------


function ttonload()
{
    if (typeof(ttDOMIsLoaded) != "undefined" && typeof(this._loaded) == "undefined")
    {
        this._loaded = true;    
        ttInitLTDSN();
    }
}    


function ttInitLTDSN()
{
    var elems = document.getElementsByTagName('div');
    
    // bind checkbox events
    for(var i=0 ; i < elems.length; i++) {
        if (ttHasClass(elems[i], 'js-checkboxselect')) {
            ttInitCBSelect(elems[i]);
        }
    }

    ttHighlightPossibleOptions();
}    


function ttInitCBSelect(cbselect)
{
    var elems = cbselect.getElementsByTagName('input');
    for(var i=0 ; i < elems.length; i++) 
    {
        var elem = elems[i];
        if (elem.type == 'checkbox' && elem.parentNode.nodeName == 'LI')
        {
            elem.onclick = function(e) {
                ttCBInputChange(cbselect, ttGetTarget(e));                
                return true;
            }
            
            elem.parentNode.onclick = function(e) {
                var el =  ttGetTarget(e);
                var inputs = el.getElementsByTagName('input');
                for (var n=0 ; n < inputs.length ; n++) 
                {
                    if (inputs[n].type == 'checkbox') {
                        inputs[n].checked = !inputs[n].checked;
                        ttCBInputChange(cbselect, inputs[n]);
                        break;
                    }
                }
                return true;
            };
        }
    }
}


function ttCBInputChange(cbselect, cb)
{
    var nurKinder    = document.getElementById('beso0');
    var erwUndKinder = document.getElementById('beso1');    
    if (cb == nurKinder && nurKinder.checked) 
        erwUndKinder.checked = false;
    if (cb == erwUndKinder && erwUndKinder.checked) 
        nurKinder.checked = false;    


    var parentDIV = ttBacksearchByTagName(cb, 'DIV');
    
    var elems = cbselect.getElementsByTagName('input');    
    var cbs = new Array();    
    var cbAll = null;        
    var isAnyChecked = false;

    for(var i=0 ; i < elems.length; i++) 
    {
        if (elems[i].type != 'checkbox') 
            continue;
        if (ttHasClass(elems[i], 'js-cb-all'))
            cbAll = elems[i];
        cbs.push(elems[i]);            
    }
    
    // if all button uncheck all other checkboxes inside this cbselect    
    if (ttHasClass(cb, 'js-cb-all'))                 
    {        
        ttCheckAll(cbselect, false);
        cb.checked = true;
    }
    else
    {
        // if group button 
        if (ttHasClass(cb, 'js-cb-group'))         
        {        
            var elems = parentDIV.getElementsByTagName('input');    
            for(var i=0 ; i < elems.length; i++) 
            {
                if (elems[i].type != 'checkbox' || elems[i] == cb) 
                    continue;
                elems[i].checked = cb.checked;
            }
//            var groupElems = ttGetElementsByClassName(parentDIV, '*', 'cb-elems');
//            groupElems[0].style.display = cb.checked ? 'block' : 'none';
        }

        for(var i=0 ; i < cbs.length; i++) 
        {
            if (cbs[i].checked)
                isAnyChecked = true;
        }        
        if (cbAll) {
            cbAll.checked = !isAnyChecked;
        }
    }    
    
    ttHighlightPossibleOptions();
}


function ttCheckAll(baseNode, checked)
{
    var elems = baseNode.getElementsByTagName('input');
    for(var i=0 ; i < elems.length ; i++) 
    {
        if (elems[i].type == 'checkbox')    
            elems[i].checked = checked;
    }
}


function ttHighlightPossibleOptions()
{
    // --- determine all checkbox states ---
    var cbstates = [[0],[0],[0],[0,0]];

    for (var k = 0 ; k < ttKategInfo.length ; k++) // 'tage' 'orte' 'beso', 'them'     
    {
        var kateg = ttKategInfo[k].kateg;
        var kAll  = document.getElementById(kateg+'-all') ? document.getElementById(kateg+'-all').checked : false;

        // for '0', '1', ...
        for(var g = 0 ; g < ttKategInfo[k].groups ; g++) 
        {
            var gdiv  = document.getElementById(kateg+'-'+g);    
            var gAll  = document.getElementById(kateg+'-'+g+'-all') ? document.getElementById(kateg+'-'+g+'-all').checked : false;            
            var elems = gdiv.getElementsByTagName('input');            
            for(var i=0 ; i < elems.length; i++) 
            {
                if (elems[i].type != 'checkbox') continue;
                if (elems[i].id.length > 6) continue;  // skip xxxx-g-all
                
                if (kAll || gAll || elems[i].checked)
                {
                    var p = elems[i].id.substr(4); 
                    ttBitset_setBit(cbstates[k], p);
                }
            }
        }
        //console.info(cbstates[k]);        
    }
    
    // --- find out which criteria are possible for the given checkbox states ---
    var mask = ttTestAllRecords(cbstates);
    
    // --- grey out all checkboxes that are no longer possible ---
    for (var k = 0 ; k < ttKategInfo.length ; k++) 
    {
        var kateg = ttKategInfo[k].kateg;    
        for (var i=0 ; i < ttKategInfo[k].krits ; i++) 
        {
            var cb = document.getElementById(kateg+i);            
            var greyout = !ttBitset_getBit(mask[k], i);
            ttGreyOut(cb, greyout);
        }
    }
    //console.info('done');


    var nurKinder    = document.getElementById('beso0');
    var erwUndKinder = document.getElementById('beso1');    
    if (nurKinder.checked) 
        ttGreyOut(erwUndKinder, true);
    if (erwUndKinder.checked) 
        ttGreyOut(nurKinder, true);    
}


function ttTestAllRecords(cbstates)
{
    var result = [
        [0],           // tage 
        [0],           // orte
        [0xffffffff],  // beso (werden nicht gefiltert)
        [0,0]          // them
    ];
    
    for (var i=0 ; i < ttMap.length ; i++)
    {
        var row = ttMap[i];    

        // falls beso zutreffen ("für kinder", "rollstuhl", etc)
        if ( (row[2][0] & cbstates[2][0]) >= cbstates[2][0] )
        {
            result[0][0] |= row[0][0]; // filter auf tage
                    
            // falls tage zutreffen...
            if ( (row[0][0] & cbstates[0][0]) != 0 )   
            {
                result[3][0] |= row[3][0]; // filter auf them 
                result[3][1] |= row[3][1]; // filter auf them 1
            
                // falls them zutreffen...
                if ((row[3][0] & cbstates[3][0]) != 0 || (row[3][1] & cbstates[3][1]) != 0)
                { 
                    result[1][0] |= row[1][0]; // filter auf orte
                }
            }
        }
    }
    return result;    
}


function ttGreyOut(cb, greyout)
{
    if (cb) {
        cb.style.color = greyout ? '#bbbbbb' : '#000000';            
        cb.parentNode.style.color = greyout ? '#bbbbbb' : '#000000';                    
//      ttSwapClass(cb, 'inactive', 'active');        
    }
}

// --- bitset ------------------------------------------------------------------

function ttBitset_new()
{
    return [0,0];
}

function ttBitset_getBit(bitset, i)
{
    if      (i < 32) return (bitset[0] & (1 << i)) != 0;
    else if (i < 64) return (bitset[1] & (1 << (i-32))) != 0;
    return 0;
}

function ttBitset_setBit(bitset, i)
{
    if      (i < 32) bitset[0] |= (1 << i); 
    else if (i < 64) bitset[1] |= (1 << (i-32));
    return bitset;
}


// --- do initialization -------------------------------------------------------

ttonload(); 


