Committer: dnikolaev
LJSUP-7240 Templatized Control Strip (Alpha Version)A trunk/cgi-bin/LJ/ControlStrip.pm U trunk/cgi-bin/weblib.pl A trunk/templates/ControlStrip/ A trunk/templates/ControlStrip/main.tmpl
Added: trunk/cgi-bin/LJ/ControlStrip.pm =================================================================== --- trunk/cgi-bin/LJ/ControlStrip.pm (rev 0) +++ trunk/cgi-bin/LJ/ControlStrip.pm 2010-11-10 07:27:46 UTC (rev 17654) @@ -0,0 +1,430 @@ +package LJ::ControlStrip; + +use strict; + +sub render +{ + my ($class, $user) = @_; + + my $show_strip = 1; + if (LJ::are_hooks("show_control_strip")) { + $show_strip = LJ::run_hook("show_control_strip", { user => $user }); + } + return "" unless $show_strip; + + my $remote = LJ::get_remote(); + my $journal = LJ::load_user($user); + + my $args = scalar LJ::Request->args; + my $querysep = $args ? "?" : ""; + my $uri = "http://" . LJ::Request->header_in("Host") . LJ::Request->uri . $querysep . $args; + $uri = LJ::eurl($uri); + + my $data_remote = {}; + my $data_journal = {}; + my $data_control_strip = {}; + + my $data_lj = { + siteroot => $LJ::SITEROOT, + sslroot => $LJ::SSLROOT, + imgprefix => $LJ::IMGPREFIX, + + link => { + login => html_link("$LJ::SITEROOT/?returnto=$uri", BML::ml('web.controlstrip.links.login')), + home => html_link("$LJ::SITEROOT/", BML::ml('web.controlstrip.links.home')), + create_account => LJ::run_hook("override_create_link_on_navstrip", $journal) || + html_link("$LJ::SITEROOT/create.bml", BML::ml('web.controlstrip.links.create', {'sitename' => $LJ::SITENAMESHORT})), + syndicated_list => html_link("$LJ::SITEROOT/syn/list.bml", BML::ml('web.controlstrip.links.popfeeds')), + learn_more => LJ::run_hook('control_strip_learnmore_link') || + html_link("$LJ::SITEROOT/", BML::ml('web.controlstrip.links.learnmore')), + explore => html_link("$LJ::SITEROOT/explore/", BML::ml('web.controlstrip.links.explore', { sitenameabbrev => $LJ::SITENAMEABBREV })), + support => html_link("$LJ::SITEROOT/support/", BML::ml('web.controlstrip.links.support')), + }, + # login_openid = "$LJ::SITEROOT/identity/login.bml?type=openid"; + # login_facebook = "$LJ::SITEROOT/identity/login.bml?type=facebook"; + # login_twitter = "$LJ::SITEROOT/identity/login.bml?type=twitter"; + }; + + if ($remote && LJ::u_equals($remote, $journal)) { + $data_journal->{type} = 'own'; + } elsif ($journal->is_personal || $journal->is_identity) { + $data_journal->{type} = 'personal'; + } elsif ($journal->is_community) { + $data_journal->{type} = 'community'; + } elsif ($journal->is_syndicated) { + $data_journal->{type} = 'syndicated'; + } elsif ($journal->is_news) { + $data_journal->{type} = 'news'; + } else { + $data_journal->{type} = 'other'; + } + + $data_journal->{'is_' . $data_journal->{type}} = 1; + + $data_journal->{view} = LJ::Request->notes('view'); + $data_journal->{view_friends} = $data_journal->{view} eq 'friends'; + $data_journal->{view_friendsfriends} = $data_journal->{view} eq 'friendsfriends'; + $data_journal->{view_entry} = $data_journal->{view} eq 'entry'; + $data_journal->{display} = LJ::ljuser($journal); + + # warn "[", $data_journal->{view}, "]\n"; + + if ($remote) + { + $data_remote->{is_logged_in} = 1; + $data_remote->{user} = $remote->{user}; + $data_remote->{display} = LJ::ljuser($remote); + $data_remote->{sessid} = ($remote->session ? $remote->{_session}->{sessid} : undef); + $data_remote->{is_paid} = $remote->in_class('paid') || $remote->in_class('sponsored'); + + if ($remote->{defaultpicid}) { + $data_remote->{userpic} = { + src => "$LJ::USERPIC_ROOT/$remote->{defaultpicid}/$remote->{userid}", + alt => BML::ml('web.controlstrip.userpic.alt'), + title => BML::ml('web.controlstrip.userpic.title'), + }; + } else { + my $tinted_nouserpic_img = ""; + + if ($journal->prop('stylesys') == 2) { + my $ctx = $LJ::S2::CURR_CTX; + my $custom_nav_strip = S2::get_property_value($ctx, "custom_control_strip_colors"); + + if ($custom_nav_strip ne "off") { + my $linkcolor = S2::get_property_value($ctx, "control_strip_linkcolor"); + + if ($linkcolor ne "") { + $tinted_nouserpic_img = S2::Builtin::LJ::palimg_modify($ctx, "controlstrip/nouserpic.gif", [S2::Builtin::LJ::PalItem($ctx, 0, $linkcolor)]); + } + } + } + + $data_remote->{userpic} = { + src => $tinted_nouserpic_img || "$LJ::IMGPREFIX/controlstrip/nouserpic.gif", + alt => BML::ml('web.controlstrip.nouserpic.alt'), + title => BML::ml('web.controlstrip.nouserpic.title'), + }; + } + + my $inbox = $remote->notification_inbox(); + $data_remote->{inbox} = { + unread_count => $inbox->unread_count, + }; + + $data_remote->{wallet} = { + balance => int(LJ::Pay::Wallet->get_user_balance($remote)), + }; + + $data_remote->{style_always_mine} = LJ::Widget::StyleAlwaysMine->render( u => $remote ) + if ($remote->{userid} != $journal->{userid}); + + $data_remote->{url}->{base} = $remote->journal_base; + $data_remote->{url}->{inbox} = "$LJ::SITEROOT/inbox/"; + $data_remote->{url}->{tokens} = "$LJ::SITEROOT/shop/tokens.bml"; + $data_remote->{url}->{edit_pics} = "$LJ::SITEROOT/editpics.bml"; + + $data_remote->{link}->{recent_comments} = html_link("$LJ::SITEROOT/tools/recent_comments.bml", BML::ml('web.controlstrip.links.recentcomments')); + $data_remote->{link}->{manage_friends} = html_link("$LJ::SITEROOT/friends/", BML::ml('web.controlstrip.links.managefriends')); + $data_remote->{link}->{manage_entries} = html_link("$LJ::SITEROOT/editjournal.bml", BML::ml('web.controlstrip.links.manageentries')); + $data_remote->{link}->{invite_friends} = html_link("$LJ::SITEROOT/friends/invite.bml", BML::ml('web.controlstrip.links.invitefriends')); + $data_remote->{link}->{add_friend} = html_link("$LJ::SITEROOT/friends/add.bml?user=$journal->{user}", BML::ml('web.controlstrip.links.addfriend')); + $data_remote->{link}->{view_friends} = html_link($remote->journal_base . "/friends/", BML::ml('web.controlstrip.links.viewfriendspage2')); + + my $friend = LJ::is_friend($remote, $journal); + my $friendof = LJ::is_friend($journal, $remote); + + $data_remote->{is_mutualfriend} = ($friend && $friendof); + $data_remote->{is_friend} = $friend; + $data_remote->{is_friendof} = $friendof; + + if ($data_journal->{is_own}) + { + if ($data_journal->{view_friends}) + { + my @filters = ( + all => BML::ml('web.controlstrip.select.friends.all'), + showpeople => BML::ml('web.controlstrip.select.friends.journals'), + showcommunities => BML::ml('web.controlstrip.select.friends.communities'), + showsyndicated => BML::ml('web.controlstrip.select.friends.feeds'), + ); + + my %res; + # FIXME: make this use LJ::Protocol::do_request + LJ::do_request( + { + 'mode' => 'getfriendgroups', + 'ver' => $LJ::PROTOCOL_VER, + 'user' => $remote->{'user'}, + }, + \%res, + { + 'noauth' => 1, + 'userid' => $remote->{'userid'} + } + ); + + my %group; + foreach my $k (keys %res) { + if ($k =~ /^frgrp_(\d+)_name/) { + $group{$1}->{'name'} = $res{$k}; + } + elsif ($k =~ /^frgrp_(\d+)_sortorder/) { + $group{$1}->{'sortorder'} = $res{$k}; + } + } + + foreach my $g (sort { $group{$a}->{'sortorder'} <=> $group{$b}->{'sortorder'} } keys %group) { + push @filters, "filter:" . lc($group{$g}->{'name'}), $group{$g}->{'name'}; + } + + my $selected = "all"; + if (LJ::Request->uri eq "/friends" && LJ::Request->args ne "") { + $selected = "showpeople" if LJ::Request->args eq "show=P&filter=0"; + $selected = "showcommunities" if LJ::Request->args eq "show=C&filter=0"; + $selected = "showsyndicated" if LJ::Request->args eq "show=Y&filter=0"; + } elsif (LJ::Request->uri =~ /^\/friends\/?(.+)?/i) { + my $filter = $1 || "default view"; + $selected = "filter:" . LJ::durl(lc($filter)); + } + + $data_remote->{friends_group_select} = LJ::html_select({'name' => "view", 'selected' => $selected }, @filters); + } + } + elsif ($data_journal->{is_personal}) + { + } + elsif ($data_journal->{is_community}) + { + $data_remote->{can_post} = LJ::check_rel($journal, $remote, 'P'); + $data_remote->{can_manage} = LJ::can_manage_other($remote, $journal); + $data_remote->{is_watcher} = $data_remote->{is_friend}; + $data_remote->{is_memberof} = $data_remote->{is_friendof}; + + $data_remote->{link}->{join_community} = html_link( + "$LJ::SITEROOT/community/join.bml?comm=$journal->{user}", + BML::ml('web.controlstrip.links.joincomm') + ); + $data_remote->{link}->{leave_community} = html_link( + "$LJ::SITEROOT/community/leave.bml?comm=$journal->{user}", + BML::ml('web.controlstrip.links.leavecomm') + ); + $data_remote->{link}->{watch_community} = html_link( + "$LJ::SITEROOT/friends/add.bml?user=$journal->{user}", + BML::ml('web.controlstrip.links.watchcomm') + ); + $data_remote->{link}->{unwatch_community} = html_link( + "$LJ::SITEROOT/community/leave.bml?comm=$journal->{user}", + BML::ml('web.controlstrip.links.removecomm') + ); + $data_remote->{link}->{post_to_community} = html_link( + "$LJ::SITEROOT/update.bml?usejournal=$journal->{user}", + BML::ml('web.controlstrip.links.postcomm') + ); + $data_remote->{link}->{edit_community_profile} = html_link( + "$LJ::SITEROOT/manage/profile/?authas=$journal->{user}", + BML::ml('web.controlstrip.links.editcommprofile') + ); + $data_remote->{link}->{edit_community_invites} = html_link( + "$LJ::SITEROOT/community/sentinvites.bml?authas=$journal->{user}", + BML::ml('web.controlstrip.links.managecomminvites') + ); + $data_remote->{link}->{edit_community_members} = html_link( + "$LJ::SITEROOT/community/members.bml?authas=$journal->{user}", + BML::ml('web.controlstrip.links.editcommmembers') + ); + } + + if ($remote->is_person) { + $data_remote->{link}->{post_journal} = html_link( + "$LJ::SITEROOT/update.bml", + BML::ml('web.controlstrip.links.post2') + ); + } + + if ($data_journal->{is_syndicated} || $data_journal->{is_news}) + { + $data_remote->{link}->{add_feed} = html_link( + "$LJ::SITEROOT/friends/add.bml?user=$journal->{user}", + BML::ml('web.controlstrip.links.addfeed') + ); + $data_remote->{link}->{remove_feed} = html_link( + "$LJ::SITEROOT/friends/add.bml?user=$journal->{user}", + BML::ml('web.controlstrip.links.removefeed') + ); + } + } + else + { + $data_remote->{is_logged_in} = 0; + + my $show_login_form = LJ::run_hook("show_control_strip_login_form", $journal); + $show_login_form = 1 if !defined $show_login_form; + + $data_journal->{login_form}->{show} = $show_login_form; + + if ($show_login_form) { + + $data_journal->{login_form}->{use_ssl} = $LJ::USE_SSL_LOGIN; + + if ($LJ::USE_SSL_LOGIN) { + $data_journal->{login_form}->{root} = $LJ::SSLROOT; + } else { + $data_journal->{login_form}->{root} = $LJ::SITEROOT; + $data_journal->{login_form}->{challenge} = LJ::challenge_generate(300); + } + + $data_control_strip->{userpic} = LJ::run_hook('control_strip_userpic_contents', $uri) || " "; + + } else { + $data_control_strip->{userpic} = LJ::run_hook('control_strip_loggedout_userpic_contents', $uri) || " "; + } + } + + $data_control_strip->{logo} = LJ::run_hook('control_strip_logo', $remote, $journal); + + $data_control_strip->{site_messages} = LJ::Widget::SiteMessages->should_render + ? LJ::Widget::SiteMessages->render + : ''; + + { + my $extra_cells; + LJ::run_hooks('add_extra_cells_in_controlstrip', \$extra_cells); + + $data_control_strip->{extra_cells} = $extra_cells || ''; + } + + my $data = { + lj => $data_lj, + remote => $data_remote, + journal => $data_journal, + control_strip => $data_control_strip, + }; + + $data->{remote}->{status} = get_status($data); + + my $tmpl = LJ::HTML::Template->new( + { + use_expr => 1 + }, + filename => "$ENV{LJHOME}/templates/ControlStrip/main.tmpl", + die_on_bad_params => 1, + strict => 0, + ) or die "Can't open template: $!"; + + $tmpl->param(flatten($data)); + + # use Data::Dumper; + # warn Dumper({flatten($data)}), "\n"; + + return $tmpl->output; +} + +sub html_link +{ + my ($url, $text) = @_; + + return "<a href='$url'>$text</a>"; +} + +sub get_status +{ + my ($data) = @_; + + my $journal_display = $data->{journal}->{display}; + + if ($data->{journal}->{is_own}) + { + # $data->{remote}->{is_logged_in} == true + if ($data->{journal}->{view_friends}) { + return BML::ml('web.controlstrip.status.yourfriendspage'); + } elsif ($data->{journal}->{view_friendsfriends}) { + return BML::ml('web.controlstrip.status.yourfriendsfriendspage'); + } else { + return BML::ml('web.controlstrip.status.yourjournal'); + } + } + elsif ($data->{journal}->{is_personal}) + { + if ($data->{remote}->{is_logged_in}) + { + if ($data->{remote}->{is_mutualfriend}) { + return BML::ml('web.controlstrip.status.mutualfriend', {user => $journal_display}); + } elsif ($data->{remote}->{is_friend}) { + return BML::ml('web.controlstrip.status.friend', {user => $journal_display}); + } elsif ($data->{remote}->{is_friendof}) { + return BML::ml('web.controlstrip.status.friendof', {user => $journal_display}); + } + } + + if ($data->{journal}->{view_friends}) { + return BML::ml('web.controlstrip.status.personalfriendspage', {user => $journal_display}); + } elsif ($data->{journal}->{view_friendsfriends}) { + return BML::ml('web.controlstrip.status.personalfriendsfriendspage', {user => $journal_display}); + } else { + return BML::ml('web.controlstrip.status.personal', {user => $journal_display}); + } + } + elsif ($data->{journal}->{is_community}) + { + if ($data->{remote}->{is_logged_in}) + { + if ($data->{remote}->{can_manage}) + { + return BML::ml('web.controlstrip.status.maintainer', {user => $journal_display}); + } + elsif ($data->{remote}->{is_watcher} && $data->{remote}->{is_memberof}) + { + return BML::ml('web.controlstrip.status.memberwatcher', {user => $journal_display}); + } + elsif ($data->{remote}->{is_watcher}) + { + return BML::ml('web.controlstrip.status.watcher', {user => $journal_display}); + } + elsif ($data->{remote}->{is_memberof}) + { + return BML::ml('web.controlstrip.status.member', {user => $journal_display}); + } + } + + return BML::ml('web.controlstrip.status.community', {user => $journal_display}); + } + elsif ($data->{journal}->{is_syndicated}) + { + return BML::ml('web.controlstrip.status.syn', {user => $journal_display}); + } + elsif ($data->{journal}->{is_news}) + { + return BML::ml('web.controlstrip.status.news', {user => $journal_display, sitename => $LJ::SITENAMESHORT}); + } + else + { + return BML::ml('web.controlstrip.status.other', {user => $journal_display}); + } +} + +sub flatten_hashref +{ + my ($hashref, $prefix, $out) = @_; + + while (my ($key, $value) = each %$hashref) { + if (ref($value) eq 'HASH') { + flatten_hashref($value, $prefix . $key . '.', $out); + } else { + $out->{$prefix . $key} = $value; + } + } +} + +sub flatten +{ + my ($hashref) = @_; + + my $out = {}; + + flatten_hashref($hashref, '', $out); + + return %$out; +} + +1; + Modified: trunk/cgi-bin/weblib.pl =================================================================== --- trunk/cgi-bin/weblib.pl 2010-11-10 07:14:06 UTC (rev 17653) +++ trunk/cgi-bin/weblib.pl 2010-11-10 07:27:46 UTC (rev 17654) @@ -20,6 +20,7 @@ LJ::Directory::Constraint LJ::M::FriendsOf ); +use LJ::ControlStrip; # <LJFUNC> # name: LJ::img @@ -1824,8 +1825,20 @@ } sub control_strip +{ + return $LJ::DISABLED{control_strip_new} ? control_strip_old(@_) : control_strip_new(@_); +} + +sub control_strip_new { my %opts = @_; + + return LJ::ControlStrip->render($opts{user}); +} + +sub control_strip_old +{ + my %opts = @_; my $user = delete $opts{user}; my $journal = LJ::load_user($user); Added: trunk/templates/ControlStrip/main.tmpl =================================================================== --- trunk/templates/ControlStrip/main.tmpl (rev 0) +++ trunk/templates/ControlStrip/main.tmpl 2010-11-10 07:27:46 UTC (rev 17654) @@ -0,0 +1,159 @@ +<table id='lj_controlstrip' cellpadding='0' cellspacing='0'> + <tr valign='top'> + +<TMPL_IF remote.is_logged_in> + + <td id='lj_controlstrip_userpic' style='background-image: none;'> + <a href='<TMPL_VAR remote.url.edit_pics>'><img src='<TMPL_VAR remote.userpic.src>' alt='<TMPL_VAR remote.userpic.alt>' title='<TMPL_VAR remote.userpic.title>' height='43' /></a> + </td> + + <td id='lj_controlstrip_user' nowrap='nowrap'> + <form id='Greeting' class='nopic' action='<TMPL_VAR lj.siteroot>/logout.bml?ret=1' method='post'> + <div> + <input type='hidden' name='user' value='<TMPL_VAR remote.user>' /> + <TMPL_IF remote.sessid><input type='hidden' name='sessid' value='<TMPL_VAR remote.sessid>' /></TMPL_IF> + <TMPL_VAR remote.display> <input type='submit' value='<TMPL_VAR expr="ml('web.controlstrip.btn.logout')">' id='Logout' /> + </div> + </form> + <TMPL_VAR lj.link.home> + <TMPL_VAR remote.link.post_journal> + <TMPL_VAR remote.link.view_friends> + <a href='<TMPL_VAR remote.url.inbox>'>Inbox (<TMPL_VAR remote.inbox.unread_count>)</a> + <a href='<TMPL_VAR remote.url.tokens>'>LJ Tokens (<TMPL_VAR remote.wallet.balance>)</a> + <TMPL_VAR lj.link.support> + </td> + + <td id='lj_controlstrip_actionlinks' nowrap='nowrap'> + <span id='lj_controlstrip_statustext'><TMPL_VAR remote.status></span><br /> + +<TMPL_IF journal.is_own> + <TMPL_IF journal.view_friends> + <TMPL_VAR remote.link.manage_friends> + <TMPL_VAR expr="ml('web.controlstrip.select.friends.label')"> + <form method='post' style='display: inline;' action='<TMPL_VAR lj.siteroot>/friends/filter.bml'> + <input type='hidden' name='user' value='<TMPL_VAR remote.user>' /> + <input type='hidden' name='mode' value='view' /> + <input type='hidden' name='type' value='allfilters' /> + <TMPL_VAR remote.friends_group_select> + <input type='submit' value='<TMPL_VAR expr="ml('web.controlstrip.btn.view')">' /> + </form> + <TMPL_ELSE> + <TMPL_VAR remote.link.recent_comments> + <TMPL_VAR remote.link.manage_entries> + <TMPL_VAR remote.link.invite_friends> + </TMPL_IF> +</TMPL_IF> + +<TMPL_IF journal.is_personal> + <TMPL_IF remote.is_friend> + <TMPL_VAR remote.link.manage_friends> + <TMPL_ELSE> + <TMPL_VAR remote.link.add_friend> + </TMPL_IF> +</TMPL_IF> + +<TMPL_IF journal.is_community> + <TMPL_IF remote.can_post><TMPL_VAR remote.link.post_to_community> </TMPL_IF> + <TMPL_IF remote.can_manage> + <TMPL_VAR remote.link.edit_community_profile> + <TMPL_VAR remote.link.edit_community_invites> + <TMPL_VAR remote.link.edit_community_members> + <TMPL_ELSE> + <TMPL_IF remote.is_memberof> + <TMPL_VAR remote.link.leave_community> + <TMPL_ELSE> + <TMPL_VAR remote.link.join_community> + </TMPL_IF> + <TMPL_IF remote.is_watcher> + <TMPL_VAR remote.link.unwatch_community> + <TMPL_ELSE> + <TMPL_VAR remote.link.watch_community> + </TMPL_IF> + </TMPL_IF> +</TMPL_IF> + +<TMPL_IF journal.is_syndicated> + <TMPL_IF remote.is_friend><TMPL_VAR remote.link.remove_feed><TMPL_ELSE><TMPL_VAR remote.link.add_feed></TMPL_IF> <TMPL_VAR lj.link.syndicated_list> +</TMPL_IF> + +<TMPL_IF journal.is_news> + <TMPL_IF remote.is_friend> <TMPL_ELSE><TMPL_VAR link.add_feed></TMPL_IF> +</TMPL_IF> + + + <TMPL_VAR remote.style_always_mine> + <TMPL_VAR control_strip.logo> + + </td> + +<TMPL_ELSE> + + <TMPL_IF journal.login_form.show> + + <td id='lj_controlstrip_userpic'> + <TMPL_VAR control_strip.userpic> + </td> + + <td id='lj_controlstrip_login' style='background-image: none;' nowrap='nowrap'> + <form id='login' class='lj_login_form' action='<TMPL_VAR journal.login_form.root>/login.bml?ret=1' method='post'> + <div> + <input type="hidden" name='mode' value='login' /> + <TMPL_UNLESS journal.login_form.use_ssl> + <input type='hidden' name='chal' id='login_chal' class='lj_login_chal' value='<TMPL_VAR journal.login_form.challenge>' /> + <input type='hidden' name='response' id='login_response' class='lj_login_response' value='' />"; + </TMPL_UNLESS> + <table cellspacing="0" cellpadding="0" style="margin-right: 1em;"> + <tr> + <td> + <label for='xc_user'><TMPL_VAR expr="ml('/login.bml.login.username')"></label> + <input type='text' name='user' size='7' maxlength='17' tabindex='1' id='xc_user' value='' /> + </td> + <td> + <label style='margin-left: 3px;' for='xc_password'><TMPL_VAR expr="ml('/login.bml.login.password')"></label> + <input type='password' name='password' size='7' tabindex='2' id='xc_password' class='lj_login_password' /> + <input type='submit' value='<TMPL_VAR expr="ml('web.controlstrip.btn.login')">' tabindex='4' /> + </td> + </tr> + <tr> + <td valign='top'> + <a href='<TMPL_VAR lj.siteroot/lostinfo.bml'><TMPL_VAR expr="ml('web.controlstrip.login.forgot')"></a> + </td> + <td style='font: 10px Arial, Helvetica, sans-serif;' valign='top' colspan='2' align='right'> + <input type='checkbox' id='xc_remember' name='remember_me' style='height: 10px; width: 10px;' tabindex='3' /> + <label for='xc_remember'><TMPL_VAR expr="ml('web.controlstrip.login.remember')"></label> + </td> + </tr> + </table> + </div> + </form> + </td> + + <TMPL_ELSE> + + <td id='lj_controlstrip_loggedout_userpic'> + <TMPL_VAR control_strip.userpic> + </td> + + </TMPL_IF> + + <td id='lj_controlstrip_actionlinks' nowrap='nowrap'> + + <span id='lj_controlstrip_statustext'><TMPL_VAR remote.status></span><br /> + + <TMPL_UNLESS journal.login_form.show><TMPL_VAR lj.link.login> </TMPL_UNLESS> + <TMPL_VAR lj.link.create_account> <TMPL_VAR lj.link.learn_more> + <TMPL_VAR control_strip.logo> + </td> + +</TMPL_IF> + + <TMPL_VAR control_strip.extra_cells> + + </tr> + <tr> + <td colspan='5'> + <TMPL_VAR control_strip.site_messages> + </td> + </tr> +</table> +