(Bug 215) Strip trailing whitespace in separate commit, for clarity.
(Bug 215) Fix up code for vgift purchase in contextual hover.

This provides a valid value in the ctxpopup endpoint for the existing
can_receive_vgifts check using our can_receive_vgifts_from user method
(which won't ever be true unless vgifts are enabled in the site config,
so it can safely be used in production ahead of deployment).

The sendvgift.href (and jQuery equivalent) are updated to use the proposed
new shop URL format of /shop/vgift?user=username, instead of vgift?to=username
that LJ apparently used.  This logic is encapsulated in the new user method,
$u->virtual_gift_url, and encoded in the endpoint as url_vgift.

Small logic tweaks in the can_receive_vgifts_from user method ensure that
the logged in user is a personal account, and the proposed recepient is not
a syndicated account.  Also added explicit check for journal bans.  This was
already being done in the shop, but in testing I realized it would still show
the option in the contextual hover menu for a banned user.

I thought about also checking for the case where the logged-in user
has banned the other user, since seeing "Send a virtual gift" right
above "Unban user" in the menu seemed odd.  On further reflection, I
realized moving "Send a virtual gift" up right below "Send message"
would look less weird.  But once that was done, the link begged for
more consistent grammar so I changed the message to "Send virtual gift",
removing the indefinite article.
(Bug 215) Update sample config file with syntax for enabling vgifts.

Because the cost of each vgift is set individually and stored in the database,
no pricing information is used in the config file.  Instead, the presence of
the vgifts key in the %SHOP hash is what activates the feature.

The bug spec says to expire vgifts after two weeks, but this seems like the
sort of decision that various sites might wish to treat differently.  So
make a new config parameter: $LJ::VGIFT_EXPIRE_DAYS (defaults to 14).

The vgift shop is obviously not ready to be turned on in production.
This syntax is being made available now to assist other developers who
are interested in testing the system as it evolves.
(Bug 215) Add a new method and fix a bug in DW::Shop::Item.

Bug fix: the "new" method was checking for userid == 0.  This generated
a warning in the undef case.  Conditional changed to falsehood test.

New method: from_text, plaintext equivalent of existing method from_html.
Common code refactored into _from_other helper method.

Slight behavior change: moved anonymity check to the top of the block,
so it will always print "anonymous" whether or not from_name is set.
(Not sure whether that qualifies as bugfix or new feature...)

Slight behavior change: if $from_u doesn't load, display the error.nojournal
string instead of "anonymous".
(Bug 215) Less negativity, as requested.
(Bug 215) Change actions for birthday event to include vgift purchase link.

This adds a link which only appears if vgifts are enabled in the config,
similar to the behavior of the contextual menu link.  However, this
link doesn't have the additional premission-checking logic of the
contextual menu link - but then again, neither do any of the other
items listed here.  In this context, where we are adding actions to
a message that the system sent, I think it's fine to just do the
config check.  Presumably some other part of the code is making sure
any undesirables aren't receiving these messages in the first place.

A side effect of the work here is to English-strip some code that was
not in the translation system before.  I also converted a couple of
unrelated BML::ml calls to LJ::Lang::ml, for the good of the order.
Merge pull request #481 from kareila/bug0215-submitted

Bug 215 - contextual menu bits