alf (red_alf) wrote in changelog,
alf
red_alf
changelog

[livejournal] r20653: LJSUP-10508: Commenting form S1 (Lebedev...

Committer: afedorov
LJSUP-10508: Commenting form S1 (Lebedev's redesign). Move branch to trunk
U   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)
Tags: afedorov, bml, css, js, livejournal, pl, pm, red_alf, text, tmpl
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments