function Bruser(Parent, Uri) {
    var bv;
    var bruser;
    var favorite;

    var loadFavorite = function(data) {
        favorite = data;
        
        $('div.bruserfav', bv).show()
        .find('.beername').attr('href', '/beer/'+data.id).text(data.name);

        fetch('brewery', data.brewery,
              function(brewery) {
                  $('div.bruserfav .breweryname', bv).attr('href', '/brewery/'+brewery.id).text(brewery.name);
              });
    };

    var cancelSettings = function() {
        $('.brusersettings', bv).hide();
        return false;
    };

    var saveSettings = function() {
        var data = {};
        var home = $('.brusersettings input.home', bv).val();
        if (!home || home.length == 0) {
            data.remove_home = true;
        } else {
            data.home = home;
        }

        var favorite = $('.brusersettings input.favorite', bv).val();
        if (!favorite || favorite.length == 0) {
            data.remove_favorite = true;
        } else {
            var favuri = $('.brusersettings input.favoriteuri', bv).val();
            data.favorite = favuri.substring(favuri.lastIndexOf('/')+1);
        }

        var email = $('.brusersettings input.email', bv).val();
        if (!email || email.length == 0) {
            data.remove_email = true;
        } else {
            data.email = email;
        }

        var password = $('.brusersettings input.password', bv).val();
        var confirm = $('.brusersettings input.confirm', bv).val();
        if (password && password.length > 0) {
            if (confirm && confirm.length > 0) {
                if (confirm == password) {
                    data.password = password;
                }
                else {
                    $('.brusersettings input.password', bv).focus();
                }
            }
            else {
                $('.brusersettings input.confirm', bv).focus();
            }
        } else if (confirm && confirm.length > 0) {
            $('.brusersettings input.password', bv).focus();
        }

        $.ajax({url:'/api/user/'+bruser.id,
                type:'PUT',
                data:data,
                success:function(bruser) { window.location = '/user/'+bruser.id; },
                dataType:'json'});
        return false;
    };
 
    var settings = function() {
        $('.brusersettings input.home', bv).val(bruser.home);
        $('.brusersettings input.email', bv).val(GSession.email);

        $('.brusersettings input.favorite', bv)
        .autocomplete("/api/autocomplete/beer",
                      {dataType:'json',
                       parse:function(data) {
                           var res = [];
                           for (var i = 0; i < data.results.length; i++) {
                               res[i] = {data:data.results[i],
                                         value:data.results[i].title,
                                         result:data.results[i].title};
                           }
                           return res;
                       },
                       formatItem:function(row) {
                           return row.title+' - '+row.brewery_name;
                       }
                      })
        .result(function(ev, row) {
            $('.brusersettings input.favoriteuri', bv).val(row.uri);
            //todo: provide undo button?
        });

        if (GUser.favorite) {
            $.getJSON('/api/beer/'+GUser.favorite, [],
                      function(data) {
                          $('.brusersettings input.favorite', bv).val(data.name);
                          $('.brusersettings input.favoriteuri', bv).val('/beer/'+data.id);
                      });
        }

        $('.brusersettings', bv).show();
        return false;
    };

    var setSession = function() {
        if (GSession === null) { return; }

        if (GSession.id == bruser.id) {
            add_edit_button('/user/'+bruser.id, 'settings', settings);

            $('div.settings', bv).show()
            .find('.save.button').attr('href', '/user/'+bruser.id).click(saveSettings).end()
            .find('.cancel.button').attr('href', '#').click(cancelSettings);
        }
    };

   var loadBruser = function(data) {
        bruser = data;
        $('.brusername', bv).text(data.name);

        if (data.home) {
            $('div.bruserhome', bv).show().find('span').text(data.home);
        }

        if (bruser.favorite) {
            fetch('beer', bruser.favorite, loadFavorite);
        }

       $('div.bruservotes span').text(bruser.votecount);

       $.getJSON('/api/user/'+bruser.id+'/agreement', [],
                 function(data) {
                     $('div.agree.'+data.agreement, bv).show();
                 });

        ViewTabber($('.bruseritems', bv),
                   [{name:'beers',
                     label:'beers',
                     createView:function(viewdiv) {
                         BeerTable(viewdiv,
                                   [{fun:function() {
                                       if (GSession) {
                                           var scored = [];
                                           for (var i = data.beers.length-1; i >= 0; i--) {
                                               var score = find_score(data.beers[i]);
                                               if (score || score == 0)
                                                   scored.push({'id':data.beers[i],
                                                                'score':score});
                                           }
                                           return map(function(b) { return b.id; },
                                                      scored.sort(function(b1, b2) { return b2.score - b1.score; }));
                                       }
                                       return [];
                                   },
                                     uri:data_uri+'?sort=score',
                                     label:'score'
                                    },
                                    {uri:data_uri+'?sort=atoz',
                                     label:'name',
                                     field:'beers',
                                     current:true
                                    },
                                    {uri:data_uri+'?sort=adddate',
                                     label:'add date',
                                     field:'beers'
                                    },
                                    {uri:data_uri+'?sort=lastcomm',
                                     label:'last comment',
                                     field:'beers'
                                    }]);
                     }},
                    {name:'comments',
                     label:'comments',
                     createView:function(viewdiv) {
                         CommentTable(viewdiv, data.comments);
                     }}]);

        get_session('bruser', setSession);
    };

    var loadTemplate = function(data) {
        var bv = $(data).appendTo(Parent);
        $.getJSON(Uri, [], loadBruser);
    };

    $.get('/'+stv+'/html/bruser.html', [], loadTemplate);
};

$(function() { Bruser($('#view'), data_uri); });

