var _tree_check_state = {};
var _search_check_state = {};
var _tree_searching = 0;

function open_tree(value) {
    expand_all(true);
    uncheck_all();
    if(typeof(value) == 'undefined')
      var values = $('#sectors').attr('value').split(',');
    else {
      var values = new Array(); values.push(value);
    }
    for(var i=0; i<values.length; i++) {
        set_check(values[i], 2);
        expand_to(values[i]);
    }
    $('#treesearch').attr('value', '');
    $('#treecover').removeClass('hidden');
    var win = $('#treewindow');
    if(win.bgiframe) win.bgiframe();
    win.removeClass('hidden');
    tree_resize();
    $('#treesearch').focus();
}
function close_tree() {
    $('#treewindow').addClass('hidden');
    $('#treecover').addClass('hidden');
}
function save_tree() {
    var checks = [];
    var paths = [];
    for(var id in _tree_check_state) {
        if(id && _tree_check_state[id] == 2) {
            if(parent_is_selected(id)) continue;
            checks.push(id);
            if(typeof(_tree_paths) != "undefined")
              paths.push('<li id="sd_'+id+'">'+_tree_paths[id]+'<img src="/sector_tree/delete.gif" onclick="remove_sector('+id+')" /></li>');
        }
    }
    $('#sectors').attr('value', checks.join(','));
    $('#sector_display').html((paths.length ? paths.join('') : 'All sectors'));
    close_tree();
}
function clear_tree() {
    $('#sector_display').html('<li>All sectors</li>');
    $('#sectors').attr('value', '');
}
function remove_sector(id) {
    $('#sd_'+id).remove();
    var ids = $('#sectors').attr('value').split(',');
    filtered_ids = $.grep(ids, function(i){ return i != id; });
    $('#sectors').attr('value', filtered_ids.join(','));
    if(filtered_ids.length == 0) $('#sector_display').html('<li>All sectors</li>');
}
function parent_is_selected(id) {
    var parent_id = $('#check_'+id).parent().parent().siblings('.treecheck').attr('funid');
    if(!parent_id) return false;
    return _tree_check_state[parent_id] == 2;
}
function toggle_branch(id) {
    if($('#branch_'+id).hasClass('hidden'))
        expand_branch(id);
    else collapse_branch(id);
}
function expand_branch(id) {
    $('#branch_'+id).removeClass('hidden');
    var e = $('#expander_'+id);
    if(e.hasClass('tml') || e.hasClass('tm')) return;
    var c = (e.hasClass('tpl') || e.hasClass('tplh')) ? 'tml' : 'tm';
    e.addClass(c);
    e.removeClass('tp tph tpl tplh');
}
function collapse_branch(id) {
    $('#branch_'+id).addClass('hidden');
    var e = $('#expander_'+id);
    if(e.hasClass('tpl') || e.hasClass('tp')) return;
    var c = (e.hasClass('tml') || e.hasClass('tmlh')) ? 'tpl' : 'tp';
    e.addClass(c);
    e.removeClass('tm tmh tml tmlh');
}
function expand_all(collapse) {
    $('#treestatus').html('Expanding');
    $('.expander').each(function(){
        var id = $(this).attr('funid');
        if(collapse) collapse_branch(id);
        else expand_branch(id);
    });
    $('#treestatus').html('');
}
function expand_to(id) {
    $('#check_'+id).parent().parent().siblings('.expander').each(function(){
        var id = $(this).attr('funid');
        expand_branch(id);
        expand_to(id);
    });
}
function set_check(id, force_state, bubbling) {
    var state = _tree_check_state[id];
    if(state == undefined) state = 0;
    var check = $('#check_'+id);
    check.removeClass('check'+state);
    if(force_state == undefined)
        state = state == 0 ? 2 : 0;
    else state = force_state;
    check.addClass('check'+state);
    _tree_check_state[id] = state;

    if(bubbling != 'up' && bubbling != 'none') {
        check.siblings('ul').children().children('.treecheck').each(function(){
            var id = $(this).attr('funid');
            set_check(id, state, 'down');
        });
    }

    if(bubbling != 'down' && bubbling != 'none') {
        check.parent().parent().siblings('.treecheck').each(function(){
            var check = $(this);
            var checked = partial = total = 0;
            check.siblings('ul').children().children('.treecheck').each(function(){
                var id = $(this).attr('funid');
                total++;
                if(_tree_check_state[id] >= 1) partial = true;
                if(_tree_check_state[id] == 2) checked++;
            });
            var id = check.attr('funid');
            var state = 0;
            if(checked == total) state = 2;
            else if(partial == true) state = 1;
            set_check(id, state, 'up');
        });
    }
}
function uncheck_all() {
    for(var id in _tree_check_state) {
        if(id && _tree_check_state[id] > 0)
            set_check(id, 0, 'none');
    }
    _tree_check_state = {};
}
function save_search() {
    close_search();
    for(id in _search_check_state) {
        if(_search_check_state[id] == 2) {
            set_check(id, 2);
            expand_to(id);
        }
    }
}
function close_search(preserve_keyword) {
    $('#tree').removeClass('hidden');
    $('#treebuttons').removeClass('hidden');
    $('#treecontrols').removeClass('hidden');
    $('#treesearchresults').addClass('hidden');
    $('#searchbuttons').addClass('hidden');
    $('#searchcontrols').addClass('hidden');
    if(preserve_keyword == undefined) $('#treesearch').attr('value', '');
    _tree_searching = 0;
}
function search_check_click() {
    search_check(this);
}
function search_check(check, force_state) {
    check = $(check);
    var id = check.attr('funid');
    var state = _search_check_state[id] || 0;
    check.removeClass('check'+state);
    if(force_state != undefined) state = force_state;
    else state = state == 0 ? 2 : 0;
    _search_check_state[id] = state;
    check.addClass('check'+state);
}
function check_all_search() {
    $('#treesearchresults .searchcheck').each(function(){search_check(this, 2)});
}
function uncheck_all_search() {
    $('#treesearchresults .searchcheck').each(function(){search_check(this, 0)});
}
function hover_class(e, hover) {
    hover = hover ? 'h' : '';
    if(e.hasClass('tp'+hover)) return 'tp';
    else if(e.hasClass('tpl'+hover)) return 'tpl';
    else if(e.hasClass('tm'+hover)) return 'tm';
    else if(e.hasClass('tml'+hover)) return 'tml';
    return null;
}
$(function(){
    var expanders = $('.expander');
    expanders.hover(
        function() {
            var me = $(this);
            var type = hover_class(me, false);
            if(type) {
                me.removeClass('tp tpl tm tml');
                me.addClass(type+'h');
            }
        },
        function() {
            var me = $(this);
            var type = hover_class(me, true);
            if(type) {
                me.removeClass('tph tplh tmh tmlh');
                me.addClass(type);
            }
        }
    );
    expanders.click(function(){
        toggle_branch($(this).attr('funid'));
        return false;
    });
    $('.treecheck').click(function(){
        set_check($(this).attr('funid'));
        return false;
    });
    $('#treesearch').keyup(function(){
        if(this.value.length < 3) {
            if(_tree_searching > 0) close_search(true);
            return;
        }
        if(this.value.length == _tree_searching) return;
        _tree_searching = this.value.length;
        $('#treestatus').html('Searching...');
        if(_tree_searching > 0) $('#treesearchresults').html('Searching...');
        $.getJSON('/sector_tree/tree_search.php', {q: this.value},
            function(data){
                var results = [];
                var result_html;
                var go_back = '<div style="margin-top:1em;"><a href="#" onclick="close_search(); return false;">Go back</a></div>';
                if(data.length > 0) {
                    var alt_count = 0;
                    $.each(data, function(i,item){
                        if(_tree_check_state[item.id]) return;
                        var check = '<td class="searchcheck check0" funid="'+item.id+'"></td>';
                        var count = item.count ? '<span class="tc">('+item.count+')</span>' : '';
                        var alt = alt_count++%2==0 ? '' : ' class="rowalt"';
                        results.push('<tr'+alt+'>'+check+'<td>'+item.path+count+'</td></tr>');
                    });
                    if(results.length == 0)
                        result_html = 'No additional categories found. ('+data.length+' already selected.)'+go_back;
                    else result_html = '<table cellspacing="0" cellpadding="0">'+results.join('')+'</table>';
                }
                else if(results.length == 0)
                    result_html = 'No categories found.'+go_back;
                $('#treesearchresults').html(result_html);
                $('.searchcheck').click(search_check_click);
                _search_check_state = {};
                if(_tree_searching > 0) {
                    $('#treesearchresults').removeClass('hidden');
                    $('#tree').addClass('hidden');
                    $('#treebuttons').addClass('hidden');
                    $('#searchbuttons').removeClass('hidden');
                    $('#treecontrols').addClass('hidden');
                    $('#searchcontrols').removeClass('hidden');
                }
                $('#treestatus').html('');
            }
        );
    });
    $('#treecover').css('opacity', 0.5);
    $(window).resize(tree_resize);
});

function tree_resize() {
    var w = $('#treewindow');
    var box_h = w.height();
    var top = w.offset().top - $(document).scrollTop();
    var doc_h = $(window).height();
    var current_h = $('ul#tree').height();
    if(doc_h < box_h + top || current_h < 470) {
        var new_h = current_h - (box_h + top + top - doc_h); // another "top" for the bottom
        if(new_h < 50) new_h = 50;
        if(new_h > 470) new_h = 470;
        $('ul#tree, #treesearchresults').css('height', new_h);
    }
}

/* Stop stupid IE behavior */
try {
    document.execCommand("BackgroundImageCache", false, true);
} catch(err) {}

