Committer: afedorov
LJSUP-10508: Commenting form S1 (Lebedev's redesign). Move branch to trunkU trunk/cgi-bin/Apache/LiveJournal.pm U trunk/cgi-bin/LJ/HTML/Template.pm U trunk/cgi-bin/LJ/Talk.pm U trunk/cgi-bin/LJ/User.pm U trunk/cgi-bin/ljdefaults.pl U trunk/cgi-bin/ljlib.pl U trunk/htdocs/imgupload.bml A trunk/htdocs/js/jquery/jquery.easing.js A trunk/htdocs/js/jquery/jquery.hotkeys.js U trunk/htdocs/js/jquery_fn.js U trunk/htdocs/js/livejournal.js U trunk/htdocs/stc/lj_base.css U trunk/htdocs/talkmulti.bml U trunk/htdocs/talkmulti.bml.text U trunk/htdocs/talkpost.bml U trunk/htdocs/talkpost_do.bml U trunk/htdocs/talkread.bml U trunk/templates/CommentForm/Form.tmpl
Modified: trunk/cgi-bin/Apache/LiveJournal.pm =================================================================== --- trunk/cgi-bin/Apache/LiveJournal.pm 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/cgi-bin/Apache/LiveJournal.pm 2011-11-29 10:40:35 UTC (rev 20653) @@ -1850,15 +1850,11 @@ if ( $LJ::DISABLED{'new_comments'} ) { $filename = $LJ::HOME. '/htdocs/talkread.bml'; } else { - $filename = $LJ::HOME. '/htdocs/talkread_new.bml'; + $filename = $LJ::HOME. '/htdocs/talkread_v2.bml'; } } } else { - if ( $LJ::DISABLED{'new_comments'} ) { - $filename = $LJ::HOME. '/htdocs/talkpost.bml'; - } else { - $filename = $LJ::HOME. '/htdocs/talkpost_new.bml'; - } + $filename = $LJ::HOME. '/htdocs/talkpost.bml'; } LJ::Request->notes("_journal" => $RQ{'user'}); LJ::Request->notes("bml_filename" => $filename); Modified: trunk/cgi-bin/LJ/HTML/Template.pm =================================================================== --- trunk/cgi-bin/LJ/HTML/Template.pm 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/cgi-bin/LJ/HTML/Template.pm 2011-11-29 10:40:35 UTC (rev 20653) @@ -110,8 +110,13 @@ }, ); + HTML::Template::Pro->register_function( + 'src2url' => sub { + my $src = shift; + return LJ::stat_src_to_url($src); + }, + ); - my $template = HTML::Template::Pro->new( global_vars => 1, # normally variables declared outside a loop are not available inside # a loop. This option makes <TMPL_VAR>s like global variables in Perl Modified: trunk/cgi-bin/LJ/Talk.pm =================================================================== --- trunk/cgi-bin/LJ/Talk.pm 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/cgi-bin/LJ/Talk.pm 2011-11-29 10:40:35 UTC (rev 20653) @@ -1198,14 +1198,17 @@ LJ::MemCache::set($rp_memkey, int($ct)); } -# LJ::Talk::load_comments($u, $remote, $nodetype, $nodeid, $opts) +# LJ::Talk::load_comments_tree($u, $remote, $nodetype, $nodeid, $opts) # # nodetype: "L" (for log) ... nothing else has been used # noteid: the jitemid for log. # opts keys: # thread -- jtalkid to thread from ($init->{'thread'} or int($GET{'thread'} / 256)) # page -- $GET{'page'} +# page_size # view -- $GET{'view'} (picks page containing view's ditemid) +# viewall +# showspam # flat -- boolean: if set, threading isn't done, and it's just a flat chrono view # up -- [optional] hashref of user object who posted the thing being replied to # only used to make things visible which would otherwise be screened? @@ -1219,9 +1222,6 @@ # out_pagesize: size of each page # out_items: number of total top level items # -# userpicref -- hashref to load userpics into, or undef to -# not load them. -# userref -- hashref to load users into, keyed by userid # init_comobj -- init or not LJ::Comment object for every loaded raw data of a comment. # by default it is On (true), but in this case it produces a huge overhead: # LJ::Comment class stores in memory all comment instances and when load @@ -1231,34 +1231,38 @@ # To disable this unexpected changes set this option to true value. # # returns: -# array of hashrefs containing keys: -# - talkid (jtalkid) -# - posterid (or zero for anon) -# - userpost (string, or blank if anon) -# - upost ($u object, or undef if anon) -# - datepost (mysql format) -# - parenttalkid (or zero for top-level) -# - parenttalkid_actual (set when the $flat mode is set, in which case parenttalkid is always faked to be 0) -# - state ("A"=approved, "S"=screened, "D"=deleted stub) -# - userpic number -# - picid (if userpicref AND userref were given) -# - subject -# - body -# - props => { propname => value, ... } -# - children => [ hashrefs like these ] -# - _loaded => 1 (if fully loaded, subject & body) -# unknown items will never be _loaded -# - _show => {0|1}, if item is to be ideally shown (0 if deleted or screened) -sub load_comments +# ( $posts, $top_replies, $children ), where +# +# $posts - hashref { +# talkid => { +# talkid => integer (jtalkid), +# parenttalkid => integer (zero for top-level), +# posterid => integer (zero for anon), +# datepost_unix => integer unix timestamp 1295268144, +# datepost => string 'YYYY-MM-DD hh:mm:ss', +# state => char ("A"=approved, "S"=screened, "D"=deleted stub, "B"=spam) +# has_children => boolean - true, if comment has children (need for 'flat' mode) +# children => arrayref of hashrefs like this, +# _show => boolean (if item is to be ideally shown, 0 - if deleted or screened), +# } +# } +# $top_replies - arrayref [ comment ids on the top level at the same page, ... ] +# $children - hashref { talkid => [ list of childred ids ] } +sub load_comments_tree { my ($u, $remote, $nodetype, $nodeid, $opts) = @_; my $n = $u->{'clusterid'}; my $viewall = $opts->{viewall}; - my $gtd_opts = {init_comobj => $opts->{init_comobj}}; + my $gtd_opts = { init_comobj => $opts->{init_comobj} }; my $posts = get_talk_data($u, $nodetype, $nodeid, $gtd_opts); # hashref, talkid -> talk2 row, or undef + unless ($posts) { + $opts->{'out_error'} = "nodb"; + return; + } + if (LJ::is_enabled('spam_button') && $opts->{showspam}) { while ( my ($commentid, $comment) = each %$posts ) { if ( $comment->{state} eq 'B' ) { @@ -1269,13 +1273,8 @@ } } - unless ($posts) { - $opts->{'out_error'} = "nodb"; - return; - } - my %users_to_load; # userid -> 1 - my %posts_to_load; # talkid -> 1 - my %children; # talkid -> [ childenids+ ] + my %children; # talkid -> [ childenids+ ] + my %has_children; # talkid -> 1 or undef my $uposterid = $opts->{'up'} ? $opts->{'up'}->{'userid'} : 0; @@ -1285,6 +1284,9 @@ foreach my $post (sort { $b->{'talkid'} <=> $a->{'talkid'} } values %$posts) { + $has_children{$post->{'parenttalkid'}} = 1; + $post->{'has_children'} = $has_children{$post->{'talkid'}}; + # kill the threading in flat mode if ($opts->{'flat'}) { $post->{'parenttalkid_actual'} = $post->{'parenttalkid'}; @@ -1340,7 +1342,6 @@ } my $page_size = $opts->{page_size} || $LJ::TALK_PAGE_SIZE || 25; - my $max_subjects = $LJ::TALK_MAX_SUBJECTS || 200; my $threading_point = $LJ::TALK_THREAD_POINT || 50; # we let the page size initially get bigger than normal for awhile, @@ -1373,12 +1374,93 @@ $page = $page < 1 ? 1 : $page > $pages ? $pages : $page; my $itemfirst = $page_size * ($page-1) + 1; - my $itemlast = $page==$pages ? $top_replies : ($page_size * $page); + my $itemlast = $page == $pages ? $top_replies : ($page_size * $page); @top_replies = @top_replies[$itemfirst-1 .. $itemlast-1]; - map { $posts_to_load{$_} = 1 } @top_replies; + $opts->{'out_pages'} = $pages; + $opts->{'out_page'} = $page; + $opts->{'out_itemfirst'} = $itemfirst; + $opts->{'out_itemlast'} = $itemlast; + $opts->{'out_pagesize'} = $page_size; + $opts->{'out_items'} = $top_replies; + return ( $posts, \@top_replies, \%children ); +} + +# LJ::Talk::load_comments($u, $remote, $nodetype, $nodeid, $opts) +# +# nodetype: "L" (for log) ... nothing else has been used +# noteid: the jitemid for log. +# opts keys: +# thread -- jtalkid to thread from ($init->{'thread'} or int($GET{'thread'} / 256)) +# page -- $GET{'page'} +# view -- $GET{'view'} (picks page containing view's ditemid) +# flat -- boolean: if set, threading isn't done, and it's just a flat chrono view +# up -- [optional] hashref of user object who posted the thing being replied to +# only used to make things visible which would otherwise be screened? +# show_parents : boolean, if thread is specified, then also show it's parents. +# out_error -- set by us if there's an error code: +# nodb: database unavailable +# noposts: no posts to load +# out_pages: number of pages +# out_page: page number being viewed +# out_itemfirst: first comment number on page (1-based, not db numbers) +# out_itemlast: last comment number on page (1-based, not db numbers) +# out_pagesize: size of each page +# out_items: number of total top level items +# +# userpicref -- hashref to load userpics into, or undef to +# not load them. +# userref -- hashref to load users into, keyed by userid +# init_comobj -- init or not LJ::Comment object for every loaded raw data of a comment. +# by default it is On (true), but in this case it produces a huge overhead: +# LJ::Comment class stores in memory all comment instances and when load +# property for any of a comment LJ::Comment loads all properties for ALL inited comments. +# (!) provide 'init_comobj => 0' wherever it is possible +# strict_page_size -- under some circumstances page size (defined in 'page_size' option') may be changed. +# To disable this unexpected changes set this option to true value. +# +# returns: +# array of hashrefs containing keys: +# - talkid (jtalkid) +# - posterid (or zero for anon) +# - userpost (string, or blank if anon) +# - upost ($u object, or undef if anon) +# - datepost (mysql format) +# - parenttalkid (or zero for top-level) +# - parenttalkid_actual (set when the $flat mode is set, in which case parenttalkid is always faked to be 0) +# - state ("A"=approved, "S"=screened, "D"=deleted stub) +# - userpic number +# - picid (if userpicref AND userref were given) +# - subject +# - body +# - props => { propname => value, ... } +# - children => [ hashrefs like these ] +# - _loaded => 1 (if fully loaded, subject & body) +# unknown items will never be _loaded +# - _show => {0|1}, if item is to be ideally shown (0 if deleted or screened) +sub load_comments +{ + my ($u, $remote, $nodetype, $nodeid, $opts) = @_; + + # paranoic code + $opts->{'out_error'} = undef; + + my ($posts, $top_replies, $children) = load_comments_tree($u, $remote, $nodetype, $nodeid, $opts); + + if ($opts->{'out_error'}) { + return; + } + + # TODO: remove this + my $page_size = $opts->{'out_pagesize'}; + + my %users_to_load; # userid -> 1 + my %posts_to_load; # talkid -> 1 + + map { $posts_to_load{$_} = 1 } @$top_replies; + # mark child posts of the top-level to load, deeper # and deeper until we've hit the page size. if too many loaded, # just mark that we'll load the subjects; @@ -1387,9 +1469,9 @@ unless ($opts->{expand_strategy}) { # the default strategy is to show first replies to top-level # comments - foreach my $itemid (@top_replies) { - next unless $children{$itemid}; - $posts_to_load{$children{$itemid}->[0]} = 1; + foreach my $itemid (@$top_replies) { + next unless $children->{$itemid}; + $posts_to_load{$children->{$itemid}->[0]} = 1; } } @@ -1402,18 +1484,18 @@ foreach my $itemid (@$item_ids){ $posts_to_load{$itemid} = 1; - next unless $children{$itemid}; + next unless $children->{$itemid}; ## expand next level it there are comments - $fun->($fun, $cur_level+1, $children{$itemid}); + $fun->($fun, $cur_level+1, $children->{$itemid}); } }; ## go through first level - foreach my $itemid (@top_replies){ - next unless $children{$itemid}; + foreach my $itemid (@$top_replies){ + next unless $children->{$itemid}; ## expand next (second) level - $expand->($expand, 2, $children{$itemid}); + $expand->($expand, 2, $children->{$itemid}); } } @@ -1422,11 +1504,11 @@ # we only expand five first replies to every first reply to # any top-level comment (yeah, this is tricky, watch me) if ($opts->{'expand_strategy'} eq 'detailed') { - foreach my $itemid_l1 (@top_replies) { - next unless $children{$itemid_l1}; + foreach my $itemid_l1 (@$top_replies) { + next unless $children->{$itemid_l1}; my $counter_l2 = 1; - foreach my $itemid_l2 (@{$children{$itemid_l1}}) { + foreach my $itemid_l2 (@{$children->{$itemid_l1}}) { # we're handling a second-level comment here # the comment itself is always shown @@ -1437,12 +1519,12 @@ next if $counter_l2 > 1; # if there is no children at all, we don't care either - next unless $children{$itemid_l2}; + next unless $children->{$itemid_l2}; # well, let's handle children now # we're copying a list here deliberately, so that # later on, we can splice() to modify the copy - my @children = @{$children{$itemid_l2}}; + my @children = @{$children->{$itemid_l2}}; map { $posts_to_load{$_} = 1 } splice(@children, 0, 5); $counter_l2++; @@ -1453,9 +1535,9 @@ # load first level and 3 first replies(or replies to replies) if ($opts->{'expand_strategy'} eq 'mobile') { undef @check_for_children; - foreach my $first_itemid (@top_replies) { - next unless $children{$first_itemid}; - my @childrens = @{ $children{$first_itemid} }; + foreach my $first_itemid (@$top_replies) { + next unless $children->{$first_itemid}; + my @childrens = @{ $children->{$first_itemid} }; my $load = $opts->{'expand_child'} || 3; while( @childrens && $load > 0 ){ if ( @childrens >= $load ){ @@ -1464,17 +1546,31 @@ }else{ map { $posts_to_load{$_} = 1 } @childrens; $load -= @childrens; - @childrens = map {$children{$_}?@{$children{$_}}:()} @childrens; + @childrens = map { $children->{$_} ? @{$children->{$_}} : () } @childrens; } } } } + my $thread = $opts->{'thread'}+0; + if ($thread && $opts->{show_parents}) { + while (my $parent_thread = $posts->{$thread}->{'parenttalkid'}) { + $children->{$parent_thread} = [ $thread ]; + $posts->{$parent_thread}->{'children'} = [ $posts->{$thread} ]; + $posts->{$parent_thread}->{'_collapsed'} = 1; + $posts_to_load{$parent_thread} = 1; + $thread = $parent_thread; + } + $top_replies = [ $thread ]; + } + + my $max_subjects = $LJ::TALK_MAX_SUBJECTS || 200; + my (@subjects_to_load, @subjects_ignored); while (@check_for_children) { my $cfc = shift @check_for_children; - next unless defined $children{$cfc}; - foreach my $child (@{$children{$cfc}}) { + next unless defined $children->{$cfc}; + foreach my $child (@{$children->{$cfc}}) { if (scalar(keys %posts_to_load) < $page_size || $opts->{expand_all}) { $posts_to_load{$child} = 1; } @@ -1491,13 +1587,6 @@ } } - $opts->{'out_pages'} = $pages; - $opts->{'out_page'} = $page; - $opts->{'out_itemfirst'} = $itemfirst; - $opts->{'out_itemlast'} = $itemlast; - $opts->{'out_pagesize'} = $page_size; - $opts->{'out_items'} = $top_replies; - # load text of posts my ($posts_loaded, $subjects_loaded); $posts_loaded = LJ::get_talktext2($u, keys %posts_to_load); @@ -1597,7 +1686,7 @@ LJ::load_userpics($opts->{'userpicref'}, \@load_pic); } } - return map { $posts->{$_} } @top_replies; + return map { $posts->{$_} } @$top_replies; } # XXX these strings should be in talk, but moving them means we have @@ -1606,7 +1695,19 @@ sub resources_for_talkform { LJ::need_res('stc/display_none.css'); - LJ::need_res('js/jquery/jquery.lj.authtype.js'); + LJ::need_res(qw( + js/jquery/jquery.lj.subjecticons.js + js/jquery/jquery.lj.commentator.js + js/jquery/jquery.lj.quotescreator.js + )); + LJ::need_res(qw( + js/jquery/jquery.lj.authtype.js + js/jquery/jquery.lj.userpicker.js + js/jquery/jquery.lj.commentform.js + js/jquery/jquery.easing.js + )); + LJ::need_res( {condition => 'IE'}, 'js/jquery/jquery.ie6multipleclass.min.js'); + LJ::need_string(qw(/talkpost_do.bml.quote.info.message)); } sub talkform { Modified: trunk/cgi-bin/LJ/User.pm =================================================================== --- trunk/cgi-bin/LJ/User.pm 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/cgi-bin/LJ/User.pm 2011-11-29 10:40:35 UTC (rev 20653) @@ -7677,6 +7677,13 @@ $cache->{'_email'} = $email; } +sub get_uids { + my @friends_names = @_; + my @ret; + push @ret, grep { $_ } map { LJ::load_user($_) } @friends_names; + return @ret; +} + sub set_password { my ($userid, $password) = @_; Modified: trunk/cgi-bin/ljdefaults.pl =================================================================== --- trunk/cgi-bin/ljdefaults.pl 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/cgi-bin/ljdefaults.pl 2011-11-29 10:40:35 UTC (rev 20653) @@ -392,6 +392,7 @@ delcomment => "delcomment.bml", talkscreen => "talkscreen.bml", spamcomment => "spamcomment.bml", + talkmulti => "talkmulti.bml", controlstrip => "tools/endpoints/controlstrip.bml", ctxpopup => "tools/endpoints/ctxpopup.bml", changerelation => "tools/endpoints/changerelation.bml", Modified: trunk/cgi-bin/ljlib.pl =================================================================== --- trunk/cgi-bin/ljlib.pl 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/cgi-bin/ljlib.pl 2011-11-29 10:40:35 UTC (rev 20653) @@ -2374,6 +2374,7 @@ js/jquery/jquery.ui.core.min.js js/jquery/jquery.ui.widget.min.js js/jquery/jquery.tmpl.min.js + js/jquery/jquery.lj.basicWidget.js js/jquery/jquery.lj.bubble.js stc/lj_base.css )); Modified: trunk/htdocs/imgupload.bml =================================================================== --- trunk/htdocs/imgupload.bml 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/htdocs/imgupload.bml 2011-11-29 10:40:35 UTC (rev 20653) @@ -12,10 +12,16 @@ my $u = LJ::User->remote; LJ::need_res('stc/lj_base-app.css', - 'stc/imgupload.css', 'stc/display_none.css', 'js/photobucket_jw.js'); + if ($GET{new_comments}) { + LJ::need_res('stc/imgupload_schemius.css'); + } else { + LJ::need_res('stc/imgupload.css'); + } + + if ($GET{upload_count} || LJ::did_post()) { my $js = ""; Copied: trunk/htdocs/js/jquery/jquery.easing.js (from rev 20637, branches/commenting-form/htdocs/js/jquery/jquery.easing.js) =================================================================== --- trunk/htdocs/js/jquery/jquery.easing.js (rev 0) +++ trunk/htdocs/js/jquery/jquery.easing.js 2011-11-29 10:40:35 UTC (rev 20653) @@ -0,0 +1,205 @@ +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +jQuery.easing['jswing'] = jQuery.easing['swing']; + +jQuery.extend( jQuery.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright © 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ \ No newline at end of file Copied: trunk/htdocs/js/jquery/jquery.hotkeys.js (from rev 20637, branches/commenting-form/htdocs/js/jquery/jquery.hotkeys.js) =================================================================== --- trunk/htdocs/js/jquery/jquery.hotkeys.js (rev 0) +++ trunk/htdocs/js/jquery/jquery.hotkeys.js 2011-11-29 10:40:35 UTC (rev 20653) @@ -0,0 +1,99 @@ +/* + * jQuery Hotkeys Plugin + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Based upon the plugin by Tzury Bar Yochay: + * http://github.com/tzuryby/hotkeys + * + * Original idea by: + * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ +*/ + +(function(jQuery){ + + jQuery.hotkeys = { + version: "0.8", + + specialKeys: { + 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", + 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", + 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", + 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", + 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", + 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", + 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" + }, + + shiftNums: { + "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", + "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", + ".": ">", "/": "?", "\\": "|" + } + }; + + function keyHandler( handleObj ) { + // Only care when a possible input has been specified + if ( typeof handleObj.data !== "string" ) { + return; + } + + var origHandler = handleObj.handler, + keys = handleObj.data.toLowerCase().split(" "); + + handleObj.handler = function( event ) { + // Don't fire in text-accepting inputs that we didn't directly bind to + if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || + /text|password|search|tel|url|email|number/.test( event.target.type ) ) ) { + return; + } + + // Keypress represents characters, not special keys + var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], + character = String.fromCharCode( event.which ).toLowerCase(), + key, modif = "", possible = {}; + + // check combinations (alt|ctrl|shift+anything) + if ( event.altKey && special !== "alt" ) { + modif += "alt+"; + } + + if ( event.ctrlKey && special !== "ctrl" ) { + modif += "ctrl+"; + } + + // TODO: Need to make sure this works consistently across platforms + if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { + modif += "meta+"; + } + + if ( event.shiftKey && special !== "shift" ) { + modif += "shift+"; + } + + if ( special ) { + possible[ modif + special ] = true; + + } else { + possible[ modif + character ] = true; + possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; + + // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" + if ( modif === "shift+" ) { + possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; + } + } + + for ( var i = 0, l = keys.length; i < l; i++ ) { + if ( possible[ keys[i] ] ) { + return origHandler.apply( this, arguments ); + } + } + }; + } + + jQuery.each([ "keydown", "keyup", "keypress" ], function() { + jQuery.event.special[ this ] = { add: keyHandler }; + }); + +})( jQuery ); Modified: trunk/htdocs/js/jquery_fn.js =================================================================== --- trunk/htdocs/js/jquery_fn.js 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/htdocs/js/jquery_fn.js 2011-11-29 10:40:35 UTC (rev 20653) @@ -279,3 +279,28 @@ } }); }; + +/** + * Function assures that callback will run not faster then minDelay. + * + * @param {Function} callback A callback to run. + * @param {Number} minDelay Minimum delay in ms. + * + * @return {Function} Callback wrapper to use as a collback in your code. + */ +jQuery.delayedCallback = function(callback, minDelay) { + var callCount = 2, + results, + checkFinish = function() { + callCount--; + if (callCount === 0) { + callback.apply(null, results); + } + } + + setTimeout(checkFinish, minDelay); + return function() { + results = [].slice.apply(arguments); + checkFinish(); + }; +}; Modified: trunk/htdocs/js/livejournal.js =================================================================== --- trunk/htdocs/js/livejournal.js 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/htdocs/js/livejournal.js 2011-11-29 10:40:35 UTC (rev 20653) @@ -31,6 +31,7 @@ LiveJournal.initPage = function () { //register system hooks LiveJournal.register_hook( 'update_wallet_balance', LiveJournal.updateWalletBalance ); + LiveJournal.register_hook( 'xdr/message', LiveJournal.processXdr ); // set up various handlers for every page LiveJournal.initInboxUpdate(); @@ -89,6 +90,27 @@ requestRound(); }; +/** + * Translate message from xdreceiver. The function will eventually be run + * from xdreceiver.html helper frame to send messages between different domains. + * + * @param {Object} message Object with the message. Object should always contain type field with event name + */ +LiveJournal.processXdr = function(message) { + if (message.type) { + var type = decodeURIComponent(message.type); + } else { + return; + } + + var messageCopy = {}; + for (var name in message) if (message.hasOwnProperty(name) && name !== 'type') { + messageCopy[name] = decodeURIComponent(message[name]); + } + + LiveJournal.run_hook(type, messageCopy); +}; + // Set up a timer to keep the inbox count updated LiveJournal.initInboxUpdate = function () { // Don't run if not logged in or this is disabled Modified: trunk/htdocs/stc/lj_base.css =================================================================== --- trunk/htdocs/stc/lj_base.css 2011-11-29 10:26:59 UTC (rev 20652) +++ trunk/htdocs/stc/lj_base.css 2011-11-29 10:40:35 UTC (rev 20653) @@ -1198,6 +1198,609 @@ /* Comment Form --------------------------- */ +.b-postform { + min-height: 220px; + } + + +.b-postform-alert-logcommentips, +.b-postform-alert-nosubjecthtml, +.b-postform-alert-screened, +.b-postform-alert-suspended, +.b-postform-alert-deleted, +.b-postform-alert-banned, +.b-postform-alert-notafriend, +.b-postform-alert-notreg, +.b-postform-alert-regonly, +.b-postform-alert-ajax { + display: none; + width: 70%; + } +.b-postform-alert-errors { + width: 70%; + } + + +/* deleted */ +/* .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-submitbox, + +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-submitbox, + +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-submitbox, + +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-submitbox, + +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-submitbox, + +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-submitbox, + +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-subjectbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-msgbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-repostbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-submitbox { + visibility: hidden; + } */ + +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-alert-regonly, + +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-alert-regonly, + +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-alert-regonly, + +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-alert-regonly, + +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-alert-regonly, + +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-alert-regonly, + +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-alert-notafriend, +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-alert-notreg, +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-alert-regonly { + display: none; + } + +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-alert-logcommentips, + +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-alert-logcommentips, + +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-alert-logcommentips, + +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-alert-logcommentips, + +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-alert-logcommentips, + +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-alert-logcommentips, + +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-alert-screened, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-alert-logcommentips { + display: none; + } + +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-deleted .b-postform-alert-deleted, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-deleted .b-postform-alert-deleted, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-deleted .b-postform-alert-deleted, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-deleted .b-postform-alert-deleted, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-deleted .b-postform-alert-deleted, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-deleted .b-postform-alert-deleted, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-deleted .b-postform-alert-deleted { + display: block; + } + + +/* suspended */ +/* .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-submitbox, + +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-submitbox, + +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-submitbox, + +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-submitbox, + +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-submitbox, + +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-submitbox, + +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-subjectbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-msgbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-repostbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-submitbox { + visibility: hidden; + } */ + +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-alert-regonly, + +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-alert-regonly, + +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-alert-regonly, + +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-alert-regonly, + +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-alert-regonly, + +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-alert-regonly, + +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-alert-notafriend, +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-alert-notreg, +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-alert-regonly { + display: none; + } + +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-alert-logcommentips, + +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-alert-logcommentips, + +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-alert-logcommentips, + +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-alert-logcommentips, + +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-alert-logcommentips, + +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-alert-logcommentips, + +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-alert-screened, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-alert-logcommentips { + display: none; + } + +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-suspended .b-postform-alert-suspended, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-suspended .b-postform-alert-suspended, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-suspended .b-postform-alert-suspended, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-suspended .b-postform-alert-suspended, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-suspended .b-postform-alert-suspended, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-suspended .b-postform-alert-suspended, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-suspended .b-postform-alert-suspended { + display: block; + } + + +/* banned */ +/*.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-submitbox, + +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-submitbox, + +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-submitbox, + +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-submitbox, + +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-submitbox, + +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-submitbox, + +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-subjectbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-msgbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-repostbox, +.b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-submitbox { + visibility: hidden; + } */ + + +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-alert-regonly, + +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-alert-regonly, + +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-alert-regonly, + +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-alert-regonly, + +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-alert-regonly, + +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-mailru.b-postform-authtype-mailru.b-postform-user-banned .b-postform-alert-regonly, + +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-alert-notafriend, +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-alert-notreg, +BODY .b-postform-realauth-vkontakte.b-postform-authtype-vkontakte.b-postform-user-banned .b-postform-alert-regonly { + display: none; + } + +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-alert-screened, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-cookieuser.b-postform-authtype-cookieuser.b-postform-user-banned .b-postform-alert-logcommentips, + +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-alert-screened, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-facebook.b-postform-authtype-facebook.b-postform-user-banned .b-postform-alert-logcommentips, + +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-alert-screened, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-twitter.b-postform-authtype-twitter.b-postform-user-banned .b-postform-alert-logcommentips, + +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-alert-screened, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-google.b-postform-authtype-google.b-postform-user-banned .b-postform-alert-logcommentips, + +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-alert-screened, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned.b-postform-user-screened-nonf .b-postform-alert-screened, +.b-postform-realauth-openid.b-postform-authtype-openid.b-postform-user-banned .b-postform-alert-logcommentips, + +.b... (truncated)