function Brewery(Parent, Uri) {
    var bv;
    var brewery;

    var fillMergeChoices = function(uri) {
        $.getJSON('/api/'+uri, [],
                  function(data) {
                      $('div.mergechoices', bv).show()
                          .find('span.breweryid').text(data.id).end()
                          .find('span.breweryname').text(data.name).end()
                          .find('span.website').text(data.website || 'unknown').end()
                          .find('span.thislocations').text(brewery.locations.length).end()
                          .find('span.otherlocations').text(data.locations.length).end()
                          .find('span.thisbeers').text(brewery.beers.length).end()
                          .find('span.otherbeers').text(data.beers.length).end()
                          .find('span.thiscomments').text(brewery.comments.length).end()
                          .find('span.othercomments').text(data.comments.length);
                  });
    };

    var merge = function() {
        var mdiv = $('div.mergechoices', bv);
        var props = {};
        var fields = mdiv.find('input[type=checkbox]');
        for (var i = fields.length-1; i >= 0; i--) {
            props[fields.eq(i).attr('name')] = !!fields.eq(i).attr('checked');
        }

        var postbrewery = brewery.id;

        if (props.breweryid) {
            for (k in props) { props[k] = !props[k]; }

            var temp = props.thiscomments;
            props.thiscomments = !props.othercomments;
            props.othercomments = !temp;

            temp = props.thislocations;
            props.thislocations = !props.otherlocations;
            props.otherlocations = !temp;

            props.otherbeers = true;
            props.thisbeers = true;

            props.breweryid = brewery.id;
            postbrewery = mdiv.find('span.breweryid').text();
        } else {
            props.breweryid = mdiv.find('span.breweryid').text();
        }

        props.cmd = 'merge';

        $.ajax({url:'/api/brewery/'+postbrewery,
                type:'POST',
                data:props,
                success:function(newb) { window.location = '/brewery/'+newb.id; },
                dataType:'json'});
        return false;
    };

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

    var showMerge = function() {
        $('.brewerymerge', bv).show();
        return false;
    };

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

    var save = function() {
        var name = $('.breweryedit .name', bv).val();
        if (name.length <= 0) { alert('Enter a new name for the brewery.'); return false; }

        var website = $('.breweryedit .website', bv).val();

        var data = {cmd:'edit',
            name:name,
            website:website};

        var locations = $('.breweryedit .location', bv);
        for (var i = locations.length-1; i >= 0; i--) {
            var val = $.trim(locations.eq(i).val());
            if (val.length > 0) data['l'+i] = val;
        }

        $.post('/api/brewery/'+brewery.id,
               data,
               function(brewery) { window.location = '/brewery/'+brewery.id; },
               'json');
        return false;
    };

    var edit = function() {
        $('.breweryedit .name', bv).val(brewery.name);
        if (brewery.locations.length > 0) {
            var lines = $('.breweryedit .location', bv);
            if (lines.length < brewery.locations.length) {
                var temp = lines.eq(0).parents('div.popupformline').eq(0);
                for (var i = (brewery.locations.length-lines.length)-1; i >= 0; i--) {
                    temp.clone().insertAfter(temp);
                }
                lines = $('.breweryedit .location', bv);
            }
            for (var i = brewery.locations.length-1; i >= 0; i--)
                lines.eq(i).val(brewery.locations[i].location);
        } else {
            $('.breweryedit .location', bv).val('');
        }
        if (brewery.website) {
            $('.breweryedit .website', bv).val(brewery.website);
        } else {
            $('.breweryedit .website', bv).val('');
        }

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

    var showOtherLocations = function() {
        $('.breweryloc .moreloc', bv).hide()
        $('.breweryloc .otherloc', bv).show();
        return false;
    };

    var hideAddLocation = function(o) {
        $(o.target).parents('div.addlocform').hide().prev().show();
        return false;
    };

    var showAddLocation = function(o) {
        $(o.target).hide().next().show();
        return false;
    };

    var addLocation = function() {
        var loc = $.trim($('.breweryloc input.location', bv).val());
        if (loc.length > 0) {
            $.post('/api/brewery/'+brewery.id,
                   {cmd:'addloc',
                    loc:loc},
                   function(newbrewery) {
                       brewery = newbrewery;
                       $('.breweryloc .primaryloc').clone().removeClass('primaryloc').show()
                       .find('span').text(loc).end()
                       .find('a.mapit').attr('href', '/local?address='+encodeURIComponent(loc)).end()
                       .insertBefore('.breweryloc .otherloc a.addloc');

                       $('.breweryloc input.location', bv).val('');
                       $('.breweryloc .addlocform').hide().prev().show();
                   },
                   'json');
        }
        return false;
    };

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

        if (GSession.id) {
            ReportForm(data_uri, $('div.report', bv));

            $('.breweryloc', bv)
            .find('a.addloc').click(showAddLocation).show().end()
            .find('a.submit').attr('href', '/brewery/'+brewery.id)
            .click(addLocation).end()
            .find('a.cancel').click(hideAddLocation);
        }
        
        if (GSession.admin) {
            add_edit_button('/brewery/'+brewery.id, 'edit', edit);

            $('div.admin', bv).show()
                .find('.save').attr('href', '/brewery/'+brewery.id).click(save).end()
                .find('.cancel').attr('href', '#').click(cancel);

            add_edit_button('/brewery/'+brewery.id, 'merge', showMerge, 'merge');

            $('div.merge', bv).show()
            .find('.merge').attr('href', '/brewery/'+brewery.id).click(merge).end()
            .find('.cancel').attr('href', '#').click(mergeCancel).end()
            .find('.othername').autocomplete('/api/autocomplete/brewery',
                                             {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; }
                                             })
                .result(function(ev, row) {
                            fillMergeChoices(row.uri);
                            return row.title;
                        });
        }
    };

    var loadBrewery = function(data) {
        brewery = data;
        $('.breweryname', bv).text(data.name);

        if (data.locations.length == 0) {
            $('.breweryloc', bv).find('.primaryloc').hide().end()
            .find('.moreloc').hide().end()
            .find('.otherloc').show();
        } else {
            $('.breweryloc', bv).find('.primaryloc')
            .find('span').text(data.locations[0].location).end()
            .find('a').attr('href', '/local?address='+encodeURIComponent(data.locations[0].location));
            
            if (data.locations.length > 1) {
                $('.breweryloc', bv)
                .find('.moreloc').click(showOtherLocations).show()
                .find('span.count').text(data.locations.length-1).end().end()
                .find('.otherloc').hide();

                var temp = $('.breweryloc .primaryloc', bv);
                var list = $('.breweryloc .otherloc', bv);
                for (var i = data.locations.length-1; i >= 1; i--) {
                    temp.clone().removeClass('primaryloc')
                    .find('span').text(data.locations[i].location).end()
                    .find('a').attr('href', '/local?address='+encodeURIComponent(data.locations[i].location)).end()
                    .prependTo(list);
                }
            } else {
                $('.breweryloc', bv).find('.moreloc').hide().end()
                .find('.otherloc').show();
            }
        }

        if (data.website) {
            $('.breweryweb a', bv).attr('href', data.website).text(data.website);
        }
        else {
            $('.breweryweb .webdata', bv).text('');
        }

        ViewTabber($('.breweryitems', bv),
                   [{name:'beers',
                     label:'beers',
                     createView:function(viewdiv) {
                         var creatordiv = $('<div/>').appendTo(viewdiv);
                         get_user('beercreator', function() { BeerCreator(creatordiv, data.id); });
                         BeerTable($('<div/>').appendTo(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('brewery', setSession);
    };

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

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

function BeerCreator(Parent, BreweryId) {
    var bc;

    this.submit = function() {
        var name = $('input[name=name]', bc).val();

        if (name.length > 0) {
            $.post('/api/brewery/'+BreweryId,
                   {cmd:'add_beer', name:name},
                   function(data) {
                       window.location = '/beer/'+data.id;
                   },
                   'json');
        }
        return false;
    };

    var loadTemplate = function(data) {
        bc = $(data).appendTo(Parent);

        $('a.show', bc).click(
            function() { $('a.show', bc).hide();
                         $('div.form', bc).show();
                         $('input', bc).focus();
                         return false;});

        $('a.cancel', bc).click(
            function() { $('div.form', bc).hide();
                         $('a.show', bc).show();
                         return false; });

        $('a.submit', bc).attr('href', '/brewery/'+data.id).click(submit);
    };

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

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

