// geleide navigatie

var spec_items_selected = {};
var phones              = [];

// @TODO dit kan misschien ook met een class
var default_color       = '#141F78';
var noitems_color       = '#999999';

function initialize() {
    if (typeof(toestels) != 'undefined') {
        initialize_spec_items();
        initialize_vergelijk();
        select_spec_item();
    } 
} 

/*
 * initialize_spec_items:
 * loop door alle spec_items heen en voeg een 'onclick'-handler toe
 */
function initialize_spec_items() {
    try {
        $$('.spec_item').each(function(spec_item_el) {
            spec_item_el.onclick = select_spec_item;
        }); 
        if ($('geleidnav_submit'))
            $('geleidnav_submit').onclick = submit_geleidnav_form;
        if ($('geleidnav_submit_drtoestel') != null )
            $('geleidnav_submit_drtoestel').onclick  = submit_geleidnav_form;
        if ($('select_sortorder')) {
          $('select_sortorder').onchange = function() {
            // als anders sorteren: dan leeg drtoestel inputs en sliders
            var sortorder = $('select_sortorder').value;
            if (sortorder != 'drtoestel' && $('drtoestel_cats') ){
                debug ('leeg drtoestel inputs');
                $A(drtoestel_cats).each(function(cat){
                        // hiddens
                        var elname = 'drtoestel_' + cat.id;
                        $(elname).value = 0;

                        // sliders
                        var swfobj = $('drtoestel_cat_' + cat.id + '_div');
                        if (swfobj){
                            try{
                                swfobj.resetMe(0);
                            } catch(e){
                                debug('slider hidden? ' + cat.id);
                            }
                        }
                    });
            }
            submit_geleidnav_form();
          }
        }
    } catch(e){
        debug(e);
    }
}

function submit_geleidnav_form() {
    try{
        $('geleidnav_submit').blur();
        if($('geleidnav_submit_drtoestel') != null) {
            $('geleidnav_submit_drtoestel').blur();
        }
        $('select_sortorder').blur();
        
        //--- gide settings in form
        if (phones == '') {
            $('artlist').value = 'empty';
        } else {
            $('artlist').value = phones;
        }
        $('sortorder').value = $('select_sortorder').value;
        $('geleidnav_form').submit();
    } catch(e){
        debug(e);
    }
}

/* 
 * select_spec_item:
 * handle de onclick op een 'spec_item'
 */
function select_spec_item() {
    try{
        var starttime = new Date();

        spec_items_selected = {};
        $$('.spec_cat').each(function(spec_cat_el) {
                spec_cat_id = spec_cat_el.id.split('spec_cat_')[1];
                if (spec_cat_id) {
                    spec_cat_el.select('input.checkbox').each(function(spec_item_input_el){
                        if (spec_item_input_el.checked) {
                            spec_item_id = spec_item_input_el.id.split('spec_item_input_')[1];
                            
                            if (!spec_items_selected[spec_cat_id]){
                                spec_items_selected[spec_cat_id] = {};
                            }
                            spec_items_selected[spec_cat_id][spec_item_id] = 1;
                        }
                    });
                }
            });
        calculate_toestels();
        
        var endtime = new Date();
        var diff    = endtime.getTime() - starttime.getTime();
        debug('clickhandler took ' + diff / 1000 + ' seconds');
    } catch(e){
        debug(e);
    }
}

/*
 * calculate_toestels:
 *
 */
function calculate_toestels() {
    try {
        // @TODO 
        // - begin met totale lijst
        //phones = toestels['totalphones'];
        phones = [];
        // forceer als string
        //  set_math met strings en integers gaat 'soms' fout
        //   a1 = ['1','2','34','567','1234']
        //   a2=[1,2,34,567,1234]
        //   a1.intersect(a2) >> ["1", "1234"] ; is niet correct
        toestels['totalphones'].each(function(t){
                phones[phones.length] = t + ''; 
            });
        specs  = [];
        
        // - iter over speccats 
        //    als something selected
        //     intersect met totale lijst
        // etc..
        
        // calculeer toestelcounts
        
        // iter over speccats
        $H(toestels['speccats']).each(function(cat) {
                var catphones   = [];
                var spec_cat_id = cat.key;
                var mode = toestels['speccats'][spec_cat_id]['mode'];
                if (!mode || (mode != 'or' && mode != 'and')) {
                    debug("invalid mode '" + mode +"'.");
                }
                //debug('cat ' + cat.key + ' mode ' + mode);
                
                var something_selected = false;
                if (spec_items_selected[spec_cat_id]) {
                    
                    // als iets geselecteerd verzamel dan
                    // alle phones in de geselecteerde speccat items
                    
                    // als mode is OR begin met lege lijst
                    if (mode == 'or') {
                        catphones = [];
                    } else {
                        // vergaar alle phones in speccat items
                        $A(toestels['speccats'][spec_cat_id]['specitems']).each(function(spec_item_id){
                            catphones = catphones.union(toestels['specitems'][spec_item_id]['phones']);
                        });
                    }
                    
                    // loop items in cat
                    $A(toestels['speccats'][spec_cat_id]['specitems']).each(function(spec_item_id) {
                            if (spec_items_selected[spec_cat_id][spec_item_id] &&
                                spec_items_selected[spec_cat_id][spec_item_id] > 0) {
                                
                                // specs.push(toestels['specitems'][spec_item_id]['slug']);
                                
                                if (mode == 'or'){
                                    catphones =  catphones.union(toestels['specitems'][spec_item_id]['phones']);
                                } else {
                                    catphones =  catphones.intersect(toestels['specitems'][spec_item_id]['phones']);
                                }
                            } else {
                                //catphones = catphones.union(toestels['specitems'][spec_item_id]['phones']);
                            }
                        });
                    //debug('catphones: ' + catphones + ' total:' + phones);
                    //debug('catphones: ' + catphones );
                    phones = $A(phones).intersect(catphones);
                    //debug('result:' + phones);
                   }
            });
        
        if (phones.length) {
            //$('geleidnav_submit').value  = 'Toon toestellen (' + phones.length + ')';
            $('geleidnav_submit').innerHTML  = '<span>Toon toestellen (' + phones.length + ')</span>';
            $('geleidnav_submit').disabled   = false;

            if($('geleidnav_submit_drtoestel')) {
                $('geleidnav_submit_drtoestel').value  = 'Toon toestellen';
                $('geleidnav_submit_drtoestel').disabled   = false;
            }

        } else if($('geleidnav_submit_drtoestel')) {
            $('geleidnav_submit_drtoestel').value  = 'Geen resultaat';
            $('geleidnav_submit_drtoestel').disabled   = true;
        }
        
        // nu hebben we een lijst van phones die voldoen aan alle criteria
        // reken uit per item hoeveel telefoons er zijn

        // @TODO cat.mode van specitem achterhalen

        $H(toestels['specitems']).each(function(pair) {
                var spec_item_id = pair.key;
                var spec_cat_id  = pair.value['catid'];
                var mode         = toestels['speccats'][spec_cat_id]['mode'];
                var itemphones   = phones.intersect(toestels['specitems'][spec_item_id]['phones']);
                var count        = itemphones.length;
                var color        = count ? default_color : noitems_color;
                var elem         = $('count_spec_item_' + spec_item_id);
                var labelelem    = $('label_spec_item_' + spec_item_id); 
                var colorstyle = {'color' : color};
                
                // 20080215, geen 0 count bij merken
                if (mode == 'and'){
                    if (elem) {
                        elem.innerHTML   = "(" + count + ")";
                    }
                }
                
                if (labelelem){
                    labelelem.setStyle(colorstyle);
                }
            });
    } catch(e){
        debug(e);
    }
}
    
/*====== VERGELIJK ======*/

/* initialize_vergelijk:
 * voeg aan elke vergelijk_checkbox een onclick-handler toe. 
 * voeg aan het vergelijk_form een onsubmit handler toe.
 */
function initialize_vergelijk() {
    try{
        $$('input.vergelijk_checkbox').each(function(el) {
            el.onclick = function(){toggle_vergelijk(el)};
        });

        $$('a.vergelijk_link').each(function(el) {
            el.onclick = function(){add_and_submit_vergelijk(el); return false;};
        });

        if ($('vergelijken_start')) {
            $('vergelijken_start').onclick = submit_vergelijk;
        }
    } catch(e){
        debug(e);
    }
}
    
/* toggle_vergelijk:
 * controleert of er maximaal 3 producten gekozen zijn.
 */
function toggle_vergelijk(e) {
    try{
        count=0;
        $$('input.vergelijk_checkbox').each(function(checkbox_el) {
            if (checkbox_el.checked) {
                count++;
            }
        });
        if (count > 3) {
            alert('u kunt maximaal 3 producten selecteren');
            e.checked = false;
            return false;
        }
        return true;
    } catch(e){
        debug(e);
    }
}

function add_and_submit_vergelijk(el) {
    id = el.id.substr(15);
    cbid = 'vergelijk_checkbox_'+id;
    $(cbid).checked = true;
    if ( toggle_vergelijk( $(cbid) ) ) {
        submit_vergelijk();
    }
}

/* submit_vergelijk:
 * bouwt een nieuwe location_url op
 */
function submit_vergelijk() {
    var phones = [];
    try {
        $$('input.vergelijk_checkbox').each(function(checkbox_el) {
            if (checkbox_el.checked) {
                var slug = checkbox_el.value;
                if (slug != '' && slug != 0) {
                    phones.push(slug);
                }
            }
        });
        if (phones.length < 1) {
            alert('Je hebt geen producten geselecteerd!');
        } else {
            url = $('vergelijk_form').action + '/' + phones.join('/');
            top.location = url;
        }
    } catch(e){
        debug(e);
    }
    return false;
}

addLoadEvent(initialize);

