var GSTree = {
    check: function(obj) {
        var check = $(obj);
        var parent = $(obj).parent();
        if(parent.hasClass('type_element'))
            GSTree.checkElement(obj);
        else
            GSTree.checkCategory(obj);
        var span = parent.parent().parent().children('span');
        if(span.length)
            GSTree.checkParent(parent.parent().parent().children('span'));
    },
    checkElement: function(obj) {
        var check = $(obj);
        check.data('checked') ? check.data('checked', 0) : check.data('checked', 1);
        if(check.data('checked')) {
            check.removeClass('empty').addClass('full');
        } else {
            check.removeClass('full').addClass('empty');
        }
    },
    checkCategory: function(obj) {
        var check = $(obj);
        var parent = $(obj).parent();
        check.data('checked') ? check.data('checked', 0) : check.data('checked', 1);
        if(check.data('checked')) {
            check.removeClass('empty').addClass('full');
        } else {
            check.removeClass('full').addClass('empty');
        }
        var act = check.data('checked');
        
        $('.my_checkbox', parent.children('ul')).each(function(){
                act ? $(this).data('checked', 1) : $(this).data('checked', 0);
                if(act) {
                    $(this).removeClass('empty').addClass('full');
                } else {
                    $(this).removeClass('full').addClass('empty');
                }
            });
    },
    checkParent: function(obj) {
        var parent = $(obj).parent();
        if( parent.hasClass('type_category') ) {
            var flag_empty = true;
            var flag_full = true;
            $('.my_checkbox', parent.children('ul')).each(function(){
                if($(this).data('checked') == 1) {
                    flag_empty = false;
                }
                if(!$(this).data('checked')) {
                    flag_full = false;
                }
            });

            if(flag_empty) {
                $(obj).removeClass('full')
                .removeClass('not_full')
                .addClass('empty');
                $(obj).data('checked', 0);
            }

            if(flag_full) {
                $(obj).removeClass('empty')
                .removeClass('not_full')
                .addClass('full');
                $(obj).data('checked', 1);
            }

            if(!flag_empty && !flag_full) {
                $(obj).removeClass('full')
                .removeClass('empty')
                .addClass('not_full');
                $(obj).data('checked', 0);
            }

        }

        if(!parent.hasClass('tree_root')) {
            var span = parent.parent().parent().children('span');
            if(span.length)
                GSTree.checkParent(span);
        }
    }
}
